From ff0b4d5b12ebbc73f942e3ec273f3dceea6de4e4 Mon Sep 17 00:00:00 2001 From: liut <4435316@qq.com> Date: Tue, 12 Oct 2021 11:06:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 14 + README.md | 83 + application/.htaccess | 1 + application/admin/controller/Auth.php | 52 + application/admin/controller/Certify.php | 63 + application/admin/controller/Dashboard.php | 91 + application/admin/controller/File.php | 152 + application/admin/controller/Group.php | 84 + application/admin/controller/Index.php | 43 + application/admin/controller/Order.php | 68 + application/admin/controller/Policy.php | 77 + application/admin/controller/Recycle.php | 116 + application/admin/controller/Report.php | 68 + application/admin/controller/Setting.php | 84 + application/admin/controller/User.php | 206 + application/admin/controller/Withdraw.php | 68 + application/admin/view/auth/login.html | 80 + application/admin/view/certify/index.html | 151 + application/admin/view/dashboard/index.html | 177 + application/admin/view/file/index.html | 288 + application/admin/view/file/info.html | 71 + application/admin/view/group/add.html | 119 + application/admin/view/group/edit.html | 118 + application/admin/view/group/index.html | 158 + application/admin/view/index/index.html | 93 + application/admin/view/order/index.html | 222 + application/admin/view/policy/add.html | 241 + application/admin/view/policy/edit.html | 241 + application/admin/view/policy/index.html | 136 + application/admin/view/recycle/index.html | 351 + application/admin/view/report/edit.html | 113 + application/admin/view/report/index.html | 135 + application/admin/view/setting/basic.html | 145 + application/admin/view/setting/email.html | 122 + application/admin/view/setting/pay.html | 91 + application/admin/view/setting/register.html | 82 + application/admin/view/setting/vip.html | 93 + application/admin/view/user/add.html | 116 + application/admin/view/user/edit.html | 154 + application/admin/view/user/index.html | 267 + application/admin/view/withdraw/index.html | 170 + application/command.php | 12 + application/common.php | 391 + application/common/behavior/LoadConfigRun.php | 28 + application/common/controller/Admin.php | 89 + application/common/controller/Home.php | 115 + application/common/exception/LoginError.php | 11 + application/common/model/Certify.php | 12 + application/common/model/FileManage.php | 432 + application/common/model/FileUpload.php | 238 + application/common/model/Folders.php | 18 + application/common/model/Groups.php | 22 + application/common/model/Order.php | 12 + application/common/model/Policys.php | 53 + application/common/model/Profit.php | 60 + application/common/model/Record.php | 44 + application/common/model/Reports.php | 13 + application/common/model/Setting.php | 14 + application/common/model/Shares.php | 58 + application/common/model/Stores.php | 34 + application/common/model/Users.php | 167 + application/common/model/Withdraw.php | 12 + application/common/model/driver/AliyunOss.php | 185 + application/common/model/driver/Local.php | 125 + .../common/model/driver/PolicyStore.php | 46 + application/common/model/driver/TxyunOss.php | 210 + .../http/middleware/AdminLoginCheck.php | 27 + .../http/middleware/UserLoginCheck.php | 37 + application/index/controller/File.php | 349 + application/index/controller/Index.php | 411 + application/index/controller/Recycle.php | 190 + application/index/controller/Share.php | 121 + application/index/controller/Upload.php | 116 + application/index/controller/User.php | 433 + application/index/view/file/edit_file.html | 123 + application/index/view/file/edit_folder.html | 128 + application/index/view/file/move_files.html | 463 + application/index/view/index/404.html | 18 + application/index/view/index/file.html | 394 + application/index/view/index/folder.html | 82 + application/index/view/index/folder_wap.html | 70 + .../index/view/index/index_default.html | 191 + application/index/view/index/index_new1.html | 149 + application/index/view/index/pwd.html | 106 + application/index/view/index/report.html | 422 + application/index/view/layout/user.html | 310 + application/index/view/recycle/index.html | 236 + application/index/view/share/echarts.html | 122 + application/index/view/share/index.html | 153 + application/index/view/share/record.html | 69 + application/index/view/share/withdraw.html | 121 + application/index/view/upload/index.html | 473 + application/index/view/user/auth.html | 85 + application/index/view/user/err.html | 23 + application/index/view/user/forget.html | 126 + application/index/view/user/index.html | 334 + application/index/view/user/info.html | 291 + application/index/view/user/login.html | 366 + application/index/view/user/reset.html | 133 + application/index/view/user/vip.html | 133 + application/index/view/user/vip_wap.html | 150 + application/index/view/user/withdraw.html | 67 + application/provider.php | 15 + application/tags.php | 30 + build.php | 26 + composer.json | 43 + composer.lock | 1106 + config/app.php | 148 + config/cache.php | 25 + config/cookie.php | 30 + config/database.php | 63 + config/log.php | 30 + config/menu.php | 138 + config/middleware.php | 18 + config/session.php | 26 + config/template.php | 40 + config/tpl/error_404_tmpl.tpl | 31 + config/tpl/error_tmpl.tpl | 66 + config/tpl/success_tmpl.tpl | 46 + extend/Qrcode/Qrcode.php | 12 + newskpan_20210930_142244.sql | 450 + public/.htaccess | 7 + public/admin.php | 13 + public/assets/css/app.css | 1673 + public/assets/css/app1.css | 417 + .../css/bootstrap-datetimepicker.min.css | 9 + public/assets/css/bootstrap-editable.css | 706 + .../css/bootstrap-table-fixed-columns.css | 27 + public/assets/css/bootstrap-table.min.css | 10 + public/assets/css/bootstrap.min.css | 6 + public/assets/css/elementui.css | 1 + public/assets/css/file.css | 255 + public/assets/css/home.css | 291 + public/assets/css/icon.css | 499 + public/assets/css/index.css | 637 + public/assets/css/layer.css | 2 + public/assets/css/layer/default/icon-ext.png | Bin 0 -> 5911 bytes public/assets/css/layer/default/icon.png | Bin 0 -> 11493 bytes public/assets/css/layer/default/layer.css | 2 + public/assets/css/layer/default/loading-0.gif | Bin 0 -> 5793 bytes public/assets/css/layer/default/loading-1.gif | Bin 0 -> 701 bytes public/assets/css/layer/default/loading-2.gif | Bin 0 -> 1787 bytes public/assets/css/layui.css | 2 + public/assets/css/list.css | 298 + public/assets/css/login.css | 419 + public/assets/css/main.css | 316 + public/assets/css/t0.css | 377 + public/assets/css/upload.css | 515 + public/assets/css/userapp.css | 417 + public/assets/file_ext/apk.png | Bin 0 -> 15009 bytes public/assets/file_ext/code.png | Bin 0 -> 252 bytes public/assets/file_ext/excel.png | Bin 0 -> 353 bytes public/assets/file_ext/exe.png | Bin 0 -> 14847 bytes public/assets/file_ext/folder.png | Bin 0 -> 192 bytes public/assets/file_ext/fonts.png | Bin 0 -> 14996 bytes public/assets/file_ext/img.png | Bin 0 -> 310 bytes public/assets/file_ext/ipa.png | Bin 0 -> 14876 bytes public/assets/file_ext/links.png | Bin 0 -> 14962 bytes public/assets/file_ext/music.png | Bin 0 -> 264 bytes public/assets/file_ext/ppt.png | Bin 0 -> 285 bytes public/assets/file_ext/ps.png | Bin 0 -> 15030 bytes public/assets/file_ext/text.png | Bin 0 -> 412 bytes public/assets/file_ext/unknown.png | Bin 0 -> 814 bytes public/assets/file_ext/video.png | Bin 0 -> 266 bytes public/assets/file_ext/word.png | Bin 0 -> 361 bytes public/assets/file_ext/zip.png | Bin 0 -> 221 bytes .../font-awesome/css/font-awesome.min.css | 4 + .../font/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../font/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../font/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../font/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes public/assets/icon/font/yunfont.eot | Bin 0 -> 24868 bytes public/assets/icon/font/yunfont.ttf | Bin 0 -> 24704 bytes public/assets/icon/font/yunfont.woff | Bin 0 -> 24780 bytes public/assets/icon/icon.css | 499 + public/assets/image/apps-android.png | Bin 0 -> 12793 bytes public/assets/image/apps-ios.png | Bin 0 -> 13625 bytes public/assets/image/clear.png | Bin 0 -> 509 bytes public/assets/image/collect-image-left.png | Bin 0 -> 23276 bytes public/assets/image/collect-image-right.png | Bin 0 -> 22650 bytes public/assets/image/collect-img1.png | Bin 0 -> 91156 bytes public/assets/image/collect-img3.png | Bin 0 -> 62441 bytes public/assets/image/collect-line.svg | 10 + public/assets/image/emptyRecyclebin.png | Bin 0 -> 1412 bytes public/assets/image/emptySousuo.png | Bin 0 -> 1655 bytes public/assets/image/emptyfile.png | Bin 0 -> 3480 bytes public/assets/image/footer-img1.png | Bin 0 -> 341031 bytes public/assets/image/footer-img2.png | Bin 0 -> 152175 bytes public/assets/image/header.png | Bin 0 -> 974802 bytes public/assets/image/i1.gif | Bin 0 -> 22281 bytes public/assets/image/i18.gif | Bin 0 -> 21053 bytes public/assets/image/i9.png | Bin 0 -> 2884 bytes public/assets/image/icon-tree_77d7929.png | Bin 0 -> 3290 bytes public/assets/image/loading.gif | Bin 0 -> 1849 bytes public/assets/image/login_iconb536.png | Bin 0 -> 4109 bytes public/assets/image/logo.gif | Bin 0 -> 1918 bytes public/assets/image/logo.png | Bin 0 -> 5614 bytes public/assets/image/logo3.gif | Bin 0 -> 3084 bytes public/assets/image/logo7.gif | Bin 0 -> 6737 bytes .../assets/image/mobile-collect-img-left.png | Bin 0 -> 13869 bytes .../assets/image/mobile-collect-img-right.png | Bin 0 -> 13724 bytes public/assets/image/provide-img1.png | Bin 0 -> 4676 bytes public/assets/image/provide-img3.png | Bin 0 -> 4104 bytes public/assets/image/q2.gif | Bin 0 -> 14649 bytes public/assets/image/q9.gif | Bin 0 -> 1769 bytes public/assets/image/space-img1.png | Bin 0 -> 59129 bytes public/assets/image/space-img2.png | Bin 0 -> 126194 bytes public/assets/image/space-img3.png | Bin 0 -> 82453 bytes public/assets/image/space-img4.png | Bin 0 -> 86843 bytes public/assets/image/upload_cancel.gif | Bin 0 -> 92 bytes public/assets/image/userhead.png | Bin 0 -> 2817 bytes public/assets/js/admin.js | 1110 + public/assets/js/animate/animate.css | 1579 + public/assets/js/bootstrap-datetimepicker.js | 1770 + public/assets/js/bootstrap-editable.js | 6898 ++ .../js/bootstrap-table-fixed-columns.js | 242 + public/assets/js/bootstrap-table.min.js | 10 + public/assets/js/bootstrap.min.js | 7 + public/assets/js/common.js | 275 + public/assets/js/file.js | 537 + public/assets/js/highcharts.js | 391 + public/assets/js/jquery.cxscroll.js | 217 + public/assets/js/jquery.js | 4 + public/assets/js/lay/modules/carousel.js | 2 + public/assets/js/lay/modules/code.js | 2 + public/assets/js/lay/modules/colorpicker.js | 2 + public/assets/js/lay/modules/element.js | 2 + public/assets/js/lay/modules/flow.js | 2 + public/assets/js/lay/modules/form.js | 2 + public/assets/js/lay/modules/jquery.js | 5 + public/assets/js/lay/modules/laydate.js | 2 + public/assets/js/lay/modules/layedit.js | 2 + public/assets/js/lay/modules/layer.js | 2 + public/assets/js/lay/modules/laypage.js | 2 + public/assets/js/lay/modules/laytpl.js | 2 + public/assets/js/lay/modules/mobile.js | 2 + public/assets/js/lay/modules/rate.js | 2 + public/assets/js/lay/modules/slider.js | 2 + public/assets/js/lay/modules/table.js | 2 + .../js/lay/modules/theme/default/icon-ext.png | Bin 0 -> 5911 bytes .../js/lay/modules/theme/default/icon.png | Bin 0 -> 11493 bytes .../js/lay/modules/theme/default/layer.css | 1 + .../lay/modules/theme/default/loading-0.gif | Bin 0 -> 5793 bytes .../lay/modules/theme/default/loading-1.gif | Bin 0 -> 701 bytes .../lay/modules/theme/default/loading-2.gif | Bin 0 -> 1787 bytes public/assets/js/lay/modules/transfer.js | 2 + public/assets/js/lay/modules/tree.js | 2 + public/assets/js/lay/modules/upload.js | 2 + public/assets/js/lay/modules/util.js | 2 + public/assets/js/layer.js | 2 + .../assets/js/layer/theme/default/layer.css | 1 + public/assets/js/layui.js | 2 + public/assets/js/noty/noty-2.4.1.js | 1907 + public/assets/js/recyclebin.js | 143 + public/assets/js/theme/default/icon.png | Bin 0 -> 11493 bytes public/assets/js/theme/default/layer.css | 179 + public/assets/js/webuploader2.js | 8106 ++ public/assets/js/wind.js | 1362 + public/assets/logo/logo.gif | Bin 0 -> 1918 bytes public/assets/pan/img/corner-1.png | Bin 0 -> 7632 bytes public/assets/pan/img/corner-2.png | Bin 0 -> 9126 bytes public/assets/pan/img/corner-3.png | Bin 0 -> 11382 bytes public/assets/pan/img/logo.png | Bin 0 -> 19262 bytes public/assets/pan/img/logo3.gif | Bin 0 -> 3084 bytes public/assets/pan/shouyi/bootstrap.js | 4971 + public/assets/pan/shouyi/theme.css | 20852 ++++ public/assets/pan/t0.css | 377 + public/assets/pan/t1.css | 96 + public/assets/pan/t2.css | 128 + public/assets/pass/api.js | 29 + public/assets/pass/base.css | 1 + public/assets/pass/pc.css | 414 + public/assets/pay/css/main.css | 443 + public/assets/pay/images/success1.png | Bin 0 -> 255 bytes public/assets/pay/images/wechatpay.png | Bin 0 -> 6436 bytes public/assets/pay/images/zfbpay.png | Bin 0 -> 8540 bytes public/assets/pay/js/qrcode.min.js | 1 + public/assets/pay/js/ui-choose.js | 300 + .../5baaddeb0df643f9d10cd208c6efb203.jpeg | Bin 0 -> 2850 bytes public/assets/picture/header-mobile.png | Bin 0 -> 390097 bytes public/assets/picture/header_logo.png | Bin 0 -> 15176 bytes public/assets/picture/loading.gif | Bin 0 -> 5793 bytes public/assets/picture/shadow.png | Bin 0 -> 982 bytes public/assets/picture/showqrcode.jpg | Bin 0 -> 37831 bytes public/assets/picture/user_logo.png | Bin 0 -> 38410 bytes public/assets/picture/wx.png | Bin 0 -> 3497 bytes .../a3558393da3813e6506f0cf8dc280149.jpeg | Bin 0 -> 2847 bytes .../css/bootstrap-datetimepicker.min.css | 9 + .../assets/static/css/bootstrap-editable.css | 706 + .../css/bootstrap-table-fixed-columns.css | 27 + .../assets/static/css/bootstrap-table.min.css | 10 + public/assets/static/css/bootstrap.min.css | 6 + .../font-awesome/css/font-awesome.min.css | 4 + .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes public/assets/static/icon/font/yunfont.ttf | Bin 0 -> 24704 bytes public/assets/static/icon/icon.css | 499 + .../assets/static/index/css/common-style.css | 1 + public/assets/static/index/css/icon-style.css | 1 + public/assets/static/index/css/index.css | 623 + public/assets/static/index/css/login.css | 925 + .../assets/static/index/css/share-style.css | 9997 ++ public/assets/static/index/css/vendor.css | 1 + public/assets/static/index/img/i1.gif | Bin 0 -> 22281 bytes public/assets/static/index/img/i18.gif | Bin 0 -> 19878 bytes public/assets/static/index/img/i9.png | Bin 0 -> 2884 bytes ...red-1.346411cf440a1c2d15a1e9a914fcd54f.png | Bin 0 -> 10723 bytes ...red-2.87ea17e60b3a18447144acf1dd3a6e73.png | Bin 0 -> 8979 bytes ...red-3.80930fe5e2664421aa960fcbb9dc1e29.png | Bin 0 -> 9390 bytes ...red-4.6cf74db55b75b77436f8944b9891dfd8.png | Bin 0 -> 8991 bytes ...red-5.9499eef7c5c7802f2a2e4e42415c6732.png | Bin 0 -> 8411 bytes ...ading.884a292166a5701121b4f8fdfb93424f.png | Bin 0 -> 2804 bytes ...bg-2k.b2afe0edb64ee536d3d32c395e23779f.jpg | Bin 0 -> 279189 bytes ...-bg-1.3198186e580f0a0aa21e1c14997b8e39.png | Bin 0 -> 3628 bytes ...-bg-2.c30fb5f95bfa68d5f3e88f9595180440.png | Bin 0 -> 2068 bytes .../static/index/img/login_top_20210903.png | Bin 0 -> 47670 bytes ...e.335e229ecb2a92ede74f0b2ffa27c0f1 (1).png | Bin 0 -> 2995 bytes ...white.335e229ecb2a92ede74f0b2ffa27c0f1.png | Bin 0 -> 2995 bytes ...white.434b9bb8f0897c629960912aba92db9d.png | Bin 0 -> 9847 bytes public/assets/static/index/img/logo3.gif | Bin 0 -> 2598 bytes public/assets/static/index/img/q2.gif | Bin 0 -> 14649 bytes public/assets/static/index/img/q9.gif | Bin 0 -> 1769 bytes ...-help.f4bce51b181f9bfb7b7ec84ab3fad289.png | Bin 0 -> 13250 bytes public/assets/static/index/img/top.gif | Bin 0 -> 265 bytes public/assets/static/index/img/top.js | 57 + public/assets/static/index/img/wa.png | Bin 0 -> 19256 bytes public/assets/static/index/img/y3.gif | Bin 0 -> 3324 bytes public/assets/static/index/js/5.js | 1 + public/assets/static/index/js/89.js | 1 + public/assets/static/index/js/common-style.js | 1 + public/assets/static/index/js/common.js | 2 + public/assets/static/index/js/icon-style.js | 1 + public/assets/static/index/js/login.js | 1 + public/assets/static/index/js/share-style.js | 1 + public/assets/static/index/js/vendor.js | 2 + public/assets/static/js/admin.js | 1031 + public/assets/static/js/ajaxForm.js | 1520 + public/assets/static/js/animate/animate.css | 1579 + .../assets/static/js/artDialog/artDialog.js | 2077 + .../static/js/artDialog/skins/default.css | 67 + .../js/artDialog/skins/icons/icon-ext.png | Bin 0 -> 5911 bytes .../static/js/artDialog/skins/icons/icon.png | Bin 0 -> 11493 bytes .../static/js/artDialog/skins/icons/layer.css | 1 + .../js/artDialog/skins/icons/loading-0.gif | Bin 0 -> 5793 bytes .../js/artDialog/skins/icons/loading-1.gif | Bin 0 -> 701 bytes .../js/artDialog/skins/icons/loading-2.gif | Bin 0 -> 1787 bytes .../static/js/bootstrap-datetimepicker.js | 1770 + public/assets/static/js/bootstrap-editable.js | 6898 ++ .../js/bootstrap-table-fixed-columns.js | 242 + .../assets/static/js/bootstrap-table.min.js | 10 + public/assets/static/js/bootstrap.min.js | 7 + public/assets/static/js/jquery.js | 4 + .../js/jquery.validate/jquery.validate.js | 1533 + public/assets/static/js/layer/layer.js | 2 + .../static/js/layer/skin/default/layer.css | 1 + .../js/layer/theme/default/icon-ext.png | Bin 0 -> 5911 bytes .../static/js/layer/theme/default/icon.png | Bin 0 -> 11493 bytes .../static/js/layer/theme/default/layer.css | 1 + .../js/layer/theme/default/loading-0.gif | Bin 0 -> 5793 bytes .../js/layer/theme/default/loading-1.gif | Bin 0 -> 701 bytes .../js/layer/theme/default/loading-2.gif | Bin 0 -> 1787 bytes public/assets/static/js/noty/noty-2.4.1.js | 1907 + public/assets/static/js/wind.js | 1362 + public/assets/static/pan/img/logo.gif | Bin 0 -> 2102 bytes public/assets/static/user/app.css | 417 + public/assets/static/user/common.js | 280 + public/assets/static/user/elementui.css | 1 + public/assets/static/user/file.css | 262 + public/assets/static/user/file.js | 465 + public/assets/static/user/home.css | 291 + .../static/user/img/emptyRecyclebin.png | Bin 0 -> 1412 bytes public/assets/static/user/img/emptyfile.png | Bin 0 -> 3480 bytes public/assets/static/user/img/loading.gif | Bin 0 -> 5793 bytes public/assets/static/user/list.css | 298 + public/assets/static/user/recyclebin.js | 142 + .../assets/static/user/viewer/viewer.min.css | 357 + .../assets/static/user/viewer/viewer.min.js | 10 + public/assets/static/user/wap/app.css | 248 + public/assets/static/user/wap/app.js | 1 + public/assets/static/user/wap/font.css | 53 + public/assets/static/user/wap/pan.css | 1 + public/assets/static/user/wap/pan.js | 1 + public/assets/static/user/wap/pan_report.css | 1 + public/assets/static/user/wap/pan_report.js | 1 + public/assets/static/user/wap/pan_share.css | 1 + public/assets/static/user/wap/pan_share.js | 16 + .../public/assets/js/bootstrap.min.js | 7 + .../public/assets/js/jquery-1.10.2.min.js | 6 + .../simpleboot3/css/simplebootadmin.css | 47 + .../assets/themes/flatadmin/bootstrap.min.css | 5 + public/assets/tixian/css/modules/code.css | 2 + .../css/modules/laydate/default/laydate.css | 2 + .../css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes .../tixian/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes .../css/modules/layer/default/layer.css | 2 + .../css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes .../css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes .../css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes public/assets/tixian/lay/modules/carousel.js | 2 + public/assets/tixian/lay/modules/code.js | 2 + .../assets/tixian/lay/modules/colorpicker.js | 2 + public/assets/tixian/lay/modules/element.js | 2 + public/assets/tixian/lay/modules/flow.js | 2 + public/assets/tixian/lay/modules/form.js | 2 + public/assets/tixian/lay/modules/jquery.js | 5 + public/assets/tixian/lay/modules/laydate.js | 2 + public/assets/tixian/lay/modules/layedit.js | 2 + public/assets/tixian/lay/modules/layer.js | 2 + public/assets/tixian/lay/modules/laypage.js | 2 + public/assets/tixian/lay/modules/laytpl.js | 2 + public/assets/tixian/lay/modules/mobile.js | 2 + public/assets/tixian/lay/modules/rate.js | 2 + public/assets/tixian/lay/modules/slider.js | 2 + public/assets/tixian/lay/modules/table.js | 2 + public/assets/tixian/lay/modules/transfer.js | 2 + public/assets/tixian/lay/modules/tree.js | 2 + public/assets/tixian/lay/modules/upload.js | 2 + public/assets/tixian/lay/modules/util.js | 2 + public/assets/tixian/layui.css | 2 + public/assets/tixian/layui.js | 2 + public/assets/viewer/viewer.min.css | 357 + public/assets/viewer/viewer.min.js | 10 + public/index.php | 22 + public/record_lock.txt | 0 public/robots.txt | 2 + public/server/index.php | 586 + public/static/admin/css/admin.css | 448 + public/static/admin/css/load.css | 105 + public/static/admin/css/other/console1.css | 140 + public/static/admin/css/other/console2.css | 18 + public/static/admin/css/other/department.css | 6 + public/static/admin/css/other/error.css | 76 + public/static/admin/css/other/icon.css | 531 + public/static/admin/css/other/login.css | 93 + public/static/admin/css/other/person.css | 80 + public/static/admin/css/other/result.css | 39 + public/static/admin/data/card.json | 57 + public/static/admin/data/dataMenu.json | 372 + public/static/admin/data/dataTree2.json | 10 + public/static/admin/data/dictData.json | 36 + public/static/admin/data/dictType.json | 90 + public/static/admin/data/dtree.json | 181 + public/static/admin/data/loginLog.json | 211 + public/static/admin/data/menu.json | 409 + public/static/admin/data/message.json | 88 + public/static/admin/data/operateLog.json | 211 + public/static/admin/data/organization.json | 41 + .../static/admin/data/organizationtree.json | 39 + public/static/admin/data/power.json | 182 + public/static/admin/data/role.json | 1 + public/static/admin/data/table.json | 132 + public/static/admin/data/user.json | 118 + public/static/admin/images/403.svg | 508 + public/static/admin/images/404.svg | 314 + public/static/admin/images/500.svg | 208 + public/static/admin/images/act.jpg | Bin 0 -> 201852 bytes public/static/admin/images/avatar.jpg | Bin 0 -> 76158 bytes public/static/admin/images/background.svg | 33 + public/static/admin/images/captcha.gif | Bin 0 -> 3952 bytes public/static/admin/images/file_ext/apk.png | Bin 0 -> 15009 bytes public/static/admin/images/file_ext/code.png | Bin 0 -> 252 bytes public/static/admin/images/file_ext/excel.png | Bin 0 -> 353 bytes public/static/admin/images/file_ext/exe.png | Bin 0 -> 14847 bytes public/static/admin/images/file_ext/fonts.png | Bin 0 -> 14996 bytes public/static/admin/images/file_ext/img.png | Bin 0 -> 310 bytes public/static/admin/images/file_ext/ipa.png | Bin 0 -> 14876 bytes public/static/admin/images/file_ext/links.png | Bin 0 -> 14962 bytes public/static/admin/images/file_ext/music.png | Bin 0 -> 264 bytes public/static/admin/images/file_ext/ppt.png | Bin 0 -> 285 bytes public/static/admin/images/file_ext/ps.png | Bin 0 -> 15030 bytes public/static/admin/images/file_ext/text.png | Bin 0 -> 412 bytes .../static/admin/images/file_ext/unknown.png | Bin 0 -> 814 bytes public/static/admin/images/file_ext/video.png | Bin 0 -> 266 bytes public/static/admin/images/file_ext/word.png | Bin 0 -> 361 bytes public/static/admin/images/file_ext/zip.png | Bin 0 -> 221 bytes public/static/admin/images/logo.png | Bin 0 -> 14280 bytes public/static/admin/images/x.png | Bin 0 -> 212 bytes public/static/admin/js/boostrap.js | 89 + public/static/component/code/css/style.css | 9 + public/static/component/code/index.html | 81 + public/static/component/layui/css/layui.css | 1 + .../component/layui/css/modules/code.css | 1 + .../css/modules/laydate/default/laydate.css | 1 + .../css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes .../layui/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes .../layui/css/modules/layer/default/layer.css | 1 + .../css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes .../css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes .../css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes .../static/component/layui/font/iconfont.eot | Bin 0 -> 46684 bytes .../static/component/layui/font/iconfont.svg | 554 + .../static/component/layui/font/iconfont.ttf | Bin 0 -> 46508 bytes .../static/component/layui/font/iconfont.woff | Bin 0 -> 30628 bytes .../component/layui/font/iconfont.woff2 | Bin 0 -> 25964 bytes .../static/component/layui/images/face/0.gif | Bin 0 -> 2689 bytes .../static/component/layui/images/face/1.gif | Bin 0 -> 5514 bytes .../static/component/layui/images/face/10.gif | Bin 0 -> 2797 bytes .../static/component/layui/images/face/11.gif | Bin 0 -> 4121 bytes .../static/component/layui/images/face/12.gif | Bin 0 -> 3361 bytes .../static/component/layui/images/face/13.gif | Bin 0 -> 7425 bytes .../static/component/layui/images/face/14.gif | Bin 0 -> 2375 bytes .../static/component/layui/images/face/15.gif | Bin 0 -> 1793 bytes .../static/component/layui/images/face/16.gif | Bin 0 -> 6721 bytes .../static/component/layui/images/face/17.gif | Bin 0 -> 4439 bytes .../static/component/layui/images/face/18.gif | Bin 0 -> 3017 bytes .../static/component/layui/images/face/19.gif | Bin 0 -> 3040 bytes .../static/component/layui/images/face/2.gif | Bin 0 -> 3222 bytes .../static/component/layui/images/face/20.gif | Bin 0 -> 5144 bytes .../static/component/layui/images/face/21.gif | Bin 0 -> 5191 bytes .../static/component/layui/images/face/22.gif | Bin 0 -> 9823 bytes .../static/component/layui/images/face/23.gif | Bin 0 -> 3792 bytes .../static/component/layui/images/face/24.gif | Bin 0 -> 8096 bytes .../static/component/layui/images/face/25.gif | Bin 0 -> 3127 bytes .../static/component/layui/images/face/26.gif | Bin 0 -> 3291 bytes .../static/component/layui/images/face/27.gif | Bin 0 -> 4377 bytes .../static/component/layui/images/face/28.gif | Bin 0 -> 2793 bytes .../static/component/layui/images/face/29.gif | Bin 0 -> 4854 bytes .../static/component/layui/images/face/3.gif | Bin 0 -> 4017 bytes .../static/component/layui/images/face/30.gif | Bin 0 -> 2555 bytes .../static/component/layui/images/face/31.gif | Bin 0 -> 2002 bytes .../static/component/layui/images/face/32.gif | Bin 0 -> 3481 bytes .../static/component/layui/images/face/33.gif | Bin 0 -> 2454 bytes .../static/component/layui/images/face/34.gif | Bin 0 -> 3700 bytes .../static/component/layui/images/face/35.gif | Bin 0 -> 1800 bytes .../static/component/layui/images/face/36.gif | Bin 0 -> 2331 bytes .../static/component/layui/images/face/37.gif | Bin 0 -> 1513 bytes .../static/component/layui/images/face/38.gif | Bin 0 -> 3615 bytes .../static/component/layui/images/face/39.gif | Bin 0 -> 6495 bytes .../static/component/layui/images/face/4.gif | Bin 0 -> 5689 bytes .../static/component/layui/images/face/40.gif | Bin 0 -> 3154 bytes .../static/component/layui/images/face/41.gif | Bin 0 -> 3644 bytes .../static/component/layui/images/face/42.gif | Bin 0 -> 5305 bytes .../static/component/layui/images/face/43.gif | Bin 0 -> 2674 bytes .../static/component/layui/images/face/44.gif | Bin 0 -> 4126 bytes .../static/component/layui/images/face/45.gif | Bin 0 -> 3417 bytes .../static/component/layui/images/face/46.gif | Bin 0 -> 3007 bytes .../static/component/layui/images/face/47.gif | Bin 0 -> 2333 bytes .../static/component/layui/images/face/48.gif | Bin 0 -> 2689 bytes .../static/component/layui/images/face/49.gif | Bin 0 -> 2315 bytes .../static/component/layui/images/face/5.gif | Bin 0 -> 4567 bytes .../static/component/layui/images/face/50.gif | Bin 0 -> 5866 bytes .../static/component/layui/images/face/51.gif | Bin 0 -> 2785 bytes .../static/component/layui/images/face/52.gif | Bin 0 -> 777 bytes .../static/component/layui/images/face/53.gif | Bin 0 -> 2127 bytes .../static/component/layui/images/face/54.gif | Bin 0 -> 2196 bytes .../static/component/layui/images/face/55.gif | Bin 0 -> 1971 bytes .../static/component/layui/images/face/56.gif | Bin 0 -> 2034 bytes .../static/component/layui/images/face/57.gif | Bin 0 -> 2705 bytes .../static/component/layui/images/face/58.gif | Bin 0 -> 2258 bytes .../static/component/layui/images/face/59.gif | Bin 0 -> 10311 bytes .../static/component/layui/images/face/6.gif | Bin 0 -> 2213 bytes .../static/component/layui/images/face/60.gif | Bin 0 -> 3245 bytes .../static/component/layui/images/face/61.gif | Bin 0 -> 2495 bytes .../static/component/layui/images/face/62.gif | Bin 0 -> 2017 bytes .../static/component/layui/images/face/63.gif | Bin 0 -> 5871 bytes .../static/component/layui/images/face/64.gif | Bin 0 -> 6448 bytes .../static/component/layui/images/face/65.gif | Bin 0 -> 3576 bytes .../static/component/layui/images/face/66.gif | Bin 0 -> 3029 bytes .../static/component/layui/images/face/67.gif | Bin 0 -> 2701 bytes .../static/component/layui/images/face/68.gif | Bin 0 -> 1424 bytes .../static/component/layui/images/face/69.gif | Bin 0 -> 2431 bytes .../static/component/layui/images/face/7.gif | Bin 0 -> 3398 bytes .../static/component/layui/images/face/70.gif | Bin 0 -> 4590 bytes .../static/component/layui/images/face/71.gif | Bin 0 -> 5304 bytes .../static/component/layui/images/face/8.gif | Bin 0 -> 4050 bytes .../static/component/layui/images/face/9.gif | Bin 0 -> 4221 bytes public/static/component/layui/layui.js | 5 + .../component/pear/css/module/button.css | 174 + .../static/component/pear/css/module/card.css | 93 + .../static/component/pear/css/module/code.css | 9 + .../component/pear/css/module/cropper.css | 272 + .../component/pear/css/module/dtree/dtree.css | 112 + .../component/pear/css/module/dtree/dtree.js | 4947 + .../pear/css/module/dtree/font/dtreefont.css | 229 + .../pear/css/module/dtree/font/dtreefont.eot | Bin 0 -> 19508 bytes .../pear/css/module/dtree/font/dtreefont.svg | 80 + .../pear/css/module/dtree/font/dtreefont.ttf | Bin 0 -> 19344 bytes .../pear/css/module/dtree/font/dtreefont.woff | Bin 0 -> 19420 bytes .../pear/css/module/dtree/font/icons.json | 283 + .../static/component/pear/css/module/form.css | 63 + .../component/pear/css/module/frame.css | 158 + .../component/pear/css/module/iconPicker.css | 3 + .../component/pear/css/module/label.css | 0 .../component/pear/css/module/layer.css | 4 + .../component/pear/css/module/layout.css | 1040 + .../static/component/pear/css/module/link.css | 20 + .../component/pear/css/module/loading.css | 987 + .../static/component/pear/css/module/menu.css | 246 + .../component/pear/css/module/message.css | 42 + .../component/pear/css/module/notice.css | 228 + .../component/pear/css/module/select.css | 827 + .../static/component/pear/css/module/step.css | 88 + .../static/component/pear/css/module/tab.css | 309 + .../component/pear/css/module/table.css | 96 + .../static/component/pear/css/module/tag.css | 85 + .../component/pear/css/module/topBar.css | 5 + .../component/pear/css/module/treetable.css | 25 + .../component/pear/css/module/uploads.css | 39 + public/static/component/pear/css/pear.css | 27 + .../static/component/pear/font/iconfont.css | 579 + public/static/component/pear/font/iconfont.js | 1 + .../static/component/pear/font/iconfont.json | 996 + .../static/component/pear/font/iconfont.ttf | Bin 0 -> 33116 bytes .../static/component/pear/font/iconfont.woff | Bin 0 -> 16624 bytes .../static/component/pear/font/iconfont.woff2 | Bin 0 -> 13564 bytes public/static/component/pear/module/admin.js | 539 + public/static/component/pear/module/area.js | 4070 + public/static/component/pear/module/button.js | 53 + public/static/component/pear/module/card.js | 267 + public/static/component/pear/module/common.js | 71 + .../static/component/pear/module/context.js | 19 + .../static/component/pear/module/convert.js | 27 + public/static/component/pear/module/count.js | 37 + .../static/component/pear/module/cropper.js | 3087 + public/static/component/pear/module/design.js | 182 + public/static/component/pear/module/drawer.js | 185 + public/static/component/pear/module/dtree.js | 5538 + .../static/component/pear/module/echarts.js | 90229 ++++++++++++++++ .../component/pear/module/echartsTheme.js | 492 + public/static/component/pear/module/frame.js | 81 + public/static/component/pear/module/hash.js | 1775 + public/static/component/pear/module/http.js | 180 + .../component/pear/module/iconPicker.js | 388 + .../static/component/pear/module/loading.js | 2097 + public/static/component/pear/module/menu.js | 471 + .../static/component/pear/module/message.js | 96 + public/static/component/pear/module/notice.js | 489 + public/static/component/pear/module/popup.js | 49 + public/static/component/pear/module/select.js | 1740 + public/static/component/pear/module/step.js | 80 + public/static/component/pear/module/tab.js | 607 + public/static/component/pear/module/tag.js | 162 + public/static/component/pear/module/theme.js | 86 + .../component/pear/module/tinymce/tinymce.js | 213 + .../tinymce/tinymce/icons/default/icons.js | 172 + .../tinymce/icons/default/icons.min.js | 1 + .../module/tinymce/tinymce/langs/readme.md | 3 + .../module/tinymce/tinymce/langs/zh_CN.js | 419 + .../tinymce/tinymce/plugins/advlist/plugin.js | 278 + .../tinymce/plugins/advlist/plugin.min.js | 9 + .../tinymce/tinymce/plugins/anchor/plugin.js | 216 + .../tinymce/plugins/anchor/plugin.min.js | 9 + .../tinymce/plugins/autolink/plugin.js | 185 + .../tinymce/plugins/autolink/plugin.min.js | 9 + .../tinymce/plugins/autoresize/plugin.js | 171 + .../tinymce/plugins/autoresize/plugin.min.js | 9 + .../tinymce/plugins/autosave/plugin.js | 212 + .../tinymce/plugins/autosave/plugin.min.js | 9 + .../tinymce/tinymce/plugins/bbcode/plugin.js | 99 + .../tinymce/plugins/bbcode/plugin.min.js | 9 + .../tinymce/tinymce/plugins/charmap/plugin.js | 1706 + .../tinymce/plugins/charmap/plugin.min.js | 9 + .../tinymce/tinymce/plugins/code/plugin.js | 92 + .../tinymce/plugins/code/plugin.min.js | 9 + .../tinymce/plugins/codesample/plugin.js | 2104 + .../tinymce/plugins/codesample/plugin.min.js | 9 + .../tinymce/plugins/colorpicker/plugin.js | 22 + .../tinymce/plugins/colorpicker/plugin.min.js | 9 + .../tinymce/plugins/contextmenu/plugin.js | 22 + .../tinymce/plugins/contextmenu/plugin.min.js | 9 + .../tinymce/plugins/directionality/plugin.js | 314 + .../plugins/directionality/plugin.min.js | 9 + .../plugins/emoticons/js/emojiimages.js | 9424 ++ .../plugins/emoticons/js/emojiimages.min.js | 3 + .../tinymce/plugins/emoticons/js/emojis.js | 9423 ++ .../plugins/emoticons/js/emojis.min.js | 2 + .../tinymce/plugins/emoticons/plugin.js | 605 + .../tinymce/plugins/emoticons/plugin.min.js | 9 + .../tinymce/plugins/fullpage/plugin.js | 544 + .../tinymce/plugins/fullpage/plugin.min.js | 9 + .../tinymce/plugins/fullscreen/plugin.js | 979 + .../tinymce/plugins/fullscreen/plugin.min.js | 9 + .../tinymce/tinymce/plugins/help/plugin.js | 846 + .../tinymce/plugins/help/plugin.min.js | 9 + .../tinymce/tinymce/plugins/hr/plugin.js | 46 + .../tinymce/tinymce/plugins/hr/plugin.min.js | 9 + .../tinymce/tinymce/plugins/image/plugin.js | 1664 + .../tinymce/plugins/image/plugin.min.js | 9 + .../tinymce/plugins/imagetools/plugin.js | 1348 + .../tinymce/plugins/imagetools/plugin.min.js | 9 + .../tinymce/plugins/importcss/plugin.js | 343 + .../tinymce/plugins/importcss/plugin.min.js | 9 + .../tinymce/plugins/indent2em/plugin.js | 62 + .../tinymce/plugins/indent2em/plugin.min.js | 62 + .../tinymce/plugins/insertdatetime/plugin.js | 177 + .../plugins/insertdatetime/plugin.min.js | 9 + .../plugins/kityformula-editor/icon.svg | 3 + .../kityformula-editor/kityFormula.html | 111 + .../assets/images/scrollbar/custom/bar-bg.png | Bin 0 -> 925 bytes .../assets/images/scrollbar/custom/bar.png | Bin 0 -> 1067 bytes .../assets/images/scrollbar/custom/bg.png | Bin 0 -> 945 bytes .../assets/images/scrollbar/custom/bottom.png | Bin 0 -> 1003 bytes .../assets/images/scrollbar/custom/btn.png | Bin 0 -> 926 bytes .../assets/images/scrollbar/custom/down.png | Bin 0 -> 926 bytes .../assets/images/scrollbar/custom/top.png | Bin 0 -> 996 bytes .../assets/images/scrollbar/custom/up.png | Bin 0 -> 926 bytes .../assets/images/scrollbar/edit/bar-bg.png | Bin 0 -> 938 bytes .../assets/images/scrollbar/edit/bar-left.png | Bin 0 -> 982 bytes .../images/scrollbar/edit/bar-right.png | Bin 0 -> 994 bytes .../assets/images/scrollbar/edit/thumb-bg.png | Bin 0 -> 941 bytes .../images/scrollbar/edit/thumb-left.png | Bin 0 -> 983 bytes .../images/scrollbar/edit/thumb-right.png | Bin 0 -> 988 bytes .../images/toolbar/alphabetic/aleph.png | Bin 0 -> 559 bytes .../assets/images/toolbar/alphabetic/bbbk.png | Bin 0 -> 519 bytes .../assets/images/toolbar/alphabetic/beth.png | Bin 0 -> 317 bytes .../images/toolbar/alphabetic/circleds.png | Bin 0 -> 874 bytes .../images/toolbar/alphabetic/complement.png | Bin 0 -> 371 bytes .../images/toolbar/alphabetic/daleth.png | Bin 0 -> 305 bytes .../assets/images/toolbar/alphabetic/ell.png | Bin 0 -> 467 bytes .../assets/images/toolbar/alphabetic/eth.png | Bin 0 -> 552 bytes .../assets/images/toolbar/alphabetic/finv.png | Bin 0 -> 239 bytes .../assets/images/toolbar/alphabetic/game.png | Bin 0 -> 492 bytes .../images/toolbar/alphabetic/gimel.png | Bin 0 -> 364 bytes .../assets/images/toolbar/alphabetic/hbar.png | Bin 0 -> 516 bytes .../images/toolbar/alphabetic/hslash.png | Bin 0 -> 542 bytes .../assets/images/toolbar/alphabetic/im.png | Bin 0 -> 571 bytes .../assets/images/toolbar/alphabetic/mho.png | Bin 0 -> 573 bytes .../images/toolbar/alphabetic/partial.png | Bin 0 -> 546 bytes .../assets/images/toolbar/alphabetic/re.png | Bin 0 -> 702 bytes .../assets/images/toolbar/alphabetic/wp.png | Bin 0 -> 524 bytes .../images/toolbar/arrow/circlearrowleft.png | Bin 0 -> 337 bytes .../images/toolbar/arrow/circlearrowright.png | Bin 0 -> 351 bytes .../images/toolbar/arrow/curvearrowleft.png | Bin 0 -> 347 bytes .../images/toolbar/arrow/curvearrowright.png | Bin 0 -> 338 bytes .../assets/images/toolbar/arrow/downarrow.png | Bin 0 -> 255 bytes .../images/toolbar/arrow/downdownarrows.png | Bin 0 -> 268 bytes .../images/toolbar/arrow/downharpoonleft.png | Bin 0 -> 190 bytes .../images/toolbar/arrow/downharpoonright.png | Bin 0 -> 191 bytes .../assets/images/toolbar/arrow/gets.png | Bin 0 -> 252 bytes .../images/toolbar/arrow/leftarrowtail.png | Bin 0 -> 259 bytes .../images/toolbar/arrow/leftharpoondown.png | Bin 0 -> 186 bytes .../images/toolbar/arrow/leftharpoonup.png | Bin 0 -> 187 bytes .../images/toolbar/arrow/leftleftarrows.png | Bin 0 -> 269 bytes .../images/toolbar/arrow/leftrightarrow.png | Bin 0 -> 309 bytes .../images/toolbar/arrow/leftrightarrows.png | Bin 0 -> 294 bytes .../toolbar/arrow/leftrightharpoons.png | Bin 0 -> 268 bytes .../toolbar/arrow/leftrightsquigarrow.png | Bin 0 -> 346 bytes .../images/toolbar/arrow/longleftarrow.png | Bin 0 -> 269 bytes .../toolbar/arrow/longleftrightarrow.png | Bin 0 -> 297 bytes .../images/toolbar/arrow/longrightarrow.png | Bin 0 -> 285 bytes .../images/toolbar/arrow/looparrowleft.png | Bin 0 -> 332 bytes .../images/toolbar/arrow/looparrowright.png | Bin 0 -> 339 bytes .../assets/images/toolbar/arrow/multimap.png | Bin 0 -> 254 bytes .../assets/images/toolbar/arrow/nearrow.png | Bin 0 -> 319 bytes .../images/toolbar/arrow/nleftarrow.png | Bin 0 -> 276 bytes .../images/toolbar/arrow/nrightarrow.png | Bin 0 -> 286 bytes .../assets/images/toolbar/arrow/nwarrow.png | Bin 0 -> 324 bytes .../images/toolbar/arrow/rightarrowtail.png | Bin 0 -> 250 bytes .../images/toolbar/arrow/rightharpoondown.png | Bin 0 -> 194 bytes .../images/toolbar/arrow/rightharpoonup.png | Bin 0 -> 185 bytes .../images/toolbar/arrow/rightleftarrows.png | Bin 0 -> 278 bytes .../toolbar/arrow/rightleftharpoons.png | Bin 0 -> 277 bytes .../images/toolbar/arrow/rightrightarrows.png | Bin 0 -> 266 bytes .../images/toolbar/arrow/rightsquigarrow.png | Bin 0 -> 304 bytes .../assets/images/toolbar/arrow/searrow.png | Bin 0 -> 317 bytes .../assets/images/toolbar/arrow/swarrow.png | Bin 0 -> 292 bytes .../assets/images/toolbar/arrow/to.png | Bin 0 -> 279 bytes .../images/toolbar/arrow/twoheadleftarrow.png | Bin 0 -> 266 bytes .../toolbar/arrow/twoheadrightarrow.png | Bin 0 -> 262 bytes .../images/toolbar/arrow/u-downarrow.png | Bin 0 -> 285 bytes .../images/toolbar/arrow/u-leftarrow.png | Bin 0 -> 275 bytes .../images/toolbar/arrow/u-leftrightarrow.png | Bin 0 -> 341 bytes .../images/toolbar/arrow/u-lftarrow.png | Bin 0 -> 277 bytes .../images/toolbar/arrow/u-lleftarrow.png | Bin 0 -> 305 bytes .../images/toolbar/arrow/u-longleftarrow.png | Bin 0 -> 281 bytes .../toolbar/arrow/u-longleftrightarrow.png | Bin 0 -> 330 bytes .../images/toolbar/arrow/u-longrightarrow.png | Bin 0 -> 288 bytes .../assets/images/toolbar/arrow/u-lsh.png | Bin 0 -> 252 bytes .../images/toolbar/arrow/u-nleftarrow.png | Bin 0 -> 350 bytes .../toolbar/arrow/u-nleftrightarrow.png | Bin 0 -> 400 bytes .../images/toolbar/arrow/u-nrightarrow.png | Bin 0 -> 349 bytes .../images/toolbar/arrow/u-rightarrow.png | Bin 0 -> 292 bytes .../images/toolbar/arrow/u-rrightarrow.png | Bin 0 -> 314 bytes .../assets/images/toolbar/arrow/u-rsh.png | Bin 0 -> 255 bytes .../assets/images/toolbar/arrow/u-uparrow.png | Bin 0 -> 282 bytes .../images/toolbar/arrow/u-updownarrow.png | Bin 0 -> 338 bytes .../assets/images/toolbar/arrow/uparrow.png | Bin 0 -> 251 bytes .../images/toolbar/arrow/updownarrow.png | Bin 0 -> 302 bytes .../images/toolbar/arrow/upharpoonleft.png | Bin 0 -> 188 bytes .../images/toolbar/arrow/upharpoonright.png | Bin 0 -> 200 bytes .../images/toolbar/arrow/upuparrows.png | Bin 0 -> 281 bytes .../assets/images/toolbar/brackets/1.png | Bin 0 -> 748 bytes .../assets/images/toolbar/brackets/2.png | Bin 0 -> 634 bytes .../assets/images/toolbar/brackets/3.png | Bin 0 -> 813 bytes .../assets/images/toolbar/brackets/4.png | Bin 0 -> 635 bytes .../kityformula/assets/images/toolbar/btn.png | Bin 0 -> 6784 bytes .../assets/images/toolbar/button/brackets.png | Bin 0 -> 1284 bytes .../assets/images/toolbar/button/down.png | Bin 0 -> 979 bytes .../assets/images/toolbar/button/frac.png | Bin 0 -> 801 bytes .../assets/images/toolbar/button/fx.png | Bin 0 -> 1738 bytes .../assets/images/toolbar/button/int.png | Bin 0 -> 4273 bytes .../assets/images/toolbar/button/lim.png | Bin 0 -> 4273 bytes .../assets/images/toolbar/button/open.png | Bin 0 -> 983 bytes .../assets/images/toolbar/button/script.png | Bin 0 -> 1311 bytes .../assets/images/toolbar/button/sin.png | Bin 0 -> 1084 bytes .../assets/images/toolbar/button/sqrt.png | Bin 0 -> 1381 bytes .../assets/images/toolbar/button/sum.png | Bin 0 -> 4273 bytes .../assets/images/toolbar/button/tick.png | Bin 0 -> 2960 bytes .../assets/images/toolbar/button/up.png | Bin 0 -> 969 bytes .../assets/images/toolbar/char.png | Bin 0 -> 89633 bytes .../assets/images/toolbar/char/bb/a.png | Bin 0 -> 609 bytes .../assets/images/toolbar/char/bb/b.png | Bin 0 -> 617 bytes .../assets/images/toolbar/char/bb/c.png | Bin 0 -> 582 bytes .../assets/images/toolbar/char/bb/d.png | Bin 0 -> 525 bytes .../assets/images/toolbar/char/bb/e.png | Bin 0 -> 543 bytes .../assets/images/toolbar/char/bb/f.png | Bin 0 -> 500 bytes .../assets/images/toolbar/char/bb/g.png | Bin 0 -> 706 bytes .../assets/images/toolbar/char/bb/h.png | Bin 0 -> 537 bytes .../assets/images/toolbar/char/bb/i.png | Bin 0 -> 319 bytes .../assets/images/toolbar/char/bb/j.png | Bin 0 -> 388 bytes .../assets/images/toolbar/char/bb/k.png | Bin 0 -> 719 bytes .../assets/images/toolbar/char/bb/l.png | Bin 0 -> 376 bytes .../assets/images/toolbar/char/bb/m.png | Bin 0 -> 778 bytes .../assets/images/toolbar/char/bb/n.png | Bin 0 -> 644 bytes .../assets/images/toolbar/char/bb/o.png | Bin 0 -> 680 bytes .../assets/images/toolbar/char/bb/p.png | Bin 0 -> 483 bytes .../assets/images/toolbar/char/bb/q.png | Bin 0 -> 825 bytes .../assets/images/toolbar/char/bb/r.png | Bin 0 -> 579 bytes .../assets/images/toolbar/char/bb/s.png | Bin 0 -> 665 bytes .../assets/images/toolbar/char/bb/t.png | Bin 0 -> 448 bytes .../assets/images/toolbar/char/bb/u.png | Bin 0 -> 468 bytes .../assets/images/toolbar/char/bb/v.png | Bin 0 -> 580 bytes .../assets/images/toolbar/char/bb/w.png | Bin 0 -> 861 bytes .../assets/images/toolbar/char/bb/x.png | Bin 0 -> 709 bytes .../assets/images/toolbar/char/bb/y.png | Bin 0 -> 556 bytes .../assets/images/toolbar/char/bb/z.png | Bin 0 -> 565 bytes .../assets/images/toolbar/char/cal/a.png | Bin 0 -> 499 bytes .../assets/images/toolbar/char/cal/b.png | Bin 0 -> 599 bytes .../assets/images/toolbar/char/cal/c.png | Bin 0 -> 482 bytes .../assets/images/toolbar/char/cal/d.png | Bin 0 -> 581 bytes .../assets/images/toolbar/char/cal/e.png | Bin 0 -> 471 bytes .../assets/images/toolbar/char/cal/f.png | Bin 0 -> 483 bytes .../assets/images/toolbar/char/cal/g.png | Bin 0 -> 579 bytes .../assets/images/toolbar/char/cal/h.png | Bin 0 -> 599 bytes .../assets/images/toolbar/char/cal/i.png | Bin 0 -> 467 bytes .../assets/images/toolbar/char/cal/j.png | Bin 0 -> 531 bytes .../assets/images/toolbar/char/cal/k.png | Bin 0 -> 600 bytes .../assets/images/toolbar/char/cal/l.png | Bin 0 -> 493 bytes .../assets/images/toolbar/char/cal/m.png | Bin 0 -> 722 bytes .../assets/images/toolbar/char/cal/n.png | Bin 0 -> 623 bytes .../assets/images/toolbar/char/cal/o.png | Bin 0 -> 597 bytes .../assets/images/toolbar/char/cal/p.png | Bin 0 -> 581 bytes .../assets/images/toolbar/char/cal/q.png | Bin 0 -> 663 bytes .../assets/images/toolbar/char/cal/r.png | Bin 0 -> 641 bytes .../assets/images/toolbar/char/cal/s.png | Bin 0 -> 527 bytes .../assets/images/toolbar/char/cal/t.png | Bin 0 -> 431 bytes .../assets/images/toolbar/char/cal/u.png | Bin 0 -> 603 bytes .../assets/images/toolbar/char/cal/v.png | Bin 0 -> 518 bytes .../assets/images/toolbar/char/cal/w.png | Bin 0 -> 759 bytes .../assets/images/toolbar/char/cal/x.png | Bin 0 -> 546 bytes .../assets/images/toolbar/char/cal/y.png | Bin 0 -> 559 bytes .../assets/images/toolbar/char/cal/z.png | Bin 0 -> 559 bytes .../assets/images/toolbar/char/frak/a.png | Bin 0 -> 393 bytes .../assets/images/toolbar/char/frak/b.png | Bin 0 -> 438 bytes .../assets/images/toolbar/char/frak/c.png | Bin 0 -> 330 bytes .../assets/images/toolbar/char/frak/d.png | Bin 0 -> 445 bytes .../assets/images/toolbar/char/frak/e.png | Bin 0 -> 356 bytes .../assets/images/toolbar/char/frak/f.png | Bin 0 -> 392 bytes .../assets/images/toolbar/char/frak/g.png | Bin 0 -> 480 bytes .../assets/images/toolbar/char/frak/h.png | Bin 0 -> 476 bytes .../assets/images/toolbar/char/frak/i.png | Bin 0 -> 296 bytes .../assets/images/toolbar/char/frak/j.png | Bin 0 -> 320 bytes .../assets/images/toolbar/char/frak/k.png | Bin 0 -> 448 bytes .../assets/images/toolbar/char/frak/l.png | Bin 0 -> 312 bytes .../assets/images/toolbar/char/frak/m.png | Bin 0 -> 450 bytes .../assets/images/toolbar/char/frak/n.png | Bin 0 -> 382 bytes .../assets/images/toolbar/char/frak/o.png | Bin 0 -> 382 bytes .../assets/images/toolbar/char/frak/p.png | Bin 0 -> 462 bytes .../assets/images/toolbar/char/frak/q.png | Bin 0 -> 439 bytes .../assets/images/toolbar/char/frak/r.png | Bin 0 -> 328 bytes .../assets/images/toolbar/char/frak/s.png | Bin 0 -> 405 bytes .../assets/images/toolbar/char/frak/t.png | Bin 0 -> 296 bytes .../assets/images/toolbar/char/frak/u.png | Bin 0 -> 389 bytes .../assets/images/toolbar/char/frak/ua.png | Bin 0 -> 653 bytes .../assets/images/toolbar/char/frak/ub.png | Bin 0 -> 707 bytes .../assets/images/toolbar/char/frak/uc.png | Bin 0 -> 517 bytes .../assets/images/toolbar/char/frak/ud.png | Bin 0 -> 658 bytes .../assets/images/toolbar/char/frak/ue.png | Bin 0 -> 566 bytes .../assets/images/toolbar/char/frak/uf.png | Bin 0 -> 616 bytes .../assets/images/toolbar/char/frak/ug.png | Bin 0 -> 662 bytes .../assets/images/toolbar/char/frak/uh.png | Bin 0 -> 574 bytes .../assets/images/toolbar/char/frak/ui.png | Bin 0 -> 483 bytes .../assets/images/toolbar/char/frak/uj.png | Bin 0 -> 533 bytes .../assets/images/toolbar/char/frak/uk.png | Bin 0 -> 577 bytes .../assets/images/toolbar/char/frak/ul.png | Bin 0 -> 537 bytes .../assets/images/toolbar/char/frak/um.png | Bin 0 -> 827 bytes .../assets/images/toolbar/char/frak/un.png | Bin 0 -> 686 bytes .../assets/images/toolbar/char/frak/uo.png | Bin 0 -> 606 bytes .../assets/images/toolbar/char/frak/up.png | Bin 0 -> 685 bytes .../assets/images/toolbar/char/frak/uq.png | Bin 0 -> 606 bytes .../assets/images/toolbar/char/frak/ur.png | Bin 0 -> 690 bytes .../assets/images/toolbar/char/frak/us.png | Bin 0 -> 674 bytes .../assets/images/toolbar/char/frak/ut.png | Bin 0 -> 562 bytes .../assets/images/toolbar/char/frak/uu.png | Bin 0 -> 532 bytes .../assets/images/toolbar/char/frak/uv.png | Bin 0 -> 696 bytes .../assets/images/toolbar/char/frak/uw.png | Bin 0 -> 847 bytes .../assets/images/toolbar/char/frak/ux.png | Bin 0 -> 575 bytes .../assets/images/toolbar/char/frak/uy.png | Bin 0 -> 726 bytes .../assets/images/toolbar/char/frak/uz.png | Bin 0 -> 527 bytes .../assets/images/toolbar/char/frak/v.png | Bin 0 -> 423 bytes .../assets/images/toolbar/char/frak/w.png | Bin 0 -> 496 bytes .../assets/images/toolbar/char/frak/x.png | Bin 0 -> 405 bytes .../assets/images/toolbar/char/frak/y.png | Bin 0 -> 450 bytes .../assets/images/toolbar/char/frak/z.png | Bin 0 -> 435 bytes .../images/toolbar/char/greek/lower/alpha.png | Bin 0 -> 339 bytes .../images/toolbar/char/greek/lower/beta.png | Bin 0 -> 382 bytes .../images/toolbar/char/greek/lower/chi.png | Bin 0 -> 344 bytes .../images/toolbar/char/greek/lower/delta.png | Bin 0 -> 329 bytes .../toolbar/char/greek/lower/epsilon.png | Bin 0 -> 265 bytes .../images/toolbar/char/greek/lower/eta.png | Bin 0 -> 311 bytes .../images/toolbar/char/greek/lower/gamma.png | Bin 0 -> 303 bytes .../images/toolbar/char/greek/lower/iota.png | Bin 0 -> 250 bytes .../images/toolbar/char/greek/lower/kappa.png | Bin 0 -> 304 bytes .../toolbar/char/greek/lower/lambda.png | Bin 0 -> 309 bytes .../images/toolbar/char/greek/lower/mu.png | Bin 0 -> 309 bytes .../images/toolbar/char/greek/lower/nu.png | Bin 0 -> 287 bytes .../images/toolbar/char/greek/lower/omega.png | Bin 0 -> 307 bytes .../toolbar/char/greek/lower/omicron.png | Bin 0 -> 298 bytes .../images/toolbar/char/greek/lower/phi.png | Bin 0 -> 369 bytes .../images/toolbar/char/greek/lower/pi.png | Bin 0 -> 276 bytes .../images/toolbar/char/greek/lower/psi.png | Bin 0 -> 362 bytes .../images/toolbar/char/greek/lower/rho.png | Bin 0 -> 328 bytes .../images/toolbar/char/greek/lower/sigma.png | Bin 0 -> 288 bytes .../images/toolbar/char/greek/lower/tau.png | Bin 0 -> 255 bytes .../images/toolbar/char/greek/lower/theta.png | Bin 0 -> 370 bytes .../toolbar/char/greek/lower/upsilon.png | Bin 0 -> 312 bytes .../images/toolbar/char/greek/lower/xi.png | Bin 0 -> 358 bytes .../images/toolbar/char/greek/lower/zeta.png | Bin 0 -> 322 bytes .../toolbar/char/greek/misc/digamma.png | Bin 0 -> 336 bytes .../toolbar/char/greek/misc/varepsilon.png | Bin 0 -> 375 bytes .../toolbar/char/greek/misc/varkappa.png | Bin 0 -> 446 bytes .../images/toolbar/char/greek/misc/varphi.png | Bin 0 -> 520 bytes .../images/toolbar/char/greek/misc/varpi.png | Bin 0 -> 476 bytes .../images/toolbar/char/greek/misc/varrho.png | Bin 0 -> 503 bytes .../toolbar/char/greek/misc/varsigma.png | Bin 0 -> 360 bytes .../toolbar/char/greek/misc/vartheta.png | Bin 0 -> 532 bytes .../images/toolbar/char/greek/upper/alpha.png | Bin 0 -> 349 bytes .../images/toolbar/char/greek/upper/beta.png | Bin 0 -> 326 bytes .../images/toolbar/char/greek/upper/chi.png | Bin 0 -> 364 bytes .../images/toolbar/char/greek/upper/delta.png | Bin 0 -> 332 bytes .../toolbar/char/greek/upper/epsilon.png | Bin 0 -> 319 bytes .../images/toolbar/char/greek/upper/eta.png | Bin 0 -> 265 bytes .../images/toolbar/char/greek/upper/gamma.png | Bin 0 -> 255 bytes .../images/toolbar/char/greek/upper/iota.png | Bin 0 -> 223 bytes .../images/toolbar/char/greek/upper/kappa.png | Bin 0 -> 364 bytes .../toolbar/char/greek/upper/lambda.png | Bin 0 -> 324 bytes .../images/toolbar/char/greek/upper/mu.png | Bin 0 -> 372 bytes .../images/toolbar/char/greek/upper/nu.png | Bin 0 -> 353 bytes .../images/toolbar/char/greek/upper/omega.png | Bin 0 -> 409 bytes .../toolbar/char/greek/upper/omicron.png | Bin 0 -> 370 bytes .../images/toolbar/char/greek/upper/phi.png | Bin 0 -> 364 bytes .../images/toolbar/char/greek/upper/pi.png | Bin 0 -> 250 bytes .../images/toolbar/char/greek/upper/psi.png | Bin 0 -> 344 bytes .../images/toolbar/char/greek/upper/rho.png | Bin 0 -> 293 bytes .../images/toolbar/char/greek/upper/sigma.png | Bin 0 -> 342 bytes .../images/toolbar/char/greek/upper/tau.png | Bin 0 -> 285 bytes .../images/toolbar/char/greek/upper/theta.png | Bin 0 -> 392 bytes .../toolbar/char/greek/upper/upsilon.png | Bin 0 -> 297 bytes .../images/toolbar/char/greek/upper/xi.png | Bin 0 -> 258 bytes .../images/toolbar/char/greek/upper/zeta.png | Bin 0 -> 364 bytes .../assets/images/toolbar/char/math/aleph.png | Bin 0 -> 551 bytes .../images/toolbar/char/math/approx.png | Bin 0 -> 494 bytes .../assets/images/toolbar/char/math/ast.png | Bin 0 -> 363 bytes .../images/toolbar/char/math/baifenhao.png | Bin 0 -> 690 bytes .../images/toolbar/char/math/because.png | Bin 0 -> 262 bytes .../assets/images/toolbar/char/math/beth.png | Bin 0 -> 324 bytes .../images/toolbar/char/math/blacksquare.png | Bin 0 -> 194 bytes .../assets/images/toolbar/char/math/cap.png | Bin 0 -> 318 bytes .../assets/images/toolbar/char/math/cdot.png | Bin 0 -> 187 bytes .../assets/images/toolbar/char/math/circ.png | Bin 0 -> 362 bytes .../assets/images/toolbar/char/math/cong.png | Bin 0 -> 424 bytes .../assets/images/toolbar/char/math/cup.png | Bin 0 -> 313 bytes .../assets/images/toolbar/char/math/ddots.png | Bin 0 -> 275 bytes .../assets/images/toolbar/char/math/div.png | Bin 0 -> 227 bytes .../images/toolbar/char/math/downarrow.png | Bin 0 -> 320 bytes .../assets/images/toolbar/char/math/eq.png | Bin 0 -> 176 bytes .../assets/images/toolbar/char/math/equiv.png | Bin 0 -> 221 bytes .../images/toolbar/char/math/exists.png | Bin 0 -> 272 bytes .../images/toolbar/char/math/forall.png | Bin 0 -> 444 bytes .../assets/images/toolbar/char/math/geq.png | Bin 0 -> 310 bytes .../assets/images/toolbar/char/math/gets.png | Bin 0 -> 325 bytes .../assets/images/toolbar/char/math/gg.png | Bin 0 -> 334 bytes .../assets/images/toolbar/char/math/gt.png | Bin 0 -> 278 bytes .../assets/images/toolbar/char/math/in.png | Bin 0 -> 368 bytes .../assets/images/toolbar/char/math/infty.png | Bin 0 -> 399 bytes .../toolbar/char/math/leftrightarrow.png | Bin 0 -> 448 bytes .../assets/images/toolbar/char/math/leq.png | Bin 0 -> 288 bytes .../assets/images/toolbar/char/math/ll.png | Bin 0 -> 340 bytes .../assets/images/toolbar/char/math/lt.png | Bin 0 -> 278 bytes .../assets/images/toolbar/char/math/minus.png | Bin 0 -> 190 bytes .../assets/images/toolbar/char/math/mp.png | Bin 0 -> 225 bytes .../assets/images/toolbar/char/math/neg.png | Bin 0 -> 223 bytes .../images/toolbar/char/math/nexists.png | Bin 0 -> 508 bytes .../assets/images/toolbar/char/math/ni.png | Bin 0 -> 373 bytes .../images/toolbar/char/math/partial.png | Bin 0 -> 551 bytes .../assets/images/toolbar/char/math/plus.png | Bin 0 -> 265 bytes .../assets/images/toolbar/char/math/pm.png | Bin 0 -> 234 bytes .../images/toolbar/char/math/propto.png | Bin 0 -> 489 bytes .../assets/images/toolbar/char/math/sim.png | Bin 0 -> 261 bytes .../assets/images/toolbar/char/math/simeq.png | Bin 0 -> 307 bytes .../assets/images/toolbar/char/math/surd.png | Bin 0 -> 477 bytes .../images/toolbar/char/math/tanhao.png | Bin 0 -> 216 bytes .../images/toolbar/char/math/therefore.png | Bin 0 -> 253 bytes .../assets/images/toolbar/char/math/times.png | Bin 0 -> 245 bytes .../assets/images/toolbar/char/math/to.png | Bin 0 -> 333 bytes .../images/toolbar/char/math/uparrow.png | Bin 0 -> 320 bytes .../images/toolbar/char/math/varnothing.png | Bin 0 -> 584 bytes .../assets/images/toolbar/char/math/vdots.png | Bin 0 -> 266 bytes .../assets/images/toolbar/char/not/gneqq.png | Bin 0 -> 408 bytes .../assets/images/toolbar/char/not/gnsim.png | Bin 0 -> 443 bytes .../assets/images/toolbar/char/not/lneqq.png | Bin 0 -> 411 bytes .../assets/images/toolbar/char/not/lnsim.png | Bin 0 -> 447 bytes .../images/toolbar/char/not/nbdash-1.png | Bin 0 -> 289 bytes .../assets/images/toolbar/char/not/ncong.png | Bin 0 -> 658 bytes .../assets/images/toolbar/char/not/neq.png | Bin 0 -> 415 bytes .../assets/images/toolbar/char/not/nequiv.png | Bin 0 -> 463 bytes .../images/toolbar/char/not/nexists.png | Bin 0 -> 317 bytes .../assets/images/toolbar/char/not/ngeq.png | Bin 0 -> 526 bytes .../assets/images/toolbar/char/not/ngtr.png | Bin 0 -> 432 bytes .../assets/images/toolbar/char/not/nleq.png | Bin 0 -> 515 bytes .../assets/images/toolbar/char/not/nless.png | Bin 0 -> 518 bytes .../assets/images/toolbar/char/not/nmid.png | Bin 0 -> 245 bytes .../assets/images/toolbar/char/not/notin.png | Bin 0 -> 383 bytes .../images/toolbar/char/not/nparallel.png | Bin 0 -> 253 bytes .../assets/images/toolbar/char/not/nprec.png | Bin 0 -> 353 bytes .../assets/images/toolbar/char/not/nsim.png | Bin 0 -> 468 bytes .../images/toolbar/char/not/nsubseteq.png | Bin 0 -> 401 bytes .../assets/images/toolbar/char/not/nsucc.png | Bin 0 -> 367 bytes .../images/toolbar/char/not/nsupseteq.png | Bin 0 -> 400 bytes .../images/toolbar/char/not/ntriangleleft.png | Bin 0 -> 409 bytes .../toolbar/char/not/ntrianglelefteq.png | Bin 0 -> 455 bytes .../toolbar/char/not/ntriangleright.png | Bin 0 -> 406 bytes .../toolbar/char/not/ntrianglerighteq.png | Bin 0 -> 440 bytes .../images/toolbar/char/not/nvdash-1.png | Bin 0 -> 321 bytes .../images/toolbar/char/not/nvdash-2.png | Bin 0 -> 342 bytes .../images/toolbar/char/not/nvdash-3.png | Bin 0 -> 340 bytes .../assets/images/toolbar/char/not/nvdash.png | Bin 0 -> 289 bytes .../images/toolbar/char/not/precnsim.png | Bin 0 -> 426 bytes .../images/toolbar/char/not/subsetneq.png | Bin 0 -> 339 bytes .../images/toolbar/char/not/succnsim.png | Bin 0 -> 465 bytes .../images/toolbar/char/not/supsetneq.png | Bin 0 -> 330 bytes .../assets/images/toolbar/char/rm/a.png | Bin 0 -> 303 bytes .../assets/images/toolbar/char/rm/b.png | Bin 0 -> 291 bytes .../assets/images/toolbar/char/rm/c.png | Bin 0 -> 291 bytes .../assets/images/toolbar/char/rm/d.png | Bin 0 -> 308 bytes .../assets/images/toolbar/char/rm/e.png | Bin 0 -> 311 bytes .../assets/images/toolbar/char/rm/f.png | Bin 0 -> 246 bytes .../assets/images/toolbar/char/rm/g.png | Bin 0 -> 354 bytes .../assets/images/toolbar/char/rm/h.png | Bin 0 -> 245 bytes .../assets/images/toolbar/char/rm/i.png | Bin 0 -> 208 bytes .../assets/images/toolbar/char/rm/j.png | Bin 0 -> 226 bytes .../assets/images/toolbar/char/rm/k.png | Bin 0 -> 301 bytes .../assets/images/toolbar/char/rm/l.png | Bin 0 -> 183 bytes .../assets/images/toolbar/char/rm/m.png | Bin 0 -> 288 bytes .../assets/images/toolbar/char/rm/n.png | Bin 0 -> 239 bytes .../assets/images/toolbar/char/rm/o.png | Bin 0 -> 308 bytes .../assets/images/toolbar/char/rm/p.png | Bin 0 -> 298 bytes .../assets/images/toolbar/char/rm/q.png | Bin 0 -> 314 bytes .../assets/images/toolbar/char/rm/r.png | Bin 0 -> 227 bytes .../assets/images/toolbar/char/rm/s.png | Bin 0 -> 296 bytes .../assets/images/toolbar/char/rm/t.png | Bin 0 -> 242 bytes .../assets/images/toolbar/char/rm/u.png | Bin 0 -> 259 bytes .../assets/images/toolbar/char/rm/ua.png | Bin 0 -> 343 bytes .../assets/images/toolbar/char/rm/ub.png | Bin 0 -> 363 bytes .../assets/images/toolbar/char/rm/uc.png | Bin 0 -> 378 bytes .../assets/images/toolbar/char/rm/ud.png | Bin 0 -> 310 bytes .../assets/images/toolbar/char/rm/ue.png | Bin 0 -> 308 bytes .../assets/images/toolbar/char/rm/uf.png | Bin 0 -> 260 bytes .../assets/images/toolbar/char/rm/ug.png | Bin 0 -> 394 bytes .../assets/images/toolbar/char/rm/uh.png | Bin 0 -> 266 bytes .../assets/images/toolbar/char/rm/ui.png | Bin 0 -> 212 bytes .../assets/images/toolbar/char/rm/uj.png | Bin 0 -> 242 bytes .../assets/images/toolbar/char/rm/uk.png | Bin 0 -> 345 bytes .../assets/images/toolbar/char/rm/ul.png | Bin 0 -> 228 bytes .../assets/images/toolbar/char/rm/um.png | Bin 0 -> 368 bytes .../assets/images/toolbar/char/rm/un.png | Bin 0 -> 338 bytes .../assets/images/toolbar/char/rm/uo.png | Bin 0 -> 371 bytes .../assets/images/toolbar/char/rm/up.png | Bin 0 -> 280 bytes .../assets/images/toolbar/char/rm/uq.png | Bin 0 -> 425 bytes .../assets/images/toolbar/char/rm/ur.png | Bin 0 -> 336 bytes .../assets/images/toolbar/char/rm/us.png | Bin 0 -> 363 bytes .../assets/images/toolbar/char/rm/ut.png | Bin 0 -> 259 bytes .../assets/images/toolbar/char/rm/uu.png | Bin 0 -> 297 bytes .../assets/images/toolbar/char/rm/uv.png | Bin 0 -> 361 bytes .../assets/images/toolbar/char/rm/uw.png | Bin 0 -> 442 bytes .../assets/images/toolbar/char/rm/ux.png | Bin 0 -> 374 bytes .../assets/images/toolbar/char/rm/uy.png | Bin 0 -> 341 bytes .../assets/images/toolbar/char/rm/uz.png | Bin 0 -> 366 bytes .../assets/images/toolbar/char/rm/v.png | Bin 0 -> 301 bytes .../assets/images/toolbar/char/rm/w.png | Bin 0 -> 339 bytes .../assets/images/toolbar/char/rm/x.png | Bin 0 -> 303 bytes .../assets/images/toolbar/char/rm/y.png | Bin 0 -> 329 bytes .../assets/images/toolbar/char/rm/z.png | Bin 0 -> 292 bytes .../assets/images/toolbar/frac/1.png | Bin 0 -> 965 bytes .../assets/images/toolbar/frac/2.png | Bin 0 -> 669 bytes .../assets/images/toolbar/frac/3.png | Bin 0 -> 596 bytes .../assets/images/toolbar/frac/c1.png | Bin 0 -> 1115 bytes .../assets/images/toolbar/frac/c2.png | Bin 0 -> 1077 bytes .../assets/images/toolbar/frac/c4.png | Bin 0 -> 1124 bytes .../assets/images/toolbar/frac/c5.png | Bin 0 -> 651 bytes .../assets/images/toolbar/func/1.png | Bin 0 -> 918 bytes .../assets/images/toolbar/func/2.png | Bin 0 -> 952 bytes .../assets/images/toolbar/func/3.png | Bin 0 -> 931 bytes .../assets/images/toolbar/func/4.png | Bin 0 -> 880 bytes .../assets/images/toolbar/func/5.png | Bin 0 -> 904 bytes .../assets/images/toolbar/func/6.png | Bin 0 -> 893 bytes .../assets/images/toolbar/func/c1.png | Bin 0 -> 857 bytes .../assets/images/toolbar/func/c2.png | Bin 0 -> 1003 bytes .../assets/images/toolbar/func/c3.png | Bin 0 -> 2532 bytes .../assets/images/toolbar/int/1.png | Bin 0 -> 873 bytes .../assets/images/toolbar/int/2.png | Bin 0 -> 1148 bytes .../assets/images/toolbar/int/3.png | Bin 0 -> 1151 bytes .../assets/images/toolbar/int/4.png | Bin 0 -> 1406 bytes .../assets/images/toolbar/int/5.png | Bin 0 -> 1486 bytes .../assets/images/toolbar/int/6.png | Bin 0 -> 1376 bytes .../assets/images/toolbar/large/1.png | Bin 0 -> 889 bytes .../assets/images/toolbar/large/2.png | Bin 0 -> 1221 bytes .../assets/images/toolbar/large/3.png | Bin 0 -> 988 bytes .../assets/images/toolbar/other.png | Bin 0 -> 40838 bytes .../assets/images/toolbar/script/1.png | Bin 0 -> 445 bytes .../assets/images/toolbar/script/2.png | Bin 0 -> 464 bytes .../assets/images/toolbar/script/3.png | Bin 0 -> 507 bytes .../assets/images/toolbar/script/4.png | Bin 0 -> 596 bytes .../assets/images/toolbar/script/c1.png | Bin 0 -> 829 bytes .../assets/images/toolbar/script/c2.png | Bin 0 -> 626 bytes .../assets/images/toolbar/script/c3.png | Bin 0 -> 753 bytes .../assets/images/toolbar/sqrt/1.png | Bin 0 -> 800 bytes .../assets/images/toolbar/sqrt/2.png | Bin 0 -> 916 bytes .../assets/images/toolbar/sqrt/3.png | Bin 0 -> 894 bytes .../assets/images/toolbar/sqrt/4.png | Bin 0 -> 916 bytes .../assets/images/toolbar/sqrt/c1.png | Bin 0 -> 2614 bytes .../assets/images/toolbar/sqrt/c2.png | Bin 0 -> 1794 bytes .../assets/images/toolbar/ys/1.png | Bin 0 -> 1927 bytes .../assets/images/toolbar/ys/2.png | Bin 0 -> 2553 bytes .../assets/images/toolbar/ys/3.png | Bin 0 -> 1200 bytes .../kityformula/assets/styles/base.css | 40 + .../kityformula/assets/styles/page.css | 12 + .../kityformula/assets/styles/scrollbar.css | 78 + .../kityformula/assets/styles/ui.css | 536 + .../kityformula/assets/theme/default/fui.css | 540 + .../assets/theme/default/fui.min.css | 10 + .../assets/theme/default/images/close.png | Bin 0 -> 836 bytes .../assets/theme/default/images/down.png | Bin 0 -> 1089 bytes .../assets/theme/default/images/open.png | Bin 0 -> 859 bytes .../assets/theme/default/images/up.png | Bin 0 -> 1080 bytes .../kityformula/js/jquery-3.6.0.min.js | 2 + .../js/kity-formula-parser.all.min.js | 9 + .../kityformula/js/kity-formula-render.all.js | 5757 + .../js/kityformula-editor.all.min.js | 12 + .../kityformula/js/kitygraph.all.js | 8572 ++ .../kityformula/loading.gif | Bin 0 -> 1787 bytes .../kityformula/resource/KF_AMS_BB.woff | Bin 0 -> 5764 bytes .../kityformula/resource/KF_AMS_CAL.woff | Bin 0 -> 5576 bytes .../kityformula/resource/KF_AMS_FRAK.woff | Bin 0 -> 9956 bytes .../kityformula/resource/KF_AMS_MAIN.woff | Bin 0 -> 52540 bytes .../kityformula/resource/KF_AMS_ROMAN.woff | Bin 0 -> 6560 bytes .../plugins/kityformula-editor/plugin.js | 72 + .../plugins/kityformula-editor/plugin.min.js | 72 + .../tinymce/plugins/legacyoutput/plugin.js | 199 + .../plugins/legacyoutput/plugin.min.js | 9 + .../tinymce/tinymce/plugins/link/plugin.js | 1290 + .../tinymce/plugins/link/plugin.min.js | 9 + .../tinymce/tinymce/plugins/lists/plugin.js | 2148 + .../tinymce/plugins/lists/plugin.min.js | 9 + .../tinymce/tinymce/plugins/media/plugin.js | 1315 + .../tinymce/plugins/media/plugin.min.js | 9 + .../tinymce/plugins/nonbreaking/plugin.js | 101 + .../tinymce/plugins/nonbreaking/plugin.min.js | 9 + .../tinymce/plugins/noneditable/plugin.js | 117 + .../tinymce/plugins/noneditable/plugin.min.js | 9 + .../tinymce/plugins/pagebreak/plugin.js | 107 + .../tinymce/plugins/pagebreak/plugin.min.js | 9 + .../tinymce/tinymce/plugins/paste/plugin.js | 1764 + .../tinymce/plugins/paste/plugin.min.js | 9 + .../tinymce/tinymce/plugins/preview/plugin.js | 127 + .../tinymce/plugins/preview/plugin.min.js | 9 + .../tinymce/tinymce/plugins/print/plugin.js | 53 + .../tinymce/plugins/print/plugin.min.js | 9 + .../tinymce/plugins/quickbars/plugin.js | 491 + .../tinymce/plugins/quickbars/plugin.min.js | 9 + .../tinymce/tinymce/plugins/save/plugin.js | 119 + .../tinymce/plugins/save/plugin.min.js | 9 + .../tinymce/plugins/searchreplace/plugin.js | 1163 + .../plugins/searchreplace/plugin.min.js | 9 + .../tinymce/plugins/spellchecker/plugin.js | 737 + .../plugins/spellchecker/plugin.min.js | 9 + .../tinymce/plugins/tabfocus/plugin.js | 129 + .../tinymce/plugins/tabfocus/plugin.min.js | 9 + .../tinymce/tinymce/plugins/table/plugin.js | 10495 ++ .../tinymce/plugins/table/plugin.min.js | 9 + .../tinymce/plugins/template/plugin.js | 577 + .../tinymce/plugins/template/plugin.min.js | 9 + .../tinymce/plugins/textcolor/plugin.js | 22 + .../tinymce/plugins/textcolor/plugin.min.js | 9 + .../tinymce/plugins/textpattern/plugin.js | 1390 + .../tinymce/plugins/textpattern/plugin.min.js | 9 + .../tinymce/tinymce/plugins/toc/plugin.js | 236 + .../tinymce/tinymce/plugins/toc/plugin.min.js | 9 + .../tinymce/plugins/visualblocks/plugin.js | 104 + .../plugins/visualblocks/plugin.min.js | 9 + .../tinymce/plugins/visualchars/plugin.js | 541 + .../tinymce/plugins/visualchars/plugin.min.js | 9 + .../tinymce/plugins/wordcount/plugin.js | 417 + .../tinymce/plugins/wordcount/plugin.min.js | 9 + .../tinymce/skins/content/dark/content.css | 72 + .../skins/content/dark/content.min.css | 8 + .../skins/content/dark/content.min.css.map | 1 + .../tinymce/skins/content/default/content.css | 67 + .../skins/content/default/content.min.css | 8 + .../skins/content/default/content.min.css.map | 1 + .../skins/content/document/content.css | 72 + .../skins/content/document/content.min.css | 8 + .../content/document/content.min.css.map | 1 + .../tinymce/skins/content/writer/content.css | 68 + .../skins/content/writer/content.min.css | 8 + .../skins/content/writer/content.min.css.map | 1 + .../tinymce/skins/ui/oxide-dark/content.css | 710 + .../skins/ui/oxide-dark/content.inline.css | 722 + .../ui/oxide-dark/content.inline.min.css | 8 + .../ui/oxide-dark/content.inline.min.css.map | 1 + .../skins/ui/oxide-dark/content.min.css | 8 + .../skins/ui/oxide-dark/content.min.css.map | 1 + .../skins/ui/oxide-dark/content.mobile.css | 29 + .../ui/oxide-dark/content.mobile.min.css | 8 + .../ui/oxide-dark/content.mobile.min.css.map | 1 + .../ui/oxide-dark/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../tinymce/skins/ui/oxide-dark/skin.css | 3024 + .../tinymce/skins/ui/oxide-dark/skin.min.css | 8 + .../skins/ui/oxide-dark/skin.min.css.map | 1 + .../skins/ui/oxide-dark/skin.mobile.css | 673 + .../skins/ui/oxide-dark/skin.mobile.min.css | 8 + .../ui/oxide-dark/skin.mobile.min.css.map | 1 + .../skins/ui/oxide-dark/skin.shadowdom.css | 36 + .../ui/oxide-dark/skin.shadowdom.min.css | 8 + .../ui/oxide-dark/skin.shadowdom.min.css.map | 1 + .../tinymce/skins/ui/oxide/content.css | 728 + .../tinymce/skins/ui/oxide/content.inline.css | 722 + .../skins/ui/oxide/content.inline.min.css | 8 + .../skins/ui/oxide/content.inline.min.css.map | 1 + .../tinymce/skins/ui/oxide/content.min.css | 8 + .../skins/ui/oxide/content.min.css.map | 1 + .../tinymce/skins/ui/oxide/content.mobile.css | 29 + .../skins/ui/oxide/content.mobile.min.css | 8 + .../skins/ui/oxide/content.mobile.min.css.map | 1 + .../skins/ui/oxide/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../tinymce/tinymce/skins/ui/oxide/skin.css | 3024 + .../tinymce/skins/ui/oxide/skin.min.css | 8 + .../tinymce/skins/ui/oxide/skin.min.css.map | 1 + .../tinymce/skins/ui/oxide/skin.mobile.css | 673 + .../skins/ui/oxide/skin.mobile.min.css | 8 + .../skins/ui/oxide/skin.mobile.min.css.map | 1 + .../tinymce/skins/ui/oxide/skin.shadowdom.css | 36 + .../skins/ui/oxide/skin.shadowdom.min.css | 8 + .../skins/ui/oxide/skin.shadowdom.min.css.map | 1 + .../tinymce/tinymce/themes/mobile/theme.js | 13592 +++ .../tinymce/themes/mobile/theme.min.js | 9 + .../tinymce/tinymce/themes/silver/theme.js | 32458 ++++++ .../tinymce/themes/silver/theme.min.js | 9 + .../pear/module/tinymce/tinymce/tinymce.js | 29786 +++++ .../module/tinymce/tinymce/tinymce.min.js | 9 + public/static/component/pear/module/topBar.js | 13 + .../static/component/pear/module/treetable.js | 221 + .../static/component/pear/module/uploads.js | 70 + public/static/component/pear/module/yaml.js | 2059 + public/static/component/pear/pear.js | 44 + public/static/forget_pwd_template.html | 98 + route/route.php | 24 + runtime/.gitignore | 2 + skpan.sql | 506 + think | 22 + 部署流程.txt | 16 + 1270 files changed, 405680 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 application/.htaccess create mode 100644 application/admin/controller/Auth.php create mode 100644 application/admin/controller/Certify.php create mode 100644 application/admin/controller/Dashboard.php create mode 100644 application/admin/controller/File.php create mode 100644 application/admin/controller/Group.php create mode 100644 application/admin/controller/Index.php create mode 100644 application/admin/controller/Order.php create mode 100644 application/admin/controller/Policy.php create mode 100644 application/admin/controller/Recycle.php create mode 100644 application/admin/controller/Report.php create mode 100644 application/admin/controller/Setting.php create mode 100644 application/admin/controller/User.php create mode 100644 application/admin/controller/Withdraw.php create mode 100644 application/admin/view/auth/login.html create mode 100644 application/admin/view/certify/index.html create mode 100644 application/admin/view/dashboard/index.html create mode 100644 application/admin/view/file/index.html create mode 100644 application/admin/view/file/info.html create mode 100644 application/admin/view/group/add.html create mode 100644 application/admin/view/group/edit.html create mode 100644 application/admin/view/group/index.html create mode 100644 application/admin/view/index/index.html create mode 100644 application/admin/view/order/index.html create mode 100644 application/admin/view/policy/add.html create mode 100644 application/admin/view/policy/edit.html create mode 100644 application/admin/view/policy/index.html create mode 100644 application/admin/view/recycle/index.html create mode 100644 application/admin/view/report/edit.html create mode 100644 application/admin/view/report/index.html create mode 100644 application/admin/view/setting/basic.html create mode 100644 application/admin/view/setting/email.html create mode 100644 application/admin/view/setting/pay.html create mode 100644 application/admin/view/setting/register.html create mode 100644 application/admin/view/setting/vip.html create mode 100644 application/admin/view/user/add.html create mode 100644 application/admin/view/user/edit.html create mode 100644 application/admin/view/user/index.html create mode 100644 application/admin/view/withdraw/index.html create mode 100644 application/command.php create mode 100644 application/common.php create mode 100644 application/common/behavior/LoadConfigRun.php create mode 100644 application/common/controller/Admin.php create mode 100644 application/common/controller/Home.php create mode 100644 application/common/exception/LoginError.php create mode 100644 application/common/model/Certify.php create mode 100644 application/common/model/FileManage.php create mode 100644 application/common/model/FileUpload.php create mode 100644 application/common/model/Folders.php create mode 100644 application/common/model/Groups.php create mode 100644 application/common/model/Order.php create mode 100644 application/common/model/Policys.php create mode 100644 application/common/model/Profit.php create mode 100644 application/common/model/Record.php create mode 100644 application/common/model/Reports.php create mode 100644 application/common/model/Setting.php create mode 100644 application/common/model/Shares.php create mode 100644 application/common/model/Stores.php create mode 100644 application/common/model/Users.php create mode 100644 application/common/model/Withdraw.php create mode 100644 application/common/model/driver/AliyunOss.php create mode 100644 application/common/model/driver/Local.php create mode 100644 application/common/model/driver/PolicyStore.php create mode 100644 application/common/model/driver/TxyunOss.php create mode 100644 application/http/middleware/AdminLoginCheck.php create mode 100644 application/http/middleware/UserLoginCheck.php create mode 100644 application/index/controller/File.php create mode 100644 application/index/controller/Index.php create mode 100644 application/index/controller/Recycle.php create mode 100644 application/index/controller/Share.php create mode 100644 application/index/controller/Upload.php create mode 100644 application/index/controller/User.php create mode 100644 application/index/view/file/edit_file.html create mode 100644 application/index/view/file/edit_folder.html create mode 100644 application/index/view/file/move_files.html create mode 100644 application/index/view/index/404.html create mode 100644 application/index/view/index/file.html create mode 100644 application/index/view/index/folder.html create mode 100644 application/index/view/index/folder_wap.html create mode 100644 application/index/view/index/index_default.html create mode 100644 application/index/view/index/index_new1.html create mode 100644 application/index/view/index/pwd.html create mode 100644 application/index/view/index/report.html create mode 100644 application/index/view/layout/user.html create mode 100644 application/index/view/recycle/index.html create mode 100644 application/index/view/share/echarts.html create mode 100644 application/index/view/share/index.html create mode 100644 application/index/view/share/record.html create mode 100644 application/index/view/share/withdraw.html create mode 100644 application/index/view/upload/index.html create mode 100644 application/index/view/user/auth.html create mode 100644 application/index/view/user/err.html create mode 100644 application/index/view/user/forget.html create mode 100644 application/index/view/user/index.html create mode 100644 application/index/view/user/info.html create mode 100644 application/index/view/user/login.html create mode 100644 application/index/view/user/reset.html create mode 100644 application/index/view/user/vip.html create mode 100644 application/index/view/user/vip_wap.html create mode 100644 application/index/view/user/withdraw.html create mode 100644 application/provider.php create mode 100644 application/tags.php create mode 100644 build.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/cache.php create mode 100644 config/cookie.php create mode 100644 config/database.php create mode 100644 config/log.php create mode 100644 config/menu.php create mode 100644 config/middleware.php create mode 100644 config/session.php create mode 100644 config/template.php create mode 100644 config/tpl/error_404_tmpl.tpl create mode 100644 config/tpl/error_tmpl.tpl create mode 100644 config/tpl/success_tmpl.tpl create mode 100644 extend/Qrcode/Qrcode.php create mode 100644 newskpan_20210930_142244.sql create mode 100644 public/.htaccess create mode 100644 public/admin.php create mode 100644 public/assets/css/app.css create mode 100644 public/assets/css/app1.css create mode 100644 public/assets/css/bootstrap-datetimepicker.min.css create mode 100644 public/assets/css/bootstrap-editable.css create mode 100644 public/assets/css/bootstrap-table-fixed-columns.css create mode 100644 public/assets/css/bootstrap-table.min.css create mode 100644 public/assets/css/bootstrap.min.css create mode 100644 public/assets/css/elementui.css create mode 100644 public/assets/css/file.css create mode 100644 public/assets/css/home.css create mode 100644 public/assets/css/icon.css create mode 100644 public/assets/css/index.css create mode 100644 public/assets/css/layer.css create mode 100644 public/assets/css/layer/default/icon-ext.png create mode 100644 public/assets/css/layer/default/icon.png create mode 100644 public/assets/css/layer/default/layer.css create mode 100644 public/assets/css/layer/default/loading-0.gif create mode 100644 public/assets/css/layer/default/loading-1.gif create mode 100644 public/assets/css/layer/default/loading-2.gif create mode 100644 public/assets/css/layui.css create mode 100644 public/assets/css/list.css create mode 100644 public/assets/css/login.css create mode 100644 public/assets/css/main.css create mode 100644 public/assets/css/t0.css create mode 100644 public/assets/css/upload.css create mode 100644 public/assets/css/userapp.css create mode 100644 public/assets/file_ext/apk.png create mode 100644 public/assets/file_ext/code.png create mode 100644 public/assets/file_ext/excel.png create mode 100644 public/assets/file_ext/exe.png create mode 100644 public/assets/file_ext/folder.png create mode 100644 public/assets/file_ext/fonts.png create mode 100644 public/assets/file_ext/img.png create mode 100644 public/assets/file_ext/ipa.png create mode 100644 public/assets/file_ext/links.png create mode 100644 public/assets/file_ext/music.png create mode 100644 public/assets/file_ext/ppt.png create mode 100644 public/assets/file_ext/ps.png create mode 100644 public/assets/file_ext/text.png create mode 100644 public/assets/file_ext/unknown.png create mode 100644 public/assets/file_ext/video.png create mode 100644 public/assets/file_ext/word.png create mode 100644 public/assets/file_ext/zip.png create mode 100644 public/assets/font-awesome/css/font-awesome.min.css create mode 100644 public/assets/icon/font/glyphicons-halflings-regular.eot create mode 100644 public/assets/icon/font/glyphicons-halflings-regular.ttf create mode 100644 public/assets/icon/font/glyphicons-halflings-regular.woff create mode 100644 public/assets/icon/font/glyphicons-halflings-regular.woff2 create mode 100644 public/assets/icon/font/yunfont.eot create mode 100644 public/assets/icon/font/yunfont.ttf create mode 100644 public/assets/icon/font/yunfont.woff create mode 100644 public/assets/icon/icon.css create mode 100644 public/assets/image/apps-android.png create mode 100644 public/assets/image/apps-ios.png create mode 100644 public/assets/image/clear.png create mode 100644 public/assets/image/collect-image-left.png create mode 100644 public/assets/image/collect-image-right.png create mode 100644 public/assets/image/collect-img1.png create mode 100644 public/assets/image/collect-img3.png create mode 100644 public/assets/image/collect-line.svg create mode 100644 public/assets/image/emptyRecyclebin.png create mode 100644 public/assets/image/emptySousuo.png create mode 100644 public/assets/image/emptyfile.png create mode 100644 public/assets/image/footer-img1.png create mode 100644 public/assets/image/footer-img2.png create mode 100644 public/assets/image/header.png create mode 100644 public/assets/image/i1.gif create mode 100644 public/assets/image/i18.gif create mode 100644 public/assets/image/i9.png create mode 100644 public/assets/image/icon-tree_77d7929.png create mode 100644 public/assets/image/loading.gif create mode 100644 public/assets/image/login_iconb536.png create mode 100644 public/assets/image/logo.gif create mode 100644 public/assets/image/logo.png create mode 100644 public/assets/image/logo3.gif create mode 100644 public/assets/image/logo7.gif create mode 100644 public/assets/image/mobile-collect-img-left.png create mode 100644 public/assets/image/mobile-collect-img-right.png create mode 100644 public/assets/image/provide-img1.png create mode 100644 public/assets/image/provide-img3.png create mode 100644 public/assets/image/q2.gif create mode 100644 public/assets/image/q9.gif create mode 100644 public/assets/image/space-img1.png create mode 100644 public/assets/image/space-img2.png create mode 100644 public/assets/image/space-img3.png create mode 100644 public/assets/image/space-img4.png create mode 100644 public/assets/image/upload_cancel.gif create mode 100644 public/assets/image/userhead.png create mode 100644 public/assets/js/admin.js create mode 100644 public/assets/js/animate/animate.css create mode 100644 public/assets/js/bootstrap-datetimepicker.js create mode 100644 public/assets/js/bootstrap-editable.js create mode 100644 public/assets/js/bootstrap-table-fixed-columns.js create mode 100644 public/assets/js/bootstrap-table.min.js create mode 100644 public/assets/js/bootstrap.min.js create mode 100644 public/assets/js/common.js create mode 100644 public/assets/js/file.js create mode 100644 public/assets/js/highcharts.js create mode 100644 public/assets/js/jquery.cxscroll.js create mode 100644 public/assets/js/jquery.js create mode 100644 public/assets/js/lay/modules/carousel.js create mode 100644 public/assets/js/lay/modules/code.js create mode 100644 public/assets/js/lay/modules/colorpicker.js create mode 100644 public/assets/js/lay/modules/element.js create mode 100644 public/assets/js/lay/modules/flow.js create mode 100644 public/assets/js/lay/modules/form.js create mode 100644 public/assets/js/lay/modules/jquery.js create mode 100644 public/assets/js/lay/modules/laydate.js create mode 100644 public/assets/js/lay/modules/layedit.js create mode 100644 public/assets/js/lay/modules/layer.js create mode 100644 public/assets/js/lay/modules/laypage.js create mode 100644 public/assets/js/lay/modules/laytpl.js create mode 100644 public/assets/js/lay/modules/mobile.js create mode 100644 public/assets/js/lay/modules/rate.js create mode 100644 public/assets/js/lay/modules/slider.js create mode 100644 public/assets/js/lay/modules/table.js create mode 100644 public/assets/js/lay/modules/theme/default/icon-ext.png create mode 100644 public/assets/js/lay/modules/theme/default/icon.png create mode 100644 public/assets/js/lay/modules/theme/default/layer.css create mode 100644 public/assets/js/lay/modules/theme/default/loading-0.gif create mode 100644 public/assets/js/lay/modules/theme/default/loading-1.gif create mode 100644 public/assets/js/lay/modules/theme/default/loading-2.gif create mode 100644 public/assets/js/lay/modules/transfer.js create mode 100644 public/assets/js/lay/modules/tree.js create mode 100644 public/assets/js/lay/modules/upload.js create mode 100644 public/assets/js/lay/modules/util.js create mode 100644 public/assets/js/layer.js create mode 100644 public/assets/js/layer/theme/default/layer.css create mode 100644 public/assets/js/layui.js create mode 100644 public/assets/js/noty/noty-2.4.1.js create mode 100644 public/assets/js/recyclebin.js create mode 100644 public/assets/js/theme/default/icon.png create mode 100644 public/assets/js/theme/default/layer.css create mode 100644 public/assets/js/webuploader2.js create mode 100644 public/assets/js/wind.js create mode 100644 public/assets/logo/logo.gif create mode 100644 public/assets/pan/img/corner-1.png create mode 100644 public/assets/pan/img/corner-2.png create mode 100644 public/assets/pan/img/corner-3.png create mode 100644 public/assets/pan/img/logo.png create mode 100644 public/assets/pan/img/logo3.gif create mode 100644 public/assets/pan/shouyi/bootstrap.js create mode 100644 public/assets/pan/shouyi/theme.css create mode 100644 public/assets/pan/t0.css create mode 100644 public/assets/pan/t1.css create mode 100644 public/assets/pan/t2.css create mode 100644 public/assets/pass/api.js create mode 100644 public/assets/pass/base.css create mode 100644 public/assets/pass/pc.css create mode 100644 public/assets/pay/css/main.css create mode 100644 public/assets/pay/images/success1.png create mode 100644 public/assets/pay/images/wechatpay.png create mode 100644 public/assets/pay/images/zfbpay.png create mode 100644 public/assets/pay/js/qrcode.min.js create mode 100644 public/assets/pay/js/ui-choose.js create mode 100644 public/assets/picture/5baaddeb0df643f9d10cd208c6efb203.jpeg create mode 100644 public/assets/picture/header-mobile.png create mode 100644 public/assets/picture/header_logo.png create mode 100644 public/assets/picture/loading.gif create mode 100644 public/assets/picture/shadow.png create mode 100644 public/assets/picture/showqrcode.jpg create mode 100644 public/assets/picture/user_logo.png create mode 100644 public/assets/picture/wx.png create mode 100644 public/assets/static/avatar/20210927/a3558393da3813e6506f0cf8dc280149.jpeg create mode 100644 public/assets/static/css/bootstrap-datetimepicker.min.css create mode 100644 public/assets/static/css/bootstrap-editable.css create mode 100644 public/assets/static/css/bootstrap-table-fixed-columns.css create mode 100644 public/assets/static/css/bootstrap-table.min.css create mode 100644 public/assets/static/css/bootstrap.min.css create mode 100644 public/assets/static/font-awesome/css/font-awesome.min.css create mode 100644 public/assets/static/fonts/glyphicons-halflings-regular.woff2 create mode 100644 public/assets/static/icon/font/yunfont.ttf create mode 100644 public/assets/static/icon/icon.css create mode 100644 public/assets/static/index/css/common-style.css create mode 100644 public/assets/static/index/css/icon-style.css create mode 100644 public/assets/static/index/css/index.css create mode 100644 public/assets/static/index/css/login.css create mode 100644 public/assets/static/index/css/share-style.css create mode 100644 public/assets/static/index/css/vendor.css create mode 100644 public/assets/static/index/img/i1.gif create mode 100644 public/assets/static/index/img/i18.gif create mode 100644 public/assets/static/index/img/i9.png create mode 100644 public/assets/static/index/img/index-intro-pic-red-1.346411cf440a1c2d15a1e9a914fcd54f.png create mode 100644 public/assets/static/index/img/index-intro-pic-red-2.87ea17e60b3a18447144acf1dd3a6e73.png create mode 100644 public/assets/static/index/img/index-intro-pic-red-3.80930fe5e2664421aa960fcbb9dc1e29.png create mode 100644 public/assets/static/index/img/index-intro-pic-red-4.6cf74db55b75b77436f8944b9891dfd8.png create mode 100644 public/assets/static/index/img/index-intro-pic-red-5.9499eef7c5c7802f2a2e4e42415c6732.png create mode 100644 public/assets/static/index/img/loading.884a292166a5701121b4f8fdfb93424f.png create mode 100644 public/assets/static/index/img/login-body-default-bg-2k.b2afe0edb64ee536d3d32c395e23779f.jpg create mode 100644 public/assets/static/index/img/login-box-bg-1.3198186e580f0a0aa21e1c14997b8e39.png create mode 100644 public/assets/static/index/img/login-box-bg-2.c30fb5f95bfa68d5f3e88f9595180440.png create mode 100644 public/assets/static/index/img/login_top_20210903.png create mode 100644 public/assets/static/index/img/logo-st-white.335e229ecb2a92ede74f0b2ffa27c0f1 (1).png create mode 100644 public/assets/static/index/img/logo-st-white.335e229ecb2a92ede74f0b2ffa27c0f1.png create mode 100644 public/assets/static/index/img/logo-white.434b9bb8f0897c629960912aba92db9d.png create mode 100644 public/assets/static/index/img/logo3.gif create mode 100644 public/assets/static/index/img/q2.gif create mode 100644 public/assets/static/index/img/q9.gif create mode 100644 public/assets/static/index/img/qrcode-help.f4bce51b181f9bfb7b7ec84ab3fad289.png create mode 100644 public/assets/static/index/img/top.gif create mode 100644 public/assets/static/index/img/top.js create mode 100644 public/assets/static/index/img/wa.png create mode 100644 public/assets/static/index/img/y3.gif create mode 100644 public/assets/static/index/js/5.js create mode 100644 public/assets/static/index/js/89.js create mode 100644 public/assets/static/index/js/common-style.js create mode 100644 public/assets/static/index/js/common.js create mode 100644 public/assets/static/index/js/icon-style.js create mode 100644 public/assets/static/index/js/login.js create mode 100644 public/assets/static/index/js/share-style.js create mode 100644 public/assets/static/index/js/vendor.js create mode 100644 public/assets/static/js/admin.js create mode 100644 public/assets/static/js/ajaxForm.js create mode 100644 public/assets/static/js/animate/animate.css create mode 100644 public/assets/static/js/artDialog/artDialog.js create mode 100644 public/assets/static/js/artDialog/skins/default.css create mode 100644 public/assets/static/js/artDialog/skins/icons/icon-ext.png create mode 100644 public/assets/static/js/artDialog/skins/icons/icon.png create mode 100644 public/assets/static/js/artDialog/skins/icons/layer.css create mode 100644 public/assets/static/js/artDialog/skins/icons/loading-0.gif create mode 100644 public/assets/static/js/artDialog/skins/icons/loading-1.gif create mode 100644 public/assets/static/js/artDialog/skins/icons/loading-2.gif create mode 100644 public/assets/static/js/bootstrap-datetimepicker.js create mode 100644 public/assets/static/js/bootstrap-editable.js create mode 100644 public/assets/static/js/bootstrap-table-fixed-columns.js create mode 100644 public/assets/static/js/bootstrap-table.min.js create mode 100644 public/assets/static/js/bootstrap.min.js create mode 100644 public/assets/static/js/jquery.js create mode 100644 public/assets/static/js/jquery.validate/jquery.validate.js create mode 100644 public/assets/static/js/layer/layer.js create mode 100644 public/assets/static/js/layer/skin/default/layer.css create mode 100644 public/assets/static/js/layer/theme/default/icon-ext.png create mode 100644 public/assets/static/js/layer/theme/default/icon.png create mode 100644 public/assets/static/js/layer/theme/default/layer.css create mode 100644 public/assets/static/js/layer/theme/default/loading-0.gif create mode 100644 public/assets/static/js/layer/theme/default/loading-1.gif create mode 100644 public/assets/static/js/layer/theme/default/loading-2.gif create mode 100644 public/assets/static/js/noty/noty-2.4.1.js create mode 100644 public/assets/static/js/wind.js create mode 100644 public/assets/static/pan/img/logo.gif create mode 100644 public/assets/static/user/app.css create mode 100644 public/assets/static/user/common.js create mode 100644 public/assets/static/user/elementui.css create mode 100644 public/assets/static/user/file.css create mode 100644 public/assets/static/user/file.js create mode 100644 public/assets/static/user/home.css create mode 100644 public/assets/static/user/img/emptyRecyclebin.png create mode 100644 public/assets/static/user/img/emptyfile.png create mode 100644 public/assets/static/user/img/loading.gif create mode 100644 public/assets/static/user/list.css create mode 100644 public/assets/static/user/recyclebin.js create mode 100644 public/assets/static/user/viewer/viewer.min.css create mode 100644 public/assets/static/user/viewer/viewer.min.js create mode 100644 public/assets/static/user/wap/app.css create mode 100644 public/assets/static/user/wap/app.js create mode 100644 public/assets/static/user/wap/font.css create mode 100644 public/assets/static/user/wap/pan.css create mode 100644 public/assets/static/user/wap/pan.js create mode 100644 public/assets/static/user/wap/pan_report.css create mode 100644 public/assets/static/user/wap/pan_report.js create mode 100644 public/assets/static/user/wap/pan_share.css create mode 100644 public/assets/static/user/wap/pan_share.js create mode 100644 public/assets/themes/admin_simpleboot3/public/assets/js/bootstrap.min.js create mode 100644 public/assets/themes/admin_simpleboot3/public/assets/js/jquery-1.10.2.min.js create mode 100644 public/assets/themes/admin_simpleboot3/public/assets/simpleboot3/css/simplebootadmin.css create mode 100644 public/assets/themes/admin_simpleboot3/public/assets/themes/flatadmin/bootstrap.min.css create mode 100644 public/assets/tixian/css/modules/code.css create mode 100644 public/assets/tixian/css/modules/laydate/default/laydate.css create mode 100644 public/assets/tixian/css/modules/layer/default/icon-ext.png create mode 100644 public/assets/tixian/css/modules/layer/default/icon.png create mode 100644 public/assets/tixian/css/modules/layer/default/layer.css create mode 100644 public/assets/tixian/css/modules/layer/default/loading-0.gif create mode 100644 public/assets/tixian/css/modules/layer/default/loading-1.gif create mode 100644 public/assets/tixian/css/modules/layer/default/loading-2.gif create mode 100644 public/assets/tixian/lay/modules/carousel.js create mode 100644 public/assets/tixian/lay/modules/code.js create mode 100644 public/assets/tixian/lay/modules/colorpicker.js create mode 100644 public/assets/tixian/lay/modules/element.js create mode 100644 public/assets/tixian/lay/modules/flow.js create mode 100644 public/assets/tixian/lay/modules/form.js create mode 100644 public/assets/tixian/lay/modules/jquery.js create mode 100644 public/assets/tixian/lay/modules/laydate.js create mode 100644 public/assets/tixian/lay/modules/layedit.js create mode 100644 public/assets/tixian/lay/modules/layer.js create mode 100644 public/assets/tixian/lay/modules/laypage.js create mode 100644 public/assets/tixian/lay/modules/laytpl.js create mode 100644 public/assets/tixian/lay/modules/mobile.js create mode 100644 public/assets/tixian/lay/modules/rate.js create mode 100644 public/assets/tixian/lay/modules/slider.js create mode 100644 public/assets/tixian/lay/modules/table.js create mode 100644 public/assets/tixian/lay/modules/transfer.js create mode 100644 public/assets/tixian/lay/modules/tree.js create mode 100644 public/assets/tixian/lay/modules/upload.js create mode 100644 public/assets/tixian/lay/modules/util.js create mode 100644 public/assets/tixian/layui.css create mode 100644 public/assets/tixian/layui.js create mode 100644 public/assets/viewer/viewer.min.css create mode 100644 public/assets/viewer/viewer.min.js create mode 100644 public/index.php create mode 100644 public/record_lock.txt create mode 100644 public/robots.txt create mode 100644 public/server/index.php create mode 100644 public/static/admin/css/admin.css create mode 100644 public/static/admin/css/load.css create mode 100644 public/static/admin/css/other/console1.css create mode 100644 public/static/admin/css/other/console2.css create mode 100644 public/static/admin/css/other/department.css create mode 100644 public/static/admin/css/other/error.css create mode 100644 public/static/admin/css/other/icon.css create mode 100644 public/static/admin/css/other/login.css create mode 100644 public/static/admin/css/other/person.css create mode 100644 public/static/admin/css/other/result.css create mode 100644 public/static/admin/data/card.json create mode 100644 public/static/admin/data/dataMenu.json create mode 100644 public/static/admin/data/dataTree2.json create mode 100644 public/static/admin/data/dictData.json create mode 100644 public/static/admin/data/dictType.json create mode 100644 public/static/admin/data/dtree.json create mode 100644 public/static/admin/data/loginLog.json create mode 100644 public/static/admin/data/menu.json create mode 100644 public/static/admin/data/message.json create mode 100644 public/static/admin/data/operateLog.json create mode 100644 public/static/admin/data/organization.json create mode 100644 public/static/admin/data/organizationtree.json create mode 100644 public/static/admin/data/power.json create mode 100644 public/static/admin/data/role.json create mode 100644 public/static/admin/data/table.json create mode 100644 public/static/admin/data/user.json create mode 100644 public/static/admin/images/403.svg create mode 100644 public/static/admin/images/404.svg create mode 100644 public/static/admin/images/500.svg create mode 100644 public/static/admin/images/act.jpg create mode 100644 public/static/admin/images/avatar.jpg create mode 100644 public/static/admin/images/background.svg create mode 100644 public/static/admin/images/captcha.gif create mode 100644 public/static/admin/images/file_ext/apk.png create mode 100644 public/static/admin/images/file_ext/code.png create mode 100644 public/static/admin/images/file_ext/excel.png create mode 100644 public/static/admin/images/file_ext/exe.png create mode 100644 public/static/admin/images/file_ext/fonts.png create mode 100644 public/static/admin/images/file_ext/img.png create mode 100644 public/static/admin/images/file_ext/ipa.png create mode 100644 public/static/admin/images/file_ext/links.png create mode 100644 public/static/admin/images/file_ext/music.png create mode 100644 public/static/admin/images/file_ext/ppt.png create mode 100644 public/static/admin/images/file_ext/ps.png create mode 100644 public/static/admin/images/file_ext/text.png create mode 100644 public/static/admin/images/file_ext/unknown.png create mode 100644 public/static/admin/images/file_ext/video.png create mode 100644 public/static/admin/images/file_ext/word.png create mode 100644 public/static/admin/images/file_ext/zip.png create mode 100644 public/static/admin/images/logo.png create mode 100644 public/static/admin/images/x.png create mode 100644 public/static/admin/js/boostrap.js create mode 100644 public/static/component/code/css/style.css create mode 100644 public/static/component/code/index.html create mode 100644 public/static/component/layui/css/layui.css create mode 100644 public/static/component/layui/css/modules/code.css create mode 100644 public/static/component/layui/css/modules/laydate/default/laydate.css create mode 100644 public/static/component/layui/css/modules/layer/default/icon-ext.png create mode 100644 public/static/component/layui/css/modules/layer/default/icon.png create mode 100644 public/static/component/layui/css/modules/layer/default/layer.css create mode 100644 public/static/component/layui/css/modules/layer/default/loading-0.gif create mode 100644 public/static/component/layui/css/modules/layer/default/loading-1.gif create mode 100644 public/static/component/layui/css/modules/layer/default/loading-2.gif create mode 100644 public/static/component/layui/font/iconfont.eot create mode 100644 public/static/component/layui/font/iconfont.svg create mode 100644 public/static/component/layui/font/iconfont.ttf create mode 100644 public/static/component/layui/font/iconfont.woff create mode 100644 public/static/component/layui/font/iconfont.woff2 create mode 100644 public/static/component/layui/images/face/0.gif create mode 100644 public/static/component/layui/images/face/1.gif create mode 100644 public/static/component/layui/images/face/10.gif create mode 100644 public/static/component/layui/images/face/11.gif create mode 100644 public/static/component/layui/images/face/12.gif create mode 100644 public/static/component/layui/images/face/13.gif create mode 100644 public/static/component/layui/images/face/14.gif create mode 100644 public/static/component/layui/images/face/15.gif create mode 100644 public/static/component/layui/images/face/16.gif create mode 100644 public/static/component/layui/images/face/17.gif create mode 100644 public/static/component/layui/images/face/18.gif create mode 100644 public/static/component/layui/images/face/19.gif create mode 100644 public/static/component/layui/images/face/2.gif create mode 100644 public/static/component/layui/images/face/20.gif create mode 100644 public/static/component/layui/images/face/21.gif create mode 100644 public/static/component/layui/images/face/22.gif create mode 100644 public/static/component/layui/images/face/23.gif create mode 100644 public/static/component/layui/images/face/24.gif create mode 100644 public/static/component/layui/images/face/25.gif create mode 100644 public/static/component/layui/images/face/26.gif create mode 100644 public/static/component/layui/images/face/27.gif create mode 100644 public/static/component/layui/images/face/28.gif create mode 100644 public/static/component/layui/images/face/29.gif create mode 100644 public/static/component/layui/images/face/3.gif create mode 100644 public/static/component/layui/images/face/30.gif create mode 100644 public/static/component/layui/images/face/31.gif create mode 100644 public/static/component/layui/images/face/32.gif create mode 100644 public/static/component/layui/images/face/33.gif create mode 100644 public/static/component/layui/images/face/34.gif create mode 100644 public/static/component/layui/images/face/35.gif create mode 100644 public/static/component/layui/images/face/36.gif create mode 100644 public/static/component/layui/images/face/37.gif create mode 100644 public/static/component/layui/images/face/38.gif create mode 100644 public/static/component/layui/images/face/39.gif create mode 100644 public/static/component/layui/images/face/4.gif create mode 100644 public/static/component/layui/images/face/40.gif create mode 100644 public/static/component/layui/images/face/41.gif create mode 100644 public/static/component/layui/images/face/42.gif create mode 100644 public/static/component/layui/images/face/43.gif create mode 100644 public/static/component/layui/images/face/44.gif create mode 100644 public/static/component/layui/images/face/45.gif create mode 100644 public/static/component/layui/images/face/46.gif create mode 100644 public/static/component/layui/images/face/47.gif create mode 100644 public/static/component/layui/images/face/48.gif create mode 100644 public/static/component/layui/images/face/49.gif create mode 100644 public/static/component/layui/images/face/5.gif create mode 100644 public/static/component/layui/images/face/50.gif create mode 100644 public/static/component/layui/images/face/51.gif create mode 100644 public/static/component/layui/images/face/52.gif create mode 100644 public/static/component/layui/images/face/53.gif create mode 100644 public/static/component/layui/images/face/54.gif create mode 100644 public/static/component/layui/images/face/55.gif create mode 100644 public/static/component/layui/images/face/56.gif create mode 100644 public/static/component/layui/images/face/57.gif create mode 100644 public/static/component/layui/images/face/58.gif create mode 100644 public/static/component/layui/images/face/59.gif create mode 100644 public/static/component/layui/images/face/6.gif create mode 100644 public/static/component/layui/images/face/60.gif create mode 100644 public/static/component/layui/images/face/61.gif create mode 100644 public/static/component/layui/images/face/62.gif create mode 100644 public/static/component/layui/images/face/63.gif create mode 100644 public/static/component/layui/images/face/64.gif create mode 100644 public/static/component/layui/images/face/65.gif create mode 100644 public/static/component/layui/images/face/66.gif create mode 100644 public/static/component/layui/images/face/67.gif create mode 100644 public/static/component/layui/images/face/68.gif create mode 100644 public/static/component/layui/images/face/69.gif create mode 100644 public/static/component/layui/images/face/7.gif create mode 100644 public/static/component/layui/images/face/70.gif create mode 100644 public/static/component/layui/images/face/71.gif create mode 100644 public/static/component/layui/images/face/8.gif create mode 100644 public/static/component/layui/images/face/9.gif create mode 100644 public/static/component/layui/layui.js create mode 100644 public/static/component/pear/css/module/button.css create mode 100644 public/static/component/pear/css/module/card.css create mode 100644 public/static/component/pear/css/module/code.css create mode 100644 public/static/component/pear/css/module/cropper.css create mode 100644 public/static/component/pear/css/module/dtree/dtree.css create mode 100644 public/static/component/pear/css/module/dtree/dtree.js create mode 100644 public/static/component/pear/css/module/dtree/font/dtreefont.css create mode 100644 public/static/component/pear/css/module/dtree/font/dtreefont.eot create mode 100644 public/static/component/pear/css/module/dtree/font/dtreefont.svg create mode 100644 public/static/component/pear/css/module/dtree/font/dtreefont.ttf create mode 100644 public/static/component/pear/css/module/dtree/font/dtreefont.woff create mode 100644 public/static/component/pear/css/module/dtree/font/icons.json create mode 100644 public/static/component/pear/css/module/form.css create mode 100644 public/static/component/pear/css/module/frame.css create mode 100644 public/static/component/pear/css/module/iconPicker.css create mode 100644 public/static/component/pear/css/module/label.css create mode 100644 public/static/component/pear/css/module/layer.css create mode 100644 public/static/component/pear/css/module/layout.css create mode 100644 public/static/component/pear/css/module/link.css create mode 100644 public/static/component/pear/css/module/loading.css create mode 100644 public/static/component/pear/css/module/menu.css create mode 100644 public/static/component/pear/css/module/message.css create mode 100644 public/static/component/pear/css/module/notice.css create mode 100644 public/static/component/pear/css/module/select.css create mode 100644 public/static/component/pear/css/module/step.css create mode 100644 public/static/component/pear/css/module/tab.css create mode 100644 public/static/component/pear/css/module/table.css create mode 100644 public/static/component/pear/css/module/tag.css create mode 100644 public/static/component/pear/css/module/topBar.css create mode 100644 public/static/component/pear/css/module/treetable.css create mode 100644 public/static/component/pear/css/module/uploads.css create mode 100644 public/static/component/pear/css/pear.css create mode 100644 public/static/component/pear/font/iconfont.css create mode 100644 public/static/component/pear/font/iconfont.js create mode 100644 public/static/component/pear/font/iconfont.json create mode 100644 public/static/component/pear/font/iconfont.ttf create mode 100644 public/static/component/pear/font/iconfont.woff create mode 100644 public/static/component/pear/font/iconfont.woff2 create mode 100644 public/static/component/pear/module/admin.js create mode 100644 public/static/component/pear/module/area.js create mode 100644 public/static/component/pear/module/button.js create mode 100644 public/static/component/pear/module/card.js create mode 100644 public/static/component/pear/module/common.js create mode 100644 public/static/component/pear/module/context.js create mode 100644 public/static/component/pear/module/convert.js create mode 100644 public/static/component/pear/module/count.js create mode 100644 public/static/component/pear/module/cropper.js create mode 100644 public/static/component/pear/module/design.js create mode 100644 public/static/component/pear/module/drawer.js create mode 100644 public/static/component/pear/module/dtree.js create mode 100644 public/static/component/pear/module/echarts.js create mode 100644 public/static/component/pear/module/echartsTheme.js create mode 100644 public/static/component/pear/module/frame.js create mode 100644 public/static/component/pear/module/hash.js create mode 100644 public/static/component/pear/module/http.js create mode 100644 public/static/component/pear/module/iconPicker.js create mode 100644 public/static/component/pear/module/loading.js create mode 100644 public/static/component/pear/module/menu.js create mode 100644 public/static/component/pear/module/message.js create mode 100644 public/static/component/pear/module/notice.js create mode 100644 public/static/component/pear/module/popup.js create mode 100644 public/static/component/pear/module/select.js create mode 100644 public/static/component/pear/module/step.js create mode 100644 public/static/component/pear/module/tab.js create mode 100644 public/static/component/pear/module/tag.js create mode 100644 public/static/component/pear/module/theme.js create mode 100644 public/static/component/pear/module/tinymce/tinymce.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/icons/default/icons.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/icons/default/icons.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/langs/readme.md create mode 100644 public/static/component/pear/module/tinymce/tinymce/langs/zh_CN.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/advlist/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/advlist/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/anchor/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/anchor/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/autolink/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/autolink/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/autoresize/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/autoresize/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/autosave/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/autosave/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/bbcode/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/bbcode/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/charmap/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/charmap/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/code/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/code/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/codesample/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/codesample/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/colorpicker/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/contextmenu/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/contextmenu/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/directionality/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/directionality/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojiimages.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojiimages.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojis.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojis.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/fullpage/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/fullpage/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/fullscreen/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/help/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/help/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/hr/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/hr/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/image/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/image/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/imagetools/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/imagetools/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/importcss/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/importcss/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/indent2em/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/indent2em/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/insertdatetime/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/icon.svg create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityFormula.html create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar-bg.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bg.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bottom.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/btn.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/down.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/top.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/up.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-bg.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-left.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-right.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-bg.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-left.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-right.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/aleph.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/bbbk.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/beth.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/circleds.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/complement.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/daleth.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/ell.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/eth.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/finv.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/game.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/gimel.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hbar.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hslash.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/im.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/mho.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/partial.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/re.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/wp.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowleft.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowright.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowleft.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowright.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downdownarrows.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonleft.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonright.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/gets.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftarrowtail.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoondown.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoonup.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftleftarrows.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrows.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightharpoons.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightsquigarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/looparrowleft.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/looparrowright.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/multimap.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nearrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nleftarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nwarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightarrowtail.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoondown.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoonup.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftarrows.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftharpoons.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightrightarrows.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightsquigarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/searrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/swarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/to.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadleftarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-downarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lftarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lleftarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lsh.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nleftarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nleftrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rsh.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-uparrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-updownarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/uparrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/updownarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonleft.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonright.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upuparrows.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/4.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/btn.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/brackets.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/down.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/frac.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/fx.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/int.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/lim.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/open.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/script.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sin.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sqrt.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sum.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/tick.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/up.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/a.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/b.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/c.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/d.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/e.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/f.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/g.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/h.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/i.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/j.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/k.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/l.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/m.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/n.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/o.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/p.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/q.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/r.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/s.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/t.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/u.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/v.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/w.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/x.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/y.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/z.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/a.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/b.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/c.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/d.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/e.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/f.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/g.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/h.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/i.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/j.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/k.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/l.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/m.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/n.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/o.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/p.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/q.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/r.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/s.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/t.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/u.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/v.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/w.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/x.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/y.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/z.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/a.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/b.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/c.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/d.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/e.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/f.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/g.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/h.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/i.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/j.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/k.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/l.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/m.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/n.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/o.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/p.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/q.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/r.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/s.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/t.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/u.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ua.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ub.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uc.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ud.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ue.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uf.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ug.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uh.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ui.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uj.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uk.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ul.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/um.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/un.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uo.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/up.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ur.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/us.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ut.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uu.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uv.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uw.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ux.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uy.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uz.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/v.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/w.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/x.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/y.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/z.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/alpha.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/beta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/chi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/delta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/epsilon.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/eta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/gamma.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/iota.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/kappa.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/lambda.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/mu.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/nu.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omega.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omicron.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/phi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/pi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/psi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/rho.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/sigma.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/tau.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/theta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/upsilon.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/xi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/zeta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/digamma.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varepsilon.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varkappa.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varphi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varpi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varrho.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varsigma.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/vartheta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/alpha.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/beta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/chi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/delta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/epsilon.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/eta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/gamma.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/iota.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/kappa.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/lambda.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/mu.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/nu.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omega.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omicron.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/phi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/pi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/psi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/rho.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/sigma.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/tau.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/theta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/upsilon.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/xi.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/zeta.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/aleph.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/approx.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ast.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/baifenhao.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/because.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/beth.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/blacksquare.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cap.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cdot.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/circ.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cong.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cup.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ddots.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/div.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/downarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/eq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/equiv.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/exists.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/forall.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/geq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gets.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gg.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gt.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/in.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/infty.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leftrightarrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ll.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/lt.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/minus.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/mp.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/neg.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/nexists.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ni.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/partial.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/plus.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/pm.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/propto.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/sim.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/simeq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/surd.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/tanhao.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/therefore.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/times.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/to.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/uparrow.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/varnothing.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/vdots.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gneqq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gnsim.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lneqq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lnsim.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nbdash-1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ncong.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/neq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nequiv.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nexists.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngeq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngtr.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nleq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nless.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nmid.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/notin.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nparallel.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nprec.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsim.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsubseteq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsucc.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsupseteq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntriangleleft.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglelefteq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntriangleright.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglerighteq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/precnsim.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/subsetneq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/succnsim.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/supsetneq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/a.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/b.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/c.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/d.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/e.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/f.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/g.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/h.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/i.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/j.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/k.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/l.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/m.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/n.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/o.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/p.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/q.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/r.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/s.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/t.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/u.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ua.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ub.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uc.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ud.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ue.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uf.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ug.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uh.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ui.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uj.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uk.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ul.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/um.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/un.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uo.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/up.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uq.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ur.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/us.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ut.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uu.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uv.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uw.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ux.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uy.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uz.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/v.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/w.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/x.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/y.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/z.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c4.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c5.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/4.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/5.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/6.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/4.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/5.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/6.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/other.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/4.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/4.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/c1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/c2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/1.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/2.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/3.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/base.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/page.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/scrollbar.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/ui.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/close.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/down.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/open.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/up.png create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/jquery-3.6.0.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kity-formula-parser.all.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kity-formula-render.all.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kityformula-editor.all.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kitygraph.all.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/loading.gif create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_BB.woff create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_CAL.woff create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_FRAK.woff create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_MAIN.woff create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_ROMAN.woff create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/legacyoutput/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/legacyoutput/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/link/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/link/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/lists/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/lists/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/media/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/media/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/nonbreaking/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/noneditable/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/noneditable/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/pagebreak/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/paste/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/paste/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/preview/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/preview/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/print/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/print/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/quickbars/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/quickbars/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/save/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/save/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/searchreplace/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/spellchecker/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/spellchecker/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/tabfocus/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/table/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/table/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/template/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/template/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/textcolor/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/textcolor/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/textpattern/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/textpattern/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/toc/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/toc/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/visualblocks/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/visualchars/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/visualchars/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/wordcount/plugin.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/plugins/wordcount/plugin.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/dark/content.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/dark/content.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/dark/content.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/default/content.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/default/content.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/default/content.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/document/content.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/document/content.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/document/content.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/writer/content.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/writer/content.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/content/writer/content.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.inline.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.inline.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.inline.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.mobile.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.mobile.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/content.mobile.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.mobile.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.mobile.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.mobile.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.shadowdom.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.inline.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.inline.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.inline.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.mobile.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.mobile.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/content.mobile.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.mobile.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.mobile.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.mobile.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.shadowdom.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.shadowdom.min.css create mode 100644 public/static/component/pear/module/tinymce/tinymce/skins/ui/oxide/skin.shadowdom.min.css.map create mode 100644 public/static/component/pear/module/tinymce/tinymce/themes/mobile/theme.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/themes/mobile/theme.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/themes/silver/theme.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/themes/silver/theme.min.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/tinymce.js create mode 100644 public/static/component/pear/module/tinymce/tinymce/tinymce.min.js create mode 100644 public/static/component/pear/module/topBar.js create mode 100644 public/static/component/pear/module/treetable.js create mode 100644 public/static/component/pear/module/uploads.js create mode 100644 public/static/component/pear/module/yaml.js create mode 100644 public/static/component/pear/pear.js create mode 100644 public/static/forget_pwd_template.html create mode 100644 route/route.php create mode 100644 runtime/.gitignore create mode 100644 skpan.sql create mode 100644 think create mode 100644 部署流程.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f3b478 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/.idea +/.vscode +/vendor +*.log +thinkphp +.env +.DS_Store +/tp.com +/public/nginx.htaccess +/public/default +/public/server/chunks/* +/public/server/upload/* +/public/temp/* +/public/avatar/* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9b3a0d4 --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +# SkyPan + +#### 介绍 +一款多用户赚钱网盘程序 + +#### 软件架构 +前端 +* Pear-admin +* Layui +* Jquery + +后端 +* PHP 7.3 +* Thinkphp5.1 +* Mysql + +`服务器 nginx` + +#### 环境依赖 +* `fileinfo` + + +#### 安装教程 + +* 下载源码包 skpan-1.xxx.zip +* 解压到网站目录 +* 通过`composer`安装相关依赖,在应用根目录运行`composer install` +* 导入数据库文件skpan.sql +* 后台帐号密码`admin` + +composer 加速 +``` +composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ +``` + + +#### nginx伪静态规则 +``` +location / { + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php?s=/$1 last; + } +} +``` +#### nginx下载规则 +``` +location /下载目录名 { + internal; +} +``` + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参考Cloudreve下载 + +https://xiaoluzyw.lanzoui.com/iMblCto46sb + +#### OSS帐号 + +`Bucket域名` skpan-store-1.oss-cn-hangzhou.aliyuncs.com + +`Endpoint` oss-cn-hangzhou.aliyuncs.com + +`AccessKey` LTAI5tRkL7PfE5YrYnK5i5Vp + +`AccessKeySecret` LSRzPi3vGLsOdKh6Q48Wl89nTp6O9R + +#### COS帐号 + +`SecretId` AKIDpEJHRNjG2nQtFTowuqlaKeDg5Pi0weuA + +`SecretKey` Lajv0umaEi4KAuY9bzFQzTrBMwMct461 + +`APPID` 1253809068 + +`存储桶名称` skpan-1253809068 + +`访问域名` https://skpan-1253809068.cos.ap-guangzhou.myqcloud.com + diff --git a/application/.htaccess b/application/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/application/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/application/admin/controller/Auth.php b/application/admin/controller/Auth.php new file mode 100644 index 0000000..de7e63c --- /dev/null +++ b/application/admin/controller/Auth.php @@ -0,0 +1,52 @@ +login_auth('admin')){ + return redirect('index/index'); + } + + if($this->request->isPost()){ + $username = input('post.username'); + $password = input('post.password'); + $captcha = input('post.captcha'); + try { + if(!captcha_check($captcha)){ + throw new \Exception('验证码错误'); + } + + (new Users)->login($username,$password,'admin'); + + return json(['code' => 200,'msg' => '登录成功,正在跳转后台..']); + }catch (\Throwable $e){ + return json(['code' => 502,'msg' => '登录失败:' . $e->getMessage()]); + } + }else{ + return $this->fetch(); + } + + } + + public function logout(){ + (new Users)->logout('admin'); + return json(['code' => 200,'msg' => '退出登录成功']); + } + + public function verify(){ + $config = [ + 'length' => 4 + ]; + $captcha = new Captcha($config); + return $captcha->entry(); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Certify.php b/application/admin/controller/Certify.php new file mode 100644 index 0000000..10bac1e --- /dev/null +++ b/application/admin/controller/Certify.php @@ -0,0 +1,63 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',20); + $list = CertifyModel::order('create_time desc') + ->page($page,$limit) + ->field('id,uid,name,idcard,status,create_time') + ->select()->each(function($item){ + $item['create_time'] = date('Y-m-d H:i',$item['create_time']); + $item['uid'] = Users::where('id',$item['uid'])->value('username'); + return $item; + }); + + $count = CertifyModel::count(); + + return json([ + 'code' => 0, + 'msg' => '获取成功', + 'data' => $list->toArray(), + 'count' => $count + ]); + } + return $this->fetch(); + } + + public function edit(){ + $id = input('get.id'); + + $info = CertifyModel::where('id',$id)->find(); + + if(empty($info)){ + return json(['code' => 502,'msg' => '数据不存在']); + } + + $info['status'] = 1; + + $info->save(); + + Users::where('id',$info['uid'])->update(['is_auth' => 1]); + + return json(['code' => 200,'msg' => '处理成功']); + } + + public function delete(){ + $id = input('get.id'); + + CertifyModel::where('id',$id)->delete(); + + return json(['code' => 200,'msg' => '删除成功']); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Dashboard.php b/application/admin/controller/Dashboard.php new file mode 100644 index 0000000..0eb3826 --- /dev/null +++ b/application/admin/controller/Dashboard.php @@ -0,0 +1,91 @@ +=',$start_time) + ->whereTime('create_time','<=',$end_time) + ->order('create_time desc') + ->select(); + + + // 图表统计 + $series_reg = str_split(str_repeat('0',30),1); + $series_order = str_split(str_repeat('0',30),1); + $series_money = str_split(str_repeat('0',30),1); + + foreach ($month_time as $key => $item){ + $item_time = date('Y-m-d',$item); + foreach ($profit as $profit_item){ + $profit_time = date('Y-m-d',$profit_item['create_time']); + if($item_time == $profit_time){ + $series_reg[$key] = $profit_item['count_reg']; + $series_order[$key] = $profit_item['count_order_yes']; + $series_money[$key] = $profit_item['count_money']; + } + } + } + + $series_reg = array_reverse($series_reg); + $series_reg = implode(',',$series_reg); + + $series_order = array_reverse($series_order); + $series_order = implode(',',$series_order); + + $series_money = array_reverse($series_money); + $series_money = implode(',',$series_money); + + // 用户数量统计 + + $default_group = config('register.default_group'); + $vip_group = config('vip.vip_group'); + + $default_user = Users::where('group',$default_group)->count(); + $vip_user = Users::where('group',$vip_group)->count(); + + $file = Stores::count(); + $size = Stores::sum('size'); + + $this->assign('count',[ + 'user' => $default_user, + 'vip' => $vip_user, + 'file' => $file, + 'size' => countSize($size) + ]); + + $this->assign('profit',$profit); + + $this->assign('series_reg',$series_reg); + $this->assign('series_order',$series_order); + $this->assign('series_money',$series_money); + $this->assign('time_type',$time_type); + + return $this->fetch(); + } + +} \ No newline at end of file diff --git a/application/admin/controller/File.php b/application/admin/controller/File.php new file mode 100644 index 0000000..d458264 --- /dev/null +++ b/application/admin/controller/File.php @@ -0,0 +1,152 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',10); + $map = []; + + // 获取筛选条件 + $start_time = input('get.start_time',''); + $end_time = input('get.end_time',''); + $policy_id = input('get.policy',''); + $ext = input('get.ext',''); + $uid = input('get.uid',''); + $origin_name = input('get.origin_name',''); + + if(!empty($start_time) && !empty($end_time)){ + $map[] = ['create_time','between time',[$start_time,$end_time]]; + } + + if(!empty($policy_id)){ + $map[] = ['policy_id','=',$policy_id]; + } + + if(!empty($ext)){ + $map[] = ['ext','=',$ext]; + } + + if(!empty($uid)){ + $map[] = ['uid','=',$uid]; + } + + if(!empty($origin_name)){ + $map[] = ['origin_name','like','%'.$origin_name.'%']; + } + + //获取排序条件 + $sort_key = input('get.sort_key','create_time'); + $sort = input('get.sort',0); + + $order_type = empty($sort) ? 'desc' : 'asc'; + + $list = Stores::where($map)->page($page,$limit)->order($sort_key,$order_type)->select()->each(function($item){ + $item['icon'] = getFileIcon($item['ext'],'admin'); + $item['size'] = countSize($item['size']); + $item['uid'] = Users::where('id',$item['uid'])->value('nickname'); + $item['policy_id'] = Policys::where('id',$item['policy_id'])->value('name'); + return $item; + }); + + $count = Stores::where($map)->count(); + + return json([ + 'code' => 0, + 'msg' => '加载成功', + 'count' => $count, + 'data' => $list->toArray() + ]); + }else{ + + $policy = Policys::field('id,name')->select(); + $this->assign('policy',$policy); + return $this->fetch(); + } + } + + public function delete(){ + $ids = input('get.ids'); + $store = Stores::withTrashed()->where('id','in',$ids)->select(); + if(empty($store)){ + $this->returnError('数据不存在'); + } + + $succ = 0; + + foreach ($store as $item){ + $item->delete(); + $succ++; + } + + $this->returnSuccess('成功删除'.$succ.'个文件'); + } + + public function download(){ + $id = input('get.id',0); + $info = Stores::get($id); + if(empty($info)){ + $this->error('数据不存在'); + } + + $policy = Policys::get($info['policy_id']); + + if(empty($policy)){ + $this->error('存储策略不存在'); + } + + // 远程文件下载 + if($policy['type'] == 'remote'){ + $down_url = getDownloadRemote($info['file_name'],$info['origin_name'],$policy->config['server_uri'],"",$policy->config['access_token']); + $this->redirect($down_url); + } + + // 存储驱动下载 + switch ($policy['type']){ + case 'aliyunoss': + $driver = new AliyunOss(0,0,0); + break; + case 'txyunoss': + $driver = new TxyunOss(0,0,0); + break; + default: + $driver = new Local(0,0,0); + break; + } + + // 下载 + return $driver->download($info,"",$policy); + } + + public function info(){ + $id = input('get.id',0); + $info = Stores::get($id); + if(empty($info)){ + $this->error('数据不存在'); + } + + $username = Users::where('id',$info['uid'])->value('username'); + $policy_name = Policys::where('id',$info['policy_id'])->value('name'); + $file_path = $info['file_name']; + + $this->assign('username',$username); + $this->assign('policy_name',$policy_name); + $this->assign('file_path',$file_path); + $this->assign('info',$info); + return $this->fetch(); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Group.php b/application/admin/controller/Group.php new file mode 100644 index 0000000..72f8160 --- /dev/null +++ b/application/admin/controller/Group.php @@ -0,0 +1,84 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',10); + + $list = Groups::page($page,$limit)->select()->each(function($item){ + $item['max_storage'] = countSize($item['max_storage']); + $item['is_sys'] = $item['is_sys'] ? '系统' : '自定义'; + $item['user_num'] = Users::where('group',$item['id'])->count(); + $item['policy_id'] = Policys::where('id',$item['policy_id'])->value('name'); + return $item; + }); + + $count = Groups::count(); + $this->returnSuccessLayTable($count,$list->toArray()); + } + + return $this->fetch(); + } + + public function add(){ + if($this->request->isPost()){ + $this->callModelMethods('Groups','addGroup',input('post.')); + $this->returnSuccess(); + } + $policy = Policys::getPolicyAll(); + $this->assign('policy',$policy); + return $this->fetch(); + } + + public function edit(){ + $id = input('get.id'); + $info = Groups::get($id); + + if(empty($info)){ + $this->error('用户组数据不存在'); + } + + if($this->request->isPost()){ + $this->callModelMethods('Groups','editGroup',$id,input('post.')); + $this->returnSuccess(); + } + + $policy = Policys::getPolicyAll(); + $this->assign('policy',$policy); + $this->assign('info',$info); + return $this->fetch(); + } + + public function delete(){ + $id = input('get.id'); + $info = Groups::get($id); + + if(empty($info)){ + $this->returnError('用户组不存在'); + } + + if($info['is_sys'] == 1){ + $this->returnError('系统用户组,不可删除'); + } + + /** + * 判断用户组下是否存在用户 + */ + + Groups::where('id',$id)->delete(); + + $this->returnSuccess('删除成功'); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php new file mode 100644 index 0000000..803b1b0 --- /dev/null +++ b/application/admin/controller/Index.php @@ -0,0 +1,43 @@ + 'SkPan网盘', + // logo + 'logo' => '/static/admin/images/logo.png', + // 菜单 + 'menu' => json_encode(config('menu.')), + // 管理员 + 'admin' => [ + 'avatar' => '/static/admin/images/avatar.jpg', + 'nickname' => $this->adminInfo['nickname'] + ], + // 激活菜单 + 'menu_select' => 1, + // 首页url + 'home_url' => url('dashboard/index'), + // 后台url + 'index_url' => url('index/index'), + // 退出登录url + 'logout_url' => url('auth/logout'), + // 修改密码url + 'pass_url' => url('auth/pass'), + // 清除缓存 + 'clear_cache_url' => url('index/cache') + ]; + + $this->assign('theme',$theme); + return $this->fetch(); + + } + +} \ No newline at end of file diff --git a/application/admin/controller/Order.php b/application/admin/controller/Order.php new file mode 100644 index 0000000..5bbad5a --- /dev/null +++ b/application/admin/controller/Order.php @@ -0,0 +1,68 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',10); + + $search_type = input('get.search_type',''); + $search_value = input('get.search_value',''); + $status = input('get.status',''); + $map = []; + + if(!empty($search_type) && !empty($search_value)){ + $map[] = [$search_type,'like','%'.$search_value.'%']; + } + + if(!empty($status)){ + $map[] = ['status','=',$status]; + } + + $pay_types = [ + 'alipay' => '支付宝', + 'wxpay' => '微信' + ]; + + $list = OrderModel::where($map) + ->page($page,$limit) + ->select()->each(function ($item) use($pay_types){ + $item['uid'] = Users::where('id',$item['uid'])->value('username'); + $item['type'] = $pay_types[$item['type']] ?? ''; + $item['money'] = number_format($item['money'],2).'¥'; + $item['vip_day'] = $item['vip_day'].'天'; + $item['out_trade_no'] = empty($item['out_trade_no']) ? '-' : $item['out_trade_no']; + $item['create_time'] = date('Y-m-d H:i',$item['create_time']); + $item['pay_time'] = empty($item['pay_time']) ? '-' : date('Y-m-d H:i',$item['pay_time']); + return $item; + }); + + $count = OrderModel::count(); + + return json([ + 'code' => 0, + 'msg' => '加载成功', + 'count' => $count, + 'data' => $list->toArray() + ]); + } + return $this->fetch(); + } + + public function delete(){ + $ids = input('get.ids'); + + OrderModel::where('id','in',$ids)->delete(); + + $this->returnSuccess('删除订单成功'); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Policy.php b/application/admin/controller/Policy.php new file mode 100644 index 0000000..0cdb6ce --- /dev/null +++ b/application/admin/controller/Policy.php @@ -0,0 +1,77 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',10); + + + $list = Policys::page($page,$limit)->field('id,name,type,max_size')->select()->each(function($item){ + $item['max_size'] = countSize($item['max_size']); + $item['type'] = PolicyType($item['type']); + $item['file_num'] = Stores::where('policy_id',$item['id'])->count(); + $item['store_num'] = countSize(Stores::where('policy_id',$item['id'])->sum('size')); + return $item; + }); + + $count = Policys::count(); + + return json([ + 'code' => 0, + 'msg' => '加载成功', + 'count' => $count, + 'data' => $list->toArray() + ]); + }else{ + return $this->fetch(); + } + } + + public function add(){ + if($this->request->isPost()){ + $this->callModelMethods('Policys','addPolicy',input('post.')); + $this->returnSuccess(); + } + return $this->fetch(); + } + + public function edit(){ + $id = input('get.id'); + $info = Policys::get($id); + + if(empty($info)){ + $this->error('存储策略数据不存在'); + } + + if($this->request->isPost()){ + $this->callModelMethods('Policys','editPolicy',$id,input('post.')); + $this->returnSuccess(); + } + + $this->assign('info',$info); + return $this->fetch(); + } + + public function delete(){ + $id = input('get.id'); + $info = Policys::get($id); + + if(empty($info)){ + $this->returnError('存储策略不存在'); + } + + Policys::where('id',$id)->delete(); + + $this->returnSuccess('删除成功'); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Recycle.php b/application/admin/controller/Recycle.php new file mode 100644 index 0000000..dfd5466 --- /dev/null +++ b/application/admin/controller/Recycle.php @@ -0,0 +1,116 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',10); + $map = []; + + // 获取筛选条件 + $start_time = input('get.start_time',''); + $end_time = input('get.end_time',''); + $policy_id = input('get.policy',''); + $ext = input('get.ext',''); + $uid = input('get.uid',''); + $origin_name = input('get.origin_name',''); + + if(!empty($start_time) && !empty($end_time)){ + $map[] = ['delete_time','between time',[$start_time,$end_time]]; + } + + if(!empty($policy_id)){ + $map[] = ['policy_id','=',$policy_id]; + } + + if(!empty($ext)){ + $map[] = ['ext','=',$ext]; + } + + if(!empty($uid)){ + $map[] = ['uid','=',$uid]; + } + + if(!empty($origin_name)){ + $map[] = ['origin_name','like','%'.$origin_name.'%']; + } + + //获取排序条件 + $sort_key = input('get.sort_key','delete_time'); + $sort = input('get.sort',0); + + $order_type = empty($sort) ? 'desc' : 'asc'; + + $list = Stores::onlyTrashed()->where($map)->page($page,$limit)->order($sort_key,$order_type)->select()->each(function($item){ + $item['icon'] = getFileIcon($item['ext'],'admin'); + $item['size'] = countSize($item['size']); + $item['uid'] = Users::where('id',$item['uid'])->value('nickname'); + $item['policy_id'] = Policys::where('id',$item['policy_id'])->value('name'); + return $item; + }); + + $count = Stores::onlyTrashed()->where($map)->count(); + + return json([ + 'code' => 0, + 'msg' => '加载成功', + 'count' => $count, + 'data' => $list->toArray() + ]); + } + $policy = Policys::field('id,name')->select(); + $this->assign('policy',$policy); + return $this->fetch(); + } + + public function restore(){ + $ids = input('get.ids'); + $store = Stores::onlyTrashed()->where('id','in',$ids)->select(); + if(empty($store)){ + $this->returnError('数据不存在'); + } + + $succ = 0; + + foreach ($store as $item){ + $item->restore(); + $succ++; + } + + $this->returnSuccess('处理完成,共恢复'.$succ.'个文件'); + } + + public function delete(){ + $ids = input('get.ids'); + $store = Stores::onlyTrashed()->where('id','in',$ids)->select(); + if(empty($store)){ + $this->returnError('数据不存在'); + } + + $succ = 0; + + foreach ($store as $item){ + $item->delete(true); + + // 删除分享信息 + Profit::where('file_id',$item['id']) + ->where('uid',$item['uid']) + ->delete(); + + $succ++; + } + + $this->returnSuccess('成功删除'.$succ.'个文件'); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Report.php b/application/admin/controller/Report.php new file mode 100644 index 0000000..3614557 --- /dev/null +++ b/application/admin/controller/Report.php @@ -0,0 +1,68 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',20); + $list = Reports::order('create_time desc') + ->page($page,$limit) + ->field('id,source_name,source_url,source_username,type,contact,real_ip,status,create_time') + ->select()->each(function($item){ + $item['create_time'] = date('Y-m-d H:i',$item['create_time']); + return $item; + }); + + $count = Reports::count(); + + return json([ + 'code' => 0, + 'msg' => '获取成功', + 'data' => $list->toArray(), + 'count' => $count + ]); + } + return $this->fetch(); + } + + public function edit(){ + $id = input('get.id'); + + $info = Reports::where('id',$id)->find(); + + if(empty($info)){ + $this->error('数据不存在'); + } + + if($this->request->isPost()){ + + $status = input('post.status'); + + $info['status'] = $status; + + $info->save(); + + return json(['code' => 200,'msg' => '处理成功']); + } + + $this->assign('info',$info); + + return $this->fetch(); + } + + public function delete(){ + $id = input('get.id'); + + Reports::where('id',$id)->delete(); + + return json(['code' => 200,'msg' => '删除成功']); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Setting.php b/application/admin/controller/Setting.php new file mode 100644 index 0000000..1c05ae4 --- /dev/null +++ b/application/admin/controller/Setting.php @@ -0,0 +1,84 @@ +saveOptions(); + $this->assign('option',$this->getOptions()); + return $this->fetch(); + } + + + public function register(){ + $this->saveOptions(); + $group = Groups::field('id,group_name')->select()->toArray(); + $this->assign('group',$group); + $this->assign('option',$this->getOptions()); + return $this->fetch(); + } + + public function pay(){ + $this->saveOptions(); + $this->assign('option',$this->getOptions()); + return $this->fetch(); + } + + public function vip(){ + $this->saveOptions(); + $group = Groups::field('id,group_name')->select()->toArray(); + $this->assign('group',$group); + $this->assign('option',$this->getOptions()); + return $this->fetch(); + } + + public function email(){ + $this->saveOptions(); + $this->assign('option',$this->getOptions()); + return $this->fetch(); + } + + protected function saveOptions(){ + if($this->request->isPost()){ + $type = $this->request->action(); + $post = input('post.'); + + try { + // 更新数据库 + foreach ($post as $key => $item){ + SettingModel::where('set_name',$key) + ->where('set_type',$type) + ->update(['set_value' => $item]); + } + }catch (\Throwable $e){ + $this->returnError($e->getMessage()); + } + + // 更新缓存 + $setting = SettingModel::select()->toArray(); + Cache::set('_setting_config',$setting); + + $this->returnSuccess('保存成功'); + } + } + + protected function getOptions(): array + { + $type = $this->request->action(); + $settings = SettingModel::where('set_type',$type)->select(); + $options = []; + foreach ($settings as $item){ + $options[$item['set_name']] = $item['set_value']; + } + return $options; + } + +} \ No newline at end of file diff --git a/application/admin/controller/User.php b/application/admin/controller/User.php new file mode 100644 index 0000000..9bf04cd --- /dev/null +++ b/application/admin/controller/User.php @@ -0,0 +1,206 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',10); + $search_type = input('get.search_type',''); + $search_value = input('get.search_value',''); + $map = []; + + if(!empty($search_type) && !empty($search_value)){ + $map[] = [$search_type,'like','%'.$search_value.'%']; + } + + $groups = Groups::column('group_name','id'); + $default_group = config('register.default_group'); + + $list = Users::where($map) + ->page($page,$limit) + ->field('id,nickname,username,group,is_auth,amount,email,avatar,status,create_time') + ->select()->each(function ($item) use ($groups,$default_group){ + $group_name = $groups[$item['group']] ?? '未知'; + + if($item['group'] == 1){ + $item['group'] = ''. $group_name .''; + }elseif ($item['group'] == $default_group){ + $item['group'] = ''. $group_name .''; + }else{ + $item['group'] = ''. $group_name .''; + } + + $item['avatar'] = getUserHead($item['avatar']); + + return $item; + }); + + $count = Users::count(); + + return json([ + 'code' => 0, + 'msg' => '加载成功', + 'count' => $count, + 'data' => $list->toArray() + ]); + }else{ + return $this->fetch(); + } + } + + public function add(){ + + $default_group = config('register.default_group'); + + if($this->request->isPost()){ + $data = input('post.'); + $result = $this->validate($data,[ + 'username|用户帐号' => 'require|alphaNum|length:6,26', + 'group|用户组' => 'require|number', + 'password|登录密码' => 'require|alphaNum|length:6,18', + 'repassword|重复密码' => 'require|confirm:password', + 'email|安全邮箱' => 'require|email' + ]); + + if($result !== true) return json(['code' => 502,'msg' => $result]); + + if(empty($data['group'])){ + $data['group'] = $default_group; + } + + //处理用户的VIP时间 + if(!empty($data['group_expire'])){ + $group_expire = strtotime($data['group_expire']); + } + + try { + (new Users)->register($data['username'],$data['email'],$data['password'],$data['group'],[],$group_expire); + return json(['code' => 200,'msg' => '账号新增成功']); + }catch (Exception $e){ + return json(['code' => 503,'msg' => $e->getMessage()]); + } + }else{ + $group = Groups::field('id,group_name')->select()->toArray(); + $this->assign('default_group',$default_group); + $this->assign('group',$group); + return $this->fetch(); + } + } + + public function del(){ + $ids = input('get.ids'); + + if(count(explode(',',$ids)) > 20){ + $this->returnError('删除失败,不能一次删除20条以上的数据'); + } + + $delete_users = Users::where('id','in',$ids)->field('id,group')->select()->toArray(); + + foreach ($delete_users as $item){ + if($item['id'] == 1){ + $this->returnError('删除失败,删除帐号中包含总管理员帐号'); + break; + } + + /** + * 待完成功能:删除用户后删除相关数据,如:上传储存的数据,订单数据,目录数据,分享数据等 + */ + + Users::where('id',$item['id'])->delete(); + } + + return json(['code' => 200,'msg' => '删除成功']); + } + + public function edit(){ + $id = input('get.id'); + $info = Users::get($id); + + if(empty($info)){ + $this->error('用户数据不存在'); + } + + if($this->request->isPost()){ + $data = input('post.'); + $result = $this->validate($data,[ + 'email|安全邮箱' => 'email', + 'password|登录密码' => 'alphaNum|length:6,18', + 'group|用户组' => 'require|number' + ]); + + if($result !== true) return json(['code' => 502,'msg' => $result]); + + $update = []; + + if(!empty($data['email'])){ + $update['email'] = $data['email']; + } + + if(!empty($data['password'])){ + $en_password = md5($data['password'] . config('app.pass_salt')); + $update['password'] = $en_password; + } + + if($info['group'] == 1 && $info['id'] != $this->adminInfo['id'] && !empty($data['password']) && $this->adminInfo['id'] != 1){ + $this->returnError('操作失败,您不能更改其他管理员组用户的密码'); + } + + if($info['id'] == $this->adminInfo['id'] && $data['group'] != $info['group']){ + $this->returnError('操作失败,您不能更改自己的用户组'); + } + + if($info['id'] == 1 && $data['group'] != $info['group']){ + $this->returnError('操作失败,您不能更改总管理员的用户组'); + } + + $update['group'] = $data['group']; + + //处理用户的VIP时间 + if($info['group_expire']$info['group_expire']){ + $update['group_expire'] = strtotime($data['group_expire']); + } + Users::where('id',$id)->update($update); + + return json(['code' => 200,'msg' => '用户信息修改成功']); + + }else{ + $group = Groups::field('id,group_name')->select()->toArray(); + $this->assign('group',$group); + $this->assign('info',$info); + return $this->fetch(); + } + } + + public function change_status(){ + $id = input('get.id'); + $status = input('get.status'); + + $info = Users::get($id); + + if($info->isEmpty()){ + $this->returnError('用户数据不存在'); + } + + if($info['id'] == 1){ + $this->returnError('操作失败,您不能封禁总管理员的帐号'); + } + + if($info['id'] == $this->adminInfo['id']){ + $this->returnError('操作失败,您不能封禁自己的帐号'); + } + + Users::where('id',$id)->update(['status' => $status]); + + return json(['code' => 200,'msg' => '用户状态切换成功']); + } + +} \ No newline at end of file diff --git a/application/admin/controller/Withdraw.php b/application/admin/controller/Withdraw.php new file mode 100644 index 0000000..e47db7e --- /dev/null +++ b/application/admin/controller/Withdraw.php @@ -0,0 +1,68 @@ +request->isAjax()){ + $page = input('get.page',1); + $limit = input('get.limit',20); + $list = WithdrawModel::order('create_time desc') + ->page($page,$limit) + ->field('id,uid,money,alipay_account,alipay_name,create_time,status') + ->select()->each(function($item){ + $item['uid'] = Users::where('id',$item['uid'])->value('username'); + $item['create_time'] = date('Y-m-d H:i',$item['create_time']); + return $item; + }); + + $count = WithdrawModel::count(); + + return json([ + 'code' => 0, + 'msg' => '获取成功', + 'data' => $list->toArray(), + 'count' => $count + ]); + } + return $this->fetch(); + } + + public function delete(){ + $id = input('get.id'); + + WithdrawModel::where('id',$id)->delete(); + + return json(['code' => 200,'msg' => '删除成功']); + } + + public function change(){ + $id = input('get.id'); + $status = input('get.status'); + + $info = WithdrawModel::where('id',$id)->find(); + + if(empty($info)){ + return json(['code' => 502,'msg' => '数据记录不存在']); + } + + $info['status'] = $status; + + $info->save(); + + if($status == 2){ + // 退回金额 + Record::addRecord($info['uid'],0,'提现退回',$info['money'],'提现系统退回金额'); + } + + return json(['code' => 200,'msg' => '操作成功']); + } + +} \ No newline at end of file diff --git a/application/admin/view/auth/login.html b/application/admin/view/auth/login.html new file mode 100644 index 0000000..cd10ea5 --- /dev/null +++ b/application/admin/view/auth/login.html @@ -0,0 +1,80 @@ + + + + + + {$Think.config.app_name} 后台管理 + + + + + + +
+
+ +
{$Think.config.app_name}Yun
+
+ {$Think.config.app_name} 后台管理 +
+
+
+ +
+
+ +
+
+ + +
+ +
+
+ +
+
+ + + + + + diff --git a/application/admin/view/certify/index.html b/application/admin/view/certify/index.html new file mode 100644 index 0000000..a7620c6 --- /dev/null +++ b/application/admin/view/certify/index.html @@ -0,0 +1,151 @@ + + + + + + + + +
+
+
+
+
+ + + + + + + + + + + + + diff --git a/application/admin/view/dashboard/index.html b/application/admin/view/dashboard/index.html new file mode 100644 index 0000000..4de1d4c --- /dev/null +++ b/application/admin/view/dashboard/index.html @@ -0,0 +1,177 @@ + + + + + + 控制后台 + + + + + + + +
+
+
+
+
用户数量
+
+
+
+ {$count.user} +
+
+ +
+
+
+
+
+
+
+
VIP用户
+
+
+
+ {$count.vip} +
+
+ +
+
+
+
+
+
+
+
文件数量
+
+
+
+ {$count.file} +
+
+ +
+
+
+
+
+
+
+
文件大小
+
+
+
+ {$count.size} +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+ + + + + + diff --git a/application/admin/view/file/index.html b/application/admin/view/file/index.html new file mode 100644 index 0000000..67b77cd --- /dev/null +++ b/application/admin/view/file/index.html @@ -0,0 +1,288 @@ + + + + + + + + +
+
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + diff --git a/application/admin/view/file/info.html b/application/admin/view/file/info.html new file mode 100644 index 0000000..9e263a6 --- /dev/null +++ b/application/admin/view/file/info.html @@ -0,0 +1,71 @@ + + + + + + + +
+
+
+
+ +
+
{$info.origin_name}
+
+
+ +
+ +
+
{:countSize($info.size)}
+
+
+ +
+ +
+ +
+
{$policy_name}
+
+
+ +
+ +
+
{$username}
+
+
+ +
+ +
+
{$file_path}
+
+
+ +
+ +
+ +
+
{$info.create_time}
+
+
+ +
+ +
+
{$info.update_time}
+
+
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/application/admin/view/group/add.html b/application/admin/view/group/add.html new file mode 100644 index 0000000..09e5c73 --- /dev/null +++ b/application/admin/view/group/add.html @@ -0,0 +1,119 @@ + + + + + + + +
+
+
+
+ +
+ +
用户组的名称
+
+
+ +
+ +
+ +
为该用户组绑定一个上传策略
+
+
+ +
+ +
+
+ +
+
单位:
+
+ +
+
限制用户组单文件上传大小
+
+ +
+ +
+ +
+ +
+
KB/s 填写0表示禁止下载
+
+ +
+ +
+ + +
+
是否允许创建文件分享链接
+
+ +
+
+
+
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/group/edit.html b/application/admin/view/group/edit.html new file mode 100644 index 0000000..77c39b2 --- /dev/null +++ b/application/admin/view/group/edit.html @@ -0,0 +1,118 @@ + + + + + + + +
+
+
+
+ +
+ +
用户组的名称
+
+
+ +
+ +
+ +
为该用户组绑定一个上传策略
+
+
+ +
+ +
+
+ +
+
单位:
+
+ +
+
限制用户组单文件上传大小
+
+ +
+ +
+ +
+ +
+
KB/s 填写0表示禁止下载
+
+ +
+ +
+ + +
+
是否允许创建文件分享链接
+
+ +
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/group/index.html b/application/admin/view/group/index.html new file mode 100644 index 0000000..df60fa9 --- /dev/null +++ b/application/admin/view/group/index.html @@ -0,0 +1,158 @@ + + + + + 用户组管理 + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + diff --git a/application/admin/view/index/index.html b/application/admin/view/index/index.html new file mode 100644 index 0000000..b960b73 --- /dev/null +++ b/application/admin/view/index/index.html @@ -0,0 +1,93 @@ + + + + + + {$Think.config.app_name} 后台管理 + + + + + + + + + + + +
+
+ +
    +
  • +
  • +
+ +
+ +
+ +
+ + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+ + + + + + + diff --git a/application/admin/view/order/index.html b/application/admin/view/order/index.html new file mode 100644 index 0000000..ad0c6f7 --- /dev/null +++ b/application/admin/view/order/index.html @@ -0,0 +1,222 @@ + + + + + + + + +
+
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + diff --git a/application/admin/view/policy/add.html b/application/admin/view/policy/add.html new file mode 100644 index 0000000..0dc1816 --- /dev/null +++ b/application/admin/view/policy/add.html @@ -0,0 +1,241 @@ + + + + + + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
多个请以半角逗号","隔开,留空表示不限制。如"png,jpg"
+
+
+ +
+ +
+ +
文件存储的服务器
+
+
+ + +
+ +
+ +
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/admin/view/policy/edit.html b/application/admin/view/policy/edit.html new file mode 100644 index 0000000..6c14cec --- /dev/null +++ b/application/admin/view/policy/edit.html @@ -0,0 +1,241 @@ + + + + + + + + +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
多个请以半角逗号","隔开,留空表示不限制。如"png,jpg"
+
+
+ +
+ +
+ +
文件存储的服务器
+
+
+ +
+ +
+ +
+
+
+
+ +
+
+
+ +{eq name="$info.type" value="local"} + +{/eq} + +{eq name="$info.type" value="remote"} + +{/eq} + +{eq name="$info.type" value="aliyunoss"} + +{/eq} + +{eq name="$info.type" value="txyunoss"} + +{/eq} + + + + + + \ No newline at end of file diff --git a/application/admin/view/policy/index.html b/application/admin/view/policy/index.html new file mode 100644 index 0000000..38c5ffa --- /dev/null +++ b/application/admin/view/policy/index.html @@ -0,0 +1,136 @@ + + + + + + + + + +
+
+
+
+
+ + + + + + + + + + + diff --git a/application/admin/view/recycle/index.html b/application/admin/view/recycle/index.html new file mode 100644 index 0000000..6008033 --- /dev/null +++ b/application/admin/view/recycle/index.html @@ -0,0 +1,351 @@ + + + + + + + + +
+
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + diff --git a/application/admin/view/report/edit.html b/application/admin/view/report/edit.html new file mode 100644 index 0000000..384235d --- /dev/null +++ b/application/admin/view/report/edit.html @@ -0,0 +1,113 @@ + + + + + + + +
+
+
+
+ +
+
{$info.source_name}
+
+
+ +
+ +
+
{$info.source_type?'文件':'目录'}
+
+
+ +
+ +
+
{$info.source_username}
+
+
+ +
+ + +
+ +
+ +
+ +
+
{$info.type}
+
+
+ +
+ +
+
{$info.contact}
+
+
+ +
+ +
+
{$info.content}
+
+
+ + +
+
+
+
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/report/index.html b/application/admin/view/report/index.html new file mode 100644 index 0000000..521c3ec --- /dev/null +++ b/application/admin/view/report/index.html @@ -0,0 +1,135 @@ + + + + + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + diff --git a/application/admin/view/setting/basic.html b/application/admin/view/setting/basic.html new file mode 100644 index 0000000..cf07e08 --- /dev/null +++ b/application/admin/view/setting/basic.html @@ -0,0 +1,145 @@ + + + + + + + +
+
+
+
+
+ +
+ +
+ +
站点的名称,将会展示在个页面的标题尾部、邮件中。
+
+
+ +
+ +
+ +
站点logo路径
+
+
+ +
+ +
+ +
网站首页主题
+
+
+ +
+ +
+ +
+ +
位于首页meta标签内的站点标题
+
+
+ +
+ +
+ +
位于首页meta标签内的站点关键词
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
站点的用户投诉举报邮箱
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/setting/email.html b/application/admin/view/setting/email.html new file mode 100644 index 0000000..b033275 --- /dev/null +++ b/application/admin/view/setting/email.html @@ -0,0 +1,122 @@ + + + + + + + +
+
+
+
+
+ +
+ +
+ +
邮箱的SMTP服务器地址
+
+
+ +
+ +
+ +
SSL连接SMTP服务器的远程服务器端口号
+
+
+ +
+ +
+ +
显示在收件人邮件的发件人邮箱地址前的发件人姓名
+
+
+ +
+ +
+ +
SMTP登录的账号
+
+
+ +
+ +
+ +
SMTP登录的密码 使用生成的授权码
+
+
+ +
+ +
+ +
+ 模板内变量: + {username} 用户帐号 + {literal}{url}{/literal} 重设密码url地址 + {site_name} 站点名称 +
+
+
+ + +
+
+ +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/setting/pay.html b/application/admin/view/setting/pay.html new file mode 100644 index 0000000..00423c6 --- /dev/null +++ b/application/admin/view/setting/pay.html @@ -0,0 +1,91 @@ + + + + + + + +
+
+
+
+
+ +
+ +
+ +
+ 支付网关注册地址:只要是易支付即可 +
+
+
+ +
+ +
+ +
+ 请填写易支付的商户ID +
+
+
+ +
+ +
+ +
+ 请填写易支付的商户密钥 +
+
+
+ + +
+ +
+
+ +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/setting/register.html b/application/admin/view/setting/register.html new file mode 100644 index 0000000..11c8f03 --- /dev/null +++ b/application/admin/view/setting/register.html @@ -0,0 +1,82 @@ + + + + + + + +
+
+
+
+
+ +
+ +
+ + +
+
是否允许新用户注册
+
+ + +
+ +
+ +
用户注册后默认属于的用户组
+
+
+ +
+ +
+
+ +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/setting/vip.html b/application/admin/view/setting/vip.html new file mode 100644 index 0000000..d2b2836 --- /dev/null +++ b/application/admin/view/setting/vip.html @@ -0,0 +1,93 @@ + + + + + + + +
+
+
+
+
+ +
+ +
+ +
开通VIP后属于的用户组
+
+
+ +
+ +
+ +
+ 游客通过分享者的链接开通VIP后,分享者获得的提成。请填写百分比如50%那么就填写50 +
+
+
+ +
+ +
+ +
+ 价格规则,一行一条,规则格式为: + 价格名称|开通价格|开通时长(单位天)|显示单位|折扣显示|省钱显示|描述内容|是否推荐(推荐填写1,不推荐填写0) +
+
+
+ +
+ +
+
+ +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/user/add.html b/application/admin/view/user/add.html new file mode 100644 index 0000000..a57dbbd --- /dev/null +++ b/application/admin/view/user/add.html @@ -0,0 +1,116 @@ + + + + + + + +
+
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+
+
+
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/user/edit.html b/application/admin/view/user/edit.html new file mode 100644 index 0000000..e1551cc --- /dev/null +++ b/application/admin/view/user/edit.html @@ -0,0 +1,154 @@ + + + + + + + +
+
+
+
+ +
+
{$info.username}
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
{$info.is_auth ? '认证成功' : '未认证'}
+
+
+ +
+ +
+
{$info.create_time|date="Y-m-d H:i:s"}
+
+
+ +
+ +
+ +
+
{$info.amount} ¥
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
{:getNotNullTime($info.login_time,'暂无登录信息')}
+
+
+ +
+ +
+
{$info.login_real_ip|default='暂无登录信息'}
+
+
+ + + +
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/application/admin/view/user/index.html b/application/admin/view/user/index.html new file mode 100644 index 0000000..2513679 --- /dev/null +++ b/application/admin/view/user/index.html @@ -0,0 +1,267 @@ + + + + + 用户管理 + + + +
+
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + diff --git a/application/admin/view/withdraw/index.html b/application/admin/view/withdraw/index.html new file mode 100644 index 0000000..e37dbc3 --- /dev/null +++ b/application/admin/view/withdraw/index.html @@ -0,0 +1,170 @@ + + + + + + + + +
+
+
+
+
+ + + + + + + + + + + + + + diff --git a/application/command.php b/application/command.php new file mode 100644 index 0000000..826bb2b --- /dev/null +++ b/application/command.php @@ -0,0 +1,12 @@ + +// +---------------------------------------------------------------------- + +return []; diff --git a/application/common.php b/application/common.php new file mode 100644 index 0000000..17dba26 --- /dev/null +++ b/application/common.php @@ -0,0 +1,391 @@ + +// +---------------------------------------------------------------------- + +// 应用公共文件 + + +function getNotNullTime($time, $default = '', $format = 'Y-m-d H:i:s'){ + if($time > 0){ + return date($format,$time); + }else{ + return $default; + } +} + +function countSize($bit,$array=false){ + $type = ['B','KB','MB','GB','TB']; + $box = ['1','1024','1048576','1073741824','TB']; + for($i = 0; $bit >= 1024; $i++) { + $bit/=1024; + } + if($array){ + return [(floor($bit*100)/100),$box[$i]]; + } + return (floor($bit*100)/100).$type[$i]; +} + +function PolicyType($d): string +{ + $type = [ + 'local' => '本地', + 'remote' => '远程', + 'aliyunoss' => '阿里云OSS', + 'txyunoss' => '腾讯云COS' + ]; + + return $type[$d] ?? '未知'; +} + +function getFileIcon($file_ext,$type = 'admin'): string +{ + $file_types = [ + 'video' => ['mp4','avi','mov','rmvb','rm','asf','divx','mpg','mpeg','mpe','wmv','mp4','mkv','vob','swf','flv'], + 'music' => ['cd','mp3','flac','ape','wma','mid','midi','mmf','ncm','wav','dts','dsf'], + 'code' => ['c','php','py','py3','cpp','h','jar','html','hta','chm','css','js','htm','asp','aspx','jsp','dll','cs','go','sql','xml','vb','java','lib','e','ec','db','bat','vbs','cmd','json','vbe','ocx','conf','sh','dat'], + 'zip' => ['zip','tar','gz','rar','7z','arj','z','iso','gho'], + 'ps' => ['ps','psd','pdd','eps','iff','tdi','pcx','raw'], + 'img' => ['png','bmp','rle','dib','gif','ico','jpeg','jpe','jff','jps','jpg','psb','svg','pbm','mp0'], + 'fonts' => ['ttf','eot','woff','otf','woff2'], + 'text' => ['txt','md','rtf','ini'], + 'word' => ['doc','docx','docm'], + 'excel' => ['xls','xlsx','xlsm'], + 'ppt' => ['ppt','pptx','pdf','pdp'], + 'links' => ['url','lnk'], + 'exe' => ['exe','msi'], + 'ipa' => ['ipa'], + 'apk' => ['apk'] + ]; + + $file_mime = 'unknown'; + + if($file_ext == 'dir'){ + $file_mime = 'folder'; + }else{ + foreach ($file_types as $mime_name => $item){ + foreach ($item as $ext){ + if($ext == $file_ext){ + $file_mime = $mime_name; + break; + } + } + } + } + + if($type == 'admin'){ + return '/static/admin/images/file_ext/'.$file_mime.'.png'; + }else{ + return '/assets/file_ext/'.$file_mime.'.png'; + } +} + +function getUserHead($user_head): string +{ + if(empty($user_head)){ + return '/assets/image/userhead.png'; + } + + return $user_head; +} + +function getVipRule(){ + $vip_rule = config('vip.vip_rule'); + + $rule_list = explode('
',nl2br($vip_rule)); + + foreach ($rule_list as $key => $item){ + $keys = ['name', 'money', 'day','day_name', 'discount', 'discount_msg', 'desc','is_top']; + $rule = array_combine($keys,explode('|',trim($item))); + $rule['id'] = $key; + $rule_list[$key] = $rule; + } + + return $rule_list; +} + +function shortUrl($url){ + + $hex = md5($url); + $base32 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + $hexLen = strlen($hex); + $subHexLen = $hexLen / 8; + $output = []; + for( $i = 0; $i < $subHexLen; $i++ ) { + $subHex = substr($hex, $i*8, 8); + $idx = 0x3FFFFFFF & (1 * hexdec('0x' . $subHex)); + $out = ''; + for( $j = 0; $j < 6; $j++ ) + { + $out .= $base32[0x0000003D & $idx]; + $idx = $idx >> 5; + } + $output[$i] = $out; + } + + $code = array_shift($output); + + $suc = substr(microtime(),2,4); + + foreach (str_split($suc,1) as $k){ + $code .= substr(str_shuffle($base32),$k,1); + } + + return $code; +} + +function getRndSharePwd($len = 4){ + $string = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + $result = ''; + for ($i = 0;$i < $len;$i++){ + $result .= substr(str_shuffle($string),rand(0,strlen($string) - 1),1); + } + return $result; +} + +function getShareUrl($code): string +{ + return url('index/share',['code' => $code],false,true); +} + +function friendDate($time, $format='Y-m-d'){ + if (!$time) + return ''; + + $nowtime = time(); + if ($time > $nowtime){ + return date($format, $time); + } + + $Y = date('Y', $time);//年份 + $z = date('z', $time);//当前的第几天 + $nowY = date('Y', $nowtime); + $nowz = date('z', $nowtime); + + if ($z > $nowz){ + $nowz += 365; + } + $diffz = $nowz - $z;//获取差异天 + $diffs = $nowtime - $time;//获取差异秒 + + if ($diffz >= 365){ + return ($nowY-$Y).'年前'; + } elseif ($diffz >= 30){ + return floor($diffz / 30).'个月前'; + } elseif ($diffz >= 7){ + return floor($diffz / 7).'个星期前'; + } elseif ($diffz >= 1){ + return $diffz.'天前'; + } elseif ($diffs >= 3600) { + return floor($diffs / 3600).'小时前'; + } elseif ($diffs >= 300) { + return floor($diffs / 60).'分钟前'; + } else {//五分钟内 + return '刚刚'; + } +} + +function getSafeNickname($name): string +{ + if(mb_strlen($name) <= 2){ + $name = mb_substr($name,0,1) . '*'; + }else{ + $len = mb_strlen($name); + $sub_len = $len - 2; + $name = mb_substr($name,0,1) . '*' . str_repeat('*',$sub_len) . mb_substr($name,$len - 1,1); + } + return $name; +} + +function getSafeDirSeparator($dir){ + return str_replace(['/','\\','//','\\\\'],DIRECTORY_SEPARATOR,$dir); +} + +function getDiyDirSeparator($spr,$dir){ + return str_replace(['/','\\','//','\\\\'],$spr,$dir); +} + +function sendEmail($username,$url){ + // 邮件配置 + $config = config('email.'); + + // 获取模板变量 + $temp_var = [ + '{username}' => $username, + '{site_title}' => config('basic.site_title'), + '{url}' => $url + ]; + + // 邮件正文 + $email_body = str_replace(array_keys($temp_var),array_values($temp_var),$config['template_forget']); + + // php mail客户端 + $mail = new PHPMailer\PHPMailer\PHPMailer(); + // debug调试 + $mail->SMTPDebug = 0; + // 使用smtp鉴权方式 + $mail->isSMTP(); + // SMTP鉴权 + $mail->SMTPAuth = true; + // 邮箱服务器地址 + $mail->Host = $config['smtp_host']; + // SSL加密 + $mail->SMTPSecure = 'ssl'; + // 端口 + $mail->Port = $config['smtp_port']; + // 邮件的编码 + $mail->CharSet = 'UTF-8'; + // smtp账号 + $mail->Username = $config['username']; + // smtp密码 + $mail->Password = $config['password']; + // 设置发件人昵称 + $mail->FromName = $config['nickname']; + // 设置发件人邮箱 + $mail->From = $config['username']; + // 邮件正文为html编码 + $mail->isHTML(true); + // 收件人邮箱 + $mail->addAddress('1655545174@qq.com'); + // 邮件标题 + $mail->Subject = '【'.config('basic.site_title').'】找回密码邮件'; + + // 邮件正文 + $mail->Body = $email_body; + + // 发送邮件 返回状态 + return $mail->send(); +} + +function getFileDownloadUrl($shares_id,$file_id,$is_count = 1){ + + $params = [ + 'file' => $file_id, + 'shares' => $shares_id, + 'timestamp' => time(), + ]; + + $sign = md5(urldecode(http_build_query($params)) . config('app.pass_salt')); + + $params['sign'] = $sign; + $params['is_count'] = $is_count; + + return url('Index/download','',false,true).'?'.urldecode(http_build_query($params)); +} + +function getDownloadFileSignVerify($param,$sign): bool +{ + $sign_key = md5(urldecode(http_build_query($param)) . config('app.pass_salt')); + return $sign_key == $sign; +} + +function getFileName($field_id){ + return \app\common\model\Stores::withTrashed()->where('id',$field_id)->value('origin_name'); +} + +function getWeekDay($time){ + $week = ["日","一","二","三","四","五","六"]; + return '星期'.$week[date('w',$time)]; +} + +function getTimeLastDay($time){ + $now_time = strtotime(date('Y-m-d')); + $the_time = strtotime(date('Y-m-d',$time)); + $day_lazy = $now_time - $the_time; + return floor($day_lazy / 86400); +} + +function getDownloadRemote($file_path,$origin_name,$hosts,$speed,$token){ + + if($speed === ""){ + $speed = 'full'; + } + + if($speed === 0){ + $speed = 'none'; + } + + $params = [ + 'file' => $file_path, + 'origin' => $origin_name, + 'speed' => $speed, + 'time' => time() + ]; + + $post = [ + 'md' => 'download', + 'tk' => urlsafe_b64encode(implode(',',$params)) + ]; + + $post['sign'] = getRemoteSign($post,$token); + + return $hosts .'?' . urldecode(http_build_query($post)); +} + +function urlsafe_b64encode($string) { + $data = base64_encode($string); + $data = str_replace(['+','/','='],['-','_',''],$data); + return $data; +} + +function getRemoteSign($params,$key): string +{ + // 过滤参数 + $params = array_filter($params,function($key) use ($params){ + if(empty($params[$key]) || $key == 'sign'){ + return false; + } + return true; + },ARRAY_FILTER_USE_KEY); + // ascii排序 + ksort($params); + reset($params); + + // 签名 + return md5(urldecode(http_build_query($params)) . $key); +} + +function Recursion($data, $pid = 0) +{ + static $child = []; + + foreach ($data as $key => $value) { + if ($value['pid'] == $pid) { + $child[] = $value; + unset($data[$key]); + Recursion($data, $value['id']); + } + } + + return $child; +} + +function getFolderChildFiles($uid,$folder_id){ + // 获取目录列表 + $folder_list = db('folders') + ->where('uid',$uid) + ->field('id,parent_folder as pid') + ->select(); + + $folder = Recursion($folder_list,$folder_id); + + $folder_ids = array_column($folder,'id'); + + $files = db('stores')->where('uid',$uid) + ->where('parent_folder','in',$folder_ids) + ->field('id') + ->select(); + + $files_ids = array_column($files,'id'); + + return [ + 'folder' => $folder_ids, + 'file' => $files_ids + ]; +} \ No newline at end of file diff --git a/application/common/behavior/LoadConfigRun.php b/application/common/behavior/LoadConfigRun.php new file mode 100644 index 0000000..cdebc75 --- /dev/null +++ b/application/common/behavior/LoadConfigRun.php @@ -0,0 +1,28 @@ +toArray(); + Cache::set('_setting_config',$conf_cache); + } + + // 加载配置 + foreach ($conf_cache as $item){ + Config::set([$item['set_name'] => $item['set_value']],$item['set_type']); + } + + } + +} \ No newline at end of file diff --git a/application/common/controller/Admin.php b/application/common/controller/Admin.php new file mode 100644 index 0000000..9bd76a4 --- /dev/null +++ b/application/common/controller/Admin.php @@ -0,0 +1,89 @@ +adminInfo = (new Users())->login_info('admin'); + } + + protected function callModelMethods($model,$methods,...$args){ + $class_name = 'app\common\model\\'.$model; + $class = new $class_name; + try { + call_user_func_array([$class,$methods],$args); + }catch (\Throwable $e){ + $this->returnError($e->getMessage(),505); + } + } + + protected function returnSuccess($msg = '操作成功',$data = []){ + $result = [ + 'code' => 200, + 'msg' => $msg, + 'time' => time(), + 'data' => $data, + ]; + + $type = 'json'; + $response = Response::create($result, $type)->header([]); + throw new HttpResponseException($response); + } + + protected function returnSuccessLayTable($count,$data = []){ + $result = [ + 'code' => 0, + 'msg' => '加载成功', + 'count' => $count, + 'data' => $data, + ]; + + $type = 'json'; + $response = Response::create($result, $type)->header([]); + throw new HttpResponseException($response); + } + + protected function returnError($msg = '操作失败,系统错误',$code = 502,$data = []){ + $result = [ + 'code' => $code, + 'msg' => $msg, + 'time' => time(), + 'data' => $data, + ]; + $type = 'json'; + $response = Response::create($result, $type)->header([]); + throw new HttpResponseException($response); + } + + protected function getQueryMap($methods,$kw = [],$ql = []){ + $map = []; + foreach ($ql as $item){ + $value = input($methods.'.'.$item); + if(!empty($value)){ + $map[$item] = $value; + } + } + foreach ($kw as $item){ + $value = input($methods.'.'.$item); + if(!empty($value)){ + $map[$item] = $value; + } + } + return $map; + } + +} \ No newline at end of file diff --git a/application/common/controller/Home.php b/application/common/controller/Home.php new file mode 100644 index 0000000..627ff26 --- /dev/null +++ b/application/common/controller/Home.php @@ -0,0 +1,115 @@ +userInfo = (new Users())->login_info('default'); + + // 是否登录 + $this->is_login = empty($this->userInfo) ? 0 : 1; + + // 用户组信息 + if($this->is_login){ + // 登录用户组 + $this->groupData = Groups::where('id',$this->userInfo['group'])->find(); + }else{ + // 游客用户组 + $this->groupData = Groups::where('id',2)->find(); + } + + // 获取VIP用户组ID + $vip_group = config('vip.vip_group'); + + // 获取普通用户组ID + $default_group = config('register.default_group'); + + // 判断是否VIP + if($this->userInfo['group'] == $vip_group){ + // VIP过期 + if(intval($this->userInfo['group_expire']) < time()){ + Users::where('id',$this->userInfo['id'])->update([ + 'group' => $default_group, + 'group_expire' => 0 + ]); + $this->vip_info['is_vip'] = 0; + $this->vip_info['expire_time'] = 0; + }else{ + $this->vip_info['is_vip'] = 1; + $this->vip_info['expire_time'] = date('Y-m-d',$this->userInfo['group_expire']); + } + }else{ + $this->vip_info['is_vip'] = 0; + $this->vip_info['expire_time'] = 0; + } + + $this->assign('group',$this->groupData); + $this->assign('info',$this->userInfo); + $this->assign('is_login',$this->is_login); + $this->assign('vip_info',$this->vip_info); + $this->assign('url_path',$this->request->path()); + } + + protected function getPolicy(): array + { + $policy = Policys::where('id',$this->groupData['policy_id'])->find()->toArray(); + + return $policy; + } + + protected function getPolicyUrl($policy,$param = []): string + { + if($policy['type'] != 'remote'){ + return url('upload/file'); + } + + $data = [ + 'uid' => $this->userInfo['id'], + 'policy_id' => $policy['id'], + 'save_dir' => $policy['config']['save_dir'] + ]; + + $data = array_merge($data,$param); + + $data['sign'] = $this->remote_sign_params($data,$policy['config']['access_token']); + + return $policy['config']['server_uri'].'?'.urldecode(http_build_query($data)); + } + + protected function remote_sign_params($params,$key): string + { + // 过滤参数 + $params = array_filter($params,function($key) use ($params){ + if(empty($params[$key]) || $key == 'sign'){ + return false; + } + return true; + },ARRAY_FILTER_USE_KEY); + // ascii排序 + ksort($params); + reset($params); + // 签名 + return md5(urldecode(http_build_query($params)) . $key); + } + + +} \ No newline at end of file diff --git a/application/common/exception/LoginError.php b/application/common/exception/LoginError.php new file mode 100644 index 0000000..92fbac9 --- /dev/null +++ b/application/common/exception/LoginError.php @@ -0,0 +1,11 @@ +where('parent_folder',$folder_id)->value('id'); + } + return $folder_id; + } + + /** + * 获取有效的目录ID + * @param $folder_id + * @param $uid + * @return mixed + */ + public static function getFolderAllowPid($folder_id,$uid){ + if(empty($folder_id)){ + $folder_id = Folders::where('uid',$uid)->where('parent_folder',$folder_id)->value('id'); + }else{ + $folder_id = Folders::where('uid',$uid)->where('id',$folder_id)->value('id'); + } + + return $folder_id; + } + + /** + * 获取文件列表 + * @param $folder_id + * @param $search + * @param $uid + * @param $page + * @param $limit + * @return array|array[] + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public static function ListFile($folder_id,$search,$uid,$page,$limit): array + { + + //获取当前根目录 + $folder_id = self::getFolderPid($folder_id,$uid); + + + $maps = [ + ['uid','=',$uid], + ['parent_folder','=',$folder_id], + ['delete_time','null',''] + ]; + + + $files_sql = db('stores') + ->where($maps) + ->where('origin_name','like','%'.$search.'%') + ->field('id,uid,shares_id,origin_name as name,ext,size,count_down,count_open,update_time') + ->fetchSql(true) + ->select(); + + $list = db('folders') + ->where($maps) + ->where('folder_name','like','%'.$search.'%') + ->field('id,uid,shares_id,folder_name as name,ext,size,count_down,count_open,update_time') + ->union($files_sql,true) + ->page($page,$limit) + ->select(); + + $files_count = db('stores') + ->where($maps) + ->where('origin_name','like','%'.$search.'%') + ->field('id') + ->count(); + + $folder_count = db('folders') + ->where($maps) + ->where('folder_name','like','%'.$search.'%') + ->field('id') + ->count(); + + $data = ['data' => []]; + + foreach ($list as $item){ + + $file_item = [ + 'file_name' => '', + 'file_size' => '-', + 'url' => '', + 'url_pass' => '', + 'count_down' => ''.$item['count_down'].'', + 'count_open' => $item['count_open'], + 'update_time' => date('Y-m-d H:i',$item['update_time']) + ]; + + if($item['ext'] == 755){ + $file_item['file_name'] = ' + + '.$item['name'].' +
+ +
'; + $share_info = Shares::getShare($item['uid'],$item['id'],1); + }else{ + $file_item['file_name'] = ' + + '.$item['name'].' +
+ +
'; + $share_info = Shares::getShare($item['uid'],$item['id'],0); + $file_item['file_size'] = countSize($item['size']); + } + + $is_folder = $item['ext'] == 755 ? 1 : 0; + + if(!empty($share_info)){ + $share_url = getShareUrl($share_info['code']); + $file_item['url'] = ''.$share_url.''; + if(empty($share_info['pwd']) || $share_info['pwd_status'] == 0){ + $share_info['pwd'] = '-'; + } + $file_item['url_pass'] = ''.$share_info['pwd'].''; + } + + $data['data'][] = $file_item; + } + + //查询上级目录 + $data['parent'] = ""; + + if($folder_id != 0){ + $parent_ids = self::getUserDirParents($uid,$folder_id); + if(!empty($parent_ids)){ + $folder_parents = Folders::where('id','in',$parent_ids) + ->where('uid',$uid) + ->field('id,folder_name') + ->order('id desc') + ->select()->toArray(); + + $folder_parents = array_reverse($folder_parents); + $data['parent'] = $folder_parents; + } + } + + $data['total'] = $files_count + $folder_count; + + return $data; + } + + + public static function ShareListFile($folder_id,$uid){ + //获取当前根目录 + $folder_id = self::getFolderPid($folder_id,$uid); + + $maps = [ + ['uid','=',$uid], + ['parent_folder','=',$folder_id], + ['delete_time','null',''] + ]; + + $files_sql = db('stores') + ->where($maps) + ->field('id,uid,shares_id,origin_name as name,ext,size,update_time') + ->fetchSql(true) + ->select(); + + $list = db('folders') + ->where($maps) + ->field('id,uid,shares_id,folder_name as name,ext,size,update_time') + ->union($files_sql,true) + ->select(); + + + $share_ids = array_column($list,'shares_id'); + // 查询分享代码 + $share_list = Shares::where('id','in',$share_ids)->column('code','id'); + + // 返回数据 + $data = []; + + foreach ($list as $item){ + $type = $item['ext'] == 755 ? 'dir' : $item['ext']; + + $files = [ + 'id' => $item['id'], + 'type' => $item['ext'] == 755 ? 'dir' : 'file', + 'icon' => getFileIcon($type,'index'), + 'name' => $item['name'], + 'size' => empty($item['size']) ? '-' : countSize($item['size']), + 'time' => friendDate($item['update_time']) + ]; + + $code = $share_list[$item['shares_id']] ?? ''; + + if(empty($code)){ + $files['url'] = 'javascript:;'; + }else{ + $files['url'] = getShareUrl($code); + } + + $data[] = $files; + } + + return $data; + } + + + public static function FolderList($folder_id,$uid): array + { + //获取当前根目录 + $folder_id = self::getFolderPid($folder_id,$uid); + + $maps = [ + ['uid','=',$uid], + ['parent_folder','=',$folder_id], + ['delete_time','null',''] + ]; + + return Folders::withTrashed() + ->where($maps) + ->field('id,folder_name') + ->select()->each(function($item) use ($uid){ + if(Folders::withTrashed()->where('parent_folder',$item['id'])->where('uid',$uid)->count() > 0){ + $item['down'] = 1; + }else{ + $item['down'] = 0; + } + return $item; + })->toArray(); + } + + /** + * 回收站文件列表 + * @param $search + * @param $uid + * @param $page + * @param $limit + * @return array|array[] + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + * @throws \think\exception\DbException + */ + public static function RecycleFile($search,$uid,$page,$limit){ + + $file_sql = db('stores') + ->where('uid',$uid) + ->where('delete_time','not null') + ->where('origin_name','like','%'.$search.'%') + ->field('id,uid,shares_id,origin_name as name,ext,size,count_down,count_open,update_time') + ->fetchSql(true) + ->select(); + + $list = db('folders') + ->where('uid',$uid) + ->where('delete_time','not null') + ->where('folder_name','like','%'.$search.'%') + ->field('id,uid,shares_id,folder_name as name,ext,size,count_down,count_open,update_time') + ->union($file_sql,true) + ->page($page,$limit) + ->select(); + + $stores_count = db('stores') + ->where('uid',$uid) + ->where('delete_time','not null') + ->where('origin_name','like','%'.$search.'%') + ->field('id') + ->count(); + + $folders_count = db('folders') + ->where('uid',$uid) + ->where('delete_time','not null') + ->where('folder_name','like','%'.$search.'%') + ->field('id') + ->count(); + + $data = ['data' => []]; + + foreach ($list as $item){ + + $file_item = [ + 'file_name' => '', + 'file_size' => '-', + 'url' => '', + 'url_pass' => '', + 'count_down' => ''.$item['count_down'].'', + 'count_open' => $item['count_open'], + 'update_time' => date('Y-m-d H:i',$item['update_time']) + ]; + + if($item['ext'] == 755){ + $file_item['file_name'] = ' + + '.$item['name'].' +
+ +
'; + $share_info = Shares::getShare($item['uid'],$item['id'],1); + }else{ + $file_item['file_name'] = ' + + '.$item['name'].' +
+ +
'; + $share_info = Shares::getShare($item['uid'],$item['id'],0); + $file_item['file_size'] = countSize($item['size']); + } + + $is_folder = $item['ext'] == 755 ? 1 : 0; + + if(!empty($share_info)){ + $share_url = getShareUrl($share_info['code']); + $file_item['url'] = ''.$share_url.''; + if(empty($share_info['pwd']) || $share_info['pwd_status'] == 0){ + $share_info['pwd'] = '-'; + } + $file_item['url_pass'] = ''.$share_info['pwd'].''; + } + + $data['data'][] = $file_item; + } + + //查询上级目录 + $data['parent'] = ""; + + $data['total'] = $stores_count + $folders_count; + + return $data; + + } + + /** + * 创建目录 + * @throws Exception + */ + public static function createFolder($folder_pid, $folder_name, $folder_desc, $uid){ + + $folder_name = str_replace(" ","",$folder_name); + $folder_name = str_replace("/","",$folder_name); + + //获取当前根目录 + $folder_pid = self::getFolderPid($folder_pid,$uid); + + if(empty($folder_name)){ + throw new Exception('目录名不能为空'); + } + + + // 判断路径 + if(Folders::where('id',$folder_pid)->where('uid',$uid)->find() == null){ + throw new Exception('文件夹路径不存在'); + } + + // 是否重复 + if( + Folders::where('parent_folder',$folder_pid) + ->where('folder_name',$folder_name) + ->where('uid',$uid)->find() != null + ){ + throw new Exception('文件夹已存在'); + } + + $dir_id = (new Folders)->insertGetId([ + 'uid' => $uid, + 'folder_name' => $folder_name, + 'parent_folder' => $folder_pid, + 'desc' => $folder_desc, + 'create_time' => time(), + 'update_time' => time() + ]); + + $share_id = Shares::addShare($uid,$dir_id,1); + + (new Folders)->where('id',$dir_id)->update(['shares_id' => $share_id]); + + return $dir_id; + } + + /** + * 获取用户上级目录列表 + * @param $uid + * @param $folder_id + * @return array + */ + protected static function getUserDirParents($uid,$folder_id): array + { + $folders = self::getUserDirs($uid); + return self::getDirParents($folders,$folder_id); + } + + /** + * 递归获取上级目录 + * @param $folders + * @param $folder_id + * @return array + */ + protected static function getDirParents($folders,$folder_id): array + { + $ids = []; + foreach ($folders as $item){ + if($item['id'] == $folder_id){ + if($item['pid']){ + $ids[] = $item['id']; + $ids = array_merge(self::getDirParents($folders,$item['pid']),$ids); + } + } + } + return $ids; + } + + /** + * 获取用户目录 + * @param $uid + * @return array + */ + protected static function getUserDirs($uid): array + { + return Folders::where('uid',$uid)->field('id,parent_folder as pid')->select()->toArray(); + } + +} \ No newline at end of file diff --git a/application/common/model/FileUpload.php b/application/common/model/FileUpload.php new file mode 100644 index 0000000..76492ac --- /dev/null +++ b/application/common/model/FileUpload.php @@ -0,0 +1,238 @@ +uid = $uid; + $this->policy = $policy; + $this->max_size = $max_size; + return $this; + } + + /** + * 检查文件信息 + * @throws Exception + */ + protected function check(){ + + if(empty($this->info['file']['folder'])){ + throw new Exception('上传目标文件夹不存在'); + } + + if(empty($this->info['file']['data'])){ + throw new Exception('请选择上传的文件'); + } + + if(empty($this->info['file']['size'])){ + throw new Exception('文件大小异常'); + } + + if(empty($this->info['file']['name'])){ + throw new Exception('上传文件名异常'); + } + + if($this->policy['type'] == 'remote'){ + throw new Exception('您不可以使用该存储策略'); + } + + if(!empty($this->max_size)){ + if($this->info['file']['size'] > $this->max_size){ + throw new Exception('单文件最大上传大小'.countSize($this->max_size)); + } + } + + if(!empty($this->policy['filetype'])){ + $file_ext = $this->getFileExt($this->info['file']['name']); + $allow_ext = explode(',',$this->policy['filetype']); + if(!in_array($file_ext,$allow_ext)){ + throw new Exception('不允许上传'.$file_ext.'类型的文件'); + } + } + + if(empty($this->info['chunk']['key'])){ + throw new Exception('分片密钥错误'); + } + + } + + /** + * 获取文件后缀名 + * @param $filename + * @return string + */ + protected function getFileExt($filename): string + { + return strtolower(pathinfo($filename, PATHINFO_EXTENSION)); + } + + /** + * 获取随机文件名 + * @param int $length + * @return string + */ + protected function getRandomKey(int $length = 16): string + { + $charTable = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + $result = ""; + for ( $i = 0; $i < $length; $i++ ){ + $result .= $charTable[ mt_rand(0, strlen($charTable) - 1) ]; + } + return $result; + } + + /** + * 获取上传目录 + * @param $key + * @return string|string[] + */ + protected function getPath($key) + { + // 目录分割 + $ds = DIRECTORY_SEPARATOR; + + // 配置目录 + $save_dir = str_replace('/',$ds,$this->policy['config']['save_dir']); + + // 根目录 + $root_path = realpath(env('root_path') . './public') . $save_dir; + + // 临时存储目录 + $temp_path = realpath(env('root_path') . './public') . str_replace('/',$ds,'/temp/'); + + // 当前保存目录 + $file_path = date('Ymd') . $ds . $this->uid . $ds; + + //文件名 + $file_name = uniqid( "file_") . time(); + + $data = [ + 'root' => $root_path, + 'temp' => $temp_path, + 'file' => $file_path, + 'path' => $root_path . $file_path, + 'temp_path' => $temp_path . $file_path, + 'name' => $file_name, + 'filename' => $file_name .'.'. $this->getFileExt($this->info['file']['name']) + ]; + + if($key == 'all'){ + return $data; + } + + return $data[$key] ?? ''; + } + + + public function upload(){ + // 超时时间5分钟 + @set_time_limit(5 * 60); + + // 获取有效的目录ID + $this->info['file']['folder'] = FileManage::getFolderAllowPid(input('post.folder_id',0),$this->uid); + + // 获取上传文件大小 + $this->info['file']['size'] = input('post.size',0); + + // 获取上传文件名 + $this->info['file']['name'] = input('post.name',''); + + // 上传文件对象获取 + $this->info['file']['data'] = request()->file('file'); + + // 分片上传 + $this->info['chunk']['key'] = input('post.chunks_key'); + $this->info['chunk']['chunk'] = input('post.chunk',0); + $this->info['chunk']['chunks'] = input('post.chunks',0); + + $this->info['uid'] = $this->uid; + + // 参数校验 + $this->check(); + + // 目录 + $path = $this->getPath('all'); + + // 上传驱动 + switch ($this->policy['type']){ + // 阿里云 + case 'aliyunoss': + $upload = new AliyunOss($this->info,$this->policy,$path); + break; + // 腾讯云 + case 'txyunoss': + $upload = new TxyunOss($this->info,$this->policy,$path); + break; + // 本地 + default: + $upload = new Local($this->info,$this->policy,$path); + break; + } + + // 上传文件 + $file_object = $upload->upload(); + + // 插入数据库 + if($file_object != 'chunk_file' && $file_object != null){ + // 加入数据库 + $data = [ + 'uid' => $this->uid, + 'origin_name' => $this->info['file']['name'], + 'file_name' => $file_object, + 'size' => $this->info['file']['size'], + 'ext' => $this->getFileExt($this->info['file']['name']), + 'parent_folder' => $this->info['file']['folder'], + 'policy_id' => $this->policy['id'], + 'create_time' => time(), + 'update_time' => time() + ]; + + $file_id = (new Stores)->insertGetId($data); + + $share_id = Shares::addShare($this->uid,$file_id,0); + + Stores::where('id',$file_id)->update(['shares_id' => $share_id]); + + return ['code' => 1,'msg' => '文件上传成功']; + } + + return ['code' => 1,'chunks' => 'chunk 文件上传成功']; + } + +} \ No newline at end of file diff --git a/application/common/model/Folders.php b/application/common/model/Folders.php new file mode 100644 index 0000000..c41ed20 --- /dev/null +++ b/application/common/model/Folders.php @@ -0,0 +1,18 @@ +update($data); + } + +} \ No newline at end of file diff --git a/application/common/model/Order.php b/application/common/model/Order.php new file mode 100644 index 0000000..817b548 --- /dev/null +++ b/application/common/model/Order.php @@ -0,0 +1,12 @@ + $item){ + if(!in_array($key,$keys)){ + $field[$key] = $item; + unset($data[$key]); + } + } + + $data['config'] = json_encode($field); + + self::insert($data); + } + + public function editPolicy($id,$data){ + //基础参数 + $keys = ['name','type','filetype']; + // 附加参数 + $field = []; + foreach ($data as $key => $item){ + if(!in_array($key,$keys)){ + $field[$key] = $item; + unset($data[$key]); + } + } + $data['config'] = json_encode($field); + self::where('id',$id)->update($data); + } + + public function getConfigAttr($value){ + return json_decode($value,true); + } + + public static function getPolicyAll(): array + { + return self::field('id,name')->select()->toArray(); + } + +} \ No newline at end of file diff --git a/application/common/model/Profit.php b/application/common/model/Profit.php new file mode 100644 index 0000000..1f43335 --- /dev/null +++ b/application/common/model/Profit.php @@ -0,0 +1,60 @@ +where('file_id',$file_id)->whereTime('create_time','d')->find(); + + // 补全字段 + $field = 'count_'.$field; + + if($field == 'count_view'){ + Stores::where('id',$file_id)->where('uid',$uid)->setInc('count_open',1); + } + + if($field == 'count_down'){ + Stores::where('id',$file_id)->where('uid',$uid)->setInc('count_down',1); + } + + + if(!empty($rec)){ + + self::where('uid',$uid)->where('file_id',$file_id)->setInc($field,$value); + + flock($fp,LOCK_UN); + return true; + } + + // 插入新统计 + $data = [ + 'uid' => $uid, + 'file_id' => $file_id, + 'create_time' => time(), + $field => $value + ]; + + // 插入统计 + self::insert($data); + + flock($fp,LOCK_UN); + return true; + } else{ + fclose($fp); + return false; + } + } + + +} \ No newline at end of file diff --git a/application/common/model/Record.php b/application/common/model/Record.php new file mode 100644 index 0000000..b1d2ec8 --- /dev/null +++ b/application/common/model/Record.php @@ -0,0 +1,44 @@ +find(); + + // 操作前金额 + $before_money = $user['amount']; + // 操作 + if($type){ + $after_money = floatval($user['amount']) - floatval($money); + }else{ + $after_money = floatval($user['amount']) + floatval($money); + } + + if($after_money < 0){ + return false; + } + + if($type){ + Users::where('id',$uid)->setDec('amount',$money); + }else{ + Users::where('id',$uid)->setInc('amount',$money); + } + + return self::create([ + 'uid' => $uid, + 'type' => $type, + 'source' => $source, + 'money' => $money, + 'before_money' => $before_money, + 'after_money' => $after_money, + 'remark' => $remark, + 'create_time' => time() + ]); + } + +} \ No newline at end of file diff --git a/application/common/model/Reports.php b/application/common/model/Reports.php new file mode 100644 index 0000000..1ec3434 --- /dev/null +++ b/application/common/model/Reports.php @@ -0,0 +1,13 @@ +count() == 0){ + $share_code = $code; + break; + } + } + + if(empty($share_code)){ + throw new Exception('分享连接生成失败,请稍后重试'); + } + + $pwd = getRndSharePwd(); + + $data = [ + 'uid' => $uid, + 'source_id' => $source, + 'type' => $type, + 'speed' => 0, + 'code' => $code, + 'pwd' => $pwd, + 'pwd_status' => 0 + ]; + + return self::insertGetId($data); + } + + public static function getShare($uid,$source,$type){ + return self::where([ + ['uid','=',$uid], + ['source_id','=',$source], + ['type','=',$type] + ])->field('id,code,pwd,pwd_status,speed')->find(); + } + + public function delShare(){ + + } + + public static function updateShare($id,$data){ + return self::where('id',$id)->update($data); + } + +} \ No newline at end of file diff --git a/application/common/model/Stores.php b/application/common/model/Stores.php new file mode 100644 index 0000000..ad347b2 --- /dev/null +++ b/application/common/model/Stores.php @@ -0,0 +1,34 @@ +policy_id); + if(empty($policy)){ + return false; + } + return $policy; + } + + public function getLocalSaveFilePath($save_dir,$filename): string + { + return env('root_path').'public'.getSafeDirSeparator($save_dir . $filename); + } + + public function getLocalSaveFile($save_dir,$filename){ + return str_replace(['/','\\','//','\\\\'],'/',($save_dir.$filename)); + } + +} \ No newline at end of file diff --git a/application/common/model/Users.php b/application/common/model/Users.php new file mode 100644 index 0000000..e672c0e --- /dev/null +++ b/application/common/model/Users.php @@ -0,0 +1,167 @@ +count() > 0){ + throw new Exception('当前帐号已被注册'); + } + + if(self::where('email',$email)->count() > 0){ + throw new Exception('当前安全邮箱已被绑定'); + } + + $en_password = md5($password . config('app.pass_salt')); + + $nickname = ucfirst($username); + + if(isset($other['nickname'])){ + $nickname = $other['nickname']; + } + + $user = [ + 'nickname' => $nickname, + 'username' => $username, + 'email' => $email, + 'group' => $group, + 'password' => $en_password, + 'create_time' => time(), + 'group_expire' => $group_expire, + 'status' => 1 + ]; + + self::insert($user); + + $user_id = self::getLastInsID(); + + //添加基础目录 + if($group != 1){ + Folders::insert([ + 'uid' => $user_id, + 'folder_name' => '根目录', + 'parent_folder' => 0, + 'create_time' => time() + ]); + } + + } + + + /** + * 用户登录登录方法 + * @param $username + * @param $password + * @param string $login_type + * @return bool + * @throws LoginError + */ + public function login($username,$password,$login_type = 'default'){ + // 登录用户组类型 + if($login_type == 'admin'){ + $group = 1; + }else{ + $group = config('register.default_group') .','.config('vip.vip_group'); + } + // 查找用户 + $user = self::where('username',$username)->where('group','in',$group)->find(); + // 用户不存在 + if(empty($user)){ + throw new LoginError('登录帐号或者密码错误,请重试'); + } + // 加密密码 + $password = md5($password . config('app.pass_salt')); + + if($user['password'] != $password){ + throw new LoginError('登录帐号或者密码错误,请重试'); + } + + // 不允许登录 + if($login_type == 'default' && $user['status'] == 0){ + throw new LoginError('登录帐号已被管理员封禁,请联系管理员处理!'); + } + + // 登录成功 + Session::set($login_type .'_uid',$user['id']); + Session::set($login_type .'_lkey',md5($username . $password . $user['status'])); + + return true; + } + + + /** + * 退出登录方法 + * @param string $type + */ + public function logout(string $type = 'default'){ + Session::delete($type .'_uid'); + Session::delete($type .'_lkey'); + } + + + /** + *登录验证方法 + * @param string $type + * @return bool + */ + public function login_auth(string $type = 'default'): bool + { + $uid = Session::get($type .'_uid'); + $key = Session::get($type .'_lkey'); + + $user = self::where('id',$uid)->find(); + + if(empty($user)){ + return false; + } + + if($key != md5($user['username'] . $user['password'] . $user['status'])){ + return false; + } + + return true; + } + + + /** + * 获取当前登录用户信息 + * @param string $type + * @return Users|false + */ + public function login_info(string $type = 'default'){ + $uid = Session::get($type .'_uid'); + + $user = self::where('id',$uid)->find(); + + if(empty($user)){ + return false; + } + + return $user; + } + + + public function getCertify(){ + return Certify::where('uid',$this->id) + ->where('status',1) + ->field('name,idcard,create_time') + ->find(); + } +} \ No newline at end of file diff --git a/application/common/model/Withdraw.php b/application/common/model/Withdraw.php new file mode 100644 index 0000000..337a1c7 --- /dev/null +++ b/application/common/model/Withdraw.php @@ -0,0 +1,12 @@ +path['temp_path'] . $this->path['filename']; + + // 保存临时文件 + $file_info = $this->info['file']['data']->move($this->path['temp_path'],$this->path['filename']); + + if(!$file_info){ + throw new Exception($this->info['file']['data']->getError()); + } + + $accessKeyId = $this->policy['config']['access_key']; + $accessKeySecret = $this->policy['config']['access_secret']; + $endpoint = $this->policy['config']['endpoint']; + $bucket = $this->policy['config']['bucket']; + + $policy_save_dir = ltrim($this->policy['config']['save_dir'],'/'); + + $object = getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']); + + try{ + $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); + + $ossClient->uploadFile($bucket,$object,$temp_file); + + // 删除临时文件 + @unlink($temp_file); + + // 返回文件存储地址 + return '/'. $object; + + } catch(OssException $e) { + throw new Exception('FAILED:'.$e->getMessage()); + } + } + + public function uploadPart() + { + + // 临时文件地址 + $temp_file = $this->path['temp_path'] . $this->path['filename']; + + // 保存临时文件 + $file_info = $this->info['file']['data']->move($this->path['temp_path'],$this->path['filename']); + + if(!$file_info){ + throw new Exception($this->info['file']['data']->getError()); + } + + $accessKeyId = $this->policy['config']['access_key']; + $accessKeySecret = $this->policy['config']['access_secret']; + $endpoint = $this->policy['config']['endpoint']; + $bucket = $this->policy['config']['bucket']; + + $policy_save_dir = ltrim($this->policy['config']['save_dir'],'/'); + + // 缓存分片上传地址 + $chunks_object_keys = 'aliyun_oss_chunks_'.$this->info['chunk']['key']; + $multi_upload_object = Cache::get($chunks_object_keys); + + + try { + $client = new OssClient($accessKeyId,$accessKeySecret,$endpoint); + + // 缓存防止重复文件地址 + if(empty($multi_upload_object)){ + $upload_object_path = getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']); + + $uploadId = $client->initiateMultipartUpload($bucket,$upload_object_path); + + $multi_upload_object = [ + 'object' => $upload_object_path, + 'upload_id' => $uploadId + ]; + + Cache::set($chunks_object_keys,$multi_upload_object); + } + + // 分片上传配置 + $options = [ + // 上传文件地址 + OssClient::OSS_FILE_UPLOAD => $temp_file, + // 分片号 + OssClient::OSS_PART_NUM => $this->info['chunk']['chunk'] + 1, + ]; + + $client->uploadPart($bucket, $multi_upload_object['object'], $multi_upload_object['upload_id'], $options); + + // 组合文件 + if(($this->info['chunk']['chunk'] + 1) == $this->info['chunk']['chunks']){ + + // 获取所有分片信息 + $listPartsInfo = $client->listParts($bucket, $multi_upload_object['object'], $multi_upload_object['upload_id']); + + $uploadParts = []; + + foreach ($listPartsInfo->getListPart() as $partInfo) { + + $uploadParts[] = [ + 'PartNumber' => $partInfo->getPartNumber(), + 'ETag' => $partInfo->getETag() + ]; + + } + + // 合并分片 + $client->completeMultipartUpload($bucket, $multi_upload_object['object'], $multi_upload_object['upload_id'], $uploadParts); + + // 删除分片缓存信息 + Cache::rm($chunks_object_keys); + // 删除临时文件 + @unlink($temp_file); + + // 返回结果 + return '/' . $multi_upload_object['object']; + } + + // 删除临时文件 + @unlink($temp_file); + + return 'chunk_file'; + + }catch (OssException $e){ + throw new Exception('FAILED:'.$e->getMessage()); + } + } + + public function download($stores, $speed, $policy) + { + + $accessKeyId = $policy['config']['access_key']; + $accessKeySecret = $policy['config']['access_secret']; + $endpoint = $policy['config']['endpoint']; + $bucket = $policy['config']['bucket']; + + $object = ltrim($stores['file_name'],'/'); + + // 限速下载 + if($speed !== ""){ + // 下载速度 + $down_speed = round(intval($speed) * 8192); + + // 最小限速100kb/s + if($down_speed < 819200){ + $down_speed = 819200; + } + + $options = [ + OssClient::OSS_TRAFFIC_LIMIT => $down_speed + ]; + } + + try { + + $ossClient = new OssClient($accessKeyId,$accessKeySecret,$endpoint); + + $options['response-content-disposition'] = 'attachment; filename='.$stores['origin_name']; + + // 120s有效期 + $timeout = 120; + $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options); + + // 跳转下载地址 + return redirect($signedUrl); + + }catch (OssException $e){ + throw new Exception($e->getMessage()); + } + + } + +} \ No newline at end of file diff --git a/application/common/model/driver/Local.php b/application/common/model/driver/Local.php new file mode 100644 index 0000000..f9a4f6e --- /dev/null +++ b/application/common/model/driver/Local.php @@ -0,0 +1,125 @@ +info['file']['data']->move($this->path['path'],$this->path['name']); + + if(!$file_info){ + throw new Exception($this->info['file']['data']->getError()); + } + + $policy_save_dir = $this->policy['config']['save_dir']; + + return getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']); + } + + public function uploadPart() + { + // 分片数据存储名称 + $chunks_saveKey = 'chunks_'.$this->info['uid'].'_'.$this->info['chunk']['key']; + + // 文件名称 + $temp_filename = 'chunks_'.md5($this->info['chunk']['key']).'_'.$this->getRandomKey(4) . '_part_'.$this->info['chunk']['chunk'].'.chunk'; + // 临时文件地址 + $temp_file = $this->path['temp_path'] . $temp_filename; + + // 保存临时文件 + $file_info = $this->info['file']['data']->move($this->path['temp_path'],$temp_filename); + + if(!$file_info){ + throw new Exception('分片创建错误:'.$this->info['file']['data']->getError()); + } + + // 分片存储列表 + $chunk_list = Cache::get($chunks_saveKey) ?? []; + + // 加入分片文件 + $chunk_list[] = $temp_file; + + // 保存分片临时存储列表 + Cache::set($chunks_saveKey,$chunk_list); + + // 分片上传成功 + if($this->info['chunk']['chunk'] == ($this->info['chunk']['chunks'] - 1)){ + + $save_file = $this->path['path'] . $this->path['filename']; + + // 融合文件路径 + $fileObj = fopen($save_file,"a+"); + + // 融合文件 + foreach ($chunk_list as $value) { + $chunkObj = fopen($value, "rb"); + + if(!($fileObj && $chunkObj)){ + throw new Exception('分片融合文件创建失败'); + } + + $content = fread($chunkObj, (2 * 1024 * 1024)); + fwrite($fileObj, $content, (2 * 1024 * 1024)); + unset($content); + fclose($chunkObj); + // 删除分片文件 + unlink($value); + } + + // 清空分片临时存储列表 + Cache::rm($chunks_saveKey); + + $policy_save_dir = $this->policy['config']['save_dir']; + + return getDiyDirSeparator('/',$policy_save_dir. $this->path['file'] . $this->path['filename']); + } + + return 'chunk_file'; + + } + + protected function getRandomKey($length = 16){ + $charTable = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + $result = ""; + for ( $i = 0; $i < $length; $i++ ){ + $result .= $charTable[ mt_rand(0, strlen($charTable) - 1) ]; + } + return $result; + } + + public function download($stores,$speed,$policy) + { + //存储文件地址 + $_file = getSafeDirSeparator(env('root_path').'public'.$stores['file_name']); + + // 文件不存在 + if(!is_file($_file)){ + throw new Exception('文件不存在,可能已被删除'); + } + + $_file_path = $stores['file_name']; + + $_file_limit_size = round(intval($speed) * 1024); + + // 启用 nginx X-Accel 下载 + header('Content-Type: application/octet-stream'); + $encoded_fname = rawurlencode($stores['origin_name']); + header('Content-Disposition: attachment;filename="'.$encoded_fname.'";filename*=utf-8'."''".$encoded_fname); + + header('X-Accel-Redirect: '. $_file_path); + header('X-Accel-Buffering: yes'); + + // 不限速下载 + if($speed !== ""){ + header('X-Accel-Limit-Rate:'.$_file_limit_size); + } + + } + +} \ No newline at end of file diff --git a/application/common/model/driver/PolicyStore.php b/application/common/model/driver/PolicyStore.php new file mode 100644 index 0000000..ef94a10 --- /dev/null +++ b/application/common/model/driver/PolicyStore.php @@ -0,0 +1,46 @@ +info = $info; + $this->policy = $policy; + $this->path = $path; + } + + public function upload() + { + if(!empty($this->info['chunk']['chunks'])){ + return $this->uploadPart(); + }else{ + return $this->uploadSimple(); + } + } + + public function uploadSimple() + { + return 0; + } + + public function uploadPart() + { + return 0; + } + + public function download($stores,$speed,$policy) + { + return 0; + } + +} \ No newline at end of file diff --git a/application/common/model/driver/TxyunOss.php b/application/common/model/driver/TxyunOss.php new file mode 100644 index 0000000..19d2bca --- /dev/null +++ b/application/common/model/driver/TxyunOss.php @@ -0,0 +1,210 @@ +policy['config']['secret_id']; + $secretKey = $this->policy['config']['secret_key']; + $region = $this->policy['config']['region']; + $bucket = $this->policy['config']['bucket']; + + // 文件路径 + $file_path = $this->info['file']['data']->getInfo('tmp_name'); + $file = fopen($file_path, 'rb'); + + // 存储路径 + $policy_save_dir = ltrim($this->policy['config']['save_dir'],'/'); + $object = getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']); + + try { + // COS对象 + $client = new Client([ + 'region' => $region, + 'schema' => 'http', + 'credentials' => [ + 'secretId' => $secretId, + 'secretKey' => $secretKey + ] + ]); + + if ($file) { + // 上传文件 + $client->putObject([ + 'Bucket' => $bucket, + 'Key' => $object, + 'Body' => $file + ]); + + // 返回文件存储地址 + return '/'. $object; + }else{ + throw new Exception('上传文件路径错误'); + } + + }catch (ServiceResponseException $e){ + throw new Exception($e->getMessage()); + }catch (\Exception $e) { + throw new Exception($e->getMessage()); + } + } + + public function uploadPart() + { + + // 配置信息 + $secretId = $this->policy['config']['secret_id']; + $secretKey = $this->policy['config']['secret_key']; + $region = $this->policy['config']['region']; + $bucket = $this->policy['config']['bucket']; + + // 分片数据存储名称 + $chunks_saveKey = 'txyunoss_chunks_'.$this->info['uid'].'_'.$this->info['chunk']['key']; + + // 文件名称 + $temp_filename = 'chunks_'.md5($this->info['chunk']['key']).'_'.$this->getRandomKey(4) . '_part_'.$this->info['chunk']['chunk'].'.chunk'; + // 临时文件地址 + $temp_file = $this->path['temp_path'] . $temp_filename; + + // 保存临时文件 + $file_info = $this->info['file']['data']->move($this->path['temp_path'],$temp_filename); + + if(!$file_info){ + throw new Exception('分片创建错误:'.$this->info['file']['data']->getError()); + } + + // 分片存储列表 + $chunk_list = Cache::get($chunks_saveKey) ?? []; + + // 加入分片文件 + $chunk_list[] = $temp_file; + + // 保存分片临时存储列表 + Cache::set($chunks_saveKey,$chunk_list); + + // 分片上传成功 + if($this->info['chunk']['chunk'] == ($this->info['chunk']['chunks'] - 1)){ + + // COS对象 + $client = new Client([ + 'region' => $region, + 'schema' => 'http', + 'credentials' => [ + 'secretId' => $secretId, + 'secretKey' => $secretKey + ] + ]); + + $save_file = $this->path['temp_path'] . 'cos_cob_'.substr(md5($this->info['chunk']['key']),0,8).'_t_'.time().'.bak'; + + // 融合文件路径 + $fileObj = fopen($save_file,"a+"); + + // 融合文件 + foreach ($chunk_list as $value) { + $chunkObj = fopen($value, "rb"); + + if(!($fileObj && $chunkObj)){ + throw new Exception('分片融合文件创建失败'); + } + + $content = fread($chunkObj, (2 * 1024 * 1024)); + fwrite($fileObj, $content, (2 * 1024 * 1024)); + unset($content); + fclose($chunkObj); + // 删除分片文件 + unlink($value); + } + + // 清空分片临时存储列表 + Cache::rm($chunks_saveKey); + + try { + $policy_save_dir = $this->policy['config']['save_dir']; + $upload_object_path = getDiyDirSeparator('/',$policy_save_dir. $this->path['file'].$this->path['filename']); + + if ($fileObj) { + // 上传文件 + $client->Upload($bucket,$upload_object_path,$fileObj); + + // 删除临时组合文件 + @unlink($save_file); + + return $upload_object_path; + }else{ + throw new Exception('上传文件路径错误'); + } + + }catch (ServiceResponseException $e){ + throw new Exception($e->getMessage()); + }catch (\Exception $e) { + throw new Exception($e->getMessage()); + } + } + + return 'chunk_file'; + } + + protected function getRandomKey($length = 16){ + $charTable = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + $result = ""; + for ( $i = 0; $i < $length; $i++ ){ + $result .= $charTable[ mt_rand(0, strlen($charTable) - 1) ]; + } + return $result; + } + + public function download($stores, $speed, $policy) + { + + $secretId = $policy['config']['secret_id']; + $secretKey = $policy['config']['secret_key']; + $region = $policy['config']['region']; + $bucket = $policy['config']['bucket']; + + $object = ltrim($stores['file_name'],'/'); + + // COS对象 + $client = new Client([ + 'region' => $region, + 'schema' => 'http', + 'credentials' => [ + 'secretId' => $secretId, + 'secretKey' => $secretKey + ] + ]); + + $disposition = 'attachment; filename='.$stores['origin_name']; + + $url = $client->getPresignedUrl('GetObject',[ + 'Bucket' => $bucket, + 'Key' => $object + ],'+10 minutes')->__toString(); + + $url .= 'response-content-disposition='.urlencode($disposition).'&'; + + // 限速下载 + if($speed !== ""){ + // 下载速度 + $down_speed = round(intval($speed) * 8192); + + // 最小限速100kb/s + if($down_speed < 819200){ + $down_speed = 819200; + } + + $url .= 'x-cos-traffic-limit='.$down_speed; + } + + // 跳转下载地址 + return redirect($url); + } +} \ No newline at end of file diff --git a/application/http/middleware/AdminLoginCheck.php b/application/http/middleware/AdminLoginCheck.php new file mode 100644 index 0000000..633d19d --- /dev/null +++ b/application/http/middleware/AdminLoginCheck.php @@ -0,0 +1,27 @@ +controller() . '/' . $request->action(); + + if(!in_array($request_uri,$this->except) && !(new Users)->login_auth('admin')){ + return redirect('auth/login'); + } + + return $next($request); + } + + +} \ No newline at end of file diff --git a/application/http/middleware/UserLoginCheck.php b/application/http/middleware/UserLoginCheck.php new file mode 100644 index 0000000..a261afb --- /dev/null +++ b/application/http/middleware/UserLoginCheck.php @@ -0,0 +1,37 @@ +controller() . '/' . $request->action(); + + if(!in_array($request_uri,$this->except) && !(new Users)->login_auth('default')){ + (new Users)->logout('default'); + return redirect('user/login'); + } + + return $next($request); + } + +} \ No newline at end of file diff --git a/application/index/controller/File.php b/application/index/controller/File.php new file mode 100644 index 0000000..fd03cc3 --- /dev/null +++ b/application/index/controller/File.php @@ -0,0 +1,349 @@ +userInfo['id'],$page,$limit); + + return json($file_list); + } + + public function mkdir(){ + + $data = input('post.'); + $result = $this->validate($data,[ + 'folder_id' => 'require|number', + 'folder_name' => 'require|chsDash|max:255', + 'folder_miaoshu' => 'max:255' + ],[ + 'folder_name.chsDash' => '文件名只能是汉字、字母、数字和下划线_及破折号-' + ]); + + if($result !== true) return json(['status' => 0,'msg' => $result]); + + try { + $dir_id = FileManage::createFolder($data['folder_id'],$data['folder_name'],$data['folder_miaoshu'],$this->userInfo['id']); + + return json(['status' => 1,'msg' => '新建文件夹成功~','data' => $dir_id]); + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + public function rename(){ + $id = input('get.id'); + $file_name = input('get.file_name'); + $is_folder = input('get.is_folder'); + + $is_folder = intval($is_folder); + + try { + if($is_folder){ + $result = $this->validate(['file_name' => $file_name],[ + 'file_name' => 'require|chsDash|max:255', + ],[ + 'file_name.chsDash' => '文件(夹)名只能是汉字、字母、数字和下划线_及破折号-' + ]); + + $info = Folders::where('id',$id)->where('uid',$this->userInfo['id'])->find(); + if(empty($info)){ + throw new Exception('文件数据不存在'); + } + $info['folder_name'] = $file_name; + $info->save(); + }else{ + $result = $this->validate(['file_name' => $file_name],['file_name' => 'require|max:255',]); + + $info = Stores::where('id',$id)->where('uid',$this->userInfo['id'])->find(); + if(empty($info)){ + throw new Exception('文件数据不存在'); + } + $info['origin_name'] = $file_name; + $info->save(); + } + + if($result !== true){ + throw new Exception($result); + } + + return json(['status' => 1,'msg' => '重命名成功']); + + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + public function delete(){ + $id = input('get.id'); + $is_folder = input('get.is_folder'); + $uid = $this->userInfo['id']; + + if(empty($id)){ + return json(['status' => 0,'msg' => '删除错误,参数缺失']); + } + + //删除目录 + if(boolval($is_folder)){ + + $pid = Folders::where('id',$id)->value('parent_folder'); + + if($pid == 0){ + return json(['status' => 0,'msg' => '删除失败,您不能删除根目录']); + } + + $child_object = getFolderChildFiles($uid,$pid); + + if(!empty($child_object['file'])){ + Stores::destroy($child_object['file']); + } + + if(!empty($child_object['folder'])){ + Folders::destroy($child_object['folder']); + } + + }else{ + Stores::destroy(function($query) use($id,$uid){ + $query->where('id','=',$id)->where('uid','=',$uid); + }); + } + + return json(['status' => 1,'msg' => '删除成功']); + } + + public function edit_folder(){ + $id = input('get.id'); + $info = Folders::get($id); + + if(empty($info)){ + $this->error('数据不存在'); + } + + if($this->request->isPost()){ + $folder_name = input('post.folder_name'); + $folder_miaoshu = input('post.folder_miaoshu'); + $shouyi = input('post.shouyi'); + + Folders::where('id',$id)->update([ + 'folder_name' => $folder_name, + 'desc' => $folder_miaoshu, + 'size' => $shouyi + ]); + + return json(['status' => 1,'msg' => '修改文件夹信息成功']); + } + + $this->assign('info',$info); + return $this->fetch(); + } + + public function edit_file(){ + $id = input('get.id'); + $info = Stores::get($id); + + if(empty($info)){ + $this->error('数据不存在'); + } + + if($this->request->isPost()){ + $file_name = input('post.file_name'); + $file_miaoshu = input('post.file_miaoshu'); + + Stores::where('id',$id)->update([ + 'origin_name' => $file_name, + 'desc' => $file_miaoshu + ]); + + return json(['status' => 1,'msg' => '修改文件信息成功']); + } + + $this->assign('info',$info); + return $this->fetch(); + } + + public function delete_all(){ + $ids = input('get.ids'); + $idFs = input('get.idFs'); + + $uid = $this->userInfo['id']; + $success_ids = []; + + if(empty($ids) && empty($idFs)){ + return json(['status' => 0,'msg' => '请选择需要删除的文件(夹)~']); + } + + if(!empty($ids)){ + $ids_list = explode(',',$ids); + try { + foreach ($ids_list as $file){ + //删除 + Stores::destroy(function($query) use($file,$uid){ + $query->where('id','=',$file)->where('uid','=',$uid); + }); + $success_ids[] = $file; + } + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + if(!empty($idFs)){ + $idFs_list = explode(',',$idFs); + try { + foreach ($idFs_list as $dir){ + $pid = Folders::where('id',$dir)->value('parent_folder'); + if($pid == 0){ + return json(['status' => 0,'msg' => '删除失败,目录操作异常']); + } + + //删除 + $child_object = getFolderChildFiles($uid,$pid); + + if(!empty($child_object['file'])){ + Stores::destroy($child_object['file']); + } + + if(!empty($child_object['folder'])){ + Folders::destroy($child_object['folder']); + } + + $success_ids[] = $dir; + } + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + return json(['status' => 1,'msg' => '成功删除 '.count($success_ids).' 个文件(夹)~','data' => $success_ids]); + } + + public function move_files(){ + $ids = input('get.ids'); + $idFs = input('get.idFs'); + + $this->assign('ids',$ids); + $this->assign('idFs',$idFs); + return $this->fetch(); + } + + public function folder_list(){ + $folder_id = input('post.folder_id',0); + $folder = FileManage::FolderList($folder_id,$this->userInfo['id']); + return json(['status' => 1,'msg' => 'ok','data' => $folder]); + } + + public function move_to_file(){ + $folder_id = input('post.folder_id',0); + $ids = input('post.ids'); + $idFs = input('post.idFs'); + + $uid = $this->userInfo['id']; + + if(empty($ids) && empty($idFs)){ + return json(['status' => 0,'msg' => '请选择需要移动的文件或者文件夹']); + } + + $folder_id = FileManage::getFolderPid($folder_id,$uid); + + $root_folder = FileManage::getFolderPid(0,$uid); + + $ids_list = array_filter(explode(',',trim($ids))); + $idFs_list = array_filter(explode(',',trim($idFs))); + + $success = []; + + //移动目录 + if(!empty($idFs_list)){ + foreach ($idFs_list as $dir){ + if($dir != $root_folder && $dir != $folder_id && !empty($dir)){ + Folders::where('id',$dir)->where('uid',$uid)->update(['parent_folder' => $folder_id]); + $success[] = $dir; + } + } + } + + //移动文件 + if(!empty($ids_list)){ + foreach ($ids_list as $file){ + if(!empty($file)){ + Stores::where('id',$file)->where('uid',$uid)->update(['parent_folder' => $folder_id]); + $success[] = $file; + } + } + } + + return json(['status' => 1,'msg' => '成功移动 '.count($success).' 个文件(夹)~','data' => $success]); + } + + public function set_share_pass(){ + $id = input('get.id'); + $pass = input('get.pass'); + $is_folder = input('get.is_folder'); + $pass_status = input('get.pass_status'); + + $is_folder = intval($is_folder); + $pass_status = intval($pass_status); + + $uid = $this->userInfo['id']; + + if($is_folder){ + $info = Folders::where('id',$id)->where('uid',$uid)->find(); + }else{ + $info = Stores::where('id',$id)->where('uid',$uid)->find(); + } + + if(empty($info)){ + return json(['status' => 0,'msg' => '文件数据不存在']); + } + + $result = $this->validate(['pass' => $pass],['pass|提取码' => 'require|alphaNum|length:4,6'],[ + 'pass.require' => '提取码必须填写', + 'pass.alphaNum' => '提取码只能为字母或者数字', + 'pass.length' => '提取码长度只能为 4 ~ 6 位字母或者数字' + ]); + + if($result !== true) return json(['status' => 0,'msg' => $result]); + + Shares::updateShare($info['shares_id'],[ + 'pwd' => $pass, + 'pwd_status' => $pass_status + ]); + + return json(['status' => 1,'msg' => '设置提取码成功']); + + } + + public function user_download(){ + $id = input('get.id',0); + $info = Stores::where('id',$id)->where('uid',$this->userInfo['id'])->find(); + + if(empty($info)){ + $this->error('数据不存在'); + } + + $share = Shares::where('id',$info['shares_id'])->find(); + + $share_url = getShareUrl($share['code']); + + $this->redirect($share_url); + + } + +} \ No newline at end of file diff --git a/application/index/controller/Index.php b/application/index/controller/Index.php new file mode 100644 index 0000000..0d6e273 --- /dev/null +++ b/application/index/controller/Index.php @@ -0,0 +1,411 @@ +fetch('index_'.config('basic.index_theme')); + } + + public function share(){ + + $code = $this->request->param('code'); + //分享信息 + $info = Shares::where('code',$code)->find(); + + //分享信息不存在 + if(empty($info)){ + return $this->fetch('404'); + } + + // 判断类型 + if($info['type']){ + $storeInfo = Folders::where('uid',$info['uid']) + ->where('id',$info['source_id']) + ->find(); + }else{ + $storeInfo = Stores::where('uid',$info['uid']) + ->where('id',$info['source_id']) + ->find(); + } + + // 存储文件/夹不存在 + if(empty($storeInfo)){ + return $this->fetch('404'); + } + + // 获取文件所有者信息 + $user = Users::where('id',$storeInfo['uid'])->field('id,nickname,avatar,status,group,desc')->find(); + + if(empty($user) || $user['status'] == 0){ + return $this->fetch('404'); + } + + $this->assign('share_id',$info['id']); + $this->assign('is_login',$this->is_login); + $this->assign('url',getShareUrl($code)); + + $share_pwd = Cookie::get('share_key_'.$code); + + // 需要密码 + if($info['pwd_status'] == 1 && !empty($info['pwd']) && $share_pwd != $info['pwd']){ + // VIP用户组 + $vip_group = config('vip.vip_group'); + + $is_vip = $user['group'] == $vip_group ? 1 : 0; + + $desc = empty(trim($user['desc'])) ? '暂无签名' : $user['desc']; + + $this->assign('desc',$desc); + $this->assign('userinfo',$user); + $this->assign('is_vip',$is_vip); + return $this->fetch('pwd'); + } + + // 显示界面 + if($info['type']){ + + // 目录显示 + $base_info = [ + 'id' => $storeInfo['id'], + 'username' => getSafeNickname($user['nickname']), + 'folder_name' => $storeInfo['folder_name'], + 'desc' => $storeInfo['desc'], + 'is_desc' => empty(trim($storeInfo['desc'])) ? 0 : 1, + 'create_time' => $storeInfo->getData('create_time') + ]; + + Folders::where('id',$storeInfo['id'])->where('uid',$storeInfo['uid'])->setInc('count_open',1); + + // 获取当前文件夹下所有文件 + $share_list = FileManage::ShareListFile($storeInfo['id'],$user['id']); + + $this->assign('share_list',$share_list); + $this->assign('info',$base_info); + + if($this->request->isMobile()){ + return $this->fetch('folder_wap'); + } + return $this->fetch('folder'); + }else{ + + // 统计数据 + Profit::record($storeInfo['uid'],$storeInfo['id'],'view'); + + // 文件显示 + $file_info = [ + 'username' => getSafeNickname($user['nickname']), + 'file_name' => $storeInfo['origin_name'], + 'size' => countSize($storeInfo['size']), + 'create_time' => friendDate($storeInfo->getData('create_time')) + ]; + + // 获取VIP价格 + $vip_rule = getVipRule(); + + // 获取最高价格 + $vip_max = end($vip_rule)['id']; + + $download = getFileDownloadUrl($storeInfo['shares_id'],$storeInfo['id']); + + $this->assign('vip_max',$vip_max); + $this->assign('vip_rule',$vip_rule); + $this->assign('download',$download); + $this->assign('user',$this->userInfo); + $this->assign('info',$file_info); + return $this->fetch('file'); + } + } + + public function report(){ + $share_id = input('get.share_id'); + + $share = Shares::where('id',$share_id)->find(); + + if(empty($share)){ + return $this->fetch('user/err',['msg' => '传递参数不正确']); + } + + // 获取文件信息 + if($share['type'] == 1){ + $files = Folders::where('id',$share['source_id'])->find(); + }else{ + $files = Stores::where('id',$share['source_id'])->find(); + } + + // 文件信息获取失败 + if(empty($files)){ + return $this->fetch('user/err',['msg' => '文件信息获取失败']); + } + + // 获取用户信息 + $share_user = Users::where('id',$share['uid'])->find(); + + if(empty($share_user)){ + return $this->fetch('user/err',['msg' => '举报用户不存在']); + } + + // 分享信息 + $report = [ + 'share_id' => $share['id'], + 'source_name' => $share['type'] ? $files['folder_name'] : $files['origin_name'], + 'source_url' => getShareUrl($share['code']), + 'source_uid' => $share['uid'], + 'source_username' => $share_user['username'], + 'source_type' => $share['type'], + 'create_time' => time(), + 'real_ip' => request()->ip() + ]; + + if($this->request->isPost()){ + $data = input('post.'); + $result = $this->validate($data,[ + 'contact|联系方式' => 'require', + 'content|详细描述' => 'require', + 'type|危害类别' => 'require' + ]); + + if($result !== true) return json(['code' => 0,'msg' => $result]); + + $report_key = 'report_'.$share_id; + + if(!empty(Cookie::get($report_key))){ + return json(['code' => 0,'msg' => '您已经举报过了,请勿重复举报']); + } + + $report = array_merge($report,$data); + + Cookie::set('report_'.$share_id,'1'); + + Reports::create($report); + + return json(['code' => 1,'msg' => '举报反馈成功']); + } + + return $this->fetch(); + } + + public function qrcode(){ + $url = input('get.url'); + if(!empty($url)){ + Qrcode::createQrcode($url); + } + } + + public function share_pass(){ + $id = input('post.id'); + $pass = input('post.pass'); + + $id = intval($id); + + $info = Shares::where('id',$id)->find(); + + if(empty($info)){ + return json(['status' => 0,'msg' => '分享数据不存在']); + } + + if($pass != $info['pwd']){ + return json(['status' => 0,'msg' => '提取码不正确']); + } + + Cookie::set('share_key_'.$info['code'],$info['pwd'],3600); + + return json(['status' => 1,'msg' => '提取码正确']); + } + + public function download(){ + $file = input('get.file'); + $shares_id = input('get.shares'); + $timestamp = input('get.timestamp'); + $sign = input('get.sign'); + $is_count = input('get.is_count'); + + // 数据签名校验 + if(!getDownloadFileSignVerify([ + 'file' => $file, + 'shares' => $shares_id, + 'timestamp' => $timestamp + ],$sign)){ + return $this->fetch('user/err',['msg' => '数据sign签名校验失败']); + } + + try { + + // 获取存储数据 + $stores = Stores::get($file); + + if(empty($stores)){ + throw new Exception('文件数据不存在'); + } + + if($is_count){ + // 统计数据 + Profit::record($stores['uid'],$stores['id'],'down',1); + $download_url = getFileDownloadUrl($stores['shares_id'],$stores['id'],0); + return redirect($download_url); + } + + // 获取存储策略 + $policy = $stores->getPolicy(); + + if(empty($policy)){ + throw new Exception('文件数据存储策略不存在'); + } + + // 禁止下载 + if($this->groupData['speed'] === 0){ + throw new Exception('您当前的用户组禁止下载文件'); + } + + // 远程文件下载 + if($policy->type == 'remote'){ + $down_url = getDownloadRemote($stores['file_name'],$stores['origin_name'],$policy->config['server_uri'],$this->groupData['speed'],$policy->config['access_token']); + $this->redirect($down_url); + } + + // 存储驱动下载 + switch ($policy->type){ + case 'aliyunoss': + $driver = new AliyunOss(0,0,0); + break; + case 'txyunoss': + $driver = new TxyunOss(0,0,0); + break; + default: + $driver = new Local(0,0,0); + break; + } + + // 下载 + return $driver->download($stores,$this->groupData['speed'],$policy); + + }catch (Exception $e){ + return $this->fetch('user/err',['msg' => $e->getMessage()]); + } + } + + public function return_callback(){ + $param = input('get.'); + $sign = input('get.sign'); + + if($sign != $this->sign_param($param)){ + $this->error('签名校验失败'); + } + + $order = Order::where('trade_no',$param['out_trade_no'])->find(); + + if(empty($order)){ + $this->error('订单数据不存在'); + } + + if($order['status'] != 1){ + $this->error('订单未支付成功'); + } + + $this->success('VIP开通/续费成功','none','请刷新当前页面,然后重新点击下载'); + } + + public function return_notify(){ + $param = input('get.'); + $sign = input('get.sign'); + + if($sign != $this->sign_param($param)){ + exit('Fail is sign verify.'); + } + + if($param['trade_status'] != 'TRADE_SUCCESS'){ + exit('Fail is trade status.'); + } + + // 查找订单 + $order = Order::where('trade_no',$param['out_trade_no'])->find(); + + if(empty($order)){ + exit('Fail order is not found.'); + } + + // 查找用户 + $user = Users::where('id',$order['uid'])->find(); + + if(empty($user)){ + exit('Fail order user is not found.'); + } + + // VIP用户组 + $vip_group = config('vip.vip_group'); + // 开通/续费时长 + $vip_expire = $order['vip_day'] * 86400; + // 开通/续费VIP + if($user['group'] == $vip_group){ + // 续费VIP + $user['group_expire'] = $user['group_expire'] + $vip_expire; + }else{ + // 开通VIP + $user['group'] = $vip_group; + $user['group_expire'] = time() + $vip_expire; + } + + // 保存数据 + $user->save(); + + // 完成订单 + $order['status'] = 1; + $order['out_trade_no'] = $param['trade_no']; + $order['pay_time'] = time(); + + // 保存订单 + $order->save(); + + // 查询分成用户 + $share = Shares::where('id',$order['profit_id'])->find(); + // 参与分成 + if(!empty($share)){ + // 用户分成奖励比例 + $vip_profit = config('vip.vip_profit'); + // 计算用户分成奖励 + $user_profit = ($order['money'] / 100) * $vip_profit; + // 通用户不奖励 + if($order['uid'] != $share['uid']){ + // 奖励 + Record::addRecord($share['uid'],0,'VIP分成',$user_profit,'用户'.getSafeNickname($user['nickname']).'开通VIP奖励'); + // 记录 + Profit::record($share['uid'],$share['source_id'],'count_order',1); + Profit::record($share['uid'],$share['source_id'],'count_order_yes',1); + Profit::record($share['uid'],$share['source_id'],'count_money',$order['money']); + Profit::record($share['uid'],$share['source_id'],'count_profit',$user_profit); + } + } + + // 处理完成 + exit('SUCCESS'); + } + + protected function sign_param($param): string + { + unset($param['sign']); + unset($param['sign_type']); + ksort($param); + reset($param); + return md5(urldecode(http_build_query($param)) . config('pay.api_key')); + } + +} diff --git a/application/index/controller/Recycle.php b/application/index/controller/Recycle.php new file mode 100644 index 0000000..340976b --- /dev/null +++ b/application/index/controller/Recycle.php @@ -0,0 +1,190 @@ +fetch(); + } + + + public function list(){ + + $limit = input('get.rows',20); + $page = input('get.page',1); + $search = input('get.search',''); + + $file_list = FileManage::RecycleFile($search,$this->userInfo['id'],$page,$limit); + return json($file_list); + } + + + public function clear(){ + // 清空回收站 + $uid = $this->userInfo['id']; + + $success_ids = []; + + try { + $stores = Stores::onlyTrashed()->where('uid',$uid)->select(); + foreach ($stores as $file){ + // 删除文件 + $file->delete(true); + // 删除分享信息 + Profit::where('file_id',$file['id']) + ->where('uid',$uid) + ->delete(); + + $success_ids[] = $file['id']; + } + + $folders = Folders::onlyTrashed()->where('uid',$uid)->select(); + foreach ($folders as $dir){ + // 删除文件 + $dir->delete(true); + // 获取子文件夹 + $folder_object = getFolderChildFiles($uid,$dir['id']); + + // 子文件夹 + if(!empty($folder_object['folder'])){ + Folders::where('id','in',$folder_object['folder'])->delete(true); + } + + // 子文件 + if(!empty($folder_object['file'])){ + // 删除文件 + Stores::where('id','in',$folder_object['file'])->delete(true); + // 删除分享信息 + Profit::where('file_id','in',$folder_object['file']) + ->where('uid',$uid) + ->delete(); + } + + $success_ids[] = $dir['id']; + } + + return json(['status' => 1,'msg' => '成功清空回收站,共删除 '.count($success_ids).' 个文件(夹)~']); + + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + + public function restore(){ + $ids = input('get.ids'); + $idFs = input('get.idFs'); + + $uid = $this->userInfo['id']; + + $success_ids = []; + + if(empty($ids) && empty($idFs)){ + return json(['status' => 0,'msg' => '请选择需要还原的文件(夹)~']); + } + + if(!empty($ids)){ + try { + $stores = Stores::onlyTrashed()->where('id','in',$ids)->where('uid',$uid)->select(); + foreach ($stores as $file){ + //还原文件 + $file->restore(); + $success_ids[] = $file['id']; + } + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + if(!empty($idFs)){ + try { + $folders = Folders::onlyTrashed()->where('id','in',$idFs)->where('uid',$uid)->select(); + foreach ($folders as $dir){ + //还原文件 + $dir->restore(); + $success_ids[] = $dir['id']; + } + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + return json(['status' => 1,'msg' => '成功还原 '.count($success_ids).' 个文件(夹)~','data' => $success_ids]); + } + + + public function delete(){ + $ids = input('get.ids'); + $idFs = input('get.idFs'); + + $uid = $this->userInfo['id']; + $success_ids = []; + + if(empty($ids) && empty($idFs)){ + return json(['status' => 0,'msg' => '请选择需要删除的文件(夹)~']); + } + + if(!empty($ids)){ + try { + $stores = Stores::onlyTrashed()->where('id','in',$ids)->where('uid',$uid)->select(); + foreach ($stores as $file){ + // 删除文件 + $file->delete(true); + + // 删除分享信息 + Profit::where('file_id',$file['id']) + ->where('uid',$uid) + ->delete(); + + $success_ids[] = $file['id']; + } + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + if(!empty($idFs)){ + try { + $folders = Folders::onlyTrashed()->where('id','in',$idFs)->where('uid',$uid)->select(); + foreach ($folders as $dir){ + // 删除文件 + $dir->delete(true); + + // 获取子文件夹 + $folder_object = getFolderChildFiles($uid,$dir['id']); + + // 子文件夹 + if(!empty($folder_object['folder'])){ + Folders::where('id','in',$folder_object['folder'])->delete(true); + } + + // 子文件 + if(!empty($folder_object['file'])){ + // 删除文件 + Stores::where('id','in',$folder_object['file'])->delete(true); + // 删除分享信息 + Profit::where('file_id','in',$folder_object['file']) + ->where('uid',$uid) + ->delete(); + } + + $success_ids[] = $dir['id']; + } + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => $e->getMessage()]); + } + } + + return json(['status' => 1,'msg' => '成功彻底删除 '.count($success_ids).' 个文件(夹)~','data' => $success_ids]); + } + +} \ No newline at end of file diff --git a/application/index/controller/Share.php b/application/index/controller/Share.php new file mode 100644 index 0000000..171c370 --- /dev/null +++ b/application/index/controller/Share.php @@ -0,0 +1,121 @@ + $time]; + }else{ + $time = date('Y-m-d'); + } + + $list = Profit::where('uid',$this->userInfo['id']) + ->whereBetweenTime('create_time',$time) + ->order([ + 'count_money' => 'desc', + 'id' => 'desc' + ]) + ->paginate(15,false,[ + 'query' => $query + ]); + + $this->assign('time',$time); + $this->assign('list',$list); + return $this->fetch(); + } + + public function record(){ + + $list = Record::where('uid',$this->userInfo['id'])->order('create_time desc')->paginate(15); + + $this->assign('list',$list); + + return $this->fetch(); + } + + public function withdraw(){ + + $list = Withdraw::where('uid',$this->userInfo['id'])->order('create_time desc')->paginate(15); + $money = Withdraw::where('uid',$this->userInfo['id'])->where('status',1)->sum('money'); + + $this->assign('money',$money); + $this->assign('list',$list); + $this->assign('amount',$this->userInfo['amount']); + return $this->fetch(); + } + + public function echarts(){ + $id = input('get.id'); + + // 获取当月所有时间 + $month_time = []; + $time_type = []; + + for ($i = 0;$i < 30;$i++){ + $month_time[] = strtotime('-'.$i.' day'); + $time_type[] = "'".date('m-d',strtotime('-'.$i.' day'))."'"; + } + + $time_type = array_reverse($time_type); + $time_type = implode(',',$time_type); + + // 获取当月间隔时间 + $start_time = strtotime(date('Y-m-d',strtotime('-29 day'))); + $end_time = strtotime('now'); + + // 获取30天的统计记录 + $profit = Profit::where('file_id',$id) + ->where('uid',$this->userInfo['id']) + ->whereTime('create_time','>=',$start_time) + ->whereTime('create_time','<=',$end_time) + ->order('create_time desc') + ->select(); + + + // 图表统计 + $series_reg = str_split(str_repeat('0',30),1); + $series_order = str_split(str_repeat('0',30),1); + $series_money = str_split(str_repeat('0',30),1); + + foreach ($month_time as $key => $item){ + $item_time = date('Y-m-d',$item); + foreach ($profit as $profit_item){ + $profit_time = date('Y-m-d',$profit_item['create_time']); + if($item_time == $profit_time){ + $series_reg[$key] = $profit_item['count_reg']; + $series_order[$key] = $profit_item['count_order_yes']; + $series_money[$key] = $profit_item['count_money']; + } + } + } + + $series_reg = array_reverse($series_reg); + $series_reg = implode(',',$series_reg); + + $series_order = array_reverse($series_order); + $series_order = implode(',',$series_order); + + $series_money = array_reverse($series_money); + $series_money = implode(',',$series_money); + + $this->assign('profit',$profit); + + $this->assign('series_reg',$series_reg); + $this->assign('series_order',$series_order); + $this->assign('series_money',$series_money); + $this->assign('time_type',$time_type); + return $this->fetch(); + } + + +} \ No newline at end of file diff --git a/application/index/controller/Upload.php b/application/index/controller/Upload.php new file mode 100644 index 0000000..1675340 --- /dev/null +++ b/application/index/controller/Upload.php @@ -0,0 +1,116 @@ +getPolicy(); + + // 上传文件数量限制 + $upload_limit = 20; + + // 上传限制 + $upload_rule = [ + 'upsize_byte' => $this->groupData['max_storage'], + 'upsize' => countSize($this->groupData['max_storage']), + 'fsize_byte' => $this->groupData['max_storage'] * $upload_limit, + 'fsize' => countSize($this->groupData['max_storage'] * $upload_limit), + ]; + + $folder_id = FileManage::getFolderAllowPid(0,$this->userInfo['id']); + + $upload_api = $this->getPolicyUrl($policy,[ + 'md' => 'upload', + 'size' => $this->groupData['max_storage'], + 'notify' => url('upload/notify','',false,true), + 'root_folder_id' => $folder_id + ]); + + $this->assign('upload_api',$upload_api); + + $this->assign('upload_limit',$upload_limit); + $this->assign('upload_rule',$upload_rule); + + return $this->fetch(); + } + + public function notify(){ + $data = input('get.'); + $policy_id = input('get.policy_id'); + $sign = input('get.sign'); + + $policy = Policys::where('id',$policy_id)->find(); + + if(empty($policy)){ + exit('Fail policy not found.'); + } + + if(empty($sign)){ + exit('Fail is no params a sign.'); + } + + $remote_sign = $this->remote_sign_params($data,$policy['config']['access_token']); + + if($remote_sign != $sign){ + exit('Fail is sign verify.'); + } + + // 加入数据库 + $data = [ + 'uid' => $data['uid'], + 'origin_name' => $data['name'], + 'file_name' => $data['path'], + 'size' => $data['size'], + 'meta' => '', + 'mime_type' => $data['mime'], + 'ext' => $data['ext'], + 'parent_folder' => $data['folder_id'], + 'policy_id' => $policy['id'], + 'dir' => '', + 'create_time' => time(), + 'update_time' => time() + ]; + + $file_id = (new Stores)->insertGetId($data); + + $share_id = Shares::addShare($data['uid'],$file_id,0); + + Stores::where('id',$file_id)->update(['shares_id' => $share_id]); + + exit('UPLOAD_SUCCESS'); + } + + public function file(){ + + // 存储策略 + $policy = $this->getPolicy(); + + try { + // 上传文件 + $result = (new FileUpload()) + ->source($this->userInfo['id'],$policy,$this->groupData['max_storage']) + ->upload(); + + return json($result); + + }catch (Exception $e){ + return json(['code' => 0,'msg' => $e->getMessage()]); + } + + } + +} \ No newline at end of file diff --git a/application/index/controller/User.php b/application/index/controller/User.php new file mode 100644 index 0000000..6a1284d --- /dev/null +++ b/application/index/controller/User.php @@ -0,0 +1,433 @@ +fetch(); + } + + public function login(){ + $layer = input('get.layer',0); + $share_id = input('get.share_id',0); + + if(empty($layer)) $layer = 0; + + if((new Users)->login_auth('default')){ + return redirect('user/index'); + } + + if($this->request->isPost()){ + $username = input('post.username'); + $password = input('post.password'); + + try { + (new Users)->login($username,$password,'default'); + + return json(['status' => 1,'msg' => '登录成功']); + }catch (\Throwable $e){ + return json(['status' => 0,'msg' => '登录失败:' . $e->getMessage()]); + } + } + + $this->assign('share_id',$share_id); + $this->assign('layer',$layer); + return $this->fetch(); + } + + public function register(){ + $data = input('post.'); + $share_id = input('get.share_id'); + + if(config('register.allow_register') != 1){ + return json(['code' => 0,'msg' => '管理员已关闭用户注册功能']); + } + + $result = $this->validate($data,[ + 'nickname|昵称' => 'require|chsAlphaNum|length:2,18', + 'username|用户帐号' => 'require|alphaNum|length:6,26', + 'password|登录密码' => 'require|alphaNum|length:6,18', + 'email|安全邮箱' => 'require|email' + ]); + + if($result !== true) return json(['code' => 0,'msg' => $result]); + + $default_group = config('register.default_group'); + + // 获取注册来源 + $share_info = Shares::where('id',$share_id)->find(); + + try { + (new Users)->register( + $data['username'], + $data['email'], + $data['password'], + $default_group, + ['nickname' => $data['nickname']] + ); + + // 统计数据 + if(!empty($share_info)){ + Profit::record($share_info['uid'],$share_info['source_id'],'reg',1); + } + + return json(['code' => 1,'msg' => '注册帐号成功']); + }catch (Exception $e){ + return json(['code' => 0,'msg' => $e->getMessage()]); + } + + } + + public function logout(){ + (new Users)->logout('default'); + $this->success('退出登录成功','index/index'); + } + + public function vip(){ + $share_id = input('get.share_id',0); + $is_layer = input('get.layer',0); + + $rule = getVipRule(); + + $this->assign('rule',$rule); + $this->assign('share_id',$share_id); + $this->assign('is_layer',$is_layer); + + if($this->request->isMobile()){ + return $this->fetch('vip_wap'); + } + return $this->fetch(); + } + + public function payment(){ + $vip_type = input('get.vip',0); + $share_id = input('get.share_id',0); + $pay_type = input('get.pay_type',0); + + if($pay_type != 'alipay' && $pay_type != 'wxpay'){ + $this->error('支付方式错误'); + } + + // 获取VIP规则 + $rule = getVipRule(); + + // 判断VIP类型是否正确 + if(!isset($rule[$vip_type])){ + $this->error('VIP类型不存在'); + } + + // 获取VIP价格 + $vip_config = $rule[$vip_type]; + + // 获取支付配置信息 + $config = config('pay.'); + + // 本地创建订单号 + $trade_no = strtoupper('VIP_'.date('YmdHis').substr(md5(uniqid()),0,10)); + + // 订单数据 + $order = [ + 'uid' => $this->userInfo['id'], + 'trade_no' => $trade_no, + 'type' => $pay_type, + 'profit_id' => $share_id, + 'money' => $vip_config['money'], + 'vip_day' => $vip_config['day'], + 'create_time' => time(), + 'status' => 0 + ]; + + Order::create($order); + + // 获取支付参数 + $pay_params = [ + 'pid' => $config['api_pid'], + 'type' => $pay_type, + 'out_trade_no' => $trade_no, + 'notify_url' => url('index/return_notify','',false,true), + 'return_url' => url('index/return_callback','',false,true), + 'name' => 'VIP会员', + 'money' => $vip_config['money'] + ]; + + ksort($pay_params); + reset($pay_params); + + $pay_params['sign'] = md5(urldecode(http_build_query($pay_params)) . $config['api_key']); + $pay_params['sign_type'] = strtoupper('MD5'); + + + $pay_html = '正在跳转支付'; + $pay_html .= ''; + $pay_html .= ''; + // 拼接支付表单 + $pay_html .= '
'; + foreach ($pay_params as $key => $val) { + $pay_html .= ''; + } + $pay_html .= '
'; + $pay_html .= ""; + $pay_html .= ''; + + exit($pay_html); + } + + public function vip_close(){ + $lock_time = time() - 7200; + Order::where('status',0) + ->limit(50) + ->whereTime('create_time','<=',$lock_time) + ->update(['status' => 2]); + + return json(['code' => 1,'msg' => '关闭订单成功']); + } + + public function forget(){ + if($this->request->isPost()){ + $email = input('post.email'); + $result = $this->validate(['email' => $email],['email|安全邮箱' => 'require|email']); + if($result !== true) return json(['code' => 0,'msg' => $result]); + $info = Users::where('email',$email)->find(); + if(empty($info)){ + return json(['code' => 0,'msg' => '该邮箱未绑定帐号']); + } + + // 获取key + $forget_key = 'forget_'.str_replace(['@','.'],['_','_'],$info['email']); + + // 邮件发送记录 + $forget_info = Cache::get($forget_key); + + if(!empty($forget_info)){ + if($forget_info['time'] >= time()){ + return json(['code' => 0,'msg' => '发送频繁,请等待'.($forget_info['time'] - time()) . ' 秒后重新发送']); + } + } + + $hash_key = bin2hex($forget_key); + $sign = md5($forget_key . time()); + // 设置找回密码key + Cache::set($forget_key,[ + 'uid' => $info['id'], + 'email' => $info['email'], + 'sign' => $sign, + 'time' => time() + 60 + ],600); + + // 找回密码链接 + $forget_url = url('user/reset','',false,true)."?key={$hash_key}&sign={$sign}"; + + // 发送邮件 + if(!sendEmail($info['username'],$forget_url)){ + return json(['code' => 0,'msg' => '找回密码邮件发送失败,请联系管理员处理']); + } + + return json(['code' => 1,'msg' => '找回密码邮件发送成功']); + } + return $this->fetch(); + } + + public function reset(){ + $key = input('get.key'); + $sign = input('get.sign'); + + if(empty($key) || empty($sign)){ + return $this->fetch('err',['msg' => '参数缺失']); + } + + $forget_key = @hex2bin($key); + + if(empty($forget_key)){ + return $this->fetch('err',['msg' => '参数验证失败']); + } + + $forget_info = Cache::get($forget_key); + + if(empty($forget_info)){ + return $this->fetch('err',['msg' => '访问错误,无效链接']); + } + + if($sign != $forget_info['sign']){ + return $this->fetch('err',['msg' => '访问错误,数据签名校验失败']); + } + + if($this->request->isPost()){ + $pwd = input('post.pwd'); + $result = $this->validate(['pwd' => $pwd],['pwd|密码' => 'require|alphaNum|length:6,18']); + if($result !== true) return json(['code' => 0,'msg' => $result]); + + $password = md5($pwd . config('app.pass_salt')); + + Users::where('id',$forget_info['uid'])->update(['password' => $password]); + + return json(['code' => 1,'msg' => '密码修改成功']); + } + + $this->assign('key',$key); + $this->assign('sign',$sign); + return $this->fetch('reset'); + } + + public function auth(){ + if($this->request->isPost()){ + $data = input('post.'); + $result = $this->validate($data,[ + 'name|姓名' => 'require|chs|length:2,20', + 'idcard|身份证号码' => 'require|idCard' + ]); + + if($result !== true) return json(['code' => 0,'msg' => $result]); + + if($this->userInfo['is_auth']){ + return json(['code' => 0,'msg' => '您已完成实名认证,请勿重复提交']); + } + + if(Certify::where('uid',$this->userInfo['id'])->where('status',0)->count() > 0){ + return json(['code' => 0,'msg' => '您提交的实名资料正在审核中,请勿重复提交']); + } + + Certify::create([ + 'uid' => $this->userInfo['id'], + 'name' => $data['name'], + 'idcard' => $data['idcard'], + 'create_time' => time() + ]); + + return json(['code' => 1,'msg' => '实名资料已提交,请耐心等待审核']); + } + + $this->assign('info',$this->userInfo->getCertify()); + $this->assign('is_auth',$this->userInfo['is_auth']); + return $this->fetch(); + } + + public function withdraw(){ + if($this->request->isPost()){ + $data = input('post.'); + $result = $this->validate($data,[ + 'tx_money|提现金额' => 'require|float', + 'alipay_account|支付宝帐号' => 'require|max:255', + 'alipay_name|支付宝姓名' => 'require|chs|max:60' + ]); + + if($result !== true) return json(['code' => 0,'msg' => $result]); + + $withdraw_count = Withdraw::where('uid',$this->userInfo['id']) + ->where('status',0) + ->whereTime('create_time','d') + ->count(); + + if($withdraw_count > 0){ + return json(['code' => 0,'msg' => '您有一条提现申请还在审核中,请勿重复提交']); + } + + if(floatval($this->userInfo['amount']) - floatval($data['tx_money']) < 0){ + return json(['code' => 0,'msg' => '您的账户余额不足']); + } + + // 扣钱 + Record::addRecord($this->userInfo['id'],1,'用户提现',$data['tx_money'],'余额提现'.$data['tx_money'].'元至支付宝'); + + // 添加记录 + Withdraw::create([ + 'uid' => $this->userInfo['id'], + 'money' => $data['tx_money'], + 'alipay_account' => $data['alipay_account'], + 'alipay_name' => $data['alipay_name'], + 'create_time' => time() + ]); + + return json(['code' => 1,'msg' => '申请成功,请等待处理']); + } + $this->assign('amount',$this->userInfo['amount']); + return $this->fetch(); + } + + public function info(){ + return $this->fetch(); + } + + public function change_pass(){ + $data = input('post.'); + $result = $this->validate($data,[ + 'old_password|原密码' => 'require|alphaNum|length:6,18', + 'password|新密码' => 'require|alphaNum|length:6,18' + ]); + + if($result !== true){ + return json(['code' => 0,'msg' => $result]); + } + + + $en_password = md5($data['old_password'] . config('app.pass_salt')); + + if($en_password != $this->userInfo['password']){ + return json(['code' => 0,'msg' => '修改失败,原密码不正确']); + } + + $en_new_password = md5($data['password'] . config('app.pass_salt')); + + Users::where('id',$this->userInfo['id'])->update([ + 'password' => $en_new_password + ]); + + return json(['code' => 1,'msg' => '密码修改成功,请重新登录']); + } + + public function set_userinfo(){ + $data = input('post.'); + $result = $this->validate($data,[ + 'nickname|昵称' => 'require|max:30|min:1', + 'desc|个性签名' => 'max:255' + ]); + + if($result !== true){ + return json(['code' => 0,'msg' => $result]); + } + + Users::where('id',$this->userInfo['id'])->update([ + 'nickname' => $data['nickname'], + 'desc' => $data['desc'] + ]); + + return json(['code' => 1,'msg' => '更新用户资料成功']); + } + + public function upload_avatar(){ + $file = request()->file('file'); + + if(!$file){ + return json(['code' => 0,'msg' => '请选择上传的文件','data' => []]); + } + + // 根目录 + $root_path = getSafeDirSeparator(realpath(env('root_path') . './public').'/avatar'); + + $info = $file->validate(['size'=> 2097152,'ext'=>'jpg,png,gif'])->move($root_path); + if($info){ + $avatar = '/avatar/'.str_replace('\\','/',$info->getSaveName()); + Users::where('id',$this->userInfo['id'])->update([ + 'avatar' => $avatar + ]); + return json(['code' => 1,'msg' => '头像上传成功','data' => []]); + }else{ + // 上传失败获取错误信息 + return json(['code' => 0,'msg' => $file->getError(),'data' => []]); + } + } + +} \ No newline at end of file diff --git a/application/index/view/file/edit_file.html b/application/index/view/file/edit_file.html new file mode 100644 index 0000000..9f5ab54 --- /dev/null +++ b/application/index/view/file/edit_file.html @@ -0,0 +1,123 @@ + + + + + + + + + +
+ + +
+ * + 文件名称 + +
+
+ 文件描述 + +
+ +

+   +

+
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/application/index/view/file/edit_folder.html b/application/index/view/file/edit_folder.html new file mode 100644 index 0000000..515e083 --- /dev/null +++ b/application/index/view/file/edit_folder.html @@ -0,0 +1,128 @@ + + + + + + + + + + + + +
+ *文件夹名称 + +
+
+

文件夹描述

+ +
+ +
+ +
+
+ +
+ + + + \ No newline at end of file diff --git a/application/index/view/file/move_files.html b/application/index/view/file/move_files.html new file mode 100644 index 0000000..648806f --- /dev/null +++ b/application/index/view/file/move_files.html @@ -0,0 +1,463 @@ + + + + + + + + + + + + + + + +
+
+
    +
  • +
    + + + 根目录 + +
    +
      +
    +
  • +
+
+
+ + +
+ +
+ + + + +
+
+
+ +

新建文件夹

+
+
+
+
+

确定

+
+
+

取消

+
+
+
+ + + + + \ No newline at end of file diff --git a/application/index/view/index/404.html b/application/index/view/index/404.html new file mode 100644 index 0000000..1739336 --- /dev/null +++ b/application/index/view/index/404.html @@ -0,0 +1,18 @@ + + + + + + + 404文件不存在 + + + +
来晚啦...文件取消分享了
+ + \ No newline at end of file diff --git a/application/index/view/index/file.html b/application/index/view/index/file.html new file mode 100644 index 0000000..f4eec80 --- /dev/null +++ b/application/index/view/index/file.html @@ -0,0 +1,394 @@ + + + + + + + + + + {$info.file_name} - {$Think.config.basic.site_title} + + + + + + + +
+
+
+ + +
+
+
+
+

文件下载:{$info.file_name}

+

+ 文件大小{$info.size} + 上传时间{$info.create_time} + 分享用户{$info.username} +

+
+ +
+ +
+
+ + {eq name="$vip_info.is_vip" value="0"} +
+
+
+
+
普通下载低速
+
下载需时约 60 分钟
+ +
+
+
+
+
+ +
+
登录下载稳定
+
下载需时约 5 分钟
+ +
+
+
+
+
+
+
VIP极速下载推荐
+
下载需时约 1 秒
+ +
+
+
+ {else/} +
+
+
+
+ +
+
电信下载VIP专用
+ +
+
+
+
+
+ +
+
联通下载VIP专用
+ +
+
+
+
+
+ +
+
移动下载VIP专用
+ +
+
+
+ {/eq} + + {eq name="$vip_info.is_vip" value="1"} +
+
+
+
+

+ 尊贵的{$group.group_name}您好,您已经购买成为 + {$group.group_name} + 到期时间:{$vip_info.expire_time}

+
+ +
+ +
+
+ {/eq} + +
+
+
+
+
+
+
升级会员尊享极速下载
永久更省83% +
+
+ + 限时大促 最后一天!仅剩 + 2 小时 20 分钟 17 秒 + +
+
+
+ + {php} + $vip_list_num = 0; + {/php} + + {volist name="$vip_rule" id="vo" key="k"} + {eq name="$vo.is_top" value="1"} +
+ {php} + $vip_list_num++; + $is_hot = intval(($vip_list_num % 3) == 2); + {/php} +
+
+

{$vo.name}

+ 限时{$vo.discount}折 +

+ {$vo.desc} +

+

+ {$vo.money} + 元 / {$vo.day_name} +
+ {$vo.discount_msg} +

+ +
+
+
+ {/eq} + {/volist} + +
+
所有会员均尊享以下特权:
+ VIP极速下载通道 + 多文件同时下载 + 去除弹窗广告 +
+
+
+
+ + + +
+
+
+
+

谨防刷单兼职,网贷,金融,裸聊敲诈,赌博等诈骗,请立即举报

+
+
+
+
+ +
+ +
+
+
+

版权声明:不得利用云存储发布,存储,淫秽,诈骗等违法信息。 + 侵权/违法投诉 + 或者投诉邮箱:{$Think.config.basic.site_email}

+
+
+

© 2018-2021 {$Think.config.basic.site_title}

+
+
+
+ + + + +
+
+ + + \ No newline at end of file diff --git a/application/index/view/index/folder.html b/application/index/view/index/folder.html new file mode 100644 index 0000000..0b20ee4 --- /dev/null +++ b/application/index/view/index/folder.html @@ -0,0 +1,82 @@ + + + + + + + {$info.folder_name} - {$Think.config.basic.site_title} + + + + + +
+
+
+   +
+
+ {eq name="$is_login" value="1"} + 前往我的网盘 + {else/} + 登录 + {/eq} +
+
+
+
+ +
+
+
{$info.folder_name}
+
+ 分享者: + {$info.username} + {$info.create_time|date="Y-m-d H:i"} + 文件投诉 +
+
+ + {eq name="$info.is_desc" value="1"} +
+ + {$info.desc} +
+ {/eq} + +
+
文件名
+
大小
+
时间
+
+
+ {volist name="$share_list" id="vo"} +
+
+    + {$vo.name} +
+
{$vo.size}
+
{$vo.time}
+
+ {/volist} +
+
+ +
+
手机可扫描二维码下载
+
+ +
+
+
+ 谨防刷单兼职,网贷,金融,裸聊敲诈,赌博等诈骗,请立即举报 +
+
版权声明:不得利用云存储发布,存储,淫秽,诈骗等违法信息。 + 侵权/违法投诉
或者投诉邮箱:{$Think.config.basic.site_email}
+ © 2021 {$Think.config.basic.site_title} +
+
+ + + \ No newline at end of file diff --git a/application/index/view/index/folder_wap.html b/application/index/view/index/folder_wap.html new file mode 100644 index 0000000..044ddda --- /dev/null +++ b/application/index/view/index/folder_wap.html @@ -0,0 +1,70 @@ + + + + + + {$info.folder_name} - {$Think.config.basic.site_title} + + + + + +
+
+
+   +
+
+ {eq name="$is_login" value="1"} + 前往我的网盘 + {else/} + 登录 + {/eq} +
+
+
+
+
+ +
+
{$info.folder_name}
+
+ 分享者:{$info.username} + {$info.create_time|date="Y-m-d"} + + 举报文件 + +
+ + {eq name="$info.is_desc" value="1"} + + {$info.desc} + {/eq} +
+ +
+
文件名
+
+ {volist name="$share_list" id="vo"} + + {/volist} +
+
+
+ + +
© 2018-2021 {$Think.config.basic.site_title}
+ + + + \ No newline at end of file diff --git a/application/index/view/index/index_default.html b/application/index/view/index/index_default.html new file mode 100644 index 0000000..64536b8 --- /dev/null +++ b/application/index/view/index/index_default.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + {$Think.config.basic.site_name} + + + + + {$Think.config.basic.site_head|raw} + + + + + +
+
+ + + +
+
+
+
+
高速存储的云盘
+
+ {$Think.config.basic.site_title}是一款速度快、不打扰、够安全、易于分享的网络云盘,你可以在这里存储、管理和探索内容,尽情打造丰富的数字世界。
+ + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+

存储到云端更畅快

+
+
+
+

尽享极速

+

上传下载

+

告别 kb/s,极速上传下载文件资料,

+

免费用户也享有合理带宽。

+ +
+
+

网盘联盟

+

资源共享

+

您的数据,变的有价值!

+

入口一直向你敞开。

+ +
+
+

云端数据

+

非常安全

+

分享文件地址永久有效

+

不必担心过期而经常更换链接。

+

+ +
+
+
+
+ +
+ +
+ + + + + + +{$Think.config.basic.site_foot|raw} + + \ No newline at end of file diff --git a/application/index/view/index/index_new1.html b/application/index/view/index/index_new1.html new file mode 100644 index 0000000..d19298f --- /dev/null +++ b/application/index/view/index/index_new1.html @@ -0,0 +1,149 @@ + + + + + {$Think.config.basic.site_name} + + + + + + + + + {$Think.config.basic.site_head|raw} + + + + + + +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
1,免费注册
2,上传文件
3,分享链接
+ + 登录 + + + 注册 + +
+
+
+
+
+
+
+
+ +
+ +
+
+
网盘用高效说话...
+
分享文件地址永久有效,不必担心过期而经常更换链接,帮您节省繁琐步骤,把时间用到有价值的地方去。 +
+
+
+
+
+
+
+
+
+
体验真正的云加速
+
下载无任何限制,无验证码等影响用户体验限制。
+
在蓝奏,所有云存储、文件下载都是秒级响应。采用网众公司云计算+存储分发技术。任何网络,享受到最快的下载速度。
+
立刻体验
+
+
+
+
+
我们的优势...
+
整合各种资源为你所用,为你24小时不间断增加收入。帮你解决各种问题,节省你的时间,等于让你赚更多的钱。
我们对于任何大小客户同等待遇,对下载IP不做各种级别区分,都是高价。了解详情
+
+
+
+
我们这么一群人...
+
我们是一群有着激情的年轻人组成的团队,如果你怀才不遇无处倾诉?各类有才能之士,凡是有一技之长,赶快加入我们。 + 了解详情
+
+
+
+
+
+

+ Copyright © 2018-2021 {$Think.config.basic.site_title} All rights + reserved. 版权所有 +

+
+
+ + + +{$Think.config.basic.site_foot|raw} + + \ No newline at end of file diff --git a/application/index/view/index/pwd.html b/application/index/view/index/pwd.html new file mode 100644 index 0000000..35b3f9d --- /dev/null +++ b/application/index/view/index/pwd.html @@ -0,0 +1,106 @@ + + + + + + + + 请输入提取码 - {$Think.config.basic.site_title} + + + + + + + + + +
+
+
+  
+
+ 登录 +
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
{:getSafeNickname($userinfo.nickname)}
+   + + {eq name="$is_vip" value="1"} + + {else/} + + {/eq} + +
+
{$desc}
+
+
+
+
+
+
请输入提取码:
+
+ + + +
+
+
+
+ 验证码:
+
+ + 验证码换一张 +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/application/index/view/index/report.html b/application/index/view/index/report.html new file mode 100644 index 0000000..cb81931 --- /dev/null +++ b/application/index/view/index/report.html @@ -0,0 +1,422 @@ + + + + + + + + + + 举报 - {$Think.config.basic.site_title} + + + + +
互联网不良信息 文件举报
+
+ 文件举报说明:
+ 1,如果有害信息类别属于“版权或者危害他人”,请提供以下材料: +
+ 版权证明文件(如著作权、版权证书等)或侵犯他人权利的相关证明(如肖像权的本人身份证等)。书面处理请求书(需要注明处理方式,如删除相关文件或冻结用户账户文件等)。举报人的相关证件扫描件(如身份证、营业执照等),如果与第一项版权证明不相符的,还需要提供 + 授权委托书 。
+ 以上材料均采用电子扫描件,并加盖公章或签名。发送到邮件 {$Think.config.basic.site_email}

+ 2,如果文件含有诈骗,病毒,木马,淫秽等问题,可以直接提交。 +
+
+
+
+ + + + + + + + + + + + + + + + + + +
+
联系邮箱/手机号:[必填]
+ +
+
+
详细描述:
+ + +
+
+
危害类别: +
+ + + + + + +
+
+
+
+ + 请稍后... +
+
+
+
+ + +
+ +
+
+ + + \ No newline at end of file diff --git a/application/index/view/layout/user.html b/application/index/view/layout/user.html new file mode 100644 index 0000000..9481444 --- /dev/null +++ b/application/index/view/layout/user.html @@ -0,0 +1,310 @@ + + + + + + + + 文件管理 - {$Think.config.basic.site_title} + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + +
+ +
{/eq} + {eq name="$vip_info.is_vip" value="1"}tan="VIP到期时间:{$vip_info.expire_time}">{/eq} + + +

+ {$info.nickname} ({$group.group_name}) +

+

+
+
+
+

+ 退出登录 +

+
+
+
+
+
+ + +
+ {block name="main"}{/block} +
+
+
+ + +
+
+ + + + + + + + + \ No newline at end of file diff --git a/application/index/view/recycle/index.html b/application/index/view/recycle/index.html new file mode 100644 index 0000000..e09efff --- /dev/null +++ b/application/index/view/recycle/index.html @@ -0,0 +1,236 @@ +{extend name="layout/user" /} +{block name="main"} +
+ +
+
+ + +
+

清空

+
+ + +
+
+
+ + +
+
+
+ + + +
+ + 放到回收站中的文件,外链无法分享不可下载。重要文件不要放到回收站! + + + + 文件操作可使用右键 + + 已全部加载,共- + + + +
+ +
+ + +
+ + +
+ +
+ + +
+
+{/block} \ No newline at end of file diff --git a/application/index/view/share/echarts.html b/application/index/view/share/echarts.html new file mode 100644 index 0000000..0a8db0b --- /dev/null +++ b/application/index/view/share/echarts.html @@ -0,0 +1,122 @@ + + + + + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + {volist name="profit" id="vo"} + + + + + + + + + + + + + {/volist} + +
浏览下载总订单成功订单注册金额分成日期星期几天前
{$vo.count_view}{$vo.count_down}{$vo.count_order}{$vo.count_order_yes}{$vo.count_reg}{$vo.count_money}{$vo.count_profit}{$vo.create_time|date="Y-m-d"}{:getWeekDay($vo.create_time)}{:getTimeLastDay($vo.create_time)}天前
+
+ + + + \ No newline at end of file diff --git a/application/index/view/share/index.html b/application/index/view/share/index.html new file mode 100644 index 0000000..02b1d99 --- /dev/null +++ b/application/index/view/share/index.html @@ -0,0 +1,153 @@ +{extend name="layout/user" /} + + +{block name="main"} + + + + +
+
+ +
+
+
+ +
+
+ 时间: + +   + 实名认证  |  + 申请提现 +
+ + + + + + + + + + + + + + + + + + + {volist name="list" id="vo"} + + + + + + + + + + + + + + {/volist} + +
ID所属文件浏览下载注册总订单成功订单金额收益操作
{$vo.id}{:getFileName($vo.file_id)}{$vo.count_view}{$vo.count_down}{$vo.count_reg}{$vo.count_order}{$vo.count_order_yes}{$vo.count_money}{$vo.count_profit} + 走势图 +
+
+ {$list|raw} +
+
+ +
+
+
+
+
+ + + + +{/block} \ No newline at end of file diff --git a/application/index/view/share/record.html b/application/index/view/share/record.html new file mode 100644 index 0000000..636dba8 --- /dev/null +++ b/application/index/view/share/record.html @@ -0,0 +1,69 @@ +{extend name="layout/user" /} + + +{block name="main"} + + + + +
+
+ +
+
+
+ +
+
+ 累计收益:0
+ + + + + + + + + + + + + + + {volist name="list" id="vo"} + + + + + + + + + + {/volist} + +
ID原因来源变更金额变更前变更后时间
{$vo.id}{$vo.remark}{$vo.source} + {eq name="$vo.type" value="0"} + + {$vo.money} + {else/} + - {$vo.money} + {/eq} + {$vo.before_money}{$vo.after_money}{$vo.create_time|date="Y-m-d H:i"}
+ +
+ {$list|raw} +
+ +
+ + +
+
+
+
+
+{/block} \ No newline at end of file diff --git a/application/index/view/share/withdraw.html b/application/index/view/share/withdraw.html new file mode 100644 index 0000000..b65b0fd --- /dev/null +++ b/application/index/view/share/withdraw.html @@ -0,0 +1,121 @@ +{extend name="layout/user" /} + + +{block name="main"} + + + + +
+
+ +
+
+
+ +
+
+ 账户余额:{$amount} +  |  累计提现:{$money} 元 +  |  实名认证 +  |  申请提现 +
+ + + + + + + + + + + + + + {volist name="list" id="vo"} + + + + + + + + + {/volist} + +
ID提现金额支付宝账号支付宝姓名状态提现时间
{$vo.id}{$vo.money} ¥{$vo.alipay_account}{$vo.alipay_name} + {eq name="$vo.status" value="0"}等待处理{/eq} + {eq name="$vo.status" value="1"}提现成功{/eq} + {eq name="$vo.status" value="2"}资金退回{/eq} + {$vo.create_time|date="Y-m-d H:i"}
+ +
+ {$list|raw} +
+ +
+ + +
+
+
+
+
+ + +{/block} \ No newline at end of file diff --git a/application/index/view/upload/index.html b/application/index/view/upload/index.html new file mode 100644 index 0000000..1740e3a --- /dev/null +++ b/application/index/view/upload/index.html @@ -0,0 +1,473 @@ + + + + + + + + + + + +
+
+
+ +
+
+
+
点击选择文件
+
+ + +
+
+

或将文件拖到这里,单次最多可选{$upload_limit}个

+

凡是上传违反国家法律文件,一律封号处理!!!

+
+
    +
    +
    +
    + +
    +
    + + + + + \ No newline at end of file diff --git a/application/index/view/user/auth.html b/application/index/view/user/auth.html new file mode 100644 index 0000000..5734a19 --- /dev/null +++ b/application/index/view/user/auth.html @@ -0,0 +1,85 @@ + + + + + + + + + + + +
    +
    + +
    + +
    + +
    +
    + + + {eq name="$is_auth" value="1"} +
    + +
    +
    {:getSafeNickname($info.name)}
    +
    +
    +
    + +
    +
    {:getSafeNickname($info.idcard)}
    +
    +
    + {else/} +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + {/eq} +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/application/index/view/user/err.html b/application/index/view/user/err.html new file mode 100644 index 0000000..afe9620 --- /dev/null +++ b/application/index/view/user/err.html @@ -0,0 +1,23 @@ + + + + + + + {$msg} + + + +
    +
    +
    +
    + {$msg} +
    + + \ No newline at end of file diff --git a/application/index/view/user/forget.html b/application/index/view/user/forget.html new file mode 100644 index 0000000..5e0b47c --- /dev/null +++ b/application/index/view/user/forget.html @@ -0,0 +1,126 @@ + + + + + + + 找回密码 - {$Think.config.basic.site_title} + + + + + + + + +
    + +
    +
    + + +
    +
    +
    为用户而变革,越简单越好,越快越好 !
    +
    会分享,就会有收获!
    + +
    + +
    + 找回密码 +
    + +
    + +
    + +
    + +
    +
    请安全邮箱
    +
    + +
    +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + +
    © 2021 {$Think.config.basic.site_title}
    + + \ No newline at end of file diff --git a/application/index/view/user/index.html b/application/index/view/user/index.html new file mode 100644 index 0000000..5eaab41 --- /dev/null +++ b/application/index/view/user/index.html @@ -0,0 +1,334 @@ +{extend name="layout/user" /} +{block name="main"} +
    +
    +
    + + +
    + +

    上传

    +
    + +
    + +

    新建

    +
    + + +
    +
    +
    + + +
    +
    +
    + + +
    + + 全部文件 + + + + 文件操作可使用右键 + + 已全部加载,共0 + + + +
    + + + + + + + + +
    + + +
    + + + + + + + + + +
    + +
    + + + + +
    +
    +{/block} \ No newline at end of file diff --git a/application/index/view/user/info.html b/application/index/view/user/info.html new file mode 100644 index 0000000..996265a --- /dev/null +++ b/application/index/view/user/info.html @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + {eq name="$vip_info.is_vip" value="1"} + VIP到期时间:{$vip_info.expire_time} + {else/} + 未开通 + {/eq} +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    + + + + + \ No newline at end of file diff --git a/application/index/view/user/login.html b/application/index/view/user/login.html new file mode 100644 index 0000000..2e5b6be --- /dev/null +++ b/application/index/view/user/login.html @@ -0,0 +1,366 @@ + + + + + + + 会员登录 - {$Think.config.basic.site_title} + + + + + + + + + +{eq name="layer" value="1"} +
    + + + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    请输入密码
    +
    + +
    +
    +
    + +
    + +
    + +
    +{/eq} + +{eq name="layer" value="0"} +
    + +
    +
    + + +
    +
    +
    为用户而变革,越简单越好,越快越好 !
    +
    会分享,就会有收获!
    + +
    + + + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    请输入密码
    +
    + +
    +
    +
    + +
    + + +
    + +
    +{/eq} + + +
    + +{eq name="layer" value="0"} + +
    © 2021 {$Think.config.basic.site_title}
    +{/eq} + + \ No newline at end of file diff --git a/application/index/view/user/reset.html b/application/index/view/user/reset.html new file mode 100644 index 0000000..76dfc3b --- /dev/null +++ b/application/index/view/user/reset.html @@ -0,0 +1,133 @@ + + + + + + + 重置密码 - {$Think.config.basic.site_title} + + + + + + + + +
    + +
    +
    + + +
    +
    +
    为用户而变革,越简单越好,越快越好 !
    +
    会分享,就会有收获!
    + +
    + +
    + 设置密码 +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    请设置密码
    +
    + +
    +
    + +
    + +
    + +
    + +
    + + +
    + + +
    © 2021 {$Think.config.basic.site_title}
    + + \ No newline at end of file diff --git a/application/index/view/user/vip.html b/application/index/view/user/vip.html new file mode 100644 index 0000000..300d301 --- /dev/null +++ b/application/index/view/user/vip.html @@ -0,0 +1,133 @@ + + + + + + + + + + + +
    + +
    +
    +
    + +

    开通账号: + {eq name="$vip_info.is_vip" value="1"} + {$info.nickname} + {else/} + {$info.nickname} + {/eq} +

    +
    + 开通VIP会员,畅享极速下载! +
    +
    +
    +
      + {volist name="$rule" id="vo"} +
    • + +
    • + {/volist} +
    +
    +
    + 支付方式: + + + + + + +
    +
    + 应付金额: +

    0.00元

    +
    +
    +
    + + 网盘运营需要成本。您的支持,就是我们更好的动力! +
    +
    +
    + + + + \ No newline at end of file diff --git a/application/index/view/user/vip_wap.html b/application/index/view/user/vip_wap.html new file mode 100644 index 0000000..8ba208f --- /dev/null +++ b/application/index/view/user/vip_wap.html @@ -0,0 +1,150 @@ + + + + + + + Document + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/index/view/user/withdraw.html b/application/index/view/user/withdraw.html new file mode 100644 index 0000000..d844939 --- /dev/null +++ b/application/index/view/user/withdraw.html @@ -0,0 +1,67 @@ + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/application/provider.php b/application/provider.php new file mode 100644 index 0000000..e474e82 --- /dev/null +++ b/application/provider.php @@ -0,0 +1,15 @@ + +// +---------------------------------------------------------------------- + +// 应用容器绑定定义 +return [ + +]; diff --git a/application/tags.php b/application/tags.php new file mode 100644 index 0000000..a38ed9a --- /dev/null +++ b/application/tags.php @@ -0,0 +1,30 @@ + +// +---------------------------------------------------------------------- + +// 应用行为扩展定义文件 +return [ + // 应用初始化 + 'app_init' => [ + 'app\\common\\behavior\\LoadConfigRun' + ], + // 应用开始 + 'app_begin' => [], + // 模块初始化 + 'module_init' => [], + // 操作开始执行 + 'action_begin' => [], + // 视图内容过滤 + 'view_filter' => [], + // 日志写入 + 'log_write' => [], + // 应用结束 + 'app_end' => [], +]; diff --git a/build.php b/build.php new file mode 100644 index 0000000..34ba3c8 --- /dev/null +++ b/build.php @@ -0,0 +1,26 @@ + +// +---------------------------------------------------------------------- + +return [ + // 生成应用公共文件 + '__file__' => ['common.php'], + + // 定义demo模块的自动生成 (按照实际定义的文件名生成) + 'demo' => [ + '__file__' => ['common.php'], + '__dir__' => ['behavior', 'controller', 'model', 'view'], + 'controller' => ['Index', 'Test', 'UserType'], + 'model' => ['User', 'UserType'], + 'view' => ['index/index'], + ], + + // 其他更多的模块定义 +]; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..9a14f3d --- /dev/null +++ b/composer.json @@ -0,0 +1,43 @@ +{ + "name": "topthink/think", + "description": "the new thinkphp framework", + "type": "project", + "keywords": [ + "framework", + "thinkphp", + "ORM" + ], + "homepage": "http://thinkphp.cn/", + "license": "Apache-2.0", + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "require": { + "php": ">=7.0", + "topthink/framework": "5.1.*", + "ext-json": "*", + "topthink/think-captcha": "2.0.*", + "ext-fileinfo": "*", + "aferrandini/phpqrcode": "^1.0", + "ext-mbstring": "*", + "phpmailer/phpmailer": "^6.5", + "ext-iconv": "*", + "ext-curl": "*", + "aliyuncs/oss-sdk-php": "^2.4", + "qcloud/cos-sdk-v5": "^2.3" + }, + "autoload": { + "psr-4": { + "app\\": "application" + } + }, + "extra": { + "think-path": "thinkphp" + }, + "config": { + "preferred-install": "dist" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..55f6b80 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1106 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "b9ba42fa345853d6f2e242a9db638267", + "packages": [ + { + "name": "aferrandini/phpqrcode", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/aferrandini/PHPQRCode.git", + "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aferrandini/PHPQRCode/zipball/3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", + "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "PHPQRCode": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ariel Ferrandini", + "email": "arielferrandini@gmail.com", + "homepage": "http://www.ferrandini.com/", + "role": "Developer" + } + ], + "description": "PHPQRCode porting and changed for PHP 5.3 compatibility", + "homepage": "https://github.com/aferrandini/PHPQRCode", + "keywords": [ + "barcode", + "php", + "qrcode" + ], + "abandoned": "endroid/qr-code", + "time": "2013-07-08T09:39:08+00:00" + }, + { + "name": "aliyuncs/oss-sdk-php", + "version": "v2.4.3", + "source": { + "type": "git", + "url": "https://github.com/aliyun/aliyun-oss-php-sdk.git", + "reference": "4ccead614915ee6685bf30016afb01aabd347e46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/4ccead614915ee6685bf30016afb01aabd347e46", + "reference": "4ccead614915ee6685bf30016afb01aabd347e46", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "*", + "satooshi/php-coveralls": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "OSS\\": "src/OSS" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aliyuncs", + "homepage": "http://www.aliyun.com" + } + ], + "description": "Aliyun OSS SDK for PHP", + "homepage": "http://www.aliyun.com/product/oss/", + "time": "2021-08-25T13:03:58+00:00" + }, + { + "name": "guzzlehttp/command", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/command.git", + "reference": "14eaba459ad9f97d11637821d95c0a5463d0d515" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/command/zipball/14eaba459ad9f97d11637821d95c0a5463d0d515", + "reference": "14eaba459ad9f97d11637821d95c0a5463d0d515", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "guzzlehttp/guzzle": "^7.3", + "guzzlehttp/promises": "^1.3", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.19" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Command\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + } + ], + "description": "Provides the foundation for building command-based web service clients", + "time": "2021-08-14T22:00:15+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "7008573787b430c1c1f650e3722d9bba59967628" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628", + "reference": "7008573787b430c1c1f650e3722d9bba59967628", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "psr/log": "^1.1" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.3-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "time": "2021-03-23T11:33:13+00:00" + }, + { + "name": "guzzlehttp/guzzle-services", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle-services.git", + "reference": "acd7ab1b83658ad7c1abd2a0871b825f65007202" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle-services/zipball/acd7ab1b83658ad7c1abd2a0871b825f65007202", + "reference": "acd7ab1b83658ad7c1abd2a0871b825f65007202", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "guzzlehttp/command": "^1.2", + "guzzlehttp/guzzle": "^7.3", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "guzzlehttp/uri-template": "^0.2 || ^1.0", + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.19 || ^9.5.8" + }, + "suggest": { + "gimler/guzzle-description-loader": "^0.0.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Command\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "Stefano Kowalke", + "email": "blueduck@mail.org", + "homepage": "https://github.com/konafets" + } + ], + "description": "Provides an implementation of the Guzzle Command library that uses Guzzle service descriptions to describe web services, serialize requests, and parse responses into easy to use model structures.", + "time": "2021-08-14T22:36:10+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2021-03-07T09:25:29+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", + "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2021-06-30T20:03:07+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "88fcf8a3ea7489a8af6b25c9dfd3f688ddb51966" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/88fcf8a3ea7489a8af6b25c9dfd3f688ddb51966", + "reference": "88fcf8a3ea7489a8af6b25c9dfd3f688ddb51966", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos", + "role": "Developer" + } + ], + "description": "A polyfill class for uri_template of PHP", + "homepage": "https://github.com/guzzlehttp/uri-template", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "time": "2021-08-14T22:34:51+00:00" + }, + { + "name": "phpmailer/phpmailer", + "version": "v6.5.1", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.2", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.6.0", + "yoast/phpunit-polyfills": "^1.0.0" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "time": "2021-08-18T09:14:16+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "qcloud/cos-sdk-v5", + "version": "v2.3.3", + "source": { + "type": "git", + "url": "https://github.com/tencentyun/cos-php-sdk-v5.git", + "reference": "9690eb289f5aa3c158a50e4061abfe9b9ad32421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tencentyun/cos-php-sdk-v5/zipball/9690eb289f5aa3c158a50e4061abfe9b9ad32421", + "reference": "9690eb289f5aa3c158a50e4061abfe9b9ad32421", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "guzzlehttp/guzzle": ">=6.2.1", + "guzzlehttp/guzzle-services": ">=1.1", + "guzzlehttp/psr7": "<=2.0", + "php": ">=5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Qcloud\\Cos\\": "src/Qcloud/Cos/" + }, + "files": [ + "src/Qcloud/Cos/Common.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "yaozongyou", + "email": "yaozongyou@vip.qq.com" + }, + { + "name": "lewzylu", + "email": "327874225@qq.com" + }, + { + "name": "tuunalai", + "email": "550566181@qq.com" + } + ], + "description": "PHP SDK for QCloud COS", + "keywords": [ + "cos", + "php", + "qcloud" + ], + "time": "2021-09-23T09:30:18+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "topthink/framework", + "version": "v5.1.41", + "source": { + "type": "git", + "url": "https://github.com/top-think/framework.git", + "reference": "7137741a323a4a60cfca334507cd1812fac91bb2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/framework/zipball/7137741a323a4a60cfca334507cd1812fac91bb2", + "reference": "7137741a323a4a60cfca334507cd1812fac91bb2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.6.0", + "topthink/think-installer": "2.*" + }, + "require-dev": { + "johnkary/phpunit-speedtrap": "^1.0", + "mikey179/vfsstream": "~1.6", + "phpdocumentor/reflection-docblock": "^2.0", + "phploc/phploc": "2.*", + "phpunit/phpunit": "^5.0|^6.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "2.*" + }, + "type": "think-framework", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + }, + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "the new thinkphp framework", + "homepage": "http://thinkphp.cn/", + "keywords": [ + "framework", + "orm", + "thinkphp" + ], + "time": "2021-01-11T02:51:29+00:00" + }, + { + "name": "topthink/think-captcha", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-captcha.git", + "reference": "54c8a51552f99ff9ea89ea9c272383a8f738ceee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-captcha/zipball/54c8a51552f99ff9ea89ea9c272383a8f738ceee", + "reference": "54c8a51552f99ff9ea89ea9c272383a8f738ceee", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "topthink/framework": "5.1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "think\\captcha\\": "src/" + }, + "files": [ + "src/helper.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "captcha package for thinkphp5", + "time": "2017-12-31T16:37:49+00:00" + }, + { + "name": "topthink/think-installer", + "version": "v2.0.5", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-installer.git", + "reference": "38ba647706e35d6704b5d370c06f8a160b635f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-installer/zipball/38ba647706e35d6704b5d370c06f8a160b635f88", + "reference": "38ba647706e35d6704b5d370c06f8a160b635f88", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "composer-plugin-api": "^1.0||^2.0" + }, + "require-dev": { + "composer/composer": "^1.0||^2.0" + }, + "type": "composer-plugin", + "extra": { + "class": "think\\composer\\Plugin" + }, + "autoload": { + "psr-4": { + "think\\composer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "time": "2021-01-14T12:12:14+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.0", + "ext-json": "*", + "ext-fileinfo": "*", + "ext-mbstring": "*", + "ext-iconv": "*", + "ext-curl": "*" + }, + "platform-dev": [] +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..73b58c9 --- /dev/null +++ b/config/app.php @@ -0,0 +1,148 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 应用设置 +// +---------------------------------------------------------------------- + +return [ + // 应用名称 + 'app_name' => 'SkyPan', + // 应用地址 + 'app_host' => '', + // 应用调试模式 + 'app_debug' => true, + // 应用Trace + 'app_trace' => false, + // 是否支持多模块 + 'app_multi_module' => true, + // 入口自动绑定模块 + 'auto_bind_module' => false, + // 注册的根命名空间 + 'root_namespace' => [], + // 默认输出类型 + 'default_return_type' => 'html', + // 默认AJAX 数据返回格式,可选json xml ... + 'default_ajax_return' => 'json', + // 默认JSONP格式返回的处理方法 + 'default_jsonp_handler' => 'jsonpReturn', + // 默认JSONP处理方法 + 'var_jsonp_handler' => 'callback', + // 默认时区 + 'default_timezone' => 'Asia/Shanghai', + // 是否开启多语言 + 'lang_switch_on' => false, + // 默认全局过滤方法 用逗号分隔多个 + 'default_filter' => '', + // 默认语言 + 'default_lang' => 'zh-cn', + // 应用类库后缀 + 'class_suffix' => false, + // 控制器类后缀 + 'controller_suffix' => false, + + // +---------------------------------------------------------------------- + // | 模块设置 + // +---------------------------------------------------------------------- + + // 默认模块名 + 'default_module' => 'index', + // 禁止访问模块 + 'deny_module_list' => ['common'], + // 默认控制器名 + 'default_controller' => 'Index', + // 默认操作名 + 'default_action' => 'index', + // 默认验证器 + 'default_validate' => '', + // 默认的空模块名 + 'empty_module' => '', + // 默认的空控制器名 + 'empty_controller' => 'Error', + // 操作方法前缀 + 'use_action_prefix' => false, + // 操作方法后缀 + 'action_suffix' => '', + // 自动搜索控制器 + 'controller_auto_search' => false, + + // +---------------------------------------------------------------------- + // | URL设置 + // +---------------------------------------------------------------------- + + // PATHINFO变量名 用于兼容模式 + 'var_pathinfo' => 's', + // 兼容PATH_INFO获取 + 'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'], + // pathinfo分隔符 + 'pathinfo_depr' => '/', + // HTTPS代理标识 + 'https_agent_name' => '', + // IP代理获取标识 + 'http_agent_ip' => 'X-REAL-IP', + // URL伪静态后缀 + 'url_html_suffix' => '', + // URL普通方式参数 用于自动生成 + 'url_common_param' => false, + // URL参数方式 0 按名称成对解析 1 按顺序解析 + 'url_param_type' => 0, + // 是否开启路由延迟解析 + 'url_lazy_route' => false, + // 是否强制使用路由 + 'url_route_must' => false, + // 合并路由规则 + 'route_rule_merge' => false, + // 路由是否完全匹配 + 'route_complete_match' => false, + // 使用注解路由 + 'route_annotation' => false, + // 域名根,如thinkphp.cn + 'url_domain_root' => '', + // 是否自动转换URL中的控制器和操作名 + 'url_convert' => true, + // 默认的访问控制器层 + 'url_controller_layer' => 'controller', + // 表单请求类型伪装变量 + 'var_method' => '_method', + // 表单ajax伪装变量 + 'var_ajax' => '_ajax', + // 表单pjax伪装变量 + 'var_pjax' => '_pjax', + // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则 + 'request_cache' => false, + // 请求缓存有效期 + 'request_cache_expire' => null, + // 全局请求缓存排除规则 + 'request_cache_except' => [], + // 是否开启路由缓存 + 'route_check_cache' => false, + // 路由缓存的Key自定义设置(闭包),默认为当前URL和请求类型的md5 + 'route_check_cache_key' => '', + // 路由缓存类型及参数 + 'route_cache_option' => [], + + // 默认跳转页面对应的模板文件 + 'dispatch_success_tmpl' => env('root_path') . 'config/tpl/success_tmpl.tpl', + 'dispatch_error_tmpl' => env('root_path') . 'config/tpl/error_tmpl.tpl', + + // 异常页面的模板文件 + //'exception_tmpl' => env('root_path') . 'config/tpl/error_404_tmpl.tpl', + + // 错误显示信息,非调试模式有效 + 'error_message' => '页面错误!请稍后再试~', + // 显示错误信息 + 'show_error_msg' => false, + // 异常处理handle类 留空使用 \think\exception\Handle + 'exception_handle' => '', + // 密码盐 + 'pass_salt' => 'tbg-sk-pan-ver-1-1-0' + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..985dbb1 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,25 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 缓存设置 +// +---------------------------------------------------------------------- + +return [ + // 驱动方式 + 'type' => 'File', + // 缓存保存目录 + 'path' => '', + // 缓存前缀 + 'prefix' => '', + // 缓存有效期 0表示永久缓存 + 'expire' => 0, +]; diff --git a/config/cookie.php b/config/cookie.php new file mode 100644 index 0000000..1de0708 --- /dev/null +++ b/config/cookie.php @@ -0,0 +1,30 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | Cookie设置 +// +---------------------------------------------------------------------- +return [ + // cookie 名称前缀 + 'prefix' => '', + // cookie 保存时间 + 'expire' => 0, + // cookie 保存路径 + 'path' => '/', + // cookie 有效域名 + 'domain' => '', + // cookie 启用安全传输 + 'secure' => false, + // httponly设置 + 'httponly' => '', + // 是否使用 setcookie + 'setcookie' => true, +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..b7d18b0 --- /dev/null +++ b/config/database.php @@ -0,0 +1,63 @@ + +// +---------------------------------------------------------------------- + +return [ + // 数据库类型 + 'type' => 'mysql', + // 服务器地址 + 'hostname' => '127.0.0.1', + // 数据库名 + 'database' => 'skpan', + // 用户名 + 'username' => 'root', + // 密码 + 'password' => 'root', + // 端口 + 'hostport' => '3306', + // 连接dsn + 'dsn' => '', + // 数据库连接参数 + 'params' => [], + // 数据库编码默认采用utf8 + 'charset' => 'utf8', + // 数据库表前缀 + 'prefix' => 'sk_', + // 数据库调试模式 + 'debug' => true, + // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'deploy' => 0, + // 数据库读写是否分离 主从式有效 + 'rw_separate' => false, + // 读写分离后 主服务器数量 + 'master_num' => 1, + // 指定从服务器序号 + 'slave_no' => '', + // 自动读取主库数据 + 'read_master' => false, + // 是否严格检查字段是否存在 + 'fields_strict' => true, + // 数据集返回类型 + 'resultset_type' => 'array', + // 自动写入时间戳字段 + 'auto_timestamp' => false, + // 时间字段取出后的默认时间格式 + 'datetime_format' => 'Y-m-d H:i:s', + // 是否需要进行SQL性能分析 + 'sql_explain' => false, + // Builder类 + 'builder' => '', + // Query类 + 'query' => '\\think\\db\\Query', + // 是否需要断线重连 + 'break_reconnect' => false, + // 断线标识字符串 + 'break_match_str' => [], +]; diff --git a/config/log.php b/config/log.php new file mode 100644 index 0000000..b3d87b4 --- /dev/null +++ b/config/log.php @@ -0,0 +1,30 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 日志设置 +// +---------------------------------------------------------------------- +return [ + // 日志记录方式,内置 file socket 支持扩展 + 'type' => 'File', + // 日志保存目录 + 'path' => '', + // 日志记录级别 + 'level' => [], + // 单文件日志写入 + 'single' => false, + // 独立日志级别 + 'apart_level' => [], + // 最大日志文件数量 + 'max_files' => 0, + // 是否关闭日志写入 + 'close' => false, +]; diff --git a/config/menu.php b/config/menu.php new file mode 100644 index 0000000..3d73e9b --- /dev/null +++ b/config/menu.php @@ -0,0 +1,138 @@ + 1, + 'title' => '面板首页', + 'icon' => 'layui-icon layui-icon-console', + 'type' => 1, + 'href' => url('dashboard/index'), + ], + [ + 'id' => 2, + 'title' => '用户管理', + 'icon' => 'layui-icon layui-icon-component', + 'type' => 0, + 'href' => '', + 'children' => [ + [ + 'id' => 121, + 'title' => '用户列表', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('user/index') + ], + [ + 'id' => 122, + 'title' => '用户组管理', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('group/index') + ], + ] + ], + [ + 'id' => 3, + 'title' => '文件管理', + 'icon' => 'layui-icon layui-icon-template-1', + 'type' => 0, + 'href' => '', + 'children' => [ + [ + 'id' => 131, + 'title' => '文件列表', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('file/index') + ], + [ + 'id' => 132, + 'title' => '文件回收站', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('recycle/index') + ], + ] + ], + [ + 'id' => 4, + 'title' => '储存策略', + 'icon' => 'layui-icon layui-icon-util', + 'type' => 1, + 'href' => url('policy/index'), + ], + [ + 'id' => 5, + 'title' => '订单记录', + 'icon' => 'layui-icon layui-icon-chart', + 'type' => 1, + 'href' => url('order/index'), + ], + [ + 'id' => 6, + 'title' => '提现列表', + 'icon' => 'layui-icon layui-icon-form', + 'type' => 1, + 'href' => url('withdraw/index'), + ], + [ + 'id' => 7, + 'title' => '实名认证', + 'icon' => 'layui-icon layui-icon-vercode', + 'type' => 1, + 'href' => url('certify/index'), + ], + [ + 'id' => 8, + 'title' => '举报处理', + 'icon' => 'layui-icon layui-icon-about', + 'type' => 1, + 'href' => url('report/index'), + ], + [ + 'id' => 10, + 'title' => '系统设置', + 'icon' => 'layui-icon layui-icon-set-fill', + 'type' => 0, + 'href' => '', + 'children' => [ + [ + 'id' => 101, + 'title' => '基本设置', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('setting/basic') + ], + [ + 'id' => 102, + 'title' => '注册访问', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('setting/register') + ], + [ + 'id' => 103, + 'title' => '支付配置', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('setting/pay') + ], + [ + 'id' => 104, + 'title' => '邮件配置', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('setting/email') + ], + [ + 'id' => 105, + 'title' => 'VIP配置', + 'type' => 1, + 'openType' => '_iframe', + 'href' => url('setting/vip') + ] + ] + ] + +]; \ No newline at end of file diff --git a/config/middleware.php b/config/middleware.php new file mode 100644 index 0000000..fe15ec3 --- /dev/null +++ b/config/middleware.php @@ -0,0 +1,18 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 中间件配置 +// +---------------------------------------------------------------------- +return [ + // 默认中间件命名空间 + 'default_namespace' => 'app\\http\\middleware\\', +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..1d7b6c6 --- /dev/null +++ b/config/session.php @@ -0,0 +1,26 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 会话设置 +// +---------------------------------------------------------------------- + +return [ + 'id' => '', + // SESSION_ID的提交变量,解决flash上传跨域 + 'var_session_id' => '', + // SESSION 前缀 + 'prefix' => 'think', + // 驱动方式 支持redis memcache memcached + 'type' => '', + // 是否自动开启 SESSION + 'auto_start' => true, +]; diff --git a/config/template.php b/config/template.php new file mode 100644 index 0000000..653184c --- /dev/null +++ b/config/template.php @@ -0,0 +1,40 @@ + +// +---------------------------------------------------------------------- + +// +---------------------------------------------------------------------- +// | 模板设置 +// +---------------------------------------------------------------------- + + +return [ + // 模板引擎类型 支持 php think 支持扩展 + 'type' => 'Think', + // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 + 'auto_rule' => 1, + // 模板路径 + 'view_path' => '', + // 模板后缀 + 'view_suffix' => 'html', + // 模板文件名分隔符 + 'view_depr' => DIRECTORY_SEPARATOR, + // 模板引擎普通标签开始标记 + 'tpl_begin' => '{', + // 模板引擎普通标签结束标记 + 'tpl_end' => '}', + // 标签库标签开始标记 + 'taglib_begin' => '{', + // 标签库标签结束标记 + 'taglib_end' => '}', + // 全局替换 + 'tpl_replace_string' => [ + '__STATIC__'=>'/assets', + ] +]; diff --git a/config/tpl/error_404_tmpl.tpl b/config/tpl/error_404_tmpl.tpl new file mode 100644 index 0000000..c2a1089 --- /dev/null +++ b/config/tpl/error_404_tmpl.tpl @@ -0,0 +1,31 @@ + + + + + + + + + + +
    + +
    +

    404

    +

    抱歉,你访问的页面不存在

    + +
    +
    + + + + + + diff --git a/config/tpl/error_tmpl.tpl b/config/tpl/error_tmpl.tpl new file mode 100644 index 0000000..ccaefd5 --- /dev/null +++ b/config/tpl/error_tmpl.tpl @@ -0,0 +1,66 @@ + + + + + + {$msg} + + + + +
    +
    +
    +
    + +
    +

    {$msg}

    +

    + {$data} +

    +
    + {if $msg=='权限不足'} + 立即关闭 + + {else} + 立即跳转 + + {/if} +
    +
    +
    +
    + + + + + diff --git a/config/tpl/success_tmpl.tpl b/config/tpl/success_tmpl.tpl new file mode 100644 index 0000000..0b3fff6 --- /dev/null +++ b/config/tpl/success_tmpl.tpl @@ -0,0 +1,46 @@ + + + + + + {$msg} + + + + +
    +
    +
    +
    + +
    +

    {$msg}

    +

    + {$data} +

    +
    + {neq name="$url" value="/index/none"} + 立即跳转 + + {/neq} +
    +
    +
    +
    + + + diff --git a/extend/Qrcode/Qrcode.php b/extend/Qrcode/Qrcode.php new file mode 100644 index 0000000..65472eb --- /dev/null +++ b/extend/Qrcode/Qrcode.php @@ -0,0 +1,12 @@ +12 原价15元|高速多线程下载文件,原价9元。|0\n月付VIP|2|30|月|6.3|立省175元 仅 1.33元/月|高速多线程下载文件,比周付省11%。|1\n半年VIP|3|180|半年|5.2|立省420元 原价450元|高速多线程下载文件,比月付省35%。|1\n一年VIP|4|360|年|4.7|立省420元 原价450元|高速多线程下载文件,比月付省50%。|1\n永久VIP|20|9999|永久|2.7|立省420元 原价450元|高速多线程下载文件,比月付省73%。|0','vip'),(19,'site_email','test@admin.com','basic'),(20,'smtp_host','smtp.qq.com','email'),(21,'smtp_port','465','email'),(22,'nickname','SK网盘官方','email'),(23,'username','zygphper@foxmail.com','email'),(24,'password','xyuufcokuxendbfi','email'),(25,'template_forget','

     

    \n\n\n\n\n\n\n\n\n
     \n
    \n\n\n\n\n\n\n\n\n\n
    找回密码验证 -【{site_title}】
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    亲爱的 {username}
    请点击下方按钮完成密码重设。十分钟之内有效,如果非你本人操作,请忽略此邮件。
    点击设置新密码
    感谢您选择{site_title}
    \n
    \n
    \n\n\n\n\n\n\n
    此邮件由系统自动发送,请不要直接回复。
    \n

    \n
    \n
     
    ','email'),(26,'site_kefu','客服QQ:1665555255

    客服在线时间:早上9点-晚上22点

    如遇到任何问题请联系客服处理
    对此给您带来的不便深感抱歉','basic'),(27,'vip_profit','50','vip'),(28,'index_theme','new1','basic'); +/*!40000 ALTER TABLE `sk_setting` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sk_shares` +-- + +DROP TABLE IF EXISTS `sk_shares`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `sk_shares` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID', + `source_id` int(11) NOT NULL DEFAULT '0' COMMENT '文件 / 目录ID', + `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0 文件 1目录', + `speed` tinyint(1) NOT NULL DEFAULT '0' COMMENT '限速开关', + `code` varchar(10) NOT NULL DEFAULT '' COMMENT '短网址代码', + `pwd` varchar(8) DEFAULT NULL COMMENT '分享密码', + `pwd_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '密码状态', + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=129 DEFAULT CHARSET=utf8 COMMENT='分享表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sk_shares` +-- + +LOCK TABLES `sk_shares` WRITE; +/*!40000 ALTER TABLE `sk_shares` DISABLE KEYS */; +INSERT INTO `sk_shares` VALUES (1,5,13,1,0,'QVNbueubNW','fmrw',0),(4,5,54,0,0,'aYbA3iNCSk','kHIb',0),(5,5,55,0,0,'JJBjIvUM80','',0),(6,5,14,1,0,'7NVjYnhxwT','jPAT',0),(7,5,56,0,0,'yaYJ3mrsYP','Wt9G',0),(8,5,57,0,0,'qy2a6fp7PW','CkLp',0),(9,5,58,0,0,'7bmANrUqUE','MyFS',0),(10,5,59,0,0,'NJVjEzpLFh','BFaM',0),(11,5,60,0,0,'mmArMvpqNn','5XPd',0),(12,5,61,0,0,'nUjuQz1qb2','98Zl',0),(13,5,62,0,0,'MzUnIjCVom','5ERQ',0),(14,5,63,0,0,'IziqeylQaJ','1Qmi',0),(15,5,64,0,0,'2uAnEr0QFn','FNx2',0),(16,5,65,0,0,'YB7bI3IucT','MCpN',0),(17,5,66,0,0,'qERnMf08KE','iKVU',0),(18,5,67,0,0,'YFJbiySL45','c8Mu',0),(19,5,68,0,0,'UFjIf2QqnV','3G2H',0),(20,5,69,0,0,'EzuYburVJs','qkIU',0),(21,5,70,0,0,'6Vzmmu1ksV','SHdA',0),(22,5,71,0,0,'MbIr2yNNJT','yV7I',0),(23,5,72,0,0,'JzyeInn1Pi','Gmmb',0),(24,5,73,0,0,'imiQraBLcN','Pa2p',0),(25,5,74,0,0,'EJZRZrJMbq','W2IS',0),(26,5,75,0,0,'eqAfaiWH7R','D1B8',0),(27,5,76,0,0,'UFj2uq57f4','SQ9u',0),(28,5,77,0,0,'Bf6vEfdCoU','sgnk',0),(29,5,78,0,0,'imaqyala0O','oTAG',0),(30,5,79,0,0,'VfMV7fnMhl','TWAr',0),(31,5,80,0,0,'QVbeqiRTAZ','eaCW',0),(32,5,81,0,0,'JBBfUvPgwv','uzc5',0),(33,5,82,0,0,'FFNJzmsgjK','NU7M',0),(34,5,83,0,0,'2aiEZbNudq','ynBq',0),(35,5,84,0,0,'3aMFVfKSwN','gkRD',0),(36,5,85,0,0,'uqiYfaxfkv','QxfD',0),(37,5,86,0,0,'VVZzyaLcG0','HRhA',0),(38,5,87,0,0,'FJv2mmUflN','Fg90',0),(39,5,15,1,0,'73eA32Tg7o','4uA5',0),(40,5,16,1,0,'YNfUzmZhx8','nEMH',0),(41,5,17,1,0,'eiiQFjdEpA','sBNK',0),(42,5,18,1,0,'YreIjqrjMS','CdZc',0),(43,5,88,0,0,'QfIzAvSL40','lZcP',0),(44,4,19,1,0,'j6ZnqaMTRo','wAvF',0),(45,4,89,0,0,'VZVnumE7Km','02tC',0),(46,5,90,0,0,'NbUFFfo3sb','J8tF',0),(47,5,91,0,0,'EfQ3QbG4aK','Bctq',0),(48,5,92,0,0,'NZb6B3ic49','jrDc',0),(49,5,93,0,0,'aqUNNnZmR2','632a',0),(50,5,94,0,0,'qeeMFrQTea','adpb',0),(51,5,95,0,0,'v6vyIbYLEW','5Guc',0),(52,5,96,0,0,'FZrIZ3YkZE','7d65',0),(53,5,97,0,0,'FzyqmqBrEb','2xry',0),(54,5,98,0,0,'qim2qmNTqN','2yOS',0),(55,5,99,0,0,'iuQJnuSQHT','UJmM',0),(56,5,100,0,0,'MBbuUrgjwi','lmSD',0),(57,5,101,0,0,'3yUF7vPc7e','I0uV',0),(58,5,102,0,0,'mm6ZRfXZCa','prqi',0),(59,5,103,0,0,'ryqeuivWSs','i5Ly',0),(60,5,104,0,0,'UN3M3mhxHw','ZpfC',0),(61,5,105,0,0,'FRZjyewFnu','SRYT',0),(62,5,106,0,0,'muQ3aeS48W','ic2y',0),(63,5,107,0,0,'qY3yi2Wfc9','nRHo',0),(64,5,108,0,0,'iAfEryWcv1','upsi',0),(65,5,109,0,0,'7VVjUzFoMO','jwTR',0),(66,5,110,0,0,'ENrUZfUfgi','xYVP',0),(67,5,111,0,0,'nMNf2u68pm','idbJ',0),(68,5,112,0,0,'RvINn2qOaE','nFo1',0),(69,5,113,0,0,'F3aYnacuCu','azXJ',0),(70,5,114,0,0,'6FR3mebo4b','IqyQ',0),(71,5,115,0,0,'mi2Qjm9MOT','6tKy',0),(72,5,116,0,0,'U32IvaBozx','JP7x',0),(73,5,117,0,0,'IVRBJbXC8c','ZO9x',0),(74,5,118,0,0,'ANn2muSUlr','fWlr',0),(75,5,119,0,0,'qiYvUv3ERC','GP8y',0),(76,5,120,0,0,'jQVRRftjKV','y8Gz',0),(77,5,121,0,0,'vmyIre9Isy','QQ9G',0),(78,5,122,0,0,'iQ7Nva6kEo','H2P8',0),(79,5,123,0,0,'6BBn2eGfaa','Fngu',0),(80,5,124,0,0,'FZBFBjTu6D','QN63',0),(81,5,125,0,0,'aimiyqgMq7','fIjC',0),(82,5,126,0,0,'q6Nn2iu8v9','cZ6U',0),(83,5,127,0,0,'umy6ZnVIzB','YO7G',0),(84,5,128,0,0,'zqmUZfk2y3','MnYF',0),(85,5,129,0,0,'3eEbUzMnxT','2zTb',0),(86,5,130,0,0,'JZjU3aeep6','6fuE',0),(87,5,131,0,0,'2IF3u25i8Y','LcbB',0),(88,5,132,0,0,'biaiaqZkzS','OqbL',0),(89,5,133,0,0,'FfQRJjr7NK','6btE',0),(90,5,134,0,0,'BRFnQfqGqa','wgTz',0),(91,5,135,0,0,'RzmmYv8Qjg','OJcS',0),(92,5,136,0,0,'nMRvI3Xo05','b8t3',0),(93,5,137,0,0,'y67nEnWzjz','lhK7',0),(94,5,138,0,0,'3YVB3qb5b7','o3GV',0),(95,5,139,0,0,'r6jEJfmGhy','3U6u',0),(96,5,140,0,0,'yI7jAvQrtQ','m3Do',0),(97,5,141,0,0,'yAR7fqlAYT','A1ft',0),(98,5,142,0,0,'VJbai2zHA8','lQjh',0),(99,5,143,0,0,'NrYVvqD4sP','StfT',0),(100,5,144,0,0,'uauIFjPko6','sijd',0),(101,5,21,1,0,'eIRrQnOHwE','RhXA',0),(102,5,145,0,0,'UbIRB3mwAm','lFCk',0),(103,5,146,0,0,'mMVJryGgMx','tSWc',0),(104,5,147,0,0,'jaymMn1wGq','mdRd',0),(105,5,148,0,0,'ZvIJrqS7Le','wT76',0),(106,5,149,0,0,'Vb2UVvXaa4','scFW',0),(107,5,150,0,0,'NjuIn2UYst','FpEu',0),(108,5,151,0,0,'7zMnamgVkz','0f5q',0),(109,5,152,0,0,'NRvyUj2gSj','HS0r',0),(110,5,153,0,0,'MfIFNv3eXU','iXem',0),(111,5,154,0,0,'3IF7RrQmXS','j6h7',0),(112,5,155,0,0,'EbUnMz8tEk','Kd6r',0),(113,5,156,0,0,'yUfI7vCa0g','zVjs',0),(114,5,157,0,0,'YnqQ3uQyZP','uUBj',0),(115,5,158,0,0,'Nnqauir1hq','QCNO',0),(116,5,159,0,0,'EJbayy279G','CBDs',0),(117,5,160,0,0,'zmUzuu8VXP','R3P7',0),(118,5,161,0,0,'RruAjyBGlS','dnbr',0),(119,5,162,0,0,'22MRZfAi5u','IMMz',0),(120,4,163,0,0,'jEjyEbzADW','Tn3M',0),(121,4,164,0,0,'AZfqaqOZHp','0xsQ',0),(122,4,22,1,0,'RBf6zyBuO9','f4fg',0),(123,4,165,0,0,'Z7jqqaU6RB','Wb6i',0),(124,4,23,1,0,'nY7B3anZl7','QkE0',0),(125,4,166,0,0,'63YJvq0WBf','6666',1),(126,4,167,0,0,'2I3Mzyqy4W','HOO8',1),(127,5,168,0,0,'z6ju6fQ6l1','UW4P',1),(128,5,169,0,0,'AFBnEnmKNE','c5ug',0); +/*!40000 ALTER TABLE `sk_shares` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sk_stores` +-- + +DROP TABLE IF EXISTS `sk_stores`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `sk_stores` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `uid` int(11) NOT NULL DEFAULT '0' COMMENT '所属用户', + `shares_id` int(11) NOT NULL DEFAULT '0' COMMENT '分享id', + `origin_name` varchar(255) NOT NULL DEFAULT '' COMMENT '源文件名', + `file_name` text NOT NULL COMMENT '存储文件名', + `size` bigint(20) NOT NULL DEFAULT '0' COMMENT '文件大小', + `meta` text COMMENT '文件元属性', + `mime_type` varchar(60) NOT NULL DEFAULT '' COMMENT '文件类型', + `ext` varchar(60) NOT NULL DEFAULT '' COMMENT '文件后缀', + `parent_folder` int(11) NOT NULL DEFAULT '0' COMMENT '所属目录', + `policy_id` int(11) NOT NULL DEFAULT '0' COMMENT '存储策略', + `count_down` int(11) NOT NULL DEFAULT '0' COMMENT '下载量', + `count_open` int(11) NOT NULL DEFAULT '0' COMMENT '浏览量', + `dir` text COMMENT '文件目录', + `desc` text COMMENT '文件描述', + `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', + `delete_time` int(11) DEFAULT NULL COMMENT '软删除', + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=170 DEFAULT CHARSET=utf8 COMMENT='储存文件'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sk_stores` +-- + +LOCK TABLES `sk_stores` WRITE; +/*!40000 ALTER TABLE `sk_stores` DISABLE KEYS */; +INSERT INTO `sk_stores` VALUES (163,4,120,'hidatarecovery_7df90c1c.exe','/uploads/20210929/4/file_6153ee4b6ce301632890443.exe',1449440,'','','exe',23,4,20,37,'',NULL,1632890447,1632902713,NULL),(166,4,125,'new-skapn.rar','/uploads/20210929/4/file_6154301dc6bb01632907293.rar',1632931,'','','rar',1,5,5,15,'',NULL,1632907297,1632907297,NULL),(167,4,126,'ShenDuHuiFu_DNGJ8.1.4.exe','/uploads/20210929/4/file_615436d49b4601632909012.exe',4394904,'','','exe',1,5,23,55,'',NULL,1632909021,1632909021,NULL),(169,5,128,'1.png','/uploads/20210930/5/file_61555172827541632981362.png',4286,NULL,'','png',8,5,0,0,NULL,NULL,1632981362,1632981362,NULL); +/*!40000 ALTER TABLE `sk_stores` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sk_users` +-- + +DROP TABLE IF EXISTS `sk_users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `sk_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(60) NOT NULL DEFAULT '' COMMENT '用户名', + `nickname` varchar(60) DEFAULT NULL COMMENT '用户昵称', + `email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱账号', + `password` varchar(40) NOT NULL DEFAULT '' COMMENT '密码', + `avatar` varchar(255) DEFAULT NULL COMMENT '用户头像', + `desc` varchar(255) DEFAULT NULL COMMENT '个性签名', + `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '用户余额', + `group` int(11) NOT NULL DEFAULT '0' COMMENT '用户组', + `group_expire` int(11) NOT NULL DEFAULT '0' COMMENT '用户组过期时间', + `is_auth` tinyint(3) NOT NULL DEFAULT '0' COMMENT '是否实名认证', + `wx_openid` varchar(64) DEFAULT NULL COMMENT '微信开放平台ID', + `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间', + `login_time` int(11) NOT NULL DEFAULT '0' COMMENT '最近登录时间', + `login_real_ip` varchar(60) NOT NULL DEFAULT '', + `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '用户状态 1 正常 0封禁', + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='用户表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sk_users` +-- + +LOCK TABLES `sk_users` WRITE; +/*!40000 ALTER TABLE `sk_users` DISABLE KEYS */; +INSERT INTO `sk_users` VALUES (1,'admin','管理员','admin@skpan.net','3e9464c59cc03ef5f3c5ed555e2757e2',NULL,NULL,10.00,1,0,0,NULL,1631009197,0,'',1),(4,'1655545174','DDDAAA','1655545174@qq.com','bbc3b9b91ed52618ee9d2259bd467099','/avatar/20210930/afd3f2595c23f931de482215bbec6243.jpg','你好世界',0.00,3,0,0,NULL,1631186682,0,'',1),(5,'ceshi123','ceshi1233','1950412285@qq.com','221da9e890927b42c61a73770d331f39',NULL,'',270.00,3,0,1,NULL,1631210019,0,'',1),(6,'aa1122','AAAA','aa1122@qq.com','221da9e890927b42c61a73770d331f39',NULL,NULL,0.00,3,0,0,NULL,1631553201,0,'',1),(7,'aa11223','abc','aa1122d@qq.com','99c0342da49856be2e9f6fbf55116e57',NULL,NULL,0.00,3,0,0,NULL,1631553262,0,'',1); +/*!40000 ALTER TABLE `sk_users` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sk_withdraw` +-- + +DROP TABLE IF EXISTS `sk_withdraw`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `sk_withdraw` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `uid` int(11) NOT NULL DEFAULT '0' COMMENT '提现用户', + `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '提现金额', + `alipay_account` varchar(255) DEFAULT NULL COMMENT '支付宝帐号', + `alipay_name` varchar(60) DEFAULT NULL COMMENT '支付宝姓名', + `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '提现时间', + `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '提现状态 0 等待处理 1提现成功', + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='用户提现记录'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sk_withdraw` +-- + +LOCK TABLES `sk_withdraw` WRITE; +/*!40000 ALTER TABLE `sk_withdraw` DISABLE KEYS */; +INSERT INTO `sk_withdraw` VALUES (1,5,20.00,'1655545174@qq.com','蓝天',1631487541,1),(2,5,10.00,'1655545174@qq.com','蓝天',1631489052,1),(3,5,100.00,'1655545174@qq.com','啊啊',1631537650,2),(4,5,20.00,'1655545174@qq.com','啊啊',1631538068,2); +/*!40000 ALTER TABLE `sk_withdraw` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Dumping events for database 'newskpan' +-- + +-- +-- Dumping routines for database 'newskpan' +-- +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-09-30 14:22:45 diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..c5a7fbb --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ + + RewriteEngine on + RewriteBase / + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L] + \ No newline at end of file diff --git a/public/admin.php b/public/admin.php new file mode 100644 index 0000000..a14d014 --- /dev/null +++ b/public/admin.php @@ -0,0 +1,13 @@ +bind('admin')->run()->send(); diff --git a/public/assets/css/app.css b/public/assets/css/app.css new file mode 100644 index 0000000..bd5024a --- /dev/null +++ b/public/assets/css/app.css @@ -0,0 +1,1673 @@ +body, +html { + margin: 0; + height: 100%; + width: 100%; + font-family: Avenir, Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +body { + overflow-x: hidden +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box +} + +a { + text-decoration: none; + color: #fff; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) +} + +a:active, +a:hover, +a:link, +a:visited { + text-decoration: none; + outline: 0 +} + +.banner[data-v-785fdba7] { + width: 100%; + height: 48px; + line-height: 40px; + background: linear-gradient(99.78deg, #7a90ff 36.43%, #526efa 61.54%), #fff; + font-family: PingFang SC; + font-style: normal; + font-weight: 400; + font-size: 16px; + text-align: center; + color: #fff; + position: fixed; + top: 0; + transform: translateZ(1000px); + z-index: 1 +} + +.banner .banner-text[data-v-785fdba7] { + width: 477px; + height: 40px; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + display: flex +} + +.banner .banner-text .banner-image[data-v-785fdba7] { + position: absolute; + width: 22px; + height: 22px; + background: url(../index_static/img/banner-icon.png); + background-size: cover; + left: 40px; + top: 50%; + transform: translateY(-50%) +} + +.banner .banner-text .banner-content[data-v-785fdba7] { + flex: 1 +} + +.banner .banner-text .banner-content span[data-v-785fdba7]:nth-child(3) { + position: absolute; + margin-left: 8px; + top: 50%; + transform: translateY(-50%); + width: 20px; + height: 20px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAC5SURBVHgB7dfbDYJAEIXhs4Z3pYMtyQ7EEuwIS7EEK9AOtINxJgRddU3MBth5OF+yCdfwB8INICIiGonIBh5pWNRxkcEO3mhUJ+98RdqlTc6g28jIyCkwcir/RjaZHe1hahu2mN9JR0zmez0+QgjHcUH43EM36DEE1tRq5N0mVpmVa9T3fCU2mZUHHWcsI+L7au317F1R24+bpIMHjCvFuFKu44zGbN3GGXl9sN7cxaXE608TERGVewCXtGQospdrRgAAAABJRU5ErkJggg==); + background-size: cover +} + +.banner .banner-icon[data-v-785fdba7] { + position: absolute; + width: 13.5px; + height: 13.5px; + top: 17px; + right: 25.5px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAfCAYAAAAfrhY5AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADXSURBVHgBvZdRDoQgDER7JG8kN5Gb6El3Vnc1QUKxQMf5dcJ7MdqqSBYAkxCjnr9fWPDPLBzwfJ6/aGAwBBIwbgLHrUA5LgIF8C9pITAENPDBy4uuAmawt0Az2EugGzwqMAzuFXADtwq4g60CNLBBYKWCDQJccINAEGZ2wKaAV2EG+sN1hbKOLWCOQAW8UQXw8B6DtI7NA8RdAI2TqyaA5MPFHWwQCCYBDM7qbgE4LYkT9DELwHk7mQVAWos1gaswMcBPAmkhMsAVgZgXIgNcEIha4bW/1C8MRWR4wytkNQAAAABJRU5ErkJggg==); + background-size: cover; + cursor: pointer +} + +.banner.active[data-v-785fdba7] { + top: 0; + z-index: 99999 +} + +@media (max-width:1200px) { + .banner[data-v-785fdba7] { + height: 74px; + line-height: 40px; + font-size: 16px; + background: linear-gradient(92.49deg, #7a90ff 2.19%, #526efa 97.37%), #fff + } + .banner .banner-text[data-v-785fdba7] { + width: 300px + } + .banner .banner-text .banner-image[data-v-785fdba7] { + display: none; + width: 18px; + height: 18px; + left: 0 + } + .banner .banner-icon[data-v-785fdba7] { + top: 30.5px; + right: 30.5px + } +} + +a[data-v-e9e0751c] { + text-decoration: none +} + +.header[data-v-e9e0751c] { + width: 100%; + height: 748px; + /*padding-top: 48px;*/ + background: rgba(224, 229, 255, .58) +} + +.header .header-content[data-v-e9e0751c] { + width: 1200px; + height: 748px; + margin: 0 auto; + position: relative +} + +.header .header-content .header-logo[data-v-e9e0751c] { + position: absolute; + background: url(../index_static/img/logo.png); + background-size: cover; + width: 137px; + height: 32.57px; + margin-top: 32px +} + +.header .header-content .header-body[data-v-e9e0751c] { + width: 100%; + height: 748px; + display: flex; + justify-content: space-between; + align-items: center +} + +.header .header-content .header-body .body-left[data-v-e9e0751c] { + width: 477px; + height: 748px; + z-index: 1 +} + +.header .header-content .header-body .body-left .left-title[data-v-e9e0751c] { + font-style: normal; + font-weight: 800; + font-size: 66px; + line-height: 72px; + color: #0b0e51; + margin-bottom: 20px; + margin-top: 238px; + font-family: Alibaba-PuHuiTi-Heavy +} + +.header .header-content .header-body .body-left .left-text[data-v-e9e0751c] { + font-family: PingFang SC; + font-style: normal; + font-weight: 400; + font-size: 20px; + line-height: 28px; + color: #4154b5; + margin-bottom: 40px +} + +.header .header-content .header-body .body-left .left-download[data-v-e9e0751c] { + display: flex +} + +.header .header-content .header-body .body-left .left-download .apps[data-v-e9e0751c], +.header .header-content .header-body .body-left .left-download .pc[data-v-e9e0751c] { + width: 164px; + height: 60px; + font-style: normal; + border-radius: 16px; + font-weight: 500; + font-size: 16px; + line-height: 60px; + text-align: center +} + +.header .header-content .header-body .body-left .left-download .apps[data-v-e9e0751c] { + background: linear-gradient(96.15deg, #526efa 2.85%, #7a90ff), #fff; + margin-right: 24px +} + +.header .header-content .header-body .body-left .left-download .pc[data-v-e9e0751c] { + border: 2px solid #859aff; + color: #446dff +} + +.header .header-content .header-body .body-left .left-reservation[data-v-e9e0751c] { + margin-top: 28px; + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 20px; + color: #637dff; + position: relative +} + +.header .header-content .header-body .body-left .left-reservation span[data-v-e9e0751c]:nth-child(3) { + position: absolute; + margin-left: 8px; + width: 20px; + height: 20px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEwSURBVHgB7ddBTsJAFMbx7xXiVrgBR/AIehJq2LjUvTGNXsC9IRlv4A30Ct6AIzRhR52O86BtgBIy06SvLN4vIWlgJvxDh2kLKKWUUrXHzE0QiSDgIXOzwuLbH878N6bLV/oMnZtAwGaDW3AcczCLFzcPnSsSWF7hywGr5o2ISJFAk1FejnDXJVJkDdZSvxYTvxapPt27grNrUjSQxUaKB7KYyEECWWhkK5A303WJubOYomdE233x8I9yFNkKXDw705okzK4xNe+U83F7myFcY2gTNJfE8fFndoSnpMAvBJw6xf4Xu19mtGrGYCAH1+cKx328kdkfN0hgaBwTD4yJY6KBsXFMLLBLHJO/Ya2ExFXj+lf84QYd4qqx/bNj/PC9oH/lMXHi0g4PTUoppS7cP/azhivFOT4PAAAAAElFTkSuQmCC); + background-size: cover +} + +.header .header-content .header-body .body-right[data-v-e9e0751c] { + width: 602.45px; + height: 406px; + position: relative +} + +.header .header-content .header-body .body-right .right-round1[data-v-e9e0751c], +.header .header-content .header-body .body-right .right-round2[data-v-e9e0751c], +.header .header-content .header-body .body-right .right-round3[data-v-e9e0751c], +.header .header-content .header-body .body-right .right-round4[data-v-e9e0751c], +.header .header-content .header-body .body-right .right-round5[data-v-e9e0751c] { + position: absolute; + border-radius: 50% +} + +.header .header-content .header-body .body-right .right-round1[data-v-e9e0751c] { + bottom: -27px; + left: -176px; + width: 339px; + height: 339px; + filter: blur(74px) +} + +.header .header-content .header-body .body-right .right-round5[data-v-e9e0751c] { + width: 312px; + height: 312px; + bottom: 0; + left: -149px; + background: linear-gradient(152.33deg, hsla(0, 0%, 100%, 0) 16.59%, hsla(0, 0%, 100%, .3) 82.8%) +} + +.header .header-content .header-body .body-right .right-round2[data-v-e9e0751c] { + bottom: 49px; + left: -56px; + width: 276px; + height: 276px; + background: linear-gradient(126.16deg, #ff83d5 6.69%, rgba(131, 240, 255, 0) 88.42%); + opacity: .5 +} + +.header .header-content .header-body .body-right .right-round3[data-v-e9e0751c] { + bottom: 195px; + left: 163px; + width: 276px; + height: 276px; + background: linear-gradient(180deg, #c7b4ff, rgba(215, 255, 208, 0)); + opacity: .5 +} + +.header .header-content .header-body .body-right .right-round4[data-v-e9e0751c] { + bottom: -16px; + left: 372px; + width: 211px; + height: 211px; + background: linear-gradient(205.25deg, rgba(148, 249, 255, .5) 11.13%, rgba(255, 227, 173, .45) 88.33%); + -webkit-backdrop-filter: blur(16px); + backdrop-filter: blur(16px); + z-index: 2 +} + +.header .header-content .header-body .body-right .header-img[data-v-e9e0751c] { + width: 602.45px; + height: 406px; + z-index: 1; + position: relative; + background: url(../index_static/img/header.png); + background-size: cover +} + +@media (max-width:1200px) { + .header[data-v-e9e0751c] { + width: 100%; + height: auto + } + .header .header-content[data-v-e9e0751c] { + width: 100%; + position: relative; + height: auto + } + .header .header-content .header-logo-box[data-v-e9e0751c] { + width: 304px; + margin: 0 auto; + position: relative + } + .header .header-content .header-logo-box .header-logo[data-v-e9e0751c] { + top: 20px; + width: 90px; + height: 22px; + background-size: contain + } + .header .header-content .header-body[data-v-e9e0751c] { + width: 100%; + height: auto; + flex-direction: column; + align-items: normal + } + .header .header-content .header-body .body-left[data-v-e9e0751c] { + width: 304px; + height: auto; + margin: 0 auto + } + .header .header-content .header-body .body-left .left-title[data-v-e9e0751c] { + font-weight: 800; + font-size: 48px; + line-height: 48px; + color: #0b0e51; + margin-top: 155px + } + .header .header-content .header-body .body-left .left-text[data-v-e9e0751c] { + font-style: normal; + font-weight: 400; + font-size: 16px; + line-height: 24px; + color: #4154b5; + margin-bottom: 34px + } + .header .header-content .header-body .body-left .left-download[data-v-e9e0751c] { + flex-direction: column + } + .header .header-content .header-body .body-left .left-download .apps[data-v-e9e0751c], + .header .header-content .header-body .body-left .left-download .pc[data-v-e9e0751c] { + width: 304px; + border-radius: 16px; + font-size: 16px + } + .header .header-content .header-body .body-left .left-download .apps[data-v-e9e0751c] { + margin-bottom: 24px + } + .header .header-content .header-body .body-left .left-download .pc[data-v-e9e0751c] { + display: none + } + .header .header-content .header-body .body-left .left-reservation[data-v-e9e0751c] { + margin-top: 0; + margin-bottom: 32px + } + .header .header-content .header-body .body-left .left-reservation span[data-v-e9e0751c]:nth-child(2) { + position: absolute; + margin-left: 8px; + width: 20px; + height: 20px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEwSURBVHgB7ddBTsJAFMbx7xXiVrgBR/AIehJq2LjUvTGNXsC9IRlv4A30Ct6AIzRhR52O86BtgBIy06SvLN4vIWlgJvxDh2kLKKWUUrXHzE0QiSDgIXOzwuLbH878N6bLV/oMnZtAwGaDW3AcczCLFzcPnSsSWF7hywGr5o2ISJFAk1FejnDXJVJkDdZSvxYTvxapPt27grNrUjSQxUaKB7KYyEECWWhkK5A303WJubOYomdE233x8I9yFNkKXDw705okzK4xNe+U83F7myFcY2gTNJfE8fFndoSnpMAvBJw6xf4Xu19mtGrGYCAH1+cKx328kdkfN0hgaBwTD4yJY6KBsXFMLLBLHJO/Ya2ExFXj+lf84QYd4qqx/bNj/PC9oH/lMXHi0g4PTUoppS7cP/azhivFOT4PAAAAAElFTkSuQmCC); + background-size: cover + } + .header .header-content .header-body .body-right[data-v-e9e0751c] { + width: 100%; + height: auto + } + .header .header-content .header-body .body-right .right-round1[data-v-e9e0751c], + .header .header-content .header-body .body-right .right-round2[data-v-e9e0751c], + .header .header-content .header-body .body-right .right-round3[data-v-e9e0751c], + .header .header-content .header-body .body-right .right-round4[data-v-e9e0751c], + .header .header-content .header-body .body-right .right-round5[data-v-e9e0751c] { + display: none + } + .header .header-content .header-body .body-right .header-img[data-v-e9e0751c] { + width: 100%; + height: auto; + background: none + } + .header .header-content .header-body .body-right .header-img img[data-v-e9e0751c] { + width: 100%; + max-width: 450px; + display: block; + margin: 0 auto + } +} + +.space[data-v-35ecef7e] { + width: 100% +} + +.space .space-content[data-v-35ecef7e] { + /*width: 1200px;*/ + width: 85%; + margin: 0 auto +} + +.space .space-content .space-title[data-v-35ecef7e] { + margin-top: 100px; + font-style: normal; + font-weight: 800; + font-size: 54px; + line-height: 72px; + text-align: center; + letter-spacing: 1px; + color: #0b0e51; + font-family: Alibaba-PuHuiTi-Heavy +} + +.space .space-content .space-body[data-v-35ecef7e] { + display: flex; + flex-wrap: wrap; + padding: 0 76px; + justify-content: space-between; + margin-top: 133px; + margin-bottom: 100px; +} + +.space .space-content .space-body .body-item[data-v-35ecef7e] { + width: 454px; + height: 372px; + border-radius: 44px; + margin-bottom: 104px; + position: relative +} + +.space .space-content .space-body .body-item p[data-v-35ecef7e] { + text-align: center; + margin: 0 +} + +.space .space-content .space-body .body-item p[data-v-35ecef7e]:first-child, +.space .space-content .space-body .body-item p[data-v-35ecef7e]:nth-child(2) { + font-style: normal; + font-weight: 700; + font-size: 32px; + line-height: 42px; + color: #0b0e51 +} + +.space .space-content .space-body .body-item p[data-v-35ecef7e]:nth-child(3), +.space .space-content .space-body .body-item p[data-v-35ecef7e]:nth-child(4) { + font-family: PingFang SC; + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 24px; + text-align: center; + color: #8789ae +} + +.space .space-content .space-body .body-item p[data-v-35ecef7e]:first-child { + margin-top: 154px +} + +.space .space-content .space-body .body-item p[data-v-35ecef7e]:nth-child(2) { + margin-bottom: 11px +} + +.space .space-content .space-body .body-item .space-logo[data-v-35ecef7e] { + position: absolute; + width: 236px; + height: 236px; + left: 109px; + top: -89px +} + +.space .space-content .space-body .body-item[data-v-35ecef7e]:first-child { + background-color: #fff5cf +} + +.space .space-content .space-body .body-item:first-child .space-logo[data-v-35ecef7e] { + background: url(../image/space-img1.png); + background-size: cover +} + +.space .space-content .space-body .body-item[data-v-35ecef7e]:nth-child(4) { + background-color: #dbe0ff; + margin-top: 48px +} + +.space .space-content .space-body .body-item:nth-child(4) .space-logo[data-v-35ecef7e] { + background: url(../image/space-img2.png); + background-size: cover +} + +.space .space-content .space-body .body-item[data-v-35ecef7e]:nth-child(2) { + background-color: #daf1ff +} + +.space .space-content .space-body .body-item:nth-child(2) .space-logo[data-v-35ecef7e] { + background: url(../image/space-img3.png); + background-size: cover +} + +.space .space-content .space-body .body-item[data-v-35ecef7e]:nth-child(3) { + background-color: #e0e5ff; + /*margin-top: 48px*/ +} + +.space .space-content .space-body .body-item:nth-child(3) .space-logo[data-v-35ecef7e] { + background: url(../image/space-img4.png); + background-size: cover +} + +@media (max-width:1200px) { + .space[data-v-35ecef7e] { + width: 100% + } + .space .space-content[data-v-35ecef7e] { + width: 375px; + margin: 0 auto + } + .space .space-content .space-title[data-v-35ecef7e] { + width: 375px; + height: 100px; + margin: 0 auto; + font-style: normal; + font-weight: 800; + font-size: 38px; + line-height: 50px; + text-align: center; + letter-spacing: 1px; + color: #0b0e51; + margin-top: 100px; + } + .space .space-content .space-body[data-v-35ecef7e] { + margin-top: 114px; + padding: 0; + margin-bottom: 86px + } + .space .space-content .space-body .body-item[data-v-35ecef7e] { + width: 335px; + height: auto; + margin: 0 auto; + margin-bottom: 94px + } + .space .space-content .space-body .body-item p[data-v-35ecef7e]:first-child, + .space .space-content .space-body .body-item P[data-v-35ecef7e]:nth-child(2) { + font-style: normal; + font-weight: 600; + font-size: 32px; + line-height: 42px; + color: #0b0e51 + } + .space .space-content .space-body .body-item p[data-v-35ecef7e]:nth-child(3), + .space .space-content .space-body .body-item p[data-v-35ecef7e]:nth-child(4) { + width: 285px; + margin: 0 auto; + font-style: normal; + font-weight: 400; + font-size: 16px; + line-height: 24px; + text-align: center; + color: #8789ae + } + .space .space-content .space-body .body-item p[data-v-35ecef7e]:first-child { + margin-top: 124px + } + .space .space-content .space-body .body-item p[data-v-35ecef7e]:nth-child(2) { + margin-bottom: 12px + } + .space .space-content .space-body .body-item p[data-v-35ecef7e]:nth-child(4) { + margin-bottom: 48px + } + .space .space-content .space-body .body-item .space-logo[data-v-35ecef7e] { + width: 158px; + height: 158px; + top: -54px; + left: 89px + } +} + +[data-v-e39358dc] { + margin: 0 +} + +.collect[data-v-e39358dc] { + width: 100%; + background: #f6f8ff +} + +.collect .collect-item[data-v-e39358dc] { + display: flex; + position: relative; + width: 1440px; + margin: 0 auto +} + +.collect .collect-left[data-v-e39358dc] { + width: 602px; + position: sticky; + left: 0; + top: 0; + height: 100vh; + min-height: 860px +} + +.collect .collect-left .collect-img1[data-v-e39358dc] { + width: 162px; + height: 159px; + position: absolute; + top: 40px; + background: url(.../image/collect-img1.png); + background-size: cover +} + +.collect .collect-left .collect-body[data-v-e39358dc] { + width: 394px; + height: 100%; + position: absolute; + top: 0; + left: 185px +} + +.collect .collect-left .collect-body .left-title[data-v-e39358dc] { + margin-top: 130px; + margin-bottom: 86px +} + +.collect .collect-left .collect-body .left-title p[data-v-e39358dc] { + font-style: normal; + font-weight: 800; + font-size: 54px; + line-height: 62px; + letter-spacing: 1px; + color: #0b0e51; + font-family: Alibaba-PuHuiTi-Heavy +} + +.collect .collect-left .collect-body .left-content[data-v-e39358dc] { + position: absolute; + top: 50%; + transform: translateY(-30%); + padding-top: 10px +} + +.collect .collect-left .collect-body .left-content .left-item[data-v-e39358dc] { + height: 67px; + width: 100%; + margin-bottom: 48px +} + +.collect .collect-left .collect-body .left-content .left-item p[data-v-e39358dc]:first-child { + font-family: PingFang SC; + font-style: normal; + font-weight: 400; + font-size: 32px; + line-height: 32px; + color: #0b0e51; + margin-bottom: 12px; + font-weight: 600 +} + +.collect .collect-left .collect-body .left-content .left-item p[data-v-e39358dc]:nth-child(2) { + font-family: PingFang SC; + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 14px; + color: #8789ae +} + +.collect .collect-left .collect-body .left-content .left-item p.active[data-v-e39358dc] { + color: #8789ae +} + +.collect .collect-left .collect-body .left-content .left-line-box[data-v-e39358dc] { + position: absolute; + top: 0; + left: -23px; + width: 9px; + height: 100% +} + +.collect .collect-left .collect-body .left-content .left-line-box .left-line[data-v-e39358dc] { + position: absolute; + width: 9px; + height: 73px; + top: 0; + background: url(../image/collect-line.svg); + background-size: cover +} + +.collect .collect-right[data-v-e39358dc] { + flex: 1; + background: #f6f8ff +} + +.collect .collect-right .right-item[data-v-e39358dc] { + width: 100%; + height: 100vh; + min-height: 860px; + position: relative +} + +.collect .collect-right .right-item .item-round[data-v-e39358dc] { + margin-top: 70px; + width: 552px; + height: 552px; + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 101px; + border-radius: 50% +} + +.collect .collect-right .right-item .item-round .item-image[data-v-e39358dc] { + width: 333px; + height: 629px; + position: absolute; + top: -107px; + left: 50%; + transform: translateX(-50%) +} + +.collect .collect-right .right-item .item-round .item-image .image-left[data-v-e39358dc] { + position: absolute; + left: -110px; + top: 481px; + width: 186px; + height: 73px; + background: url(../image/collect-image-left.png); + background-size: cover +} + +.collect .collect-right .right-item .item-round .item-image .image-right[data-v-e39358dc] { + position: absolute; + right: -97px; + top: 430px; + width: 186px; + height: 73px; + background: url(../image/collect-image-right.png); + background-size: cover +} + +.collect .collect-right .right-item:nth-child(2) .item-round[data-v-e39358dc] { + background: linear-gradient(107.92deg, #5a76ff 18.23%, #8fa2ff 82.77%), #fff +} + +.collect .collect-right .right-item:nth-child(2) .item-round .item-image[data-v-e39358dc] { + background: url(../image/collect-item1.png); + background-size: cover +} + +.collect .collect-right .right-item:nth-child(3) .item-round[data-v-e39358dc] { + background: linear-gradient(107.92deg, #8fc9ff 18.23%, #c6e4ff 82.77%), #fff +} + +.collect .collect-right .right-item:nth-child(3) .item-round .item-image[data-v-e39358dc] { + background: url(../image/collect-item2.png); + background-size: cover +} + +.collect .collect-right .right-item:nth-child(4) .item-round[data-v-e39358dc] { + background: linear-gradient(107.92deg, #a68fff 18.23%, #cbbeff 82.77%), #fff +} + +.collect .collect-right .right-item:nth-child(4) .item-round .item-image[data-v-e39358dc] { + background: url(../image/collect-item3.png); + background-size: cover +} + +.collect .collect-right .right-img[data-v-e39358dc] { + float: left; + height: 100vh; + min-height: 860px; + width: 100%; + position: sticky; + left: 0; + top: 0; + z-index: 1 +} + +.collect .collect-right .right-img .right-img1[data-v-e39358dc] { + position: absolute; + left: 630px; + top: -49px; + width: 108px; + height: 107px; + background: url(../image/collect-img2.png); + background-size: cover +} + +.collect .collect-right .right-img .right-img2[data-v-e39358dc] { + position: absolute; + left: 563px; + bottom: 108px; + width: 241px; + height: 176px; + background: url(../image/collect-img3.png); + background-size: cover +} + +.collect .collect-right .right-img .right-img3[data-v-e39358dc] { + position: absolute; + left: 764px; + bottom: 259px; + width: 40px; + height: 40px; + background: url(../image/collect-img4.png); + background-size: cover +} + +a[data-v-20ff4511] { + text-decoration: none +} + +.footer[data-v-20ff4511] { + width: 100%; + background: #f6f8ff; + -webkit-backdrop-filter: blur(32.6194px); + backdrop-filter: blur(32.6194px); + position: relative; + padding-top: 130px +} + +.footer .footer-item[data-v-20ff4511] { + width: 1200px; + margin: 0 auto; + height: 600px +} + +.footer .footer-item .footer-img[data-v-20ff4511] { + position: relative; + width: 1200px; + margin: 0 auto +} + +.footer .footer-item .footer-img .footer-img1[data-v-20ff4511] { + position: absolute; + left: -99px; + width: 367px; + height: 322px; + transform: rotate(-13.32deg); + background: url(../image/footer-img1.png); + background-size: cover; + margin-top: 84px; + margin-left: 15px +} + +.footer .footer-item .footer-img .footer-img2[data-v-20ff4511] { + position: absolute; + width: 290px; + height: 252px; + background: url(../image/footer-img2.png); + background-size: contain; + background-repeat: no-repeat; + margin-top: -72px; + top: -130px; + right: -75px +} + +.footer .footer-item .footer-title[data-v-20ff4511] { + font-style: normal; + font-weight: 800; + font-size: 54px; + line-height: 60px; + text-align: center; + letter-spacing: 1px; + color: #0b0e51; + padding-top: 50px; + margin-bottom: 64px; + font-family: Alibaba-PuHuiTi-Heavy +} + +.footer .footer-item .footer-content[data-v-20ff4511] { + width: 356px; + height: 60px; + margin: 0 auto; + display: flex; + position: absolute; + left: 50%; + transform: translateX(-50%); + justify-content: space-between +} + +.footer .footer-item .footer-content .content-apps[data-v-20ff4511], +.footer .footer-item .footer-content .content-pc[data-v-20ff4511] { + width: 164px; + height: 60px; + font-style: normal; + border-radius: 16px; + font-weight: 500; + font-size: 16px; + line-height: 60px; + text-align: center +} + +.footer .footer-item .footer-content .content-apps[data-v-20ff4511] { + background: linear-gradient(96.15deg, #446dff 2.85%, rgba(99, 125, 255, .75)), #fff; + color: #fff +} + +.footer .footer-item .footer-content .content-pc[data-v-20ff4511] { + border: 2px solid #859aff; + color: #446dff +} + +.footer .footer-item .footer-text[data-v-20ff4511] { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 90px; + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 20px; + text-align: center; + color: #8286a6; + background: #f9faff +} + +.footer .footer-item .footer-text .footer-text-links[data-v-20ff4511] { + margin: 20px auto; + width: 208px; + display: flex; + font-style: normal; + font-weight: 600; + font-size: 14px; + line-height: 5px; + text-align: center; + color: #8286a6 +} + +.footer .footer-item .footer-text .footer-text-links ul[data-v-20ff4511] { + display: flex; + justify-content: space-between +} + +.footer .footer-item .footer-text .footer-text-links ul li[data-v-20ff4511] { + list-style: none; + border-right: 2px solid #8286a6 +} + +.footer .footer-item .footer-text .footer-text-links ul li a[data-v-20ff4511] { + color: #8286a6; + padding: 0 6px +} + +.footer .footer-item .footer-text .footer-text-links ul li:first-child a[data-v-20ff4511] { + padding-left: 0 +} + +.footer .footer-item .footer-text .footer-text-links ul li[data-v-20ff4511]:nth-child(3) { + border: none +} + +.footer .footer-item .footer-text .footer-text-links ul li:nth-child(3) a[data-v-20ff4511] { + padding-right: 0 +} + +.footer .footer-item .footer-text .footer-text-content[data-v-20ff4511] { + line-height: 12px +} + +@media (max-width:1200px) { + .footer[data-v-20ff4511] { + height: 780px; + padding: 0 + } + .footer .footer-item[data-v-20ff4511] { + width: 375px; + height: 780px + } + .footer .footer-item .footer-img[data-v-20ff4511] { + width: 375px; + position: absolute + } + .footer .footer-item .footer-img .footer-img1[data-v-20ff4511] { + position: absolute; + width: 237px; + height: 208px; + left: 0; + top: 425px; + margin: 0 + } + .footer .footer-item .footer-img .footer-img2[data-v-20ff4511] { + position: absolute; + width: 90px; + height: 152.5px; + top: 340px; + left: 217px; + background: url(../image/footer-img2.png); + background-size: contain; + background-repeat: no-repeat; + margin: 0 + } + .footer .footer-item .footer-title[data-v-20ff4511] { + padding-top: 124px; + margin-bottom: 44px + } + .footer .footer-item .footer-title p[data-v-20ff4511] { + position: static; + font-style: normal; + font-weight: 800; + font-size: 38px; + line-height: 50px; + text-align: center; + letter-spacing: 1px; + color: #0b0e51; + margin: 0 + } + .footer .footer-item .footer-content[data-v-20ff4511] { + flex-direction: column; + height: auto + } + .footer .footer-item .footer-content .content-apps[data-v-20ff4511], + .footer .footer-item .footer-content .content-pc[data-v-20ff4511] { + width: 304px; + height: 60px; + margin: 0 auto + } + .footer .footer-item .footer-content .content-apps[data-v-20ff4511] { + margin-bottom: 24px + } + .footer .footer-item .footer-content .content-pc[data-v-20ff4511] { + display: none + } + .footer .footer-item .footer-text[data-v-20ff4511] { + width: 100%; + height: 104px; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 18px; + text-align: center; + color: #8286a6 + } + .footer .footer-item .footer-text .footer-text-links[data-v-20ff4511] { + margin-bottom: 12px + } + .footer .footer-item .footer-text .footer-text-content[data-v-20ff4511] { + width: 220px; + margin: 0 auto; + line-height: 18px + } +} + +.mobile-collect[data-v-f34ce26c] { + width: 100%; + background: #f6f8ff; + position: relative +} + +.mobile-collect .mobile-collect-item[data-v-f34ce26c] { + width: 375px; + margin: 0 auto; + position: relative +} + +.mobile-collect .mobile-collect-item .mobile-collect-title[data-v-f34ce26c] { + height: 100px; + margin-left: 45px; + padding-top: 60px; + font-style: normal; + font-weight: 800; + font-size: 38px; + line-height: 50px; + letter-spacing: 1px; + color: #0b0e51; + padding-bottom: 80px; + font-family: Alibaba-PuHuiTi-Heavy; + margin-bottom: 80px +} + +.mobile-collect .mobile-collect-item .mobile-collect-title p[data-v-f34ce26c] { + margin: 0 +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item[data-v-f34ce26c] { + width: 100%; + padding-bottom: 124px +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item .item-text[data-v-f34ce26c] { + margin-left: 45px; + margin-bottom: 125px +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item .item-text p[data-v-f34ce26c] { + margin: 0 +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item .item-text p[data-v-f34ce26c]:first-child { + font-style: normal; + font-weight: 600; + font-size: 28px; + line-height: 28px; + color: #0b0e51; + margin-bottom: 12px +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item .item-text p[data-v-f34ce26c]:nth-child(2) { + font-style: normal; + font-weight: 400; + font-size: 16px; + line-height: 16px; + color: #8789ae +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item .item-body[data-v-f34ce26c] { + width: 324px; + height: 324px; + border-radius: 50%; + background: linear-gradient(107.92deg, #5a76ff 18.23%, #8fa2ff 82.77%), #fff; + position: relative; + margin: 0 auto +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item .item-body .body-img[data-v-f34ce26c] { + width: 247px; + height: 478px; + position: absolute; + left: 50%; + transform: translateX(-50%); + top: -105px; + background: url(../index_static/img/mobile-collect-img1.png); + background-size: cover +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item .item-body .body-img .body-img-left[data-v-f34ce26c] { + position: absolute; + width: 138px; + height: 50px; + left: -58px; + top: 356px; + background: url(../index_static/img/mobile-collect-img-left.png); + background-size: cover +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item .item-body .body-img .body-img-right[data-v-f34ce26c] { + position: absolute; + width: 122px; + height: 48px; + right: -48px; + top: 338px; + background: url(../index_static/img/mobile-collect-img-right.png); + background-size: cover +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item:nth-child(2) .item-body[data-v-f34ce26c] { + background: linear-gradient(107.92deg, #8fc9ff 18.23%, #c6e4ff 82.77%), #fff +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item:nth-child(2) .item-body .body-img[data-v-f34ce26c] { + background: url(../index_static/img/mobile-collect-img2.png); + background-size: cover +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item:nth-child(3) .item-body[data-v-f34ce26c] { + background: linear-gradient(107.92deg, #a68fff 18.23%, #cbbeff 82.77%), #fff +} + +.mobile-collect .mobile-collect-item .mobile-collect-content .mobile-content-item:nth-child(3) .item-body .body-img[data-v-f34ce26c] { + background: url(../index_static/img/mobile-collect-img3.png); + background-size: cover +} + +.mobile-collect .mobile-collect-item .mobile-collect-box[data-v-f34ce26c] { + width: 110px; + height: 107px; + position: absolute; + left: 20px; + top: -59px; + background: url(../index_static/img/collect-img1.png); + background-size: cover +} + +.apps[data-v-ce7600a4] { + height: 1584px; + position: relative; + padding-top: 48px +} + +.apps .apps-content[data-v-ce7600a4] { + width: 1200px; + margin: 0 auto; + position: relative; + margin-bottom: 149px +} + +.apps .apps-content .apps-logo[data-v-ce7600a4] { + width: 137px; + height: 32px; + position: absolute; + left: 0; + top: 32px; + background: url(../index_static/img/logo.png); + background-size: cover +} + +.apps .apps-content .apps-title[data-v-ce7600a4] { + font-style: normal; + font-weight: 800; + font-size: 66px; + line-height: 72px; + color: #0b0e51; + text-align: center; + padding-top: 161px; + font-family: Alibaba-PuHuiTi-Heavy +} + +.apps .apps-content .apps-text[data-v-ce7600a4] { + width: 713px; + height: 140px; + margin: 0 auto; + font-style: normal; + font-weight: 400; + font-size: 20px; + line-height: 28px; + text-align: center; + color: #4154b5; + margin-top: 20px; + margin-bottom: 120px +} + +.apps .apps-content .apps-text p a[data-v-ce7600a4] { + border-bottom: 1px solid #4154b5; + text-decoration: none; + color: #4154b5 +} + +.apps .apps-content .apps-download[data-v-ce7600a4] { + width: 900px; + height: 400px; + margin: 0 auto; + display: flex; + justify-content: space-between +} + +.apps .apps-content .apps-download .download-android[data-v-ce7600a4], +.apps .apps-content .apps-download .download-ios[data-v-ce7600a4] { + width: 400px; + height: 400px; + border-radius: 44px; + border: 2px solid #e0e5ff; + position: relative +} + +.apps .apps-content .apps-download .download-android .item-icon[data-v-ce7600a4], +.apps .apps-content .apps-download .download-ios .item-icon[data-v-ce7600a4] { + position: absolute; + width: 0; + height: 0; + border-color: #5c7eff #5c7eff transparent transparent; + border-style: solid; + border-width: 44px; + border-radius: 0 44px 0 0; + right: -2px; + top: -2px +} + +.apps .apps-content .apps-download .download-android .item-icon .icon[data-v-ce7600a4], +.apps .apps-content .apps-download .download-ios .item-icon .icon[data-v-ce7600a4] { + position: absolute; + top: -31px; + left: 0; + width: 26px; + height: 26px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKbSURBVHgB7ZmBcdswDEW/eh2gG5Qb1BvEGzgbxO0CTbpA4g2SDdxO4E5QbVBvYG1gdwIWiOU7BSElQKTqa8x3x5NDMl8iBYIQCBQKhUKHKlTpvZ/R5Z7KB6RRV1W1Cug/0uUT0mio3JH+YbAn3fCXz4cT2tc+H7fy2d/h35P61nu13mOYLZUn6GFz/arsy+ZyBxu8FFysUTOgJ7LTNQyQKWgHtB2hPUfPgM5hcpOieUMvoBliu51162iWa2Qgh7ZpQK3H+g2xGKme3ecj0mFtJ7RXpP0AJVaTcwh7qdQ95TRZLtB0AwNvbg1d/IBiYcYfpHNAWL+BAZNToMW5JVv/TD+vOtU8mAckwjFZq70QTSsYMLvtdiNcYwJIe0OXDRK4yDVkcskyuh5gZunfbry9z6MxudtQmJ4JfsAd6SMXF2NyP5EHjqYbUVfD6IojsItfy8oq1ru116SPscBgsmkTB9Xnd6EwLbE0Ftv3NdKpY+soBt27N2cgtL9DA4mufR527eRo77v0NuZSI+a2PyIPDjZvZvVaTlZoIgW+yRZ6HHQm8woOTv0x4nY93W5g1fcvM6emsIdNTJiFQ0bEsy1luyb0MZnBuTc78/cQI2Y9646dqm0KTvlm7LnoZ7fsqS6Hi382p4C2yeTHpLFcoH6BRNo3Mw80adPKz4wyuTOzp3L6gKpl4/84oC9UfuC4vhrZaB3Q1GmsELvuH62TiCZSxqSx+KyI01inCKChkpzXbtNYnLJadLR5MN+QytDmpfj/yTbWIcr50NTQG620fclMX6WLNAO6p5tcQY/ra/TH48ocGzGvZz6XGu7ppz3Wz8lMPntsDeWKzUInCk2gnx9R9gHt6Ce4o8sS6dTyjLTV5plNTWNtShqrUMjPX8PG7FALyrWSAAAAAElFTkSuQmCC); + background-size: cover +} + +.apps .apps-content .apps-download .download-android .item-logo[data-v-ce7600a4], +.apps .apps-content .apps-download .download-ios .item-logo[data-v-ce7600a4] { + width: 102px; + height: 102px; + margin: 66px auto 40px; + background: url(../index_static/img/apps-ios.png); + background-size: cover +} + +.apps .apps-content .apps-download .download-android .item-text[data-v-ce7600a4], +.apps .apps-content .apps-download .download-ios .item-text[data-v-ce7600a4] { + font-style: normal; + font-weight: 600; + font-size: 32px; + line-height: 42px; + text-align: center; + color: #0b0e51; + margin-bottom: 25px +} + +.apps .apps-content .apps-download .download-android .item-download[data-v-ce7600a4], +.apps .apps-content .apps-download .download-ios .item-download[data-v-ce7600a4] { + width: 177px; + height: 60px; + background: linear-gradient(96.15deg, #446dff 2.85%, rgba(99, 125, 255, .75)), #fff; + border-radius: 16px; + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 60px; + text-align: center; + color: #fff; + margin: 0 auto +} + +.apps .apps-content .apps-download .download-android .item-download.active[data-v-ce7600a4], +.apps .apps-content .apps-download .download-ios .item-download.active[data-v-ce7600a4] { + display: none +} + +.apps .apps-content .apps-download .download-android .item-logo[data-v-ce7600a4] { + background: url(../index_static/img/apps-android.png); + background-size: cover +} + +.apps .apps-content .apps-download .download-item:hover .item-logo[data-v-ce7600a4] { + width: 178px; + height: 178px; + margin: 95px auto 20px +} + +.apps .apps-content .apps-download .download-item:hover .item-text[data-v-ce7600a4] { + display: none +} + +.apps .apps-content .apps-download .download-item:hover .item-download[data-v-ce7600a4] { + display: none; + width: 82px; + height: 28px; + background: #fff; + border: none; + font-weight: 500; + font-size: 20px; + line-height: 28px; + text-align: center; + color: #0b0e51 +} + +.apps .apps-content .apps-download .download-item:hover .item-download.active[data-v-ce7600a4] { + display: block +} + +@media (min-width:1200px) { + .apps .apps-content .apps-download .download-ios:hover .item-logo[data-v-ce7600a4] { + background: url(../index_static/img/ios-erweima.png); + background-size: cover + } + .apps .apps-content .apps-download .download-android:hover .item-logo[data-v-ce7600a4] { + background: url(../index_static/img/android-erweima.png); + background-size: cover + } +} + +.apps .apps-provide .provide-title[data-v-ce7600a4] { + font-family: Alibaba-PuHuiTi-Heavy; + font-style: normal; + font-weight: 400; + font-size: 54px; + line-height: 72px; + text-align: center; + letter-spacing: 1px; + color: #0b0e51 +} + +.apps .apps-provide .provide-content[data-v-ce7600a4] { + width: 900px; + height: 186px; + display: flex; + justify-content: space-between; + margin: 0 auto; + margin-top: 60px +} + +.apps .apps-provide .provide-content .provide-item[data-v-ce7600a4] { + width: 286px; + height: 186px; + background: #f8f8f8; + border-radius: 16px +} + +.apps .apps-provide .provide-content .provide-item .provide-item-logo[data-v-ce7600a4] { + width: 83px; + height: 83px; + margin: 28px auto 18px; + background: url(../index_static/img/provide-img1.png); + background-size: cover +} + +.apps .apps-provide .provide-content .provide-item .provide-item-text[data-v-ce7600a4] { + font-style: normal; + font-weight: 600; + font-size: 20px; + line-height: 28px; + text-align: center; + color: #a0a0a0 +} + +.apps .apps-provide .provide-content .provide-item:nth-child(2) .provide-item-logo[data-v-ce7600a4] { + background: url(data:image/png;base64,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); + background-size: cover +} + +.apps .apps-provide .provide-content .provide-item:nth-child(3) .provide-item-logo[data-v-ce7600a4] { + background: url(../index_static/img/provide-img3.png); + background-size: cover +} + +.apps .apps-footer[data-v-ce7600a4] { + position: absolute; + bottom: 13px; + left: 50%; + transform: translateX(-50%); + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 12px; + text-align: center; + color: #8286a6 +} + +@media (max-width:1200px) { + .apps[data-v-ce7600a4] { + height: auto; + padding-top: 74px + } + .apps .apps-content[data-v-ce7600a4] { + width: 375px; + margin-bottom: 120px + } + .apps .apps-content .apps-logo[data-v-ce7600a4] { + width: 93px; + height: 22px; + top: 20px; + left: 32px + } + .apps .apps-content .apps-title[data-v-ce7600a4] { + width: 314px; + margin: 0 auto; + font-style: normal; + font-weight: 800; + font-size: 48px; + line-height: 48px; + color: #0b0e51; + padding-top: 155px; + text-align: center + } + .apps .apps-content .apps-text[data-v-ce7600a4] { + width: 314px; + height: 192px; + font-style: normal; + font-weight: 400; + font-size: 16px; + line-height: 24px; + color: #4154b5; + margin-bottom: 84px; + text-align: left + } + .apps .apps-content .apps-text p[data-v-ce7600a4] { + margin: 0 + } + .apps .apps-content .apps-text p a[data-v-ce7600a4] { + border-bottom: 1px solid #4154b5; + text-decoration: none; + color: #4154b5 + } + .apps .apps-content .apps-text .apps-mobile-go[data-v-ce7600a4] { + margin-top: 22px + } + .apps .apps-content .apps-download[data-v-ce7600a4] { + width: 375px; + height: auto; + flex-direction: column + } + .apps .apps-content .apps-download .download-android[data-v-ce7600a4], + .apps .apps-content .apps-download .download-ios[data-v-ce7600a4] { + width: 335px; + height: 335px; + border-radius: 36.5px; + background: #fff; + border: 1.66px solid #e0e5ff; + margin: 0 auto + } + .apps .apps-content .apps-download .download-android .item-icon[data-v-ce7600a4], + .apps .apps-content .apps-download .download-ios .item-icon[data-v-ce7600a4] { + display: none + } + .apps .apps-content .apps-download .download-android .item-logo[data-v-ce7600a4], + .apps .apps-content .apps-download .download-ios .item-logo[data-v-ce7600a4] { + margin: 33px auto 40px + } + .apps .apps-content .apps-download .download-android .item-text[data-v-ce7600a4], + .apps .apps-content .apps-download .download-ios .item-text[data-v-ce7600a4] { + font-style: normal; + font-weight: 600; + font-size: 32px; + line-height: 42px; + text-align: center; + color: #0b0e51 + } + .apps .apps-content .apps-download .download-android .item-download[data-v-ce7600a4], + .apps .apps-content .apps-download .download-ios .item-download[data-v-ce7600a4] { + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 60px; + text-align: center; + color: #fff + } + .apps .apps-content .apps-download .download-ios[data-v-ce7600a4] { + margin-bottom: 60px + } + .apps .apps-provide[data-v-ce7600a4] { + padding-bottom: 148px + } + .apps .apps-provide .provide-title[data-v-ce7600a4] { + font-style: normal; + font-weight: 400; + font-size: 38px; + line-height: 50px; + text-align: center; + letter-spacing: 1px; + color: #0b0e51 + } + .apps .apps-provide .provide-content[data-v-ce7600a4] { + width: 335px; + height: auto; + margin-top: 40px; + flex-wrap: wrap + } + .apps .apps-provide .provide-content .provide-item[data-v-ce7600a4] { + width: 158px; + height: 192px; + margin-bottom: 20px + } + .apps .apps-provide .provide-content .provide-item .provide-item-logo[data-v-ce7600a4] { + width: 60px; + height: 60px; + margin: 28px auto 20px + } + .apps .apps-provide .provide-content .provide-item .provide-item-text[data-v-ce7600a4] { + font-style: normal; + font-weight: 600; + font-size: 20px; + line-height: 28px; + text-align: center; + color: #a0a0a0 + } + .apps .apps-provide .provide-content .provide-item .provide-item-text p[data-v-ce7600a4] { + margin: 0 + } + .apps .apps-footer[data-v-ce7600a4] { + width: 259px; + height: 36px; + bottom: 8px; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 18px; + text-align: center; + color: #8286a6 + } +} + + +/* 头部*/ +*{ + padding: 0; + margin: 0; + list-style: none; + text-decoration: none; + font-family: "microsoft yahei"; +} +.clear{ + clear: both; +} + +/*头部开始*/ + +#header{ + height: 72px; + position: fixed; + width: 100%; + top:0; + background-color: white; + min-width: 960px; + z-index: 9; +} +.fixwid{ + width: 1190px; + margin: 0 auto; + overflow: hidden; +} +.logo{ + height: 72px; + float: left; +} +.logo img{ + width: 40px; + margin-top: 11px; + float: left; +} +.logo span{ + float: left; + font-size: 24px; + color: #11b4ea; + margin-left: 10px; + height: 72px; + line-height: 72px; +} +.nav{ + height: 72px; + float: right; +} +.nav ul{ + float: left; + height: 72px; + line-height: 72px; +} +.nav ul li{ + float: left; + padding: 0 19px; +} +.login{ + float: left; + width: 80px; + height: 72px; + line-height: 72px; + text-align: center; + margin-left: 24px; + background-color: #11b4ea; +} +.login .a_area{ + display: block; +} +.a_line{ + color: #242424; +} +.a_line:hover{ + color: #11b4ea!important; +} + +.nav .a_link{ + font-size: 16px; +} + +.a_area{ + color: white; + background-color: #11b4ea; +} +.a_area:hover{ + background-color: #47c4f0!important; + color: white; +} + +.nav .a_area{ + font-size: 16px; +} + +#header>img{ + width: 100%; + height: 29px; + position: relative; +} + +/*头部结束*/ + diff --git a/public/assets/css/app1.css b/public/assets/css/app1.css new file mode 100644 index 0000000..65162ef --- /dev/null +++ b/public/assets/css/app1.css @@ -0,0 +1,417 @@ +.child-view { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + -webkit-transition: all .5s cubic-bezier(.55, 0, .1, 1); + transition: all .5s cubic-bezier(.55, 0, .1, 1) +} + +.slide-left-enter, +.slide-right-leave-active { + opacity: 0; + -webkit-transform: translate(30px); + transform: translate(30px) +} + +.slide-left-leave-active, +.slide-right-enter { + opacity: 0; + -webkit-transform: translate(-30px); + transform: translate(-30px) +} + +.content { + width: 1100px; + margin: 0 auto +} + +.flex { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex +} + +.flex-box { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center +} + +.align-center, +.flex-box, +.space-between { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center +} + +.space-between { + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between +} + +.text-overflow { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +input:focus { + outline: none +} + +.dis-btn1 { + cursor: pointer +} + +html { + line-height: 1.15; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible +} + +pre { + font-family: monospace, monospace; + font-size: 1em +} + +a { + background-color: transparent +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted +} + +b, +strong { + font-weight: bolder +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +img { + border-style: none +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0 +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0 +} + +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText +} + +fieldset { + padding: .35em .75em .625em +} + +legend { + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +progress { + vertical-align: baseline +} + +textarea { + overflow: auto +} + +[type=checkbox], +[type=radio] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0 +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +details { + display: block +} + +summary { + display: list-item +} + +[hidden], +template { + display: none +} + +a, +abbr, +acronym, +address, +applet, +article, +aside, +audio, +b, +big, +blockquote, +body, +canvas, +caption, +center, +cite, +code, +dd, +del, +details, +dfn, +div, +dl, +dt, +em, +embed, +fieldset, +figcaption, +figure, +footer, +form, +h1, +h2, +h3, +h4, +h5, +h6, +header, +html, +i, +iframe, +img, +input, +ins, +kbd, +label, +legend, +li, +mark, +menu, +nav, +object, +ol, +output, +p, +pre, +q, +ruby, +s, +samp, +section, +small, +span, +strike, +strong, +sub, +summary, +sup, +table, +tbody, +td, +tfoot, +th, +thead, +time, +tr, +tt, +u, +ul, +var, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font-weight: 400; + vertical-align: baseline +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +menu, +nav, +section { + display: block +} + +body { + line-height: 1 +} + +blockquote, +q { + quotes: none +} + +blockquote:after, +blockquote:before, +q:after, +q:before { + content: none +} + +table { + border-collapse: collapse; + border-spacing: 0 +} + +a { + color: #7e8c8d; + -webkit-backface-visibility: hidden; + text-decoration: none +} + +li { + list-style: none +} + +body { + -webkit-text-size-adjust: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) +} + +body, +html { + font-family: PingFang SC, STHeitiSC-Light, Helvetica-Light, arial, sans-serif, Droid Sans Fallback; + -webkit-tap-highlight-color: transparent; + background: #f4f4f4; +} + +* { + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +img { + display: block; + max-width: 100% +} + +.app, +body, +html { + width: 100%; + height: 100%; + position: relative; + background: #fff +} \ No newline at end of file diff --git a/public/assets/css/bootstrap-datetimepicker.min.css b/public/assets/css/bootstrap-datetimepicker.min.css new file mode 100644 index 0000000..7969773 --- /dev/null +++ b/public/assets/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,9 @@ +/*! + * Datetimepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */.datetimepicker{padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datetimepicker-inline{width:220px}.datetimepicker.datetimepicker-rtl{direction:rtl}.datetimepicker.datetimepicker-rtl table tr td span{float:right}.datetimepicker-dropdown,.datetimepicker-dropdown-left{top:0;left:0}[class*=" datetimepicker-dropdown"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute}[class*=" datetimepicker-dropdown"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute}[class*=" datetimepicker-dropdown-top"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0}[class*=" datetimepicker-dropdown-top"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;border-bottom:0}.datetimepicker-dropdown-bottom-left:before{top:-7px;right:6px}.datetimepicker-dropdown-bottom-left:after{top:-6px;right:7px}.datetimepicker-dropdown-bottom-right:before{top:-7px;left:6px}.datetimepicker-dropdown-bottom-right:after{top:-6px;left:7px}.datetimepicker-dropdown-top-left:before{bottom:-7px;right:6px}.datetimepicker-dropdown-top-left:after{bottom:-6px;right:7px}.datetimepicker-dropdown-top-right:before{bottom:-7px;left:6px}.datetimepicker-dropdown-top-right:after{bottom:-6px;left:7px}.datetimepicker>div{display:none}.datetimepicker.minutes div.datetimepicker-minutes{display:block}.datetimepicker.hours div.datetimepicker-hours{display:block}.datetimepicker.days div.datetimepicker-days{display:block}.datetimepicker.months div.datetimepicker-months{display:block}.datetimepicker.years div.datetimepicker-years{display:block}.datetimepicker table{margin:0}.datetimepicker td,.datetimepicker th{text-align:center;/*width:20px;*/height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0}.table-striped .datetimepicker table tr td,.table-striped .datetimepicker table tr th{background-color:transparent}.datetimepicker table tr td.minute:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.hour:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.day:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.old,.datetimepicker table tr td.new{color:#999}.datetimepicker table tr td.disabled,.datetimepicker table tr td.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td.today,.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top,#fdd49a,#fdf59a);background-image:-ms-linear-gradient(top,#fdd49a,#fdf59a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fdd49a),to(#fdf59a));background-image:-webkit-linear-gradient(top,#fdd49a,#fdf59a);background-image:-o-linear-gradient(top,#fdd49a,#fdf59a);background-image:linear-gradient(top,#fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a',endColorstr='#fdf59a',GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today:hover:hover,.datetimepicker table tr td.today.disabled:hover,.datetimepicker table tr td.today.disabled:hover:hover,.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today:hover.disabled,.datetimepicker table tr td.today.disabled.disabled,.datetimepicker table tr td.today.disabled:hover.disabled,.datetimepicker table tr td.today[disabled],.datetimepicker table tr td.today:hover[disabled],.datetimepicker table tr td.today.disabled[disabled],.datetimepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active{background-color:#fbf069}.datetimepicker table tr td.active,.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(top,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active:hover:hover,.datetimepicker table tr td.active.disabled:hover,.datetimepicker table tr td.active.disabled:hover:hover,.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active:hover.disabled,.datetimepicker table tr td.active.disabled.disabled,.datetimepicker table tr td.active.disabled:hover.disabled,.datetimepicker table tr td.active[disabled],.datetimepicker table tr td.active:hover[disabled],.datetimepicker table tr td.active.disabled[disabled],.datetimepicker table tr td.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datetimepicker .datetimepicker-hours span{height:26px;line-height:26px}.datetimepicker .datetimepicker-hours table tr td span.hour_am,.datetimepicker .datetimepicker-hours table tr td span.hour_pm{width:14.6%}.datetimepicker .datetimepicker-hours fieldset legend,.datetimepicker .datetimepicker-minutes fieldset legend{margin-bottom:inherit;line-height:30px}.datetimepicker .datetimepicker-minutes span{height:26px;line-height:26px}.datetimepicker table tr td span:hover{background:#eee}.datetimepicker table tr td span.disabled,.datetimepicker table tr td span.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td span.active,.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(top,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active:hover:hover,.datetimepicker table tr td span.active.disabled:hover,.datetimepicker table tr td span.active.disabled:hover:hover,.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active:hover.disabled,.datetimepicker table tr td span.active.disabled.disabled,.datetimepicker table tr td span.active.disabled:hover.disabled,.datetimepicker table tr td span.active[disabled],.datetimepicker table tr td span.active:hover[disabled],.datetimepicker table tr td span.active.disabled[disabled],.datetimepicker table tr td span.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span.old{color:#999}.datetimepicker th.switch{}.datetimepicker thead tr:first-child th,.datetimepicker tfoot tr:first-child th{cursor:pointer}.datetimepicker thead tr:first-child th:hover,.datetimepicker tfoot tr:first-child th:hover{background:#eee}.input-append.date .add-on i,.input-prepend.date .add-on i,.input-group.date .input-group-addon span{cursor:pointer;width:14px;height:14px} \ No newline at end of file diff --git a/public/assets/css/bootstrap-editable.css b/public/assets/css/bootstrap-editable.css new file mode 100644 index 0000000..cba0ae0 --- /dev/null +++ b/public/assets/css/bootstrap-editable.css @@ -0,0 +1,706 @@ +/*! X-editable - v1.5.3 +* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery +* http://github.com/vitalets/x-editable +* Copyright (c) 2019 Vitaliy Potapov; Licensed MIT */ +.editableform { + margin-bottom: 0; /* overwrites bootstrap margin */ +} + +.editableform .control-group { + margin-bottom: 0; /* overwrites bootstrap margin */ + white-space: nowrap; /* prevent wrapping buttons on new line */ + line-height: 20px; /* overwriting bootstrap line-height. See #133 */ +} + +/* + BS3 fix: stop css from breaking when the form is inside a popup and inside a form with the class .form-horizontal + See: https://github.com/vitalets/x-editable/issues/682 +*/ +.form-horizontal .editable-popup .editableform .form-group { + margin-left:0; + margin-right:0; +} + + +/* + BS3 width:1005 for inputs breaks editable form in popup + See: https://github.com/vitalets/x-editable/issues/393 +*/ +.editableform .form-control { + width: auto; +} + +.editable-buttons { + display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ + vertical-align: top; + margin-left: 7px; + /* inline-block emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-button { + width: 24px; + height: 1px; + display: inline-block; + vertical-align: middle; + margin: 8px 2px 8px 5px; + cursor: pointer; + position: relative; +} + +.editable-button .icon{ + position: absolute; + color: #09AAFF; +} + +.editable-button .icon1 { + top: 0; + left: 0; + font-size: 24px; + filter: alpha(opacity=30); + -moz-opacity: .3; + opacity: .3; +} + +.editable-button .icon2 { + position: absolute; + top: 6px; + left: 5px; + font-size: 12px; +} + +.editable-buttons.editable-buttons-bottom { + display: block; + margin-top: 7px; + margin-left: 0; +} + +.editable-input { + margin: 9px 0; + vertical-align: top; + display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ + width: auto; /* bootstrap-responsive has width: 100% that breakes layout */ + white-space: normal; /* reset white-space decalred in parent*/ + /* display-inline emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-buttons .editable-cancel { + margin-left: 7px; +} + +/*for jquery-ui buttons need set height to look more pretty*/ +.editable-buttons button.ui-button-icon-only { + height: 24px; + width: 30px; +} + +.editableform-loading { + background: url('../image/loading.gif') center center no-repeat; + height: 25px; + width: auto; + min-width: 25px; +} + +.editable-inline .editableform-loading { + background-position: left 5px; +} + + .editable-error-block { + max-width: 300px; + margin: 5px 0 0 0; + width: auto; + white-space: normal; +} + +/*add padding for jquery ui*/ +.editable-error-block.ui-state-error { + padding: 3px; +} + +.editable-error { + color: red; +} + +/* ---- For specific types ---- */ + +.editableform .editable-date { + padding: 0; + margin: 0; + float: left; +} + +/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */ +.editable-inline .add-on .icon-th { + margin-top: 3px; + margin-left: 1px; +} + + +/* checklist vertical alignment */ +.editable-checklist label input[type="checkbox"], +.editable-checklist label span { + vertical-align: middle; + margin: 0; +} + +.editable-checklist label { + white-space: nowrap; +} + +/* set exact width of textarea to fit buttons toolbar */ +.editable-wysihtml5 { + width: 566px; + height: 250px; +} + +/* clear button shown as link in date inputs */ +.editable-clear { + clear: both; + font-size: 0.9em; + text-decoration: none; + text-align: right; +} + +/* IOS-style clear button for text inputs */ +.editable-clear-x { + background: url('../image/clear.png') center center no-repeat; + display: block; + width: 13px; + height: 13px; + position: absolute; + opacity: 0.6; + z-index: 100; + + top: 50%; + right: 6px; + margin-top: -6px; + +} + +.editable-clear-x:hover { + opacity: 1; +} + +.editable-pre-wrapped { + white-space: pre-wrap; +} + +.editable-container.editable-popup { + max-width: none !important; /* without this rule poshytip/tooltip does not stretch */ +} + +.editable-container.popover { + width: auto; /* without this rule popover does not stretch */ +} + +.editable-container.editable-inline { + display: inline-block; + vertical-align: middle; + width: auto; + /* inline-block emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-container.ui-widget { + font-size: inherit; /* jqueryui widget font 1.1em too big, overwrite it */ + z-index: 9990; /* should be less than select2 dropdown z-index to close dropdown first when click */ +} +.editable-click, +a.editable-click, +a.editable-click:hover { + text-decoration: none; + border-bottom: dashed 1px #0088cc; +} + +.editable-click.editable-disabled, +a.editable-click.editable-disabled, +a.editable-click.editable-disabled:hover { + color: #585858; + cursor: default; + border-bottom: none; +} + +.editable-empty, .editable-empty:hover, .editable-empty:focus{ + font-style: italic; + color: #DD1144; + /* border-bottom: none; */ + text-decoration: none; +} + +.editable-unsaved { + font-weight: bold; +} + +.editable-unsaved:after { +/* content: '*'*/ +} + +.editable-bg-transition { + -webkit-transition: background-color 1400ms ease-out; + -moz-transition: background-color 1400ms ease-out; + -o-transition: background-color 1400ms ease-out; + -ms-transition: background-color 1400ms ease-out; + transition: background-color 1400ms ease-out; +} + +/*see https://github.com/vitalets/x-editable/issues/139 */ +.form-horizontal .editable +{ + padding-top: 5px; + display:inline-block; +} + + +/*! + * Datepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.datepicker { + padding: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + direction: ltr; + /*.dow { + border-top: 1px solid #ddd !important; + }*/ + +} +.datepicker-inline { + width: 220px; +} +.datepicker.datepicker-rtl { + direction: rtl; +} +.datepicker.datepicker-rtl table tr td span { + float: right; +} +.datepicker-dropdown { + top: 0; + left: 0; +} +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 6px; +} +.datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 7px; +} +.datepicker > div { + display: none; +} +.datepicker.days div.datepicker-days { + display: block; +} +.datepicker.months div.datepicker-months { + display: block; +} +.datepicker.years div.datepicker-years { + display: block; +} +.datepicker table { + margin: 0; +} +.datepicker td, +.datepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: none; +} +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.day:hover { + background: #eeeeee; + cursor: pointer; +} +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #999999; +} +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { + background-color: #fde19a; + background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); + background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); + background-image: linear-gradient(top, #fdd49a, #fdf59a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); + border-color: #fdf59a #fdf59a #fbed50; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #000; +} +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled] { + background-color: #fdf59a; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active { + background-color: #fbf069 \9; +} +.datepicker table tr td.today:hover:hover { + color: #000; +} +.datepicker table tr td.today.active:hover { + color: #fff; +} +.datepicker table tr td.range, +.datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:hover { + background: #eeeeee; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today, +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:hover { + background-color: #f3d17a; + background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); + background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); + background-image: linear-gradient(top, #f3c17a, #f3e97a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); + border-color: #f3e97a #f3e97a #edde34; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:hover:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today:hover.disabled, +.datepicker table tr td.range.today.disabled.disabled, +.datepicker table tr td.range.today.disabled:hover.disabled, +.datepicker table tr td.range.today[disabled], +.datepicker table tr td.range.today:hover[disabled], +.datepicker table tr td.range.today.disabled[disabled], +.datepicker table tr td.range.today.disabled:hover[disabled] { + background-color: #f3e97a; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active { + background-color: #efe24b \9; +} +.datepicker table tr td.selected, +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected.disabled:hover { + background-color: #9e9e9e; + background-image: -moz-linear-gradient(top, #b3b3b3, #808080); + background-image: -ms-linear-gradient(top, #b3b3b3, #808080); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); + background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); + background-image: -o-linear-gradient(top, #b3b3b3, #808080); + background-image: linear-gradient(top, #b3b3b3, #808080); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); + border-color: #808080 #808080 #595959; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected:hover:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected:hover.disabled, +.datepicker table tr td.selected.disabled.disabled, +.datepicker table tr td.selected.disabled:hover.disabled, +.datepicker table tr td.selected[disabled], +.datepicker table tr td.selected:hover[disabled], +.datepicker table tr td.selected.disabled[disabled], +.datepicker table tr td.selected.disabled:hover[disabled] { + background-color: #808080; +} +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active { + background-color: #666666 \9; +} +.datepicker table tr td.active, +.datepicker table tr td.active:hover, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.active:hover, +.datepicker table tr td.active:hover:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active:hover.disabled, +.datepicker table tr td.active.disabled.disabled, +.datepicker table tr td.active.disabled:hover.disabled, +.datepicker table tr td.active[disabled], +.datepicker table tr td.active:hover[disabled], +.datepicker table tr td.active.disabled[disabled], +.datepicker table tr td.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.datepicker table tr td span:hover { + background: #eeeeee; +} +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span.old, +.datepicker table tr td span.new { + color: #999999; +} +.datepicker th.datepicker-switch { + width: 145px; +} +.datepicker thead tr:first-child th, +.datepicker tfoot tr th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover, +.datepicker tfoot tr th:hover { + background: #eeeeee; +} +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; +} +.input-append.date .add-on i, +.input-prepend.date .add-on i { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} +.input-daterange input { + text-align: center; +} +.input-daterange input:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-daterange input:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-daterange .add-on { + display: inline-block; + width: auto; + min-width: 16px; + height: 18px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; + margin-left: -5px; + margin-right: -5px; +} diff --git a/public/assets/css/bootstrap-table-fixed-columns.css b/public/assets/css/bootstrap-table-fixed-columns.css new file mode 100644 index 0000000..40855f9 --- /dev/null +++ b/public/assets/css/bootstrap-table-fixed-columns.css @@ -0,0 +1,27 @@ +.fixed-table-header-columns, +.fixed-table-body-columns { + position: absolute; + background-color: #fff; + display: none; + box-sizing: border-box; + overflow: hidden; +} + +.fixed-table-header-columns .table, +.fixed-table-body-columns .table { + border-right: 1px solid #ddd; +} + +.fixed-table-header-columns .table.table-no-bordered, +.fixed-table-body-columns .table.table-no-bordered { + border-right: 1px solid transparent; +} + +.fixed-table-body-columns table { + position: absolute; + animation: none; +} + +.bootstrap-table .table-hover > tbody > tr.hover > td{ + background-color: #f5f5f5; +} \ No newline at end of file diff --git a/public/assets/css/bootstrap-table.min.css b/public/assets/css/bootstrap-table.min.css new file mode 100644 index 0000000..bfad989 --- /dev/null +++ b/public/assets/css/bootstrap-table.min.css @@ -0,0 +1,10 @@ +/** + * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation) + * + * @version v1.18.1 + * @homepage https://bootstrap-table.com + * @author wenzhixin (http://wenzhixin.net.cn/) + * @license MIT + */ + +.bootstrap-table .fixed-table-toolbar::after{content:"";display:block;clear:both}.bootstrap-table .fixed-table-toolbar .bs-bars,.bootstrap-table .fixed-table-toolbar .columns,.bootstrap-table .fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group>.btn{border-radius:0}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .fixed-table-toolbar .columns .dropdown-menu{text-align:left;max-height:300px;overflow:auto;-ms-overflow-style:scrollbar;z-index:1001}.bootstrap-table .fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.bootstrap-table .fixed-table-toolbar .columns-left{margin-right:5px}.bootstrap-table .fixed-table-toolbar .columns-right{margin-left:5px}.bootstrap-table .fixed-table-toolbar .pull-right .dropdown-menu{right:0;left:auto}.bootstrap-table .fixed-table-container{position:relative;clear:both}.bootstrap-table .fixed-table-container .table{width:100%;margin-bottom:0!important}.bootstrap-table .fixed-table-container .table td,.bootstrap-table .fixed-table-container .table th{vertical-align:middle;box-sizing:border-box}.bootstrap-table .fixed-table-container .table thead th{vertical-align:bottom;padding:0;margin:0}.bootstrap-table .fixed-table-container .table thead th:focus{outline:0 solid transparent}.bootstrap-table .fixed-table-container .table thead th.detail{width:30px}.bootstrap-table .fixed-table-container .table thead th .th-inner{padding:.75rem;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bootstrap-table .fixed-table-container .table thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px!important}.bootstrap-table .fixed-table-container .table thead th .both{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC")}.bootstrap-table .fixed-table-container .table thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.bootstrap-table .fixed-table-container .table thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.bootstrap-table .fixed-table-container .table tbody tr.selected td{background-color:#daebfe}.bootstrap-table .fixed-table-container .table tbody tr.no-records-found td{text-align:center}.bootstrap-table .fixed-table-container .table tbody tr .card-view{display:flex}.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-value{width:100%}.bootstrap-table .fixed-table-container .table .bs-checkbox{text-align:center}.bootstrap-table .fixed-table-container .table .bs-checkbox label{margin-bottom:0}.bootstrap-table .fixed-table-container .table .bs-checkbox label input[type=checkbox],.bootstrap-table .fixed-table-container .table .bs-checkbox label input[type=radio]{margin:0 auto!important}.bootstrap-table .fixed-table-container .table.table-sm .th-inner{padding:.3rem}.bootstrap-table .fixed-table-container.fixed-height.has-card-view{border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .fixed-table-border{border-left:1px solid #dee2e6;border-right:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .table thead th{border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .table-dark thead th{border-bottom:1px solid #32383e}.bootstrap-table .fixed-table-container .fixed-table-header{overflow:hidden}.bootstrap-table .fixed-table-container .fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading{align-items:center;background:#fff;display:flex;justify-content:center;position:absolute;bottom:0;width:100%;z-index:1000;transition:visibility 0s,opacity .15s ease-in-out;opacity:0;visibility:hidden}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.open{visibility:visible;opacity:1}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap{align-items:baseline;display:flex;justify-content:center}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .loading-text{margin-right:6px}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap{align-items:center;display:flex;justify-content:center}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::before{content:"";animation-duration:1.5s;animation-iteration-count:infinite;animation-name:LOADING;background:#212529;border-radius:50%;display:block;height:5px;margin:0 4px;opacity:0;width:5px}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot{animation-delay:.3s}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after{animation-delay:.6s}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark{background:#212529}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-dot,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::after,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::before{background:#fff}.bootstrap-table .fixed-table-container .fixed-table-footer{overflow:hidden}.bootstrap-table .fixed-table-pagination::after{content:"";display:block;clear:both}.bootstrap-table .fixed-table-pagination>.pagination,.bootstrap-table .fixed-table-pagination>.pagination-detail{margin-top:10px;margin-bottom:10px}.bootstrap-table .fixed-table-pagination>.pagination-detail .pagination-info{line-height:34px;margin-right:5px}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list{display:inline-block}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list .btn-group{position:relative;display:inline-block;vertical-align:middle}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list .btn-group .dropdown-menu{margin-bottom:0}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination{margin:0}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a{color:#c8c8c8}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a::before{content:'\2B05'}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a::after{content:'\27A1'}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.disabled a{pointer-events:none;cursor:default}.bootstrap-table.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important;background:#fff;height:calc(100vh);overflow-y:scroll}.bootstrap-table.bootstrap4 .pagination-lg .page-link,.bootstrap-table.bootstrap5 .pagination-lg .page-link{padding:.5rem 1rem}div.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}@keyframes LOADING{0%{opacity:0}50%{opacity:1}to{opacity:0}} \ No newline at end of file diff --git a/public/assets/css/bootstrap.min.css b/public/assets/css/bootstrap.min.css new file mode 100644 index 0000000..56bd5a1 --- /dev/null +++ b/public/assets/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-. +5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../font/glyphicons-halflings-regular.eot);src:url(../font/glyphicons-halflings-regular.eot#iefix) format('embedded-opentype'),url(../font/glyphicons-halflings-regular.woff2) format('woff2'),url(../font/glyphicons-halflings-regular.woff) format('woff'),url(../font/glyphicons-halflings-regular.ttf) format('truetype'),url(https://static.skpan.cn/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #C3EAFF;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #f2f6fd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#F0F8FD}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#F0F8FD}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #C3EAFF;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,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control:focus{outline: 0;-webkit-box-shadow: 0 0 5px 0 #09AAFF;-moz-box-shadow: 0 0 5px 0 #09AAFF;box-shadow: 0 0 5px 0 #09AAFF;}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #C3EAFF;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #C3EAFF;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #C3EAFF;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/public/assets/css/elementui.css b/public/assets/css/elementui.css new file mode 100644 index 0000000..b3a8bfe --- /dev/null +++ b/public/assets/css/elementui.css @@ -0,0 +1 @@ +.el-pagination--small .arrow.disabled,.el-table--hidden,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.is-hidden>*{visibility:hidden}.el-input__suffix,.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing),.el-message__closeBtn:focus,.el-message__content:focus,.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing),.el-rate:active,.el-rate:focus,.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing),.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}@-webkit-keyframes rotating{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotating{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination:after,.el-pagination:before{display:table;content:""}.el-pagination:after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409eff}.el-pagination button:disabled{color:#c0c4cc;background-color:#fff;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:50% no-repeat #fff;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#c0c4cc;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .more:before,.el-pagination--small li.more:before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409eff}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#c0c4cc}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409eff}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409eff;color:#fff}.el-dialog,.el-pager li{background:#fff;-webkit-box-sizing:border-box}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-date-table,.el-pager,.el-table th{-webkit-user-select:none;-moz-user-select:none}.el-pager .more:before{line-height:30px}.el-pager li{padding:0 4px;font-size:13px;min-width:35.5px;height:28px;line-height:28px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center}.el-menu--collapse .el-menu .el-submenu,.el-menu--popup{min-width:200px}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#c0c4cc}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409eff}.el-pager li.active{color:#409eff;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{to{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409eff}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #e4e7ed;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.el-dropdown-menu,.el-menu--collapse .el-submenu .el-menu{z-index:10;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#f5f7fa}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#fff}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button:before{content:"";position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:hsla(0,0%,100%,.5)}.el-dropdown .el-dropdown__caret-button.el-button--default:before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover:before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown-menu{position:absolute;top:0;left:0;padding:10px 0;margin:5px 0;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#606266;cursor:pointer;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #ebeef5}.el-dropdown-menu__item--divided:before{content:"";height:6px;display:block;margin:0 -20px;background-color:#fff}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:1px solid #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0}.el-menu,.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu:after,.el-menu:before{display:table;content:""}.el-menu:after{clear:both}.el-menu.el-menu--horizontal{border-bottom:1px solid #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409eff;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#fff;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409eff;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-submenu{position:relative}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;border:1px solid #e4e7ed;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;position:relative;-webkit-box-sizing:border-box;white-space:nowrap;list-style:none}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0 !important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409eff}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0 !important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409eff}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0 !important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{white-space:nowrap;background:#fff;border:1px solid #dcdfe6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409eff}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none !important;box-shadow:none !important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:#409eff;border-color:#409eff;-webkit-box-shadow:-1px 0 0 0 #409eff;box-shadow:-1px 0 0 0 #409eff}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#f2f6fc}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-popover,.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409eff;box-shadow:0 0 2px 2px #409eff}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409eff}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #dcdfe6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#dcdfe6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#fff}.el-switch.is-checked .el-switch__core{border-color:#409eff;background-color:#409eff}.el-switch.is-checked .el-switch__core:after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #e4e7ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409eff;background-color:#fff}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected:after{position:absolute;right:20px;font-family:element-icons;content:"\E6DA";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#fff}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#f5f7fa}.el-select-dropdown__item.selected{color:#409eff;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type):after{content:"";position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#e4e7ed}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#c0c4cc}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409eff}.el-select .el-input .el-select__caret{color:#c0c4cc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotate(180deg);transform:rotate(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotate(0);transform:rotate(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotate(180deg);transform:rotate(180deg);border-radius:100%;color:#c0c4cc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#e4e7ed}.el-select .el-input.is-focus .el-input__inner{border-color:#409eff}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#c0c4cc;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.el-select .el-tag__close{margin-top:-2px}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5}.el-select .el-tag__close.el-icon-close{background-color:#c0c4cc;right:-7px;top:0;color:#fff}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#fff}.el-select .el-tag__close.el-icon-close:before{display:block;-webkit-transform:translateY(.5px);transform:translateY(.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table--mini,.el-table--small,.el-table__expand-icon{font-size:12px}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent !important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit td.gutter,.el-table--fit th.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th{background:#f5f7fa}.el-table th,.el-table tr{background-color:#fff}.el-table td,.el-table th{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table td.is-center,.el-table th.is-center{text-align:center}.el-table td.is-right,.el-table th.is-right{text-align:right}.el-table td.gutter,.el-table th.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table--medium td,.el-table--medium th{padding:10px 0}.el-table--small td,.el-table--small th{padding:8px 0}.el-table--mini td,.el-table--mini th{padding:6px 0}.el-table--border td:first-child .cell,.el-table--border th:first-child .cell,.el-table .cell{padding-left:10px}.el-table tr input[type=checkbox]{margin:0}.el-table td,.el-table th.is-leaf{border-bottom:1px solid #ebeef5}.el-table th.is-sortable{cursor:pointer}.el-table th{overflow:hidden;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-table th>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th>.cell.highlight{color:#409eff}.el-table th.required>div:before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-table td.gutter{width:0}.el-table .cell{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-right:10px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #ebeef5}.el-table--border:after,.el-table--group:after,.el-table:before{content:"";position:absolute;background-color:#ebeef5;z-index:1}.el-table--border:after,.el-table--group:after{top:0;right:0;width:1px;height:100%}.el-table:before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border td,.el-table--border th,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #ebeef5}.el-table--border th.gutter:last-of-type{border-bottom:1px solid #ebeef5;border-bottom-width:1px}.el-table--border th,.el-table__fixed-right-patch{border-bottom:1px solid #ebeef5}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right:before,.el-table__fixed:before{content:"";position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#ebeef5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#fff}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td{border-top:1px solid #ebeef5;background-color:#f5f7fa;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td{border-top:1px solid #ebeef5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td,.el-table__header-wrapper tbody td{background-color:#f5f7fa;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-picker-panel,.el-table-filter{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #ebeef5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#c0c4cc;top:5px}.el-table .sort-caret.descending{border-top-color:#c0c4cc;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409eff}.el-table .descending .sort-caret.descending{border-top-color:#409eff}.el-table .hidden-columns{position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td{background:#fafafa}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td,.el-table__body tr.hover-row.el-table__row--striped.current-row>td,.el-table__body tr.hover-row.el-table__row--striped>td,.el-table__body tr.hover-row>td{background-color:#f5f7fa}.el-table__body tr.current-row>td{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #ebeef5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td{background-color:#f5f7fa}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #ebeef5;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:2px 0}.el-date-table td,.el-date-table td div{height:30px;-webkit-box-sizing:border-box}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409eff;color:#fff}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #ebeef5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div,.el-date-table td.in-range div,.el-date-table td.in-range div:hover{background-color:#f2f6fc}.el-table-filter__bottom button:hover{color:#409eff}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;padding:4px 0;text-align:center;cursor:pointer;position:relative}.el-date-table td,.el-date-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td div{padding:3px 0}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#c0c4cc}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409eff;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#fff}.el-date-table td.available:hover{color:#409eff}.el-date-table td.current:not(.disabled) span{color:#fff;background-color:#409eff}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#fff}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409eff}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#f5f7fa;opacity:1;cursor:not-allowed;color:#c0c4cc}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#f2f6fc;border-radius:15px}.el-date-table td.selected div:hover{background-color:#f2f6fc}.el-date-table td.selected span{background-color:#409eff;color:#fff;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:1px solid #ebeef5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:#409eff;font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#fff}.el-month-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-month-table td.disabled .cell:hover{color:#c0c4cc}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:#409eff}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#f2f6fc}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#fff}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#fff;background-color:#409eff}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:#409eff}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:#409eff;font-weight:700}.el-year-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-year-table td.disabled .cell:hover{color:#c0c4cc}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409eff}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:1px solid #ebeef5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409eff}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409eff;font-weight:700}.time-select-item.disabled{color:#e4e7ed;cursor:not-allowed}.time-select-item:hover{background-color:#f5f7fa;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#c0c4cc;float:left;line-height:32px}.el-date-editor .el-range-input,.el-date-editor .el-range-separator{height:100%;margin:0;text-align:center;display:inline-block;font-size:14px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;padding:0;width:39%;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::-ms-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::-moz-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::placeholder{color:#c0c4cc}.el-date-editor .el-range-separator{padding:0 5px;line-height:32px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#c0c4cc;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor.is-active,.el-range-editor.is-active:hover{border-color:#409eff}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#e4e7ed}.el-range-editor.is-disabled input{background-color:#f5f7fa;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::-moz-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::placeholder{color:#c0c4cc}.el-range-editor.is-disabled .el-range-separator{color:#c0c4cc}.el-picker-panel{color:#606266;border:1px solid #e4e7ed;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.el-picker-panel,.el-popover,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-picker-panel__body-wrapper:after,.el-picker-panel__body:after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409eff}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409eff}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409eff}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409eff}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list:after,.el-time-spinner__list:before{content:"";display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#c0c4cc;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #e4e7ed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-slider__button,.el-slider__button-wrapper,.el-time-panel{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content:after,.el-time-panel__content:before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #e4e7ed;border-bottom:1px solid #e4e7ed}.el-time-panel__content:after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content:before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds:after{left:66.66667%}.el-time-panel__content.has-seconds:before{padding-left:33.33333%}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409eff}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #e4e7ed}.el-popover{position:absolute;background:#fff;min-width:150px;border:1px solid #ebeef5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#fff;border-radius:4px;border:1px solid #ebeef5;font-size:18px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper:after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#f56c6c}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px !important}.el-message-box__status:before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67c23a}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#e6a23c}.el-message-box__status.el-icon-error{color:#f56c6c}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#f56c6c;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb:after,.el-breadcrumb:before{display:table;content:""}.el-breadcrumb:after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#c0c4cc}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner.is-link,.el-breadcrumb__inner a{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner.is-link:hover,.el-breadcrumb__inner a:hover{color:#409eff;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item:after,.el-form-item:before{display:table;content:""}.el-form-item:after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content:after,.el-form-item__content:before{display:table;content:""}.el-form-item__content:after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#f56c6c;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:"*";color:#f56c6c;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#f56c6c}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409eff;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-collapse-item__arrow,.el-tabs__nav{-webkit-transition:-webkit-transform .3s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8);transform:scale(.8)}.el-tabs__new-tab:hover{color:#409eff}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap:after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#e4e7ed;z-index:1}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after,.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409eff inset;box-shadow:inset 0 0 2px 2px #409eff;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs__item .el-icon-close:hover{background-color:#c0c4cc;color:#fff}.el-tabs__item.is-active{color:#409eff}.el-tabs__item:hover{color:#409eff;cursor:pointer}.el-tabs__item.is-disabled{color:#c0c4cc;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #e4e7ed}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #e4e7ed;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close,.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #e4e7ed;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#fff}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--border-card{background:#fff;border:1px solid #dcdfe6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#f5f7fa;border-bottom:1px solid #e4e7ed;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409eff;background-color:#fff;border-right-color:#dcdfe6;border-left-color:#dcdfe6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409eff}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#c0c4cc}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #dcdfe6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left:after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #e4e7ed;border-bottom:none;border-top:1px solid #e4e7ed;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #e4e7ed;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #e4e7ed;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #e4e7ed;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #e4e7ed}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #e4e7ed;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #e4e7ed;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #e4e7ed;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tree{position:relative;cursor:default;background:#fff;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409eff}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#f5f7fa}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409eff;color:#fff}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:#f5f7fa}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#c0c4cc;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#c0c4cc}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#c0c4cc}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#fff}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67c23a}.el-alert--success.is-light .el-alert__description{color:#67c23a}.el-alert--success.is-dark{background-color:#67c23a;color:#fff}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#fff}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#e6a23c}.el-alert--warning.is-light .el-alert__description{color:#e6a23c}.el-alert--warning.is-dark{background-color:#e6a23c;color:#fff}.el-alert--error.is-light{background-color:#fef0f0;color:#f56c6c}.el-alert--error.is-light .el-alert__description{color:#f56c6c}.el-alert--error.is-dark{background-color:#f56c6c;color:#fff}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active{opacity:0}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ebeef5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67c23a}.el-notification .el-icon-error{color:#f56c6c}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#e6a23c}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409eff}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409eff}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #dcdfe6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #dcdfe6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#e4e7ed;color:#e4e7ed}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#e4e7ed;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #dcdfe6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #dcdfe6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow:after{content:" ";border-width:5px}.el-progress-bar__inner:after,.el-row:after,.el-row:before,.el-slider:after,.el-slider:before,.el-slider__button-wrapper:after,.el-upload-cover:after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow:after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow:after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow:after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow:after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#fff}.el-tooltip__popper.is-light{background:#fff;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow:after{border-top-color:#fff}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow:after{border-bottom-color:#fff}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow:after{border-left-color:#fff}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow:after{border-right-color:#fff}.el-slider:after,.el-slider:before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper:after{vertical-align:middle;display:inline-block}.el-slider:after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#e4e7ed;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button{border-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409eff;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal}.el-slider__button-wrapper:after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409eff;background-color:#fff;border-radius:50%;-webkit-transition:.2s;transition:.2s;user-select:none}.el-image-viewer__btn,.el-slider__button,.el-step__icon-inner{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px}.el-slider.is-vertical .el-slider__button-wrapper,.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #dcdfe6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#c0c4cc}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409eff}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative !important}.el-loading-parent--hidden{overflow:hidden !important}.el-loading-mask{position:absolute;z-index:2000;background-color:hsla(0,0%,100%,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-2,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-pull-10,.el-col-pull-11,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-push-0,.el-col-push-1,.el-col-push-2,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-row{position:relative}.el-loading-spinner .el-loading-text{color:#409eff;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409eff;stroke-linecap:round}.el-loading-spinner i{color:#409eff}@-webkit-keyframes loading-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loading-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row:after,.el-row:before{display:table}.el-row:after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-upload--picture-card,.el-upload-dragger{-webkit-box-sizing:border-box;cursor:pointer}.el-col-0{width:0}.el-col-offset-0{margin-left:0}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0;filter:alpha(opacity=0)}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409eff;color:#409eff}.el-upload:focus .el-upload-dragger{border-color:#409eff}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:360px;height:180px;text-align:center;position:relative;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#c0c4cc;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #dcdfe6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409eff;font-style:normal}.el-upload-dragger:hover{border-color:#409eff}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409eff}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67c23a}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409eff}.el-upload-list__item:hover{background-color:#f5f7fa}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409eff;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409eff}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px;background-color:#fff}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover:after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner:after,.el-progress-bar__innerText,.el-spinner{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67c23a}.el-progress.is-success .el-progress__text{color:#67c23a}.el-progress.is-warning .el-progress-bar__inner{background-color:#e6a23c}.el-progress.is-warning .el-progress__text{color:#e6a23c}.el-progress.is-exception .el-progress-bar__inner{background-color:#f56c6c}.el-progress.is-exception .el-progress__text{color:#f56c6c}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#ebeef5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409eff;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-card,.el-message{border-radius:4px;overflow:hidden}.el-progress-bar__inner:after{height:100%}.el-progress-bar__innerText{color:#fff;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-width:1px;border-style:solid;border-color:#ebeef5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67c23a}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#e6a23c}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#f56c6c}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#c0c4cc;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67c23a}.el-message .el-icon-error{color:#f56c6c}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#e6a23c}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#f56c6c;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409eff}.el-badge__content--success{background-color:#67c23a}.el-badge__content--warning{background-color:#e6a23c}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#f56c6c}.el-card{border:1px solid #ebeef5;background-color:#fff;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px}.el-rate{height:20px;line-height:1}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#c0c4cc;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;-webkit-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;-webkit-flex-shrink:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto !important;-webkit-flex-basis:auto !important;flex-basis:auto !important;-ms-flex-negative:0;-webkit-flex-shrink:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;-webkit-flex-grow:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#c0c4cc;border-color:#c0c4cc}.el-step__head.is-success{color:#67c23a;border-color:#67c23a}.el-step__head.is-error{color:#f56c6c;border-color:#f56c6c}.el-step__head.is-finish{color:#409eff;border-color:#409eff}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;width:24px;height:24px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#c0c4cc}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#c0c4cc}.el-step__title.is-success{color:#67c23a}.el-step__title.is-error{color:#f56c6c}.el-step__title.is-finish{color:#409eff}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#c0c4cc}.el-step__description.is-success{color:#67c23a}.el-step__description.is-error{color:#f56c6c}.el-step__description.is-finish{color:#409eff}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;-webkit-flex-grow:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.el-step.is-simple .el-step__arrow:after,.el-step.is-simple .el-step__arrow:before{content:"";display:inline-block;position:absolute;height:15px;width:1px;background:#c0c4cc}.el-step.is-simple .el-step__arrow:before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow:after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#fff;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#c0c4cc;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.el-carousel__item,.el-carousel__mask{height:100%;top:0;left:0;position:absolute}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item--card,.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#fff;opacity:.24;-webkit-transition:.2s;transition:.2s}.el-fade-in-enter,.el-fade-in-leave-active,.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active,.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active,.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-enter-active,.el-fade-in-leave-active,.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1);transform:scale(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45);transform:scale(.45)}.collapse-transition{-webkit-transition:height .3s ease-in-out,padding-top .3s ease-in-out,padding-bottom .3s ease-in-out;transition:height .3s ease-in-out,padding-top .3s ease-in-out,padding-bottom .3s ease-in-out}.horizontal-collapse-transition{-webkit-transition:width .3s ease-in-out,padding-left .3s ease-in-out,padding-right .3s ease-in-out;transition:width .3s ease-in-out,padding-left .3s ease-in-out,padding-right .3s ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #ebeef5;border-bottom:1px solid #ebeef5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;height:48px;line-height:48px;background-color:#fff;color:#303133;cursor:pointer;border-bottom:1px solid #ebeef5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409eff}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:#fff;overflow:hidden;box-sizing:border-box;border-bottom:1px solid #ebeef5}.el-cascader__tags,.el-collapse-item__wrap,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0,0,0,.03));filter:drop-shadow(0 2px 12px rgba(0,0,0,.03))}.el-popper .popper__arrow:after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow:after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow:after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow:after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow:after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;display:inline-block;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:#409eff;border-width:1px;border-style:solid;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:#409eff}.el-tag .el-tag__close{color:#409eff}.el-tag .el-tag__close:hover{color:#fff;background-color:#409eff}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#fff;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67c23a}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#fff;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close:before{display:block}.el-tag--dark{background-color:#409eff;color:#fff}.el-tag--dark,.el-tag--dark.is-hit{border-color:#409eff}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#fff;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#fff;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67c23a}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#fff;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:#409eff}.el-tag--plain.is-hit{border-color:#409eff}.el-tag--plain .el-tag__close{color:#409eff}.el-tag--plain .el-tag__close:hover{color:#fff;background-color:#409eff}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#fff;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#fff;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{display:inline-block;position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#c0c4cc}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:#409eff}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#c0c4cc}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#fff;border:1px solid #e4e7ed;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;-webkit-flex:none;flex:none;background-color:#c0c4cc;color:#fff}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#f5f7fa}.el-cascader__suggestion-item.is-checked{color:#409eff;font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#c0c4cc}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#c0c4cc}.el-cascader__search-input::-ms-input-placeholder{color:#c0c4cc}.el-cascader__search-input::-moz-placeholder{color:#c0c4cc}.el-cascader__search-input::placeholder{color:#c0c4cc}.el-color-predefine{font-size:12px;margin-top:8px;width:280px}.el-color-predefine,.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.el-color-predefine__colors{-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409eff;box-shadow:0 0 3px 2px #409eff}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:-webkit-gradient(linear,left top,right top,color-stop(0,red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:-webkit-linear-gradient(left,red,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red);background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:-webkit-gradient(linear,left top,left bottom,color-stop(0,red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:-webkit-linear-gradient(top,red,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red);background:linear-gradient(180deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(hsla(0,0%,100%,0)));background:-webkit-linear-gradient(left,#fff,hsla(0,0%,100%,0));background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(transparent));background:-webkit-linear-gradient(bottom,#000,transparent);background:linear-gradient(0deg,#000,transparent)}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(hsla(0,0%,100%,0)),to(#fff));background:-webkit-gradient(linear,left top,right top,color-stop(0,hsla(0,0%,100%,0)),to(#fff));background:-webkit-linear-gradient(left,hsla(0,0%,100%,0),#fff);background:linear-gradient(90deg,hsla(0,0%,100%,0) 0,#fff);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(hsla(0,0%,100%,0)),to(#fff));background:-webkit-gradient(linear,left top,left bottom,color-stop(0,hsla(0,0%,100%,0)),to(#fff));background:-webkit-linear-gradient(top,hsla(0,0%,100%,0),#fff);background:linear-gradient(180deg,hsla(0,0%,100%,0) 0,#fff)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper:after{content:"";display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409eff;border-color:#409eff}.el-color-dropdown__link-btn{cursor:pointer;color:#409eff;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409eff,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:hsla(0,0%,100%,.7)}.el-color-picker__trigger{display:inline-block;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;cursor:pointer}.el-color-picker__color,.el-color-picker__trigger{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-color-picker__color{display:block;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty,.el-color-picker__icon{top:50%;left:50%;font-size:12px;position:absolute}.el-color-picker__empty{color:#999}.el-color-picker__empty,.el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{display:inline-block;width:100%;color:#fff;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#fff;background-image:none;border:1px solid #dcdfe6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea__inner::-ms-input-placeholder{color:#c0c4cc}.el-textarea__inner::-moz-placeholder{color:#c0c4cc}.el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea__inner:hover{border-color:#c0c4cc}.el-textarea__inner:focus{outline:0;border-color:#409eff}.el-textarea .el-input__count{color:#909399;background:#fff;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea.is-exceed .el-textarea__inner{border-color:#f56c6c}.el-textarea.is-exceed .el-input__count{color:#f56c6c}.el-input{position:relative;font-size:14px;display:inline-block;width:100%}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner,.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#c0c4cc;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;color:#909399;font-size:12px}.el-input .el-input__count .el-input__count-inner{background:#fff;line-height:normal;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;display:inline-block;font-size:inherit;height:40px;line-height:40px;outline:0;padding:0 8px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all .3s;height:100%;color:#c0c4cc;text-align:center}.el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input__inner::-ms-input-placeholder{color:#c0c4cc}.el-input__inner::-moz-placeholder{color:#c0c4cc}.el-input__inner::placeholder{color:#c0c4cc}.el-input__inner:hover{border-color:#c0c4cc}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409eff;outline:0}.el-input__suffix{right:5px;-webkit-transition:all .3s;transition:all .3s}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px}.el-input__icon,.el-input__prefix{-webkit-transition:all .3s;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;line-height:40px}.el-input__icon:after{content:"";height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#f56c6c}.el-input.is-exceed .el-input__suffix .el-input__count{color:#f56c6c}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#f5f7fa;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #dcdfe6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#fff;background-color:#409eff;font-size:0}.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #dcdfe6;background-color:#f5f7fa;color:#c0c4cc}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer-panel{border:1px solid #ebeef5;border-radius:4px;overflow:hidden;background:#fff;display:inline-block;vertical-align:middle;width:200px;max-height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block !important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409eff}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#f5f7fa;margin:0;padding-left:15px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-divider__text,.el-link{font-weight:500;font-size:14px}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#fff;margin:0;padding:0;border-top:1px solid #ebeef5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner:after{height:6px;width:3px;left:4px}.el-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1;-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:0}.el-container.is-vertical,.el-drawer{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-aside,.el-header{-webkit-box-sizing:border-box}.el-container.is-vertical{-ms-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.el-header{padding:0 20px}.el-aside,.el-header{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;-webkit-flex-shrink:0;flex-shrink:0}.el-aside{overflow:auto}.el-footer,.el-main{-webkit-box-sizing:border-box}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1;-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto;overflow:auto;padding:20px}.el-footer,.el-main{-webkit-box-sizing:border-box;box-sizing:border-box}.el-footer{padding:0 20px;-ms-flex-negative:0;-webkit-flex-shrink:0;flex-shrink:0}.el-timeline{margin:0;font-size:14px;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #e4e7ed}.el-timeline-item__icon{color:#fff;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#e4e7ed;border-radius:50%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:#409eff}.el-timeline-item__node--success{background-color:#67c23a}.el-timeline-item__node--warning{background-color:#e6a23c}.el-timeline-item__node--danger{background-color:#f56c6c}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0}.el-link.is-underline:hover:after{content:"";position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #409eff}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#409eff}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#409eff}.el-link.el-link--default.is-disabled{color:#c0c4cc}.el-link.el-link--primary{color:#409eff}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#f56c6c}.el-link.el-link--danger{color:#f56c6c}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67c23a}.el-link.el-link--success{color:#67c23a}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#e6a23c}.el-link.el-link--warning{color:#e6a23c}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#dcdfe6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#fff;padding:0 20px;color:#303133}.el-image__error,.el-image__placeholder{background:#f5f7fa}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;font-size:14px;color:#c0c4cc;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;border-radius:50%;opacity:.8;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;user-select:none}.el-button,.el-checkbox,.el-image-viewer__btn{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:40px}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{top:50%;width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff}.el-image-viewer__prev{left:40px}.el-image-viewer__next,.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image-viewer__next{right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:#409eff;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#fff;border-color:#409eff;color:#409eff}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#fff;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#ebeef5;color:#c0c4cc}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:"";position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:hsla(0,0%,100%,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#fff;background-color:#409eff;border-color:#409eff}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#fff}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#fff;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409eff;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409eff;border-color:#409eff;color:#fff}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#fff}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#fff}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#fff;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67c23a;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67c23a;border-color:#67c23a;color:#fff}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#fff}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#fff}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#fff;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#e6a23c;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#e6a23c;border-color:#e6a23c;color:#fff}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#fff}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#fff}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#fff;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#f56c6c;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#f56c6c;border-color:#f56c6c;color:#fff}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#fff;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#fff}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#fff}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#fff;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#fff}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#fff;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--text,.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover,.el-button--text:active{border-color:transparent}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--mini,.el-button--small{font-size:12px;border-radius:3px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small,.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini.is-circle{padding:7px}.el-button--text{color:#409eff;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;background-color:transparent}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group:after,.el-button-group:before{display:table;content:""}.el-button-group:after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #ebeef5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#c0c4cc}.el-backtop,.el-calendar-table td.is-today{color:#409eff}.el-calendar-table td{border-bottom:1px solid #ebeef5;border-right:1px solid #ebeef5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#f2f8fe}.el-calendar-table tr:first-child td{border-top:1px solid #ebeef5}.el-calendar-table tr td:first-child{border-left:1px solid #ebeef5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#f2f8fe}.el-backtop{position:fixed;background-color:#fff;width:40px;height:40px;border-radius:50%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#f2f6fc}.el-page-header{line-height:24px}.el-page-header,.el-page-header__left{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.el-page-header__left{cursor:pointer;margin-right:40px;position:relative}.el-page-header__left:after{content:"";position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#dcdfe6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox,.el-checkbox-button__inner,.el-radio{font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409eff}.el-checkbox.is-bordered.is-disabled{border-color:#ebeef5;cursor:not-allowed}.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#dcdfe6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{cursor:not-allowed;border-color:#c0c4cc}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:#c0c4cc}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:#c0c4cc;border-color:#c0c4cc}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409eff;border-color:#409eff}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#c0c4cc;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner:after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409eff}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409eff}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{content:"";position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #dcdfe6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:#409eff}.el-checkbox__inner:after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #dcdfe6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409eff}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-radio,.el-radio__input{line-height:1;outline:0;white-space:nowrap}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#409eff;border-color:#409eff;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409eff}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#ebeef5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none !important;box-shadow:none !important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409eff}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-radio,.el-radio--medium.is-bordered .el-radio__label{font-size:14px}.el-radio{color:#606266;cursor:pointer;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-radio.is-bordered.is-checked{border-color:#409eff}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#ebeef5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#f5f7fa;border-color:#e4e7ed}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{cursor:pointer;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner:after{cursor:not-allowed;background-color:#f5f7fa}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:#c0c4cc}.el-radio__input.is-disabled+span.el-radio__label{color:#c0c4cc;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409eff;background:#409eff}.el-radio__input.is-checked .el-radio__inner:after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409eff}.el-radio__input.is-focus .el-radio__inner{border-color:#409eff}.el-radio__inner{border:1px solid #dcdfe6;border-radius:100%;width:14px;height:14px;background-color:#fff;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box}.el-radio__inner:hover{border-color:#409eff}.el-radio__inner:after{width:4px;height:4px;border-radius:100%;background-color:#fff;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409eff;box-shadow:0 0 2px 2px #409eff}.el-radio__label{font-size:14px;padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity .34s ease-out;transition:opacity .34s ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:background-color .3s;transition:background-color .3s}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity .12s ease-out;transition:opacity .12s ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;border-radius:4px;font-size:14px}.el-cascader-panel.is-bordered{border:1px solid #e4e7ed;border-radius:4px}.el-cascader-menu{min-width:180px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;border-right:1px solid #e4e7ed}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu:last-child .el-cascader-node{padding-right:20px}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box}.el-avatar,.el-drawer{-webkit-box-sizing:border-box;overflow:hidden}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#c0c4cc}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:#409eff;font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#f5f7fa}.el-cascader-node.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;color:#fff;background:#c0c4cc;width:40px;height:40px;line-height:40px;font-size:14px}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-drawer,.el-drawer__header{display:-webkit-box;display:-ms-flexbox}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}.el-drawer.btt,.el-drawer.ttb,.el-drawer__container{left:0;right:0;width:100%}.el-drawer.ltr,.el-drawer.rtl,.el-drawer__container{top:0;bottom:0;height:100%}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}to{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%);transform:translate(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%);transform:translate(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(100%);transform:translate(100%)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(100%);transform:translate(100%)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%);transform:translate(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%);transform:translate(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(-100%);transform:translate(-100%)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(-100%);transform:translate(-100%)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}.el-drawer{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-ms-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;color:#72767b;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child,.el-drawer__title{-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1}.el-drawer__title{margin:0;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;-webkit-flex:1;flex:1}.el-drawer__body>*{-webkit-box-sizing:border-box;box-sizing:border-box}.el-drawer__container{position:relative}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-popconfirm__main{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0} \ No newline at end of file diff --git a/public/assets/css/file.css b/public/assets/css/file.css new file mode 100644 index 0000000..55ce30a --- /dev/null +++ b/public/assets/css/file.css @@ -0,0 +1,255 @@ +/* 文件列表图标 关于母猪的产后护养研究 */ +.file-icon{ + cursor: default; + display: inline-block; /* 一行显示 */ + height: 26px; + width: 26px; + left: 43px; + top: 10px; + margin-right: 5px; + vertical-align:middle; /* 对齐 */ +} + +.filename{ + vertical-align:middle; + font-size:13px; +} + + +.viewer{ + + cursor:pointer; /* 鼠标样式 */ +} + +.folder{ + cursor:pointer; /* 鼠标样式 */ +} + +.icon-search:hover{ + color: #09AAFF; +} + +/* 鼠标悬浮显示更多按钮 */ +.gengduo { + z-index: 3; + float:right; + margin-top: 5px; + cursor:pointer; + display: none; +} + + +/* 图标 */ +.icon-color { + color: #09AAFF; +} + + +/* 路劲导航 */ +.daohang { + background-color: #fff; + height: 16px; + line-height: 16px; + margin-bottom: 15px; + position: relative; + font-size: 13px; + display: block; + padding: 15px 0 7px 9px; + margin-top: 0px; + color: #666; +} + +.daohang-path { + line-height: 16px; + background: #fff; + overflow: hidden; + white-space: nowrap; +} + +.daohang-path li { + float: left; +} + +.daohang-path a { + color: #09aaff; +} + +.daohang-path .fuhao { + padding: 0 5px; + color: #c5d8f3; + padding: 0 3px; +} + + + + +/* 空文件样式 */ +.emptyFile { + top: 20px; + left: 0; + width: 100%; + height: 100%; + line-height: 30px; +} + +.emptyFile p { + color: #424e67; + margin: 20px 0; + font-weight: 200; + display: block; + margin-block-start: 1em; + margin-block-end: 1em; + margin-inline-start: 0px; + margin-inline-end: 0px; + font-size: 14px; +} + +.emptyFile2 { + margin: 0; + display: block; + text-align: left; + position: relative; + overflow-x: hidden; + overflow-y: auto; + height: 100%; + min-height: 400px; +} +.emptyFile2 .img { + background: url(../image/emptyfile.png) no-repeat scroll center 0 transparent; + padding-top: 150px; + width: 488px; + position: absolute; + left: 50%; /* 左边距实现居中 */ + top: 90%; + text-align: center; + margin: -190px 0 0 -244px; +} + +/* 空回收站样式 */ +.emptyRecyclebin .img { + background: url(/assets/image/emptyRecyclebin.png) no-repeat scroll center 0 transparent; + padding-top: 80px; +} + +.emptyRecyclebin-p { + font-size: 16px; + font-weight: 700; + color: #03081a; +} + +/* 搜索未找到时 */ +.emptySousuo .img { + background: url(/assets/image/emptySousuo.png) no-repeat scroll center 0 transparent; + padding-top: 110px; +} + + + +/* 开关按钮 */ +.switch { + position: relative; + /*display: inline-block;*/ + width: 60px; + height: 34px; + } + + .switch input {display:none;} + + .slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; + } + + .slider:before { + position: absolute; + content: ""; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; + } + + input:checked + .slider { + background-color: #2196F3; + } + + input:focus + .slider { + box-shadow: 0 0 1px #2196F3; + } + + input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); + } + + /* Rounded sliders */ + .slider.round { + border-radius: 34px; + } + + .slider.round:before { + border-radius: 50%; + } + + +/* 右键菜单 */ +.context-menu .list { + border: 1px solid #dde0e4; + border-radius: 5px; + box-shadow: 0 0 8px #ccc; +} + +.context-menu .list { + min-height: 23px; + padding: 2px 0; + position: absolute; + background-color: #FFF; + color: #000; +} + +.context-menu .list li { + display: list-item; + cursor: default; + width: 110px; + height: 23px; + line-height: 23px; + white-space: nowrap; + position: relative; + z-index: 1; + box-sizing: border-box; + padding: 0 27px 0 20px; +} + +.context-menu .list .separate, +.context-menu .list .separate.list-hover { + padding: 0; + margin: 5px 0; + height: 1px; + line-height: 0; + font-size: 0 !important; + background-color: #e9e9e9; + cursor: default; +} +.context-menu .list li:hover { + background-color: #4281F4; + color: #FFF!important; +} + +.context-menu ul, .context-menu li { + list-style: none; + padding: 0; + margin: 0; + font-size: 13px!important; + color: #5b667b!important; +} \ No newline at end of file diff --git a/public/assets/css/home.css b/public/assets/css/home.css new file mode 100644 index 0000000..38b9da1 --- /dev/null +++ b/public/assets/css/home.css @@ -0,0 +1,291 @@ + + +.brdCom { + content: " "; + position: absolute; + width: 100%; + -webkit-transform: scaleY(.5); + transform: scaleY(.5) +} + +.header { + height: 100% +} + +.pub-right { + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center +} + +.pub-header { + width: 100%; + height: 100% +} + +.pub-header .logo { + cursor: pointer +} + +.pub-header .head-box { + cursor: pointer +} + +.pub-header .head-box .head-img { + width: 34px; + height: 34px; + border-radius: 50%; + margin-right: 8px +} + +.pub-header .head-box .text { + font-size: 18px; + color: #434343; + margin-right: 14px +} + +.pub-header .head-box .down { + width: 14px; + height: 9px; + margin-right: 30px +} + +.pub-header .head-box .line { + width: 2px; + height: 20px; + background: #dcdcdc +} + +.pub-header .pub-header1 { + margin-left: 30px; + cursor: pointer +} + +.pub-header .pub-header1 .yq { + width: 17px; + height: 17px +} + +.pub-header .pub-header1 .xgmm { + width: 13px; + height: 17px +} + +.pub-header .pub-header1 .tc { + width: 15px; + height: 16px +} + +.pub-header .pub-header1 .text { + font-size: 14px; + color: #313131; + margin-left: 8px +} + +.pop-box { + padding-bottom: 20px +} + +.pop-box .pop-top { + width: 100%; + height: 90px; + background-image: -webkit-gradient(linear, right top, left top, from(#5a84f0), to(#6aafef)); + background-image: -webkit-linear-gradient(right, #5a84f0, #6aafef); + background-image: linear-gradient(-90deg, #5a84f0, #6aafef); + border-top-left-radius: 10px; + border-top-right-radius: 10px; + padding: 20px 15px 0 15px +} + +.pop-box .pop-top .text { + font-size: 12px; + color: #fff +} + +.pop-box .pop-top .pro { + width: 230px; + height: 6px; + background-color: #fff; + border-radius: 3px; + margin: 15px 0 +} + +.pop-box .pop-top .pro p { + height: 100%; + width: 65px; + border-radius: 3px; + background-color: #fdd30d +} + +.pop-box .pop-bottom { + padding: 0 14px +} + +.pop-box .pop-bottom .text-box { + margin-top: 20px; + font-size: 14px; + color: #313131 +} + +.pop-box .pop-bottom .text-box .text { + font-size: 14px; + color: #313131 +} + +.pop-box .pop-bottom .text-box .btn { + border-radius: 3px; + width: 47px; + height: 22px; + background-color: #bcbcbc; + font-size: 14px; + color: #fff; + cursor: pointer +} + +.yq-box { + margin-top: 14px +} + +.yq-box .text { + font-size: 14px +} + +.yq-box .text1 { + width: 214px; + height: 22px; + border-radius: 4px; + border: 1px solid #dcdcdc; + margin-left: 8px; + font-size: 12px; + color: #fff; + padding: 0 5px +} + +.yq-box .text1 .text2 { + width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden +} + +.yq-box .btn { + width: 47px; + height: 22px; + background-color: #fdd30d; + border-radius: 4px; + font-size: 12px; + color: #fff; + cursor: pointer +} + +.el-dialog__header { + background: #f6f6f6; + border-top-left-radius: 4px; + border-top-right-radius: 4px +} + +.el-header { + width: 100%; + height: 70px; + background-color: #fff; + -webkit-box-shadow: 0 3px 15px 0 hsla(0, 0%, 71%, .2); + box-shadow: 0 3px 15px 0 hsla(0, 0%, 71%, .2); + padding: 0 42px 0 25px +} + +.el-aside { + background: #f7f7f7; + overflow: hidden +} + +.el-col { + width: 100% +} + +.el-dialog { + border-radius: 4px +} + +.el-popover { + padding: 0; + background-color: #fff; + -webkit-box-shadow: 0 3px 15px 0 hsla(0, 0%, 71%, .2); + box-shadow: 0 3px 15px 0 hsla(0, 0%, 71%, .2); + border-radius: 10px +} + +.el-popper .popper__arrow, +.el-popper .popper__arrow:after { + border-color: transparent transparent #5c89f0 transparent +} + +.el-popper[x-placement^=bottom] .popper__arrow:after { + border-bottom-color: #5c89f0 +} + +.el-dialog .text { + font-size: 12px; + color: #4f7cec; + text-align: center; + padding-bottom: 10px +} + +.el-dialog .input { + width: 322px; + height: 32px; + border-radius: 2px; + border: 1px solid #dcdcdc; + padding-left: 12px; + font-size: 12px; + display: block; + margin: 20px auto 0 auto +} + +.el-dialog .dis-btn { + width: 322px; + height: 34px; + background-color: #4f7cec; + border-radius: 4px; + font-size: 14px; + color: #fff; + margin: 40px auto 0 auto; + cursor: pointer +} + +.el-dialog .code-box { + margin-top: 20px; + margin-left: 21px +} + +.el-dialog .code-box .input1 { + width: 222px; + height: 32px; + border-radius: 2px; + border: 1px solid #dcdcdc; + padding-left: 12px; + font-size: 12px +} + +.el-dialog .code-box .dis-btn1 { + width: 86px; + height: 32px; + background-color: #4f7cec; + border-radius: 2px; + margin-left: 14px; + font-size: 12px; + color: #fff; + cursor: pointer +} + +.el-aside { + width: 195px; +} +@media (max-width:576px) { + .el-aside { + width: 100px; + } + .el-menu-item{ + padding: 0 0px; + } +} \ No newline at end of file diff --git a/public/assets/css/icon.css b/public/assets/css/icon.css new file mode 100644 index 0000000..88f1218 --- /dev/null +++ b/public/assets/css/icon.css @@ -0,0 +1,499 @@ +@font-face { + font-family:yunfont; + src:url(../font/yunfont.eot); + src:url(../font/yunfont.eot#iefix) + format('embedded-opentype'),url(../font/yunfont.ttf) + format('truetype'),url(../font/yunfont.woff) + format('woff'),url(https://static.skpan.cn/icon/font/yunfont.svg?t=1610419101922?de437c#yunfont) format('svg'); + font-weight:400; + font-style:normal; +} + + +.g-button-right{ + padding-left: 20px; + color: #666; + background-color: rgb(247, 247, 247); +} + +.g-button-right .icon{ + height: 38px; + width: 23px; + line-height: 38px; + margin-left: 5px; + margin-top: -2px; + font-size: 16px; + display: inline-block; +} + +.icon { + font-family: yunfont!important; + speak: never; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.icon-my-share:before { + content: "\e900" +} + +.icon-disk:before { + content: "\e901" +} + +.icon-share:before { + content: "\e902" +} + +.icon-delete:before { + content: "\e903" +} + +.icon-theme:before { + content: "\e904" +} + +.icon-search:before { + content: "\e905" +} + +.icon-newfolder:before { + content: "\e906" +} + +.icon-download:before { + content: "\e907" +} + +.icon-border:before { + content: "\e908" +} + +.icon-face:before { + content: "\e909" +} + +.icon-android:before { + content: "\e90a" +} + +.icon-apple:before { + content: "\e90b" +} + +.icon-device:before { + content: "\e90c" +} + +.icon-check:before { + content: "\e90d" +} + +.icon-cancel:before { + content: "\e90e" +} + +.icon-print:before { + content: "\e90f" +} + +.icon-order:before { + content: "\e910" +} + +.icon-grid:before { + content: "\e911" +} + +.icon-right:before { + content: "\e912" +} + +.icon-more:before { + content: "\e913" +} + +.icon-copy:before { + content: "\e914" +} + +.icon-upload:before { + content: "\e915" +} + +.icon-yunguanjia:before { + content: "\e916" +} + +.icon-iPad:before { + content: "\e917" +} + +.icon-win:before { + content: "\e918" +} + +.icon-mail:before { + content: "\e919" +} + +.icon-sync:before { + content: "\e91a" +} + +.icon-share-cancel:before { + content: "\e91b" +} + +.icon-qrcode:before { + content: "\e91c" +} + +.icon-beauty:before { + content: "\e91d" +} + +.icon-edit:before { + content: "\e91e" +} + +.icon-save-disk:before { + content: "\e91f" +} + +.icon-list:before { + content: "\e920" +} + +.icon-history:before { + content: "\e921" +} + +.icon-notice:before { + content: "\e922" +} + +.icon-recovery:before { + content: "\e923" +} + +.icon-mosaic:before { + content: "\e924" +} + +.icon-speed:before { + content: "\e925" +} + +.icon-play:before { + content: "\e926" +} + +.icon-poly:before { + content: "\e927" +} + +.icon-feedback:before { + content: "\e928" +} + +.icon-search-del:before { + content: "\e929" +} + +.icon-small-lock:before { + content: "\e92a" +} + +.icon-close:before { + content: "\e92b" +} + +.icon-minimize:before { + content: "\e92c" +} + +.icon-maximizing:before { + content: "\e92d" +} + +.icon-share-community:before { + content: "\e92e" +} + +.icon-share-email:before { + content: "\e92f" +} + +.icon-share-link:before { + content: "\e930" +} + +.icon-share-friend:before { + content: "\e931" +} + +.icon-sort-select:before { + content: "\e932" +} + +.icon-dropdown-arrow:before { + content: "\e933" +} + +.icon-friendlist:before { + content: "\e934" +} + +.icon-checkgridsmall:before { + content: "\e935" +} + +.icon-mboxchate:before { + content: "\e936" +} + +.icon-checksmall:before { + content: "\e937" +} + +.icon-downtitle:before { + content: "\e938" +} + +.icon-up:before { + content: "\e939" +} + +.icon-rename-cancel:before { + content: "\e93a" +} + +.icon-circle:before { + content: "\e93b" +} + +.icon-mac:before { + content: "\e93c" +} + +.icon-musicpause:before { + content: "\e93d" +} + +.icon-musicloop:before { + content: "\e93e" +} + +.icon-musicprev:before { + content: "\e93f" +} + +.icon-musicrandom:before { + content: "\e940" +} + +.icon-musicloop2:before { + content: "\e941" +} + +.icon-musicnext:before { + content: "\e942" +} + +.icon-musicplay:before { + content: "\e943" +} + +.icon-musicvolume:before { + content: "\e944" +} + +.icon-arrow-up:before { + content: "\e945" +} + +.icon-arrow-down:before { + content: "\e946" +} + +.icon-arrow-right:before { + content: "\e947" +} + +.icon-arrow-left:before { + content: "\e948" +} + +.icon-appeal:before { + content: "\e949" +} + +.icon-radio-checked:before { + content: "\e94a" +} + +.icon-radio-non:before { + content: "\e94b" +} + +.icon-director:before { + content: "\e94c" +} + +.icon-dropdown-select:before { + content: "\e94d" +} + +.icon-tips-detail:before { + content: "\e94e" +} + +.icon-tips-success:before { + content: "\e94f" +} + +.icon-tips-close:before { + content: "\e950" +} + +.icon-tips-caution:before { + content: "\e951" +} + +.icon-imageEnlarge:before { + content: "\e952" +} + +.icon-hollowCircle:before { + content: "\e953" +} + +.icon-picpre-enlarge:before { + content: "\e954" +} + +.icon-picpre-close:before { + content: "\e955" +} + +.icon-picpre-beautify:before { + content: "\e956" +} + +.icon-picpre-delete:before { + content: "\e957" +} + +.icon-picpre-before:before { + content: "\e958" +} + +.icon-picpre-pulldown2:before { + content: "\e959" +} + +.icon-picpre-next:before { + content: "\e95a" +} + +.icon-picpre-download:before { + content: "\e95b" +} + +.icon-picpre-detail:before { + content: "\e95c" +} + +.icon-picpre-pullup:before { + content: "\e95d" +} + +.icon-picpre-rotate:before { + content: "\e95e" +} + +.icon-picpre-phone:before { + content: "\e95f" +} + +.icon-picpre-cloudprint:before { + content: "\e960" +} + +.icon-picpre-facesearch:before { + content: "\e961" +} + +.icon-remark-edit:before { + content: "\e962" +} + +.icon-remark-remove:before { + content: "\e963" +} + +.icon-camera:before { + content: "\e964" +} + +.icon-sharedir:before { + content: "\e965" +} + +.icon-sharedir-info:before { + content: "\e966" +} + +.icon-classify-modify-remove:before { + content: "\e967" +} + +.icon-setting:before { + content: "\e968" +} + +.icon-share-sellmall:before { + content: "\e969" +} + +.icon-pdf2word:before { + content: "\e96a" +} + +.icon-uniE96D:before { + content: "\e96b" +} + +.icon-uniE96E:before { + content: "\e96c" +} + +.icon-uniE96F:before { + content: "\e96d" +} + +.icon-sjck:before { + content: "\e96e" +} + +.icon-addwp:before { + content: "\e96f" +} + +.icon-wpedit:before { + content: "\e970" +} + +.icon-share-lock:before { + content: "\e971" +} + +.icon-svg-s-close:before { + content: "\e972" +} \ No newline at end of file diff --git a/public/assets/css/index.css b/public/assets/css/index.css new file mode 100644 index 0000000..b3bfefa --- /dev/null +++ b/public/assets/css/index.css @@ -0,0 +1,637 @@ +* { + -webkit-box-sizing: content-box !important; + -moz-box-sizing: content-box !important; + box-sizing: content-box !important; +} + +body { + font-size: 14px !important; + font-family: arial, \5FAE\8F6F\96C5\9ED1, sans-serif; + margin: auto; + color: #3f3f3f +} + +.h3, h3 { + font-size: 14px !important; +} +.h2, h2 { + font-size: 14px !important; +} +.h1, h1 { + font-size: 14px !important; +} + +a:link { + text-decoration: none; +} + +a:visited { + text-decoration: none; +} + +a:hover { + text-decoration: none; + color: #f32 +} + +a:active { + text-decoration: none; + color: #ff0 +} + +.dx:link { + color: #fff; + background-color: #09f +} + +.dx:hover { + color: #fff; + background-color: #5bf +} + +.d1 { + background: #fafafa; + box-shadow: 0 2px 6px 0 rgba(0,0,0,.05); + position: fixed; + top: 0; + _top: expression(eval(document.compatMode&&document.compatMode=='CSS1Compat')?documentElement.scrollTop:document.body.scrollTop); + filter: alpha(opacity=70); + -moz-opacity: .7; + -khtml-opacity: .7; + opacity: .7; + z-index: 100; + width: 100%; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #fc6; + height: 49px +} + +.d1 a:link { + text-decoration: none +} + +.d1 a:visited { + text-decoration: none +} + +.d1 a:hover { + color: #333; + text-decoration: none +} + +.d1 a:active { + text-decoration: none +} + +.d11 { + float: left; + background-image: url(../image/logo3.gif); + background-repeat: no-repeat; + background-position: 17px 14px; + padding-top: 18px; + height: 29px +} + +.d12 { + font-size: 16px; + float: right; + padding-right: 30px; + padding-top: 18px; + height: 29px +} + +.d7 { + display: block; + text-align: right; + width: 230px +} + +.pc { + background-color: #09f; + height: 15px; + background-image: url(../image/logo3.gif); + background-repeat: no-repeat; + background-position: 90% bottom; + margin-top: 45px; + _margin-top: 0; + width: 100% +} + +.li { + text-align: center; + padding-top: 17px; + padding-bottom: 7px; + font-size: 20px; + color: #bbb; + font-family: MingLiU, PMingLiU +} + +.q7 { + background-color: #fc3; + width: 100%; + margin-right: auto; + margin-left: auto +} + +.q1 { + font-size: 37px; + font-weight: bold; + text-align: center; + padding-top: 70px; + padding-left: 150px +} + +.q1 span { + font-family: \9ED1\4F53 +} + +.q2 { + font-size: 20px; + color: #ff9; + text-align: center; + margin-top: 27px; + margin-bottom: 13px; + padding-left: 150px; + font-family: MingLiU, PMingLiU +} + +.q3 { + text-align: center; + padding-left: 150px; + padding-top: 20px; + font-size: 16px +} + +.q5 { + background-image: url(../image/q2.gif); + background-repeat: no-repeat; + background-position: 0 30px; + height: 300px; + float: left; + width: 700px +} + +.q9 { + height: 306px; + width: 998px; + margin-right: auto; + margin-left: auto; + background-image: url(../image/q9.gif); + background-repeat: no-repeat; + background-position: right bottom; + padding-top: 23px; + padding-bottom: 23px +} + +.y0 { + background-color: #fff; + padding: 23px; + _top: expression(eval(document.compatMode&&document.compatMode=='CSS1Compat')?documentElement.scrollTop:document.body.scrollTop); + filter: alpha(opacity=70); + -moz-opacity: .7; + -khtml-opacity: .7; + opacity: .7; + z-index: 100; + width: 220px; + border-radius: 5px; + float: right +} + +.y1 { + font-size: 26px; + text-align: center; + padding-top: 17px +} + +.y2 { + width: 170px; + margin-right: auto; + margin-left: auto; + line-height: 37px; + margin-top: 11px; + margin-bottom: 11px; + color: #f60; + text-align: center +} + +.y3 { + text-align: center; + color: #777 +} + +.y6 { + border: 1px solid #D5D5D5; + background-image: linear-gradient(#FCFCFC, #EEE); + background-color: #f7f7f7; + text-shadow: 0 2px 0 rgba(255, 255, 255, 0.9); + text-align: center; + margin-right: auto; + margin-left: auto; + width: 130px; + margin-top: 7px; + display: block; + padding: 7px; + border-radius: 5px; + color: #000 +} + +.y6:link { + color: #000 +} + +.y6:hover { + border: 1px solid #fc3; + color: #999; +} + +.y6:visited { + color: #333 +} + +.y6:active { + background-color: #ffc; + background-image: linear-gradient(#dcdcdc, #d8d8d8); + box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.15) +} + +.v1 { + font-family: "Raleway", "Open Sans", "Helvetica Neue", Microsoft JhengHei, arial, sans-serif, \5FAE\8F6F\96C5\9ED1, Arial, sans-serif; + font-size: 26px; + margin-top: 7px; + margin-bottom: 7px; + text-align: center; + color: #333 +} + +.v2 { + text-align: center; + margin-top: 17px +} + +.v3 { + height: 210px; + background-color: #19a9e5; + padding-top: 39px; + width: 100% +} + +.v4 { + font-family: "Raleway", "Open Sans", "Helvetica Neue", Microsoft JhengHei, arial, sans-serif, \5FAE\8F6F\96C5\9ED1, Arial, sans-serif; + font-size: 30px; + color: #fff; + padding: 7px +} + +.v5 { + color: #fff; + padding: 7px; + font-size: 13px +} + +.v6 { + font-size: 17px; + color: #adf; + padding: 7px +} + +.v7 { + height: 33px; + width: 118px; + background-color: #6b0; + text-align: center; + margin-left: 7px; + border-radius: 5px; + display: block; + line-height: 33px +} + +.v7:link { + color: #fff; + text-decoration: none +} + +.v7:hover { + background-color: #81d658; + color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5) +} + +.v7:visited { + color: #fff +} + +.v7:active { + background-color: #509100; + box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.15) +} + +.p8 { + float: left; + width: 220px; + margin-left: 3px; + padding-top: 160px; + border: 1px solid #fff; + padding-bottom: 30px +} + +.p8:hover { + background-image: url(../image/i1.gif); + background-repeat: no-repeat; + background-position: -820px 22px; + color: #000; + border: 1px solid #eee +} + +.p7 { + float: left; + width: 220px; + margin-left: 3px; + padding-top: 160px; + border: 1px solid #fff; + padding-bottom: 30px +} + +.p7:hover { + background-image: url(../image/i1.gif); + background-repeat: no-repeat; + background-position: -1046px 22px; + color: #000; + border: 1px solid #eee +} + +.p6 { + float: left; + width: 220px; + margin-left: 3px; + padding-top: 160px; + border: 1px solid #fff; + padding-bottom: 30px +} + +.p6:hover { + background-image: url(../image/i1.gif); + background-repeat: no-repeat; + background-position: -1270px 22px; + color: #000; + border: 1px solid #eee +} + +.p5 { + float: left; + width: 220px; + margin-left: 3px; + padding-top: 160px; + border: 1px solid #fff; + padding-bottom: 30px +} + +.p5:hover { + background-image: url(../image/i1.gif); + background-repeat: no-repeat; + background-position: -1496px 22px; + color: #000; + border: 1px solid #eee +} + +.p9 { + width: 927px; + height: 273px; + background-image: url(../image/i1.gif); + background-repeat: no-repeat; + margin-right: auto; + margin-left: auto; + background-position: 59px 23px; + color: #999 +} + +.c { + clear: both; + height: 70px +} + +.h1 { + width: 600px; + padding-top: 100px; + padding-right: 398px; + padding-bottom: 100px; + margin-right: auto; + margin-left: auto; + background-image: url(../image/i18.gif); + background-repeat: no-repeat; + background-position: 682px -719px +} + +.h1:hover { + background-image: url(../image/i18.gif); + background-repeat: no-repeat; + background-position: 683px -719px +} + +.h2 { + width: 460px; + margin-right: auto; + margin-left: auto; + padding-top: 20px; + padding-bottom: 20px; + padding-left: 538px; + background-image: url(../image/i18.gif); + background-repeat: no-repeat; + background-position: 0 -460px +} + +.h3 { + height: 180px; + width: 640px; + margin-right: auto; + margin-left: auto; + padding-top: 7px; + padding-right: 358px; + padding-bottom: 7px; + background-image: url(../image/i18.gif); + background-repeat: no-repeat; + background-position: 718px -218px +} + +.u { + width: 998px; + margin-right: auto; + margin-left: auto; + height: 200px +} + +.u1 { + width: 998px; + margin-top: 27px; + border-top: 1px solid #e1e1e1; + margin-right: auto; + margin-left: auto; + margin-bottom: 70px +} + +.u2 { + width: 365px; + float: right; + background-image: url(../image/i9.png); + background-repeat: repeat; + height: 197px +} + +.u2:hover { + border-right-width: 1px; + border-right-style: solid; + border-right-color: #fff +} + +.u3 { + height: 100px; + width: 500px; + padding-top: 50px; + padding-bottom: 50px; + float: left +} + +.u5 { + height: 193px; + width: 362px; + background-image: url(../image/i18.gif); + background-repeat: no-repeat +} + +.m1 { + font-family: "Raleway", "Open Sans", "Helvetica Neue", Microsoft JhengHei, arial, sans-serif, \5FAE\8F6F\96C5\9ED1, Arial, sans-serif; + font-size: 26px; + padding: 7px +} + +.m2 { + color: #999; + padding: 7px; + line-height: 1.5em +} + +.foot { + width: 100%; + padding-top: 39px; + padding-bottom: 30px; + color: #aaa; + font-size: 12px; + line-height: 30px; + border-top-width: 1px; + border-top-style: solid; + border-top-color: #ddd +} + +.foot a:link { + color: #19a9e5 +} + +.foot a:visited { + text-decoration: none; + color: #19a9e5 +} + +.foot a:hover { + color: #f32 +} + +.f0 { + font-size: 14px; + border-radius: 5px; + margin-bottom: 17px; + line-height: normal; + color: #333 +} + +.f1 { + font-size: 12px; + text-align: center; + word-spacing: 7px; + width: 100%; + margin-right: auto; + margin-left: auto; + margin-top: 50px; + padding-bottom: 98px; + padding-top: 8px +} + +.f3 { + float: left; + width: 198px +} + +.f5 { + clear: both; + width: 998px; + height: 1px +} + +.f6 { + width: 998px; + margin-right: auto; + margin-left: auto +} + +.f7 { + display: block; + height: 41px; + width: 130px; + background-image: url(https://static.skpan.cn/pan/img/y3.gif); + margin-right: auto; + margin-left: auto; + border: 1px solid #000 +} + +.f7:hover { + background-image: url(https://static.skpan.cn/pan/img/y3.gif); + border: 1px solid #ccc; + background-position: 0 95px +} + +.f9 { + height: 40px; + width: 130px; + background-image: url(../image/logo.gif); +} + +.up { + width: 50px; + height: 50px; + background: url(https://static.skpan.cn/img/top.gif) no-repeat 0 0 +} + +.up:hover { + background: url(https://static.skpan.cn/img/top.gif) no-repeat 0 -50px +} + +.up:active { + box-shadow: inset 0 5px 5px rgba(0, 0, 0, 0.15) +} + +::-moz-selection { + background: #000; + color: #fff +} + +::selection { + background: #000; + color: #fff +} + +::-webkit-scrollbar { + background: rgba(0, 0, 0, 0.1); + height: 9px; + width: 9px +} + +::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.2) +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(0, 0, 0, 0.3); +} + +::-webkit-scrollbar-thumb:active { + background: rgba(0, 0, 0, 0.5); +} \ No newline at end of file diff --git a/public/assets/css/layer.css b/public/assets/css/layer.css new file mode 100644 index 0000000..d323d27 --- /dev/null +++ b/public/assets/css/layer.css @@ -0,0 +1,2 @@ +/** layui-v2.5.4 MIT License By https://www.layui.com */ + .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/public/assets/css/layer/default/icon-ext.png b/public/assets/css/layer/default/icon-ext.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbb669bb311514baa5db3a6a00b4644d0e280f1 GIT binary patch literal 5911 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 bWW^%>x7XlHV^#Q1uOX^B?ki3(VEg|7!QHuF literal 0 HcmV?d00001 diff --git a/public/assets/css/layer/default/loading-1.gif b/public/assets/css/layer/default/loading-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..db3a483e4b74971fbfb1cc0fb6499852cedfe650 GIT binary patch literal 701 zcmZ?wbhEHbRAo?Qn8?Ji_w)@mZNLBj|1&T!DE{a6a}5c0b_{Se(lcOY1PT3QVdY|A zV$cDyff`g97?`@J^shYqmS1s(LX_+4yGox$4el*+Jm?ved2^25GBru=T^dGm#<906 za&AQCZ08H8P;Bd&{NT;vl&}c_^L4%p?g_hjBu{YB29{c>Ob}p@z~Ks3xCw+@!HClp xtZ<(QPf3`00FNu+VbOvoEE+h73k#4LIKl$IE8t;)<_eUs!0QU6uz&iJhvXcHF*h)T1OnEW1i^?zgDfop1p?usL*#PMGT;HQkSO{q6FlJyb$PWkPf|h*eTST}7h8z$}MF(XD(aQ)ZLZ zM?v0rT<1C4XHn<6PbNA{XL@>1^)apdD_@tcYDrW#m`k#MmslI7p^P;Az74wGs`!SI zLs$GEZHsafXsu1i-WleMzAL(yw$-LK{0hv;6hrx8kx!!4$``dAyBnY9Jz&DqJo2$A z!(L$H=KqBeY~CF_viHPz^tTglc?D97CqEBjzUwH}7GI zapg8YZM~>2Wk%E$d&r@9ly9b4Q zJpM7T@}r63I(OExUlG%Xcjz3MU+9U^r!SkpjNThDtaP)7>j6L5z%o5|^hlVOyI*uY zt^UU6NTuY?(Lb4ZIU2Zb5Vz}Pb7KF%ivf&j^CL>$cDz?rMNTQQ|NqDVD7mhghUp%h zhIA{gi{S8y9YhIIbSv$`B!JiPi!0#4#Jge0)p&YVPHchWcyAn zQhvb8ggXGXs9;k`u9Uq*YB>O+Q3Rq=2hlLFcG{Q3ORH_}JnY8C+r%@}6|%ySP%bWG zV~mA;?P`Q2L_Ss})nrJ{$TmeA9Tt*4=}X5x%RioM@_?ZsKSEST-f+GBv~Ya)xX3O{ z8!d=YthI-13OI;RN~`>|6u5L{z20oBp%9MIj)n$!Aw{Wpq&Rtr4~*_74Gjo@3el>B zz(Rk;;>2lp73<2;d=r*8z%WkdsG=vRuG_fvxO#uN^El|+5Qoz^X!2MfxJ3m}vyi?> zMLLDi8+${Z6YbUg?8GNR>-+SwHKdFyr%HqWcs|X_l*-DAC^bG&KCqWg7-_`UlwQ`EdOp_LJkr`L$mHHs75uP?fSgVfsDjuE#ft2b8HDt0yFt!+;C zEgL=)G9ZFt4wa+N3Xg7FGc0~`&EEt6_%7tyzmnb9B_h1~7~GD4V-Bhx7~QKRkF>&aT>(-!Us@aJxAY@8E?HW$G8g zSz@7Jcp>iCp;lU1ieF6n7!oAa-1E!rS0 zF1lBFVS%G#ZO}b@*+bIk+7@Q|iG60vIDVpV%4tW8rKyzwRo_<25;8*Ky@n z-sX>W*b;M){5lB_Edc@m1`VHy0@dg$PTR9uE$O2&a?KAe?xRlCj&Z$iZYw*{padding:.5px}.layui-col-space3{margin:-1.5px}.layui-col-space3>*{padding:1.5px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space8{margin:-3.5px}.layui-col-space8>*{padding:3.5px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #E6E6E6;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{background-color:#e6e6e6}.layui-text{line-height:22px;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding:0 5px!important}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{margin-right:3px;font-size:18px;vertical-align:bottom;vertical-align:middle\9}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-sm i{font-size:16px!important}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:85px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:115px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878!important;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{color:#5FB878}.layui-radio-disbaled>i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #e2e2e2}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#f2f2f2}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:0 -1px 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#C9C9C9}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#e6e6e6}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#e6e6e6;color:#C9C9C9}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#f2f2f2;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:55px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;border-top-color:rgba(255,255,255,.7)}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{margin-top:-9px;border-style:dashed dashed solid;border-color:transparent transparent #fff}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#000}.layui-nav-child dd{position:relative}.layui-nav .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{position:relative;height:45px;line-height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{right:10px}.layui-nav-itemed>.layui-nav-child{display:block;padding:0;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-bg-blue .layui-nav-bar,.layui-bg-blue .layui-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:last-child:before{display:none}.layui-timeline-item:first-child:before{display:block}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-8px 6px 0}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#e2e2e2;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #e6e6e6;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;z-index:66666666;width:280px;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#e2e2e2;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:'';position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #e6e6e6;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-15px}.layui-slider-input-btn{display:none;position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #d2d2d2}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #d2d2d2}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:34px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:'';position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:'';position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:'';position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .3s;-webkit-transition:all .3s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout} \ No newline at end of file diff --git a/public/assets/css/list.css b/public/assets/css/list.css new file mode 100644 index 0000000..f3560b6 --- /dev/null +++ b/public/assets/css/list.css @@ -0,0 +1,298 @@ +/* 滚动条样式 */ +::-webkit-scrollbar { + width: 12px; + height: 10px; +} +::-webkit-scrollbar-thumb { + height: 30px; + background-color: #999; + -webkit-border-radius: 7px; + outline: 2px solid #fff; + outline-offset: -2px; + border: 2px solid #fff; +} +::-webkit-scrollbar-track-piece { + background-color: #fff; + -webkit-border-radius: 3px; +} + +.g-button-right { + color: #666; +} + +.select { + color: #09AAFF; + background: rgba(0,0,0,.05); +} + +.brdCom{ + content: " "; + position: absolute; + width: 100%; + -webkit-transform: scaleY(.5); + transform: scaleY(.5) +} + +.top-item{ + color: #409eff; + height: 34px; + border-radius: 4px; + border: 1px solid #C3EAFF; + padding: 0 18px 0 15px; + cursor: pointer; + margin-right: 10px; + position: relative +} + + +.top-item .text{ + color: #409eff; + font-size: 14px; + margin-left: 10px +} + +.top-item:hover .text { + border: none; + color: #2f6aff +} + +.icon-box{ + border: 1px solid #4f7cec; + border-radius: 4px +} + +.icon-box .top-item{ + border: none; + border-radius: 0; + margin-right: 0; + border-right: 1px solid #4f7cec +} + +.icon-box .top-item:last-child { + border-right: none +} + +.top-right{ + width: 316px; + height: 32px; + background-color: #f1f2f4; + border-radius: 16px; + padding: 0 15px +} + +.top-right input{ + font-size: 14px; + background: none; + border: none; + width: 250px +} + +.top-right .icon{ + color: #434343; + cursor: pointer +} + +.all-box1{ + margin-top: 14px +} + +.all-box1 .text{ + font-size: 12px; + color: #535353 +} + +.all-box1 .text1{ + font-size: 12px; + color: #626262 +} + +.cz-box .icon,.cz-box img{ + cursor: pointer; + margin-right: 15px +} + +.cz-box .icon{ + color: #4f7cec +} + +.scop-text{ + cursor: pointer; + color: #313131; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.dis-form{ + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding-left: 20px; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center +} + +.dis-form.from1{ + margin-top: 35px +} + +.dis-form .text1{ + width: 85px; + font-size: 14px; + color: #a0a0a0 +} + +.dis-form .text2{ + font-size: 14px; + color: #b5b5b5; + margin-left: 15px +} + +.lj{ + width: 370px; + height: 40px; + border: 1px solid #dcdcdc; + font-size: 14px; + color: #b5b5b5; + margin: 30px auto 0 auto; + border-radius: 4px +} + +.share-img{ + width: 151px; + margin: 30px auto 0 auto +} + +.dis-btn1{ + width: 115px; + height: 34px; + background-color: #4f7cec; + border-radius: 4px; + font-size: 14px; + color: #fff; + margin: 30px auto 0 auto +} + +.tqm{ + width: 257px; + height: 34px; + background-color: #eee; + border-radius: 4px; + border: 1px solid #dcdcdc; + font-size: 14px; + color: #707070; + margin-top: 10px; + margin-left: 130px +} + +.file-box{ + max-height: 400px; + overflow-y: auto +} + +.code-text{ + position: absolute; + bottom: 68px; + left: 200px; + color: #000 +} + +.el-pagination { + margin-top: 20px +} + +.el-dialog__title { + width: 370px; + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-select { + width: 110px +} + +.el-upload-dragger { + width: 83px; + height: 34px +} + +.file-box .el-radio { + margin-top: 20px +} + +.url-box { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center +} + +.url-box .url { + width: 350px; + margin-right: 20px +} + +.url-box .url,.url-box .url1 { + height: 42px; + border: 1px solid #dcdcdc +} + +.url-box .url1 { + width: 130px; + text-align: center; + line-height: 42px +} + +.code-img { + width: 300px; + display: block; + margin: 20px auto +} + +.shareimg-box { + position: relative +} + +.shareimg-box .code-box { + position: absolute; + bottom: 93px; + left: 149px; + width: 120px; + height: 120px; + background: #fff +} + +.top-right .el-input__inner { + background: none; + border: none +} + +/* 上传按钮 */ +.upload { + color: #fff; + background-color:#09AAFF; + border: 1px solid #fff; +} + +.upload:hover { + background-color:#09a0f1; +} + +.upload .text { + color: #fff; +} + +.upload:hover .text { + color: #fff; +} + diff --git a/public/assets/css/login.css b/public/assets/css/login.css new file mode 100644 index 0000000..a8c4d04 --- /dev/null +++ b/public/assets/css/login.css @@ -0,0 +1,419 @@ +body { + font: 14px \5FAE\8F6F\96C5\9ED1, "Raleway", "Open Sans", "Helvetica Neue", Microsoft JhengHei, Arial, sans-serif; + margin: auto; + color: #3F3F3F; +} + +a:link { + text-decoration: none; + color: #0099FF; +} + +a:visited { + text-decoration: none; + color: #0099FF; +} + +a:hover { + text-decoration: none; + color: #FF3311; +} + +a:active { + text-decoration: none; + color: #FFFF00; +} + +.dx:link { + color: #FFFFFF; + background-color: #0099FF; +} + +.dx:hover { + color: #FFFFFF; + background-color: #55BBFF; +} + +.d1 { + background: #fafafa; + box-shadow: 0 2px 6px 0 rgba(0,0,0,.05); + position: fixed; + top: 0; + _top: expression(eval(document.compatMode&&document.compatMode=='CSS1Compat')?documentElement.scrollTop:document.body.scrollTop); + filter: alpha(opacity=70); + -moz-opacity: 0.7; + -khtml-opacity: 0.7; + opacity: 0.7; + z-index: 100; + width: 100%; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #dee9f5; + height: 49px; + } + +.d1 a:link { + color: #999999; + text-decoration: none; +} + +.d1 a:visited { + color: #a8d6f1; + text-decoration: none; +} + +.d1 a:hover { + color: #333333; + text-decoration: none; +} + +.d1 a:active { + text-decoration: none; +} + +.d11 { + float: left; + background-image: url(../image/logo3.gif); + background-repeat: no-repeat; + background-position: 17px 14px; + padding-top: 18px; + height: 29px; +} + +.d12 { + float: right; + padding-right: 30px; + padding-top: 18px; + height: 29px; + position: absolute; + right: 0; +} + +.d7 { + display: block; + width: 230px; + text-align: right; +} + +.pc { + background-color: #0099FF; + height: 15px; + background-image: url(../image/logo3.gif); + background-repeat: no-repeat; + background-position: 90% bottom; + margin-top: 45px; + _margin-top: 0px; +} + +.d { + width: 993px; + margin-right: auto; + margin-left: auto; + height: auto; +} + +.b { + font-size: 30px; + text-align: center; + padding: 56px 0px 20px 0px; +} + +.d2 { + line-height: 43px; + border-top: 1px solid #EEEEEE; + padding: 28px 10px 16px 10px; +} + +.z { + padding-left: 270px; + height: 56px; +} + +.dx2 { + text-align: center; + width: 128px; + float: left; + background-color: #FF6452; + margin: 13px; + line-height: 30px; + height: 30px; +} + +.dx2 a:link { + color: #FFFFFF; + text-decoration: none; +} + +.dx2 a:visited { + color: #FFFFFF; +} + +.dx2 a:hover { + color: #CCCCCC; +} + +.d3 { + clear: both; +} + +.foot_info { + font-size: 12px; + text-align: center; + color: #93D393; + padding: 60px 0px 36px 0px; +} + +.p9 { + margin-right: auto; + margin-left: auto; + padding-top: 60px; +} + +.p8 { + padding: 9px; + font-size: 16px; + width: 93%; + border: 1px solid #D6D6D6; + border-radius: 4px; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); + background: #fafafa; +} + +.p8:focus { + border: #52A6EF 1px solid; + box-shadow: 0 0 3px rgba(82, 166, 239, 0.8); + outline: none; + background: #fff; +} + +.btn { + height: 38px; + width: 100%; + background-color: #18BC9C; + color: #FFFFFF; + font-size: 16px; + font-family: \9ED1\4F53; + border: 1px solid #3ed3b6; + border-radius: 16px; + margin-bottom: 4px; + cursor: pointer; +} + +.btn:hover { + background-color: #3ed3b6; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.btn:active { + background-color: #3ed3b6; + box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.15); +} + +.btn:focus { + outline: none; +} + +.p7 { + color: #BBBBBB; + padding-right: 16px; +} + +.j { + font-weight: 700; +} + +::-webkit-scrollbar { + background: rgba(0, 0, 0, 0.1); + height: 8px; + width: 8px +} + +::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.2) +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(0, 0, 0, 0.3); +} + +::-webkit-scrollbar-thumb:active { + background: rgba(0, 0, 0, 0.5); +} + + +.d12 { + display: none; +} + +.input { + padding: 9px 9px 9px 31px; + font-size: 16px; + width: 83%; + border: 1px solid #D6D6D6; + border-radius: 4px; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); + background-image: url(../image/logo7.gif); + background-repeat: no-repeat; + background-position: -121px -158px; +} + +.pwd { + background-image: url(../image/logo7.gif); + background-repeat: no-repeat; + background-position: -121px -188px; +} + +.input:hover { + border: #52A6EF 1px solid; +} + +.input:focus { + border: #52A6EF 1px solid; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.275); + outline: none; +} + +.btn:disabled { + border: #D5D5D5 1px solid; + background-color: #D5D5D5; + color: #9E9E9E; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.9); + box-shadow: initial; +} + +.p4 { + text-align: center; + line-height: 2.1em; + color: #888888; +} + +.p6 { + text-align: center; + font-size: 30px; + line-height: 2.0em; + color: #585858; +} + +.p5 { + height: 52px; + width: 78px; + margin-right: auto; + margin-left: auto; + background-image: url(../image/logo7.gif); + background-repeat: no-repeat; + background-position: 0px -56px; +} + +.p3 { + padding: 4px; +} + +.p2 { + height: 102px; + width: 99px; + margin-right: auto; + margin-left: auto; + background-image: url(../image/logo7.gif); + background-repeat: no-repeat; + background-position: 0px -111px; +} + +.p1 { + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.3); + border: 29px solid #F5F5F5; + margin-left: auto; + margin-right: auto; + background-color: #F5F5F5; + width: 258px; + padding-bottom: 20px; +} + +.e_u { + display: none; + position: absolute; + background-color: #FFF; + border: 1px solid #999; + padding: 6px; + border-radius: 3px; + box-shadow: 0 2px 3px rgba(0, 0, 0, .15); + margin-top: -30px; + margin-left: 185px; +} + + +.ylogin { + display: none; + position: absolute; + text-align: center; + width: 250px; + line-height: 36px; + background: #f5f5f5; + height: 40px; + cursor: pointer; +} + +.usersel { + position: absolute; + margin-left: 218px; + color: #08f; +} + +.copyright { + line-height: 1.5em; + padding-top: 100px; + margin-bottom: -50px; + text-align: center; + font-size: 12px; + color: #999; + line-height: 1.5em; +} + +.main-title { + display: block; + margin-top: 5px; + margin-bottom: 30px; + font-size: 24px; + color: #3d3d3d; + text-align: center; + line-height: 30px; +} + +.wx-title { + display: block; + /* 居中 */ + position: relative; + margin-top: 10px; + color: #3d3d3d; + text-align: center; + font-size: 14px; +} +.wx-title img{ + margin-bottom:-4px; +} + +.wx-img { + width: 172px; + height: 172px; +} + +.wx-img img { + margin-left: 43px; + max-width: 100%; + border: 1px solid #e2e2e2; +} + +.errorBox { + border: 1px solid #fdd3d3; + bottom: 8px; + padding-left: 33px; + padding-top: 5px; + padding-bottom: 5px; + color: #e63333; + opacity: 1; + display: none; + background: url(../image/login_iconb536.png) -104px -50px no-repeat #feefef; +} + +input:-webkit-autofill { /* 取消Chrome记住密码的背景颜色 */ + -webkit-box-shadow: 0 0 0 1000px white inset !important; +} \ No newline at end of file diff --git a/public/assets/css/main.css b/public/assets/css/main.css new file mode 100644 index 0000000..1a62972 --- /dev/null +++ b/public/assets/css/main.css @@ -0,0 +1,316 @@ +*{ + padding: 0; + margin: 0; + list-style: none; + text-decoration: none; + font-family: "microsoft yahei"; +} +.clear{ + clear: both; +} + +/*头部开始*/ + +#header{ + height: 72px; + position: fixed; + width: 100%; + top:0; + background-color: white; + min-width: 960px; + z-index: 9; +} +.fixwid{ + width: 960px; + margin: 0 auto; + overflow: hidden; +} +.logo{ + height: 72px; + float: left; +} +.logo img{ + width: 46px; + margin-top: 11px; + float: left; +} +.logo span{ + float: left; + font-size: 24px; + color: #11b4ea; + margin-left: 10px; + height: 72px; + line-height: 72px; +} +.nav{ + height: 72px; + float: right; +} +.nav ul{ + float: left; + height: 72px; + line-height: 72px; +} +.nav ul li{ + float: left; + padding: 0 19px; +} +.login{ + float: left; + width: 80px; + height: 72px; + line-height: 72px; + text-align: center; + margin-left: 24px; + background-color: #11b4ea; +} +.login .a_area{ + display: block; +} +.a_line{ + color: #242424; +} +.a_line:hover{ + color: #11b4ea!important; +} + +.nav .a_link{ + font-size: 16px; +} + +.a_area{ + color: white; + background-color: #11b4ea; +} +.a_area:hover{ + background-color: #47c4f0!important; + color: white; +} + +.nav .a_area{ + font-size: 16px; +} + +#header>img{ + width: 100%; + height: 29px; + position: relative; +} + +/*头部结束*/ + + +/*轮播开始*/ + +#banner{ + width: 100%; + height: 400px; + overflow: hidden; + margin-top: 72px; +} +#banner .carousel-inner{ + height: 400px; +} +#banner .carousel-inner .item img{ + height: 400px; + width: 100%; +} +#banner .carousel-indicators li{ + width: 48px; + height: 4px; + background-color: white; + border: none; +} +#banner .carousel-indicators .active{ + width: 48px; + height: 4px; + background-color: #73c3fc; + border: none; +} +#banner .glyphicon-chevron-lef img{ + width: 40px; + position: absolute; + top: 140px; + left: 0; +} +#banner .glyphicon-chevron-righ img{ + width: 40px; + position: absolute; + top: 140px; + right: 0; +} + +/*轮播结束*/ + + + +/*主体开始*/ + +#main{ + +} +.project{ + overflow: hidden; +} +.project_c{ + width: 320px; + float: left; +} +.project_c img{ + display: block; + margin: 50px auto 30px; +} +.project_c h1{ + text-align: center; + font-size: 16px; + color: #11b4ea; + font-weight: normal; + margin-bottom: 20px; +} +.project_c p{ + display: block; + font-size: 14px; + color: #7e7e7e; + text-align: center; + margin: 0 68px 40px; +} + +.course{ + overflow: hidden; +} +.title{ + position: relative; + height: 100px; + overflow: hidden; +} +.title h1{ + color: #242424; + width: 188px; + margin-top: 40px; + left: 50%; + margin-left: -94px; + background-color: white; + font-size: 26px; + font-weight: normal; + text-align: center; + position: absolute; + z-index: 2; +} +.title hr{ + position: absolute; + top:36px; + left: 50%; + margin-left: -294px; + height: 1px; + border: none; + background-color: #d9d9d9; + width: 588px; + left: 50%-294px; +} + + +.course{ + +} +.course_c{ + width: 220px; + margin-right: 26px; + float: left; + margin-top: 42px; +} +.course_c img{ + width: 220px; +} +.course_c span{ + display: block; + text-align: center; + font-size: 14px; + margin-top: 22px; +} +.course_c span .a_line{ + color: #7e7e7e; +} +.course>a{ + display: block; + margin: 50px auto; + width: 194px; + font-size: ; + color: ; + padding: 16px 62px; +} + +.display{ + position: relative; +} +/*.display #carousel-example-generic{ + height: 400px; +} +.display .carousel-inner{ + height: 400px; + width: 748px; + margin: 0 auto; +}*/ + +.about{ + margin-top: 40px; +} +.about img{ + display: block; + margin:0 auto; + width: 86px; + margin-bottom: 40px; + margin-top: 10px; +} +.about span{ + color: #7e7e7e; + display: block; + text-align: center; + font-size: 14px; + margin-bottom: 80px; +} + +/*底部开始*/ + +#footer{ + height: 100px; + background-color: #717980; + width: 100%; + font-size: 14px; + color: white; +} +.footer_l{ + height: 100px; + float: left; + line-height: 100px; + text-indent: 4px; + position: relative; +} +.footer_l img{ + display: block; + margin-top: 42px; + float: left; +} +.footer_r{ + height: 100px; + float: right; + line-height: 100px; +} + +/*底部结束*/ + + +.scroll_horizontal{position:relative;width:768px;height:400px;padding:10px;margin: 0 auto;} +.scroll_horizontal .box{overflow:hidden;position:relative;width:748px;height:400px;margin:0 auto;} +.scroll_horizontal .list{overflow:hidden;width:9999px;} +.scroll_horizontal .list li{float:left;width:748px;} +.scroll_horizontal .list li span{ + display: block; + text-align: center; + margin: 20px auto 30px; + color: #bebdbd; + font-size: 18px; +} +.scroll_horizontal .prev, +.scroll_horizontal .next{position:absolute;top:50%;margin-top:-25px;width:28px;height:61px;background-repeat:no-repeat;font:0/0 Arial;cursor:pointer;} +.scroll_horizontal .prev{left:-85px;background-image:url(https://static.skpan.cn/pan/images/dis_l.png);} +.scroll_horizontal .next{right:-85px;background-image:url(https://static.skpan.cn/pan/images/dis_r.png);} \ No newline at end of file diff --git a/public/assets/css/t0.css b/public/assets/css/t0.css new file mode 100644 index 0000000..72d6fca --- /dev/null +++ b/public/assets/css/t0.css @@ -0,0 +1,377 @@ +/* CSS Document */ +body { + font: 14px Arial, \5FAE\8F6F\96C5\9ED1, sans-serif; + margin: auto; + color: #3F3F3F; +} + +.bgimg { + background-image: url(../image/logo3.gif); + background-repeat: no-repeat; + background-position: 17px 14px; +} + +a:link { + text-decoration: none; + color: #0099FF; +} + +a:visited { + text-decoration: none; + color: #0099FF; +} + +a:hover { + text-decoration: none; + color: #FF3311; +} + +a:active { + text-decoration: none; + color: #FFFF00; +} + +.dx:link { + color: #FFFFFF; + background-color: #0099FF; +} + +.dx:hover { + color: rgb(255, 255, 255); + background-color: #55BBFF; +} + +.d1 { + background: #fafafa; + box-shadow: 0 2px 6px 0 rgba(0,0,0,.05); + position: fixed; + top: 0; + filter: alpha(opacity=70); + -moz-opacity: 0.7; + -khtml-opacity: 0.7; + opacity: 0.7; + z-index: 100; + width: 100%; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #dee9f5; + height: 49px; +} + +.d1 a:link { + text-decoration: none; +} + +.d1 a:visited { + color: #0099FF; + text-decoration: none; +} + +.d1 a:hover { + color: #333333; + text-decoration: none; +} + +.d1 a:active { + text-decoration: none; +} + +.d11 { + float: left; + background-repeat: no-repeat; + background-position: 17px 14px; + padding-top: 18px; + height: 29px; +} + +.d12 { + float: right; +} + +.d12 a { + display: inline-block; + font-size: 16px; + margin-top: 16px; + margin-right: 28px; +} + +.d7 { + display: block; + width: 230px; + text-align: right; +} + +.pc { + background-color: #0099FF; + height: 15px; + background-repeat: no-repeat; + background-position: 90% bottom; + margin-top: 45px; + _margin-top: 0px; +} + +.d { + width: 993px; + margin-right: auto; + margin-left: auto; + height: auto; + padding-bottom: 100px; +} + +.b { + font-size: 30px; + text-align: center; + padding: 56px 0px 20px 0px; +} + +.d2 { + line-height: 43px; + border-top: 1px solid #EEEEEE; + padding: 28px 10px 16px 10px; +} + +.d3 { + clear: both; +} + +.foot_info { + font-size: 12px; + text-align: center; + color: #93D393; + margin-top: 130px; +} + +.foot_copy { + color: #888; + padding-bottom: 10px; +} + +.p9 { + margin-right: auto; + margin-left: auto; + padding-top: 60px; +} + +.p8 { + padding: 9px; + font-size: 16px; + width: 93%; + border: 1px solid #D6D6D6; + border-radius: 4px; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); + background: #fafafa; +} + +.p8:focus { + border: #52A6EF 1px solid; + box-shadow: 0 0 3px rgba(82, 166, 239, 0.8); + outline: none; + background: #fff; +} + +.btn { + height: 38px; + width: 100%; + background-color: #FFA300; + color: #FFFFFF; + font-size: 16px; + font-family: \9ED1\4F53; + border-radius: 4px; + border: none; +} + +.p7 { + color: #BBBBBB; + padding-right: 16px; +} + +.btn:hover { + background-color: #FFD360; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); +} + +.btn:active { + background-color: #FFA000; + box-shadow: inset 0 4px 5px rgba(0, 0, 0, 0.15); +} + +.btn:focus { + outline: none; +} + +.ios { + background-color: #F1F1F1; + font-size: 12px; + padding: 3px; + border-radius: 2px; + color: #A5A5A5; + margin-left: 17px; +} + +.j { + font-weight: 700; +} + +.load { + text-align: center; + padding: 50px 0; +} + +.load a { + cursor: default; + display: inline-block; + line-height: initial; +} + +.load a:focus { + outline: 0; +} + +.txt { + font-size: 14px; + cursor: pointer; + color: #fff; + background-color: #ff5b5b; + padding: 6px 30px; + box-shadow: 0 1px 1px rgba(0, 0, 0, .17); + transition: .2s; + border: 1px solid #ff5b5b; + border-radius: 4px; +} + +.txt:hover { + background-color: #ff3434; + box-shadow: 0 1px 2px rgba(0, 0, 0, .26); + border: 1px solid #ff3434; +} + +.txt:active { + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.17); + background: #ff5b5b; + transition: .0s; + border: 1px solid #ff5b5b; +} + +.txtc { + margin: 0 26px; +} + +::-webkit-scrollbar { + background: rgba(0, 0, 0, 0.1); + height: 8px; + width: 8px +} + +::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.2) +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(0, 0, 0, 0.3); +} + +::-webkit-scrollbar-thumb:active { + background: rgba(0, 0, 0, 0.5); +} + +.load2 .loader, +.load2 .loader:before, +.load2 .loader:after { + border-radius: 50%; +} + +.load2 .loader:before, +.load2 .loader:after { + position: absolute; + content: ''; +} + +.load2 .loader:before { + width: 16px; + height: 32px; + background: #fff; + border-radius: 32px 0 0 32px; + top: -1px; + left: -1px; + transform-origin: 16px 16px; + animation: load2 2s infinite ease 1.5s; +} + +.load2 .loader { + font-size: 11px; + text-indent: -99999em; + margin: auto; + position: relative; + width: 30px; + height: 30px; + box-shadow: inset 0 0 0 4px #09f; +} + +.load2 .loader:after { + width: 16px; + height: 32px; + background: #fff; + border-radius: 0 31px 31px 0; + top: -1px; + left: 15px; + transform-origin: 0px 16px; + animation: load2 2s infinite ease; +} + +@keyframes load2 { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +.ifr { + width: 100%; + height: 45px; + margin-top: -31px; + position: relative; + z-index: 9; +} + +.ifr2 { + z-index: 1; + visibility: inherit; + overflow: hidden; + width: 100%; + height: 100%; +} + + +.n_bot { + text-align: center; + padding: 3%; +} + +#code { + margin: auto; + width: 300px; + margin-top: 20px; +} + +.wap-down{ + font-size: 15px; + color: #7e8c8d; +} + +.shenmin { + color: #8a6d3b; + background-color: #fcf8e3; + padding: 5px; + border: 1px solid #faebcc; + border-radius: 3px; + font-size: 12px; + clear: both; + width: 400px; + margin: auto; + text-align: center; + line-height: initial; + margin-bottom: 10px; +} \ No newline at end of file diff --git a/public/assets/css/upload.css b/public/assets/css/upload.css new file mode 100644 index 0000000..993bfb7 --- /dev/null +++ b/public/assets/css/upload.css @@ -0,0 +1,515 @@ +/* CSS Document */ +::-webkit-scrollbar{background:rgba(0,0,0,0.1);height: 8px;width:8px}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.2)} +::-webkit-scrollbar-thumb:hover {background:rgba(0,0,0,0.3);} +::-webkit-scrollbar-thumb:active {background:rgba(0,0,0,0.5);} +body {font:13px Arial,\5FAE\8F6F\96C5\9ED1,\5B8B\4F53,\65B0\5B8B\4F53,sans-serif;margin: 0px;padding: 0px;color: #3F3F3F;background: #fff;SCROLLBAR-FACE-COLOR: #A8A8A8;SCROLLBAR-HIGHLIGHT-COLOR: #F5F5F5;SCROLLBAR-SHADOW-COLOR: #F5F5F5;SCROLLBAR-3DLIGHT-COLOR: #F5F5F5;SCROLLBAR-ARROW-COLOR: #505050;SCROLLBAR-TRACK-COLOR: #F5F5F5;SCROLLBAR-DARKSHADOW-COLOR: #F5F5F5;SCROLLBAR-BASE-COLOR: #BCBCBC;} +a:link {color: #3377FF;}a:visited {color: #3377FF;}a:hover {color: #FF6666;}a:active {color: #ccc;} +.aspanlink{cursor: pointer;color: #3377FF;} +.aspanlink:hover{color: #FF6666;} +.toplink{display: block;height: 45px;width: 127px;position: absolute;} +.toum{background-image: url(../image/logo7.gif);background-repeat: no-repeat;border-bottom: 1px solid #EEEEEE;border-top: 1px solid #FF7868;} +.n1{width: 860px;margin-left: 16px;margin-top: 17px;padding: 12px 13px 9px 13px;} +.footm{text-align: center;padding-top: 50px;font-size: 12px;color: #93D393;} +ul{padding:0; margin:0;} +li{list-style-type:none;} +table {font-size: 13px;} +.vip1{color: #F00;} +.vip2{border: 1px solid #BF8026;border-radius: 2px;font-size: 12px;color: #BF8026;margin-left: 5px;padding-left: 3px;} +.vip3{background: #BF8026;color: #FFFFFF;padding: 0 3px;margin-left: 3px;background-image: linear-gradient(#FFC276, #CC9104);} +.svip1{color: #F00;} +.svip2{border: 1px solid #e40b04;border-radius: 2px;font-size: 12px;color: #23201f;padding-left: 3px;} +.svip3{background:#b92828;color: #FFFFFF;padding: 0 3px;margin-left: 3px;background-image: linear-gradient(#ff3f36, #ca2220);} +.btn { width:118px; height:34px;font:12px \9ED1\4F53;font-weight:700;border-radius: 4px;border: 1px solid #D5D5D5;background-image: linear-gradient(#FCFCFC, #EEE);background-color: #f7f7f7;text-shadow: 0 2px 0 rgba(255, 255, 255, 0.9);} +.btn:focus{border-color: #51a7e8;outline: none;box-shadow: 0 0 5px rgba(81,167,232,0.5);} +.btn:hover{background:#eee;background-image: linear-gradient(#EEE, #DDD);} +.btn:active{box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.25);background-color:#CCC;border-color: #ABABAB;background-image: none;} +.btn:disabled{background-image: linear-gradient(#eee, #eee);border: 1px solid #eee;} +form {padding:0;margin:0;} +a {text-decoration: none;} +textarea{border: 1px solid #59bff1;padding: 5px;box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.175);border-radius: 3px;} +textarea:hover{border: 1px solid #209EFF;} +textarea:focus{outline: none;box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.375);} +#menu_container{padding:0px;} +.mydisk_nav{margin:17px 0 0 150px;} +.mydisk_nav ul{ list-style:none;} +.mydisk_nav li{ float:left; width:80px; background:#FFEECF; margin-right:5px; line-height:29px; height:28px; text-align:center;} +.mydisk_nav li a{display:block;color: #111111;cursor: default;} +.mydisk_nav li a:hover{background:#FFD360;color: #111111;} +.mydisk_nav li a:active{background:#FFB100;color: #111111;box-shadow: inset 0 5px 5px rgba(0, 0, 0, 0.15);} +#mydisk_nav_sel{background:#FFD360;} +.mydisk_bar{ border-radius: 8px;float: right;padding: 15px;padding-bottom: 0;line-height: 20px;background:#fff url(/images/u.gif) 0px 17px no-repeat;padding-left: 18px; position: absolute;right: 0;} +.mydisk_file_bar{ line-height:33px; height:33px;padding-left: 10px;} +.mydisk_file_bar a:link{color: #FFFFFF;text-decoration: none;} +.mydisk_file_bar a:visited{color: #FFFFFF;} +.rank_info{width:280px;border:1px #FFD360 solid;line-height:23px;overflow: hidden;padding-right: 18px;} +.file_box{height:200px; overflow-y:scroll; border:1px #CCCCCC solid;} +.file_box li{padding: 9px 0 0 15px;} +.cfm_info li{height: 46px;} +.tb_box_msg{padding:18px; color:#008800;} +.img_light{padding-bottom: 3px;} +.up_msg_box{background: #f7f7f7;width:auto; padding:30px; margin:auto;} +#container {width: 100%;height:auto;margin:13px auto 0px;} +.clear{ clear:both} +.tips_box{padding: 13px;margin: 17px;clear: both;} +.tips_box li{margin-bottom:5px;} +.txtgray { color: #AAAAAA; } +.txtgray:hover{background: #f7f7f7;} +.txtgreen{ color:#008800;} +.txtred{ color:#FD8888;} +.box_style{padding:10px 20px 30px;} +.p_bar{padding: 15px 0 10px 0;background: #FFFFFF;} +.p_bar a:hover{background: #ddd;border: 1px solid #ddd;color: #3377FF;} +.p_redirect{padding:7px; border:1px #cccccc solid; margin:0 7px 0 0; text-align:center;} +.p_num{padding:7px; border:1px #cccccc solid; margin:0 7px 0 0; text-align:center;} +.p_info{padding:7px;border:1px #cccccc solid;text-align:center;margin-right: 7px;} +.p_curpage{padding:7px; border:1px #cccccc solid; margin:0 7px 0 0; text-align:center; color:#f00; font-weight:bold;} +.td_line td{height:38px} +.menu_common{position: absolute; top: 0px; left: 0px; background-color: #FFFFFF; visibility: hidden; margin-bottom:8px; overflow: hidden; border: 1px solid #92B7E5; } +.menu_box2 {width: 50px; height: auto; padding-top:5px;} +.menu_box2 a{display:block; height:18px; text-align:center;} +.menu_thumb{ background-color: #D0F2C3; padding:8px; line-height: 20px; height: 38px; } +.info_box{line-height: 2.8;padding-top: 2%;} +.info_b2{line-height: 2em;font-size: 14px;} +.progressWrapper {overflow: hidden;} +.progressContainer {margin: 9px;padding: 6px;background-color: #aae4ff;overflow: hidden;border-radius: 3px;} +.progressContainer:hover{background-color: #9addfd;} +.progressContainer textarea{width: 96%;margin-top: 4px;margin-left: 8px;} +.message {margin: 1em 0;padding: 10px 20px; border: solid 1px #FFDD99; background-color: #FFFFCC; overflow: hidden; } +.up_red {background-color: #FFEBEB;} +.up_blue {background-color: #337ABB;} +.progressName {white-space: nowrap;} +.progressBarInProgress, +.progressBarComplete, +.progressBarError {font-size: 4px;width: 0%;height: 19px;background-color: #33CC00;border:1px solid #33CC00;} +.progressBarComplete {width: 100%;background-color: green;visibility: hidden;} +.progressBarError {width: 100%;background-color: red;visibility: hidden;} +.progressBarStatus {} +a.progressCancel {font-size: 0;display: block;height: 13px;width: 13px;background-image: url(../image/upload_cancel.gif);background-repeat: no-repeat;background-position: -13px 0px;float: right;} +a.progressCancel:hover {background-position: 0px 0px;} +.upload_style{margin-left:10px;float:left;padding:7px \9;border: 1px solid #209EFF;background-image: url(/img/up.gif);background-repeat: no-repeat;box-shadow: 0 1px 1px rgba(0, 0, 0, 0.08);} +.upload_style:hover{border: 1px solid #ccc;} +.upload_style:active{box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.12);background:#ddd;border: 1px solid #a7a7a7;} +.swfupload{padding:7px;} +.upload_btn{ margin-left:10px;float:left;} +#upl_detail{display:none; padding:8px; color:#252525;} +.store_nav{padding:10px;color: #008800;} +#up_msg_tips{color:#008800;text-align: center;} +.menu{ cursor: pointer;color: #3377FF;background: url(/img/qq.gif) 0px 1px no-repeat;display: inline-block;padding-left: 28px;} +.menu:hover{color:#FF6666;} +.submenu{background-color: #fff; box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);right: 0;top: 0;height: 100%;position: fixed; width: 26%;_width:300px;_position: absolute;} +.subcl{position: absolute;width: 32px;height: 32px; background: #DCDEE2 url(/img/cl.gif) 9px 8px no-repeat; margin-left: -33px;} +.subcl:hover{background-color: #CDD1D8;} +.subcl:active{box-shadow: inset 0 3px 4px rgba(0, 0, 0, 0.15);} +.subtp{padding: 10px; box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);} +.subbx{padding: 8px;line-height: 36px;} +.subbx p{margin: 8% 9% 8% 9%;} +.subbx span{ display: block;margin-left: 16%;color: #888;line-height: 20px;padding-top: 12px;} +.diskdao{float: left;width: 88px;margin-left: 5px;background-color: #209EFF;text-align: center;overflow: hidden;height: 32px;cursor: default;border-radius: 3px;margin-top: 3px;} +.diskdao:hover{background-color: #62BCFF;} +.diskdao:active{background-color: #197CC8;box-shadow: inset 0 3px 4px rgba(0, 0, 0, 0.15);} +.diskdao3{float: left;width: 88px;margin-left: 5px;background-color: #FF4949;text-align: center;height: 32px;cursor: default;border-radius: 3px;margin-top: 3px;} +.diskdao3:hover{background-color: #FF7979;} +.diskdao3:active{background-color: #CC3300;box-shadow: inset 0 3px 4px rgba(0, 0, 0, 0.15);} +.k1{font-size: 22px;width: 290px;border: 1px solid #CCCCCC;padding: 5px;*height: 38px;box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);border-radius: 3px;} +.k1:hover{border:#52A6EF 1px solid;} +.k1:focus{border:#52A6EF 1px solid;background: #fff;box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.275);outline: none;} +.up{width:50px;height:50px;background:url(/img/top.gif) no-repeat 0 0;} +.up:hover{background:url(/img/top.gif) no-repeat 0px -50px;} +.up:active{box-shadow: inset 0 3px 4px rgba(0, 0, 0, 0.15);} +.t1{padding-left: 130px;background-image: url(/img/n5.gif);background-repeat: repeat-y;background-position: 316px 10px;} +.t2{float: left;padding-top: 20px;padding-bottom: 68px;} +.t3{background-image: url(/img/n7.gif);background-repeat: no-repeat;background-position: 180px 30px;color: #AAA;width: 258px;float: left;line-height: 78px;font-size: 16px;} +.t5{background-image: url(/img/n6.gif);background-repeat: no-repeat;background-position: 158px 0px;font-size: 24px;line-height: 68px;text-indent: 80px;} + +.highslide-heading{display:none;font-weight:bold;margin:.4em} +.highslide-dimming{background:black} +a.highslide-full-expand{background:url(/images/graphics/fullexpand.gif) no-repeat;display:block;margin:0 10px 10px 0;width:34px;height:34px} +.highslide-loading{display:block;text-transform:uppercase;text-decoration:none;padding:8px;padding-left:22px;background-image:url(/images/graphics/loader.white.gif);background-repeat:no-repeat} +a.highslide-credits,a.highslide-credits i{padding:2px;color:silver;text-decoration:none;font-size:10px} +a.highslide-credits:hover,a.highslide-credits:hover i{color:white;background-color:gray} +.highslide-move,.highslide-move *{cursor:move} +.highslide-viewport{display:none;position:fixed;width:100%;height:100%;z-index:1;background:0;left:0;top:0} +.highslide-overlay{display:none} +.hidden-container{display:none} +.closebutton{position:relative;top:-15px;left:15px;width:30px;height:30px;cursor:pointer;background:url(/images/graphics/close.png)} +.highslide-gallery ul{list-style-type:none;margin:0;padding:0} +.highslide-gallery ul li{display:block;position:relative;float:left;width:106px;height:106px;border:1px solid silver;background:#ededed;margin:2px;line-height:0;overflow:hidden} +.highslide-gallery ul a{position:absolute;top:50%;left:50%} +.highslide-gallery ul img{position:relative;top:-50%;left:-50%} +html>/**/body .highslide-gallery ul li{display:table;text-align:center} +html>/**/body .highslide-gallery ul li{text-align:center} +html>/**/body .highslide-gallery ul a{position:static;display:table-cell;vertical-align:middle} +html>/**/body .highslide-gallery ul img{position:static} +.highslide-controls{width:195px;height:40px;background:url(/images/graphics/controlbar-white.gif) 0 -90px no-repeat;margin:20px 15px 10px 0} +.highslide-controls ul{position:relative;left:15px;height:40px;list-style:none;margin:0;padding:0;background:url(/images/graphics/controlbar-white.gif) right -90px no-repeat} +.highslide-controls li{float:left;padding:5px 0;margin:0;list-style:none} +.highslide-controls a{background-image:url(/images/graphics/controlbar-white.gif);display:block;float:left;height:30px;width:30px;outline:0} +.highslide-controls a.disabled{cursor:default} +.highslide-controls a.disabled span{cursor:default} +.highslide-controls a span{display:none;cursor:pointer} +.highslide-maincontent{display:none} +.highslide-html{background-color:white} +.highslide-html-content{display:none;width:400px} +.highslide-header ul{margin:0;padding:0;text-align:right} +.highslide-header ul li{display:inline;padding-left:1em} +.highslide-header ul li.highslide-previous,.highslide-header ul li.highslide-next{display:none} +.highslide-header a{font-weight:bold;color:gray;text-transform:uppercase;text-decoration:none} +.highslide-header a:hover{color:black} +.highslide-header .highslide-move a{cursor:move} +.highslide-footer .highslide-resize{display:block;float:right;margin-top:5px;height:11px;width:11px;background:url(/images/graphics/resize.gif) no-repeat} +.highslide-footer .highslide-resize span{display:none} +.highslide-resize{cursor:nw-resize} + +.draggable-header .highslide-header{height:33px;background-color:#ffd360} +.draggable-header .highslide-heading{position:absolute;margin:9px 7px .4em} +.draggable-header .highslide-header .highslide-move{cursor:move;display:block;height:30px;position:absolute;right:24px;top:0;width:100%;z-index:1} +.draggable-header .highslide-header .highslide-move *{display:none} +.draggable-header .highslide-header .highslide-close{position:absolute;right:6px;top:6px;z-index:5;padding:0} +.draggable-header .highslide-header .highslide-close a{display:block;height:14px;width:14px;background-image:url(img/upload_cancel.gif)} +.draggable-header .highslide-header .highslide-close a:hover{background-position:0 14px} +.draggable-header .highslide-header .highslide-close span{display:none} +.draggable-header .highslide-maincontent{padding-top:1em} +::-moz-selection{background:#000;color:#fff}::selection{background:#000;color:#fff} + +.jifen{margin-left: 3%; font-size: 16px;} +.jifen span{color: #3DB6F3;font-family:"Raleway","Open Sans","Helvetica Neue",Microsoft JhengHei,arial,sans-serif,\5FAE\8F6F\96C5\9ED1,Arial,sans-serif;font-size: 24px; margin-left: 18px;} +.jf_item{text-align: center;margin-left: 3%;margin-top: 38px;width: 280px;float: left;padding-bottom: 27px;border: 1px solid #fff;} +.jf_item:hover{border: 1px solid #ddd;} +.jf_img{} +.jf_img img{} +.jf_tit{font-size: 14px;} +.jf_rd{color: #3DB6F3;padding: 10px;font-size: 14px;} +.jf_go{font-weight: 700;width: 70%;margin-left: auto;margin-right: auto;} +.jf_go a{color: #555;display: block;background: #F5F5F5;border: 1px solid #D6D5D5;border-radius: 2px;padding: 5px;box-shadow: 1px 1px #F5F3F3;} +.jf_go a:hover{border: 1px solid #3DB6F3;} +.jf_go a:active{box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.25);} +.jf_red{color: #aaa;margin-left: 6%;margin-top: 58px;} + +.mf{padding: 23px 26px; line-height: 2em;} +.mf1{width: 153px;text-align: right; position: absolute;} +.mf2{margin-left: 199px;} + +.mq{padding: 25px 26px;} +.mq1{width: 153px;text-align: right;} +.mq2{margin-left: 199px;margin-top: -23px;} + +.mq3{width: 160px;} +.mq5{border: 1px solid #209eff;padding: 0 3px;font-size: 12px;margin-left: 8px;color: #888;opacity: .5;border-radius: 2px;} +.mq5:hover{opacity: 1;} + +.pad{ float: left;} +.pad0{float: left;display: block;padding-top: 6px;margin-left: 12px;} +.pad1{background: #fff;width: 3px;height: 1px;border: 3px solid #ddd;border-top: 2px solid #ddd;border-bottom: 2px solid #ddd;border-radius: 2px;} +.pad2{background: #ddd;height: 8px;width: 2px;margin-left: 3px;} +.pad3{border-top: 1px solid #ddd;border-bottom: 2px solid #ddd;width: 3px;height: 1px;position: absolute;margin-top: -6px;margin-left: 4px;} + +.pad1s{background: #fff;width: 3px;height: 1px;border: 3px solid #ffd360;border-top: 2px solid #ffd360;border-bottom: 2px solid #ffd360;border-radius: 2px;} +.pad2s{background: #ffd360;height: 8px;width: 2px;margin-left: 3px;} +.pad3s{border-top: 1px solid #ffd360;border-bottom: 2px solid #ffd360;width: 3px;height: 1px;position: absolute;margin-top: -6px;margin-left: 4px;} + + + +.if_top{color: #3F731F;border: 1px solid #B3DAC5;position: fixed;z-index: 9;padding: 2px;left: 37px;border-radius: 0 0 5px 5px;font-size: 12px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.07);width: 300px;text-align: center;background: #E9FFE7;border-top: 0;top: 0;margin: auto;left: 0;right: 0;} +.f_tp{padding: 5px;} +.f_th{background-color: #fbfbfb;padding: 6px;clear: both;height: 22px;line-height: 22px; border-bottom: 3px solid #eee; color: #aaa;} +.f_name{float: left;width: 480px;} +.f_name2{float: left;} +.f_size{float: left;width: 66px;text-align: center;} +.f_time{float: left;width: 110px;text-align: center;} +.f_down{float: left;width: 100px;text-align: center;} +.f_sel{float: right;width: 65px;text-align: center;} +.f_tb{color: #aaa;padding: 6px;clear: both;height: 26px;line-height: 26px;} +.f_tb:hover{background:#F3F5F9;box-shadow: inset 1px 1px 0px rgba(0, 0, 0, 0.05);} +.f_tb2{padding: 10px 6px;clear: both;} + +.f_up{position: relative;margin-left: 15px;color: #000;} +.f_upb{position: absolute;top:-1000px;width: 520px;height: 370px;z-index: 9;background-color: #fff;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);border-radius: 7px;} +.f_upc{position: absolute;top: 8px;right: 7px;height: 14px;width: 14px;background-image: url(img/upload_cancel.gif);cursor: pointer;} +.f_upc:hover{opacity: .15;} +.queueList {margin: 22px 20px;border: 3px dashed #e6e6e6;} +.filep{color:#888;font-size:14px; padding-top: 15px;} +.placeholder {height: 200px;padding-top: 125px;text-align: center;font-size: 18px;position: relative;background-color: #F7F7F7;} +.placeholder:hover {background-color: #fff;} +.webuploader-container {position: relative;} +#filePicker{text-align: center; width: 118px;color: #fff;cursor: pointer;box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);height: 38px;margin: auto;font-size: 14px;background: #209EFF;border-radius: 3px;line-height: 38px;} +#filePicker:hover{background: #62BCFF;box-shadow:none;box-shadow: inset 2px 2px 1px rgba(0, 0, 0, 0.05);} +#filePicker:active{background-color: #197CC8;box-shadow: inset 0 3px 4px rgba(0, 0, 0, 0.15);} +#filePicker2{text-align: center;width:90px;height:34px;font-size: 14px;color: #fff;cursor: pointer;box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);background: #209EFF;border-radius: 3px;line-height: 34px;} +#filePicker2:hover{background: #62BCFF;box-shadow: inset 2px 2px 1px rgba(0, 0, 0, 0.05);} +#filePicker2:active{box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.11);} +#fileup:active{ box-shadow: inset 0 3px 4px rgba(0, 0, 0, 0.15);} +.webuploader-element-invisible {position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px,1px,1px,1px);} +.fileho{display: none;cursor: default;background-color: #ccc;font-size: 14px;border-radius: 3px;line-height: 34px;width:90px;text-align:center;color: #fff;} +.uploadbtn{position: absolute;font-size: 14px;background: #F5713E;border-radius: 3px;line-height: 34px;padding: 0 17px;color: #fff;margin: 0 auto 0 auto;cursor: pointer;box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);margin-left: 100px;margin-top: -34px;} +.uploadbtn:hover{background: #E86F4B;box-shadow: inset 2px 2px 1px rgba(0, 0, 0, 0.05);} +.uploadbtn:active{box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.21);} +.disabled{background-color:#ccc; cursor: default;box-shadow: none;} +.disabled:hover{background: #ccc;} +.disabled:active{box-shadow: none;} +#uploader p {margin: 0;} +.filelist {list-style: none;margin: 0;padding: 0;} +.element-invisible {position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px,1px,1px,1px);} +.filled {padding: 17px;margin: 0;border: 0;overflow-y: auto;height: 267px;} +.filelist li{background-color: #f0f0f0;height: 56px;position: relative;overflow: hidden;margin-bottom: 7px;animation-name: fadeIn2; +animation-duration: 0.7s;animation-iteration-count: 1;animation-delay: 0s;} +.filelist li:hover{background-color: #f7f7f7; box-shadow: inset 1px 1px 0px rgba(0, 0, 0, 0.05);} +.filelist li .progress{position: absolute;width: 100%;top: 0;left: 0;overflow: hidden;margin: 0;border-radius: 0;background: none;height: 100%;border-left: 1px solid #8cea7f;} +.filelist li .progress span{display: none;overflow: hidden;width:0;height: 100%;background-color: #8cea7f;} +.title{padding-top: 10px;padding-left: 10px;position: absolute;overflow: hidden;} +.fsize{color: #95C5A9;padding-left: 38px;position: absolute;overflow: hidden;top: 30px;} +.fdecs{position: absolute;top: 22px;right: 15px;height: 14px;width: 14px;background-image: url(../image/upload_cancel.gif);font-size: 0;opacity: 0.39;} +.fdecs:hover{cursor: pointer;opacity: 1;} +.fdecs2{position: absolute;right: 36px;top: 0;bottom: 0;font-size: 12px;color: #E84545;line-height: 56px;} +.fload{color:#000} +.statusbar{padding: 17px;margin: 0;border-bottom: 1px solid #eee;/*box-shadow: 0 0px 5px rgba(0, 0, 0, 0.07);*/border-radius: 7px 7px 0 0;background-color: #f7f7f7;border-bottom: 1px solid #DADADA;} +.info{position: absolute;bottom: 0;left: 0;background-color: #eee;line-height: 20px;font-size: 12px;min-width: 270px;text-indent: 7px;} +.info font{background-color: #FF4949;color: #fff;cursor: pointer;padding: 0 3px;} +#ready{background: #e1ffd8;animation-name: fadeIn2;animation-duration: 3s;animation-iteration-count: 1;animation-delay: 0s;border-bottom: 1px solid #fff;} +.f_img{border:0;margin-right: 3px; background-color: #F0F0F0;border-radius: 2px;} +@keyframes fadeIn2 { +0% { +opacity: 0.1; +} +50% { +opacity: 1; +} +100% { +} +} + +.f_sela{display: block;width: 30px;height: 16px;font: 12px \9ED1\4F53;border-radius: 4px;border: 1px solid #D5D5D5;background-image: linear-gradient(#FCFCFC, #EEE);background-color: #f7f7f7;text-shadow: 0 2px 0 rgba(255, 255, 255, 0.9);float: left;margin-left: 12px;margin-top: 3px;outline:0;cursor: pointer;} +.f_selb{ background: url(/images/recycle_icon.gif) 0px 1px no-repeat;display: block;width: 16px;height: 16px;float: left;margin-left: 5px;margin-top: 3px;cursor: pointer;} +.f_selb:hover{opacity: .5;} +.f_sela span{background-color: #333;width: 3px;height: 3px;display: inline-block;border-radius: 2px;margin: 7px 1px;} +.f_sela:hover{background: #eee;background-image: linear-gradient(#EEE, #DDD);} +.f_focus{box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.25);background-color: #CCC;background-image: linear-gradient(#EEE, #DDD);border-color: #ABABAB;} +.redcolor{color:#FF8572;display:block} +.redcolor:hover{} +.f_selcd{position: relative;margin-top: 28px;margin-left: 66px;} +.f_selc{position:relative;margin-top: 28px; margin-left: 38px;} +.f_view{position: absolute;background-color: #fff;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);width: 170px;border-radius: 0px;border: 0px solid #ddd;border-top:0; z-index: 9;} +.f_view div{height: 30px;cursor: default;line-height: 30px;background: #fff;color: #333;border-top: 1px solid #F1F3F7;font-size: 12px;cursor: pointer;} +.f_view div:hover{background-color: #F1F3F7;color:#888} +.f_viewtop{border-radius: 3px 3px 0 0;} +.f_viewbot{border-radius: 0 0 3px 3px;border-bottom: 0;} +#f_more{position: relative;} +.f_cl{cursor: pointer;background: #fff url(/img/cl.gif) 8px 8px no-repeat;font-size:0;border-radius: 50%;width: 30px;height: 30px;line-height: 30px;text-align: center;position: absolute;right: -15px;top: -15px;border: 1px solid #ddd;border-bottom: 0;border-left: 0;} +.f_cl:hover{background: #DCDEE2 url(/img/cl.gif) 8px 8px no-repeat; color: #209EFF;} +#f_sha{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;text-align: center;position: fixed;top: 0;left: 300px;width: 270px;} +.f_sha0{width: 40px;height: 40px;border-radius: 50%;background: #08f;color: #fff;line-height: 40px;font-size: 20px;margin: auto;} +#f_sha1{background-color: #D0F2C3;border-radius: 3px;padding: 13px 13px;font-size: 14px;margin: 15px 0;word-wrap: break-word; word-break: normal; text-align: left;} +#f_sha1:hover{background-color: #C2ECB2; box-shadow: inset 1px 1px 0px rgba(0, 0, 0, 0.05);} +.f_tcn{border-bottom: 1px solid #fff;margin: 0 8px 8px 8px;padding-bottom: 8px;} +#code{} +#code img{margin: auto;padding-top: 15px;} +#f_surl{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +.f_surl0{} +.f_surl2{color: #888; font-size: 12px;} +.durls{margin: 15px 0;} +#f_des{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +.f_des1{margin-top: 15px; text-align: right;} +.f_des2{margin: 15px 0;} +#f_pwd{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +.f_pwd2{ width: 270px;} +#fol_des{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +.fol_des1{} +#fol_pwd{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +.fol_pwd3{height: 30px;line-height: 30px;} +#tongle{position: absolute;right: 20px;cursor: pointer;} +#on{background: #4dbf08;height: 26px;width: 60px;border-radius: 30px;box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.15);} +#off{background: #eee;height: 26px;width: 60px;border-radius: 30px;box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.15);} +.off1{border-radius: 50%;width: 25px;background: #fff;height: 25px;box-shadow: 2px 2px 1px rgba(0, 0, 0, 0.15);} +.on1{border-radius: 50%;width: 25px;background: #fff;height: 25px; +box-shadow: 2px 2px 1px rgba(0, 0, 0, 0.15);float: right;} +.fol_pwd2{ width: 270px;} +#fol_cre{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +.nofile{text-align: center;padding: 8px;} +.fnow{background-color: #eee;padding: 5px 10px;border-radius: 3px;color: #57865F;} +.fnow:hover{ box-shadow: inset 1px 1px 0px rgba(0, 0, 0, 0.05);} +.fnow span{display: inline-block;} +#f_nowid{} +#nowpwd{} +#f_midf{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +#f_midf1{margin-top: 10px; max-height: 300px;overflow: auto; border: 1px solid #ddd;} +#f_midf4hover{color: #3377ff;} +#f_linkcdn{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +.f_midf5{border: 2px solid #ddd;width: 15px;height: 15px;border-radius: 50%;margin-top: 7px;float: right;} +.f_midf6{height: 34px;line-height: 34px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;padding: 0 10px;} +.f_midf6:hover{color:#08f; cursor: pointer; background-color: #F3F5F9; box-shadow: inset 1px 1px 0px rgba(0, 0, 0, 0.05);} +.f_midf6 .f_midf5:hover{border: 2px solid #209EFF;} +.f_midf5:active{ background-color: #209EFF;} +.fkey{display:none;margin-left: 6px;padding: 0px 8px;border-radius: 3px;border: 1px solid #eee;} +.fkey:hover{ border: 1px solid #aaa;} +.finfo{display:none;margin-left: 6px;padding: 0px 8px;border-radius: 3px;border: 1px solid #eee;} +.finfo:hover{ border: 1px solid #aaa;} +.finfos{display:none;position: absolute;background: #fff;border-radius: 3px;border: 1px solid #ddd;margin-top: 10px;padding: 7px 10px; color: #333; max-width: 300px;} +.finfost{ color: #5E9039;} +.file_ico{padding: 2px 8px;border-radius: 3px;display: none;} +#f_linkcdn_info{background-color: #D0F2C3;border-radius: 3px;padding: 13px;font-size: 14px;margin: 15px 0;} +#f_linkcdn_info:hover{background-color: #C2ECB2; box-shadow: inset 1px 1px 0px rgba(0, 0, 0, 0.05);} +#f_linkcdn_txt{display:none;} +#f_diy{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +#f_diy_box{display: none;} +#f_diy_set{display: none;} +.f_diy_set{background-color: #D0F2C3;border-radius: 3px;font-size: 14px;margin: 15px 0;word-wrap: break-word;word-break: normal;height: 46px;line-height: 46px;padding: 0 5px;} +.f_diy_set:hover{ box-shadow: inset 1px 1px 0px rgba(0, 0, 0, 0.05);} +#f_ename{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +#f_diy_domain{float: left;} +#f_diy_input{height: 38px;border: 0;margin-top: 4px;float: left;background: #fff;width: 150px;box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.17); border: 1px solid #d0f2c3;} +#f_diy_input:hover{border: 1px solid #96ce81;} +#f_diy_input:focus{outline: none;border: 1px solid #96ce81;box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.275);} +#f_diy_info{background-color: #D0F2C3;border-radius: 3px;padding: 13px 13px;font-size: 14px;margin: 15px 0;word-wrap: break-word;word-break: normal;text-align: center;} +#f_diy_info:hover{box-shadow: inset 1px 1px 0px rgba(0, 0, 0, 0.05);} +#f_ico{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +#f_ico_box{} +#f_ico_info{background: #f7f7f7;height: 90px;text-align: center;line-height: 90px;display: none;margin-bottom: 10px;} +#file_lock{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +#file_lock2{background: #fff;display: none;border-radius: 8px;box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);margin-top: 10%;padding: 20px;position: fixed;top: 0;left: 300px;min-width: 270px;} +.lockspan{font-size: 16px;display: block;padding-bottom: 10px;} +.filelock{display: none;margin-left: 6px;padding: 0px 2px;border-radius: 3px;border: 1px solid #ff9a9a;color: #f77;font-size: 12px;cursor: pointer;} +.f_wringd{cursor: pointer;color: #FFFFFF;background-color: #F19586;padding: 0 3px;border-radius: 3px;} +#f_right{position: absolute;left: 1000px;top: 100px;} +.f_wring{display: none;border-radius: 3px;border: 1px solid #ddd;width: 300px; margin-bottom: 30px;} +.f_wring1{color: #E2513A;border-bottom: 1px solid #ddd;padding: 10px;font-size: 14px;text-align: center;} +.f_wring2{line-height: 1.8em;padding: 0 17px; word-wrap: break-word;} +#wring{background: rgba(0, 0, 0, 0.7) none repeat scroll 0 0 !important;position: fixed;top: -100px;color: #fff;border-radius: 3px;padding: 2px 13px;margin: auto;left: 0;right: 0;text-align: center;;max-width: 200px;z-index: 999; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22);} +.helpinfo{width: 300px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);} +.helpinfoa{padding: 5px 0;display: block;} +.helpinfotop{text-align: center;border-bottom:1px solid #eee;height: 35px;line-height: 35px;} +.helpinfobox{padding: 10px;line-height: 1.7em;} +.helpinfolist{padding: 10px;background: #f5f5f5;margin: 10px;border-radius: 3px;display: none;font-size: 12px;} + +.f_right_vip{ width: 300px;border: 1px solid #eee;border-radius: 3px;} +.f_right_vip_box{padding: 10px;height: 30px;} +.f_right_vip_ico{ float: left;border-radius: 3px;width: 40px;height: 30px;text-align: center;line-height: 30px;font-size: 26px;background: #484b4c;color: #fff;} +.f_right_vip_title{ float: left;margin-left: 10px;} +.f_right_vip_time{color: #9e9e9e;font-size: 12px;} +.f_right_vip_now{float: right;color: #72b15e; height: 30px;line-height: 30px;} +.f_right_vip_now_span{color: #ef6354;} +.f_right_vip_over{padding: 10px;background: #f1f1f1;} +.f_right_vip_over span{color: #999;margin-right: 5px;font-size: 12px;} + +.follink{color: #3377FF;cursor: pointer;} +.follink:hover{color: #999} +.f_tpspan{padding-left: 5px;color: #37f;cursor: pointer;margin-right: 5px;} +.f_tpspan:hover{color: #999} +.f_tpspannow{color: #333;cursor: default;} + +@media (max-width: 519px){ +.toum{background-image:none} +.mydisk_nav{width: 97%;margin-left: auto;margin-right: auto;} +.tips_box{display:none;} +.pro{ padding-top: 90px;} +.mf{border-top: 1px solid #f1f1f1;clear: both;padding: 20px 18px;} +.mf1{width: 100%;text-align: left;color: #888;position: initial;} +.mf2{margin-left: 0;margin-top: -17px;text-align: right;} +.mq{padding: 26px 18px 0px 18px;clear: both;} +.mq1{position: absolute;margin-top: 8px;width: auto;text-align: left;color: #888;} +.mq2{margin-left:0;margin-top: 1px;text-align: right;} +.mq3{width: 100%;} +.mq4{display:none} +.txtred{display:none} +.helpinfo{display:none} +.mk1{width: 100%;border: 0;border-bottom: 1px solid #ddd;box-shadow: inset 0 0px 0px rgba(0, 0, 0, 0);border-radius: 0; padding-left: 99px;} +.mk1:hover{border: 0;border-bottom: 1px solid #ddd;} +.mk1:focus{border: 0;border-bottom: 1px solid #ddd;box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0);} +.mbtn{width: 100%;} +.t1{border-top: 1px solid #f1f1f1;clear: both;padding-left: 0;padding: 10px 20px;background-image: none;} +.t2{float: inherit;padding-bottom: 0;} +.t3{background-image: none;width: 100%;text-align: right;line-height: 20px;} +.t5{display: none;} +.jf_item{width:98%;margin-left: 0;} +.n1{width: 100%;margin-left: 0;border: 0;padding: 0;} +.mydisk_file_bar{padding-left: 0;padding-bottom: 18px; opacity: .5;} +.footm{display:none;} +.mobdao{display:none;} +.diskdao{width: 78px;} +.diskdao3{width: 78px;} +::-webkit-scrollbar{background:rgba(0,0,0,0);height: 1px;width:1px}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)} +::-webkit-scrollbar-thumb:hover {background:rgba(0,0,0,0);} +::-webkit-scrollbar-thumb:active {background:rgba(0,0,0,0);} +.mydisk_file_bar{position:absolute;right: 3%;opacity: .5;top: -10px;} +.n1{border:0;margin-left: auto;width:97%;padding:0;margin-right: auto;} +.my{border-top: 1px solid #eee;padding-top: 18px;} +.mi{padding-left: 22px;} +.mi span{margin-right: 8px;} +.mii{float: right;} +.footm{display: none;} +.f_up{margin: 0 15px; top: 50px;} +.f_upb{width: 100%;height: auto;} + +#f_surl,#f_sha,#f_pwd,#f_des,#fol_des,#fol_pwd,#fol_cre,#f_midf,#f_linkcdn,#f_diy,#f_ico,#f_ename{margin: 0;min-width: auto; width: auto;right: 15px;left: 15px;top: 30px;} +.btn{width: 100%;} +.k1{width: 100%;} +.f_view{width: auto;right: 15px;left: 15px;position: fixed;bottom: 15px;} +.f_pwd2{width: 100%;} + +.f_time{ width: auto;} +.f_tb{height: 60px;border-top: 1px solid #eee;} +.mobbot{display:none} +.pad{float: inherit;} +.f_name {float: inherit;width: 100%;} +#topcontrol{display:none} +.mq4{display:block} +.f_view div{line-height: 50px;height: 50px;} +.tongle{ float: right;} +#f_diy_input{width: 100%;border: 1px solid #CCCCCC;padding: 5px;box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);border-radius: 3px;} +.f_diy_set{ padding: 0;} +.f_ename{ padding: 0;} +#f_right{display:none;} +} + +@media (min-width: 1260px){ + #f_right{display:block;position: absolute;left: initial;top: 100px; right: 30px;} +} + +.upimgbtn{ + display: inline-block; + padding: 20px 30px; + vertical-align: middle; + -ms-touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + background: #fff; + background-image: none; + background-size: 100%; + border: 1px solid #eee; + font-size: 20px; + } + a.upimgbtn:hover{ + background-color: #f5f5f5; + border: 1px solid #08f; + } +.upimgbtntop{margin-top: 10px;background: #f7f7f7;padding: 10px;} +.progress{ + margin-top:2px; + width: 200px; + height: 14px; + margin-bottom: 10px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); + box-shadow: inset 0 1px 2px rgba(0,0,0,.1); + } +.progress-bar{ + background-color: rgb(92, 184, 92); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.14902) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.14902) 50%, rgba(255, 255, 255, 0.14902) 75%, transparent 75%, transparent); + background-size: 40px 40px; + box-shadow: rgba(0, 0, 0, 0.14902) 0px -1px 0px 0px inset; + box-sizing: border-box; + color: rgb(255, 255, 255); + display: block; + float: left; + font-size: 12px; + height: 20px; + line-height: 20px; + text-align: center; + transition-delay: 0s; + transition-duration: 0.6s; + transition-property: width; + transition-timing-function: ease; + width: 266.188px; +} \ No newline at end of file diff --git a/public/assets/css/userapp.css b/public/assets/css/userapp.css new file mode 100644 index 0000000..65162ef --- /dev/null +++ b/public/assets/css/userapp.css @@ -0,0 +1,417 @@ +.child-view { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + -webkit-transition: all .5s cubic-bezier(.55, 0, .1, 1); + transition: all .5s cubic-bezier(.55, 0, .1, 1) +} + +.slide-left-enter, +.slide-right-leave-active { + opacity: 0; + -webkit-transform: translate(30px); + transform: translate(30px) +} + +.slide-left-leave-active, +.slide-right-enter { + opacity: 0; + -webkit-transform: translate(-30px); + transform: translate(-30px) +} + +.content { + width: 1100px; + margin: 0 auto +} + +.flex { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex +} + +.flex-box { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center +} + +.align-center, +.flex-box, +.space-between { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center +} + +.space-between { + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between +} + +.text-overflow { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +input:focus { + outline: none +} + +.dis-btn1 { + cursor: pointer +} + +html { + line-height: 1.15; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible +} + +pre { + font-family: monospace, monospace; + font-size: 1em +} + +a { + background-color: transparent +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted +} + +b, +strong { + font-weight: bolder +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +img { + border-style: none +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0 +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0 +} + +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText +} + +fieldset { + padding: .35em .75em .625em +} + +legend { + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +progress { + vertical-align: baseline +} + +textarea { + overflow: auto +} + +[type=checkbox], +[type=radio] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0 +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +details { + display: block +} + +summary { + display: list-item +} + +[hidden], +template { + display: none +} + +a, +abbr, +acronym, +address, +applet, +article, +aside, +audio, +b, +big, +blockquote, +body, +canvas, +caption, +center, +cite, +code, +dd, +del, +details, +dfn, +div, +dl, +dt, +em, +embed, +fieldset, +figcaption, +figure, +footer, +form, +h1, +h2, +h3, +h4, +h5, +h6, +header, +html, +i, +iframe, +img, +input, +ins, +kbd, +label, +legend, +li, +mark, +menu, +nav, +object, +ol, +output, +p, +pre, +q, +ruby, +s, +samp, +section, +small, +span, +strike, +strong, +sub, +summary, +sup, +table, +tbody, +td, +tfoot, +th, +thead, +time, +tr, +tt, +u, +ul, +var, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font-weight: 400; + vertical-align: baseline +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +menu, +nav, +section { + display: block +} + +body { + line-height: 1 +} + +blockquote, +q { + quotes: none +} + +blockquote:after, +blockquote:before, +q:after, +q:before { + content: none +} + +table { + border-collapse: collapse; + border-spacing: 0 +} + +a { + color: #7e8c8d; + -webkit-backface-visibility: hidden; + text-decoration: none +} + +li { + list-style: none +} + +body { + -webkit-text-size-adjust: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) +} + +body, +html { + font-family: PingFang SC, STHeitiSC-Light, Helvetica-Light, arial, sans-serif, Droid Sans Fallback; + -webkit-tap-highlight-color: transparent; + background: #f4f4f4; +} + +* { + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +img { + display: block; + max-width: 100% +} + +.app, +body, +html { + width: 100%; + height: 100%; + position: relative; + background: #fff +} \ No newline at end of file diff --git a/public/assets/file_ext/apk.png b/public/assets/file_ext/apk.png new file mode 100644 index 0000000000000000000000000000000000000000..8738ae5aae48fead8141faad7bb1f39fe3db7edf GIT binary patch literal 15009 zcmeI3Yj6`)7>2i?Sc-TVK*8}6!Z?Dm-Q8T;WG79n4U(#X+E!`DDlEIF?b>8_$!=&` zhG_*I3ksuF6c8EYHj3hfA9WNQTLdq4ila~|DwlBtl@0@gpjJgZn}p;vO*!cJ^XyET zujjn)_nm#tCHrTWl+KtwI_HKQilRoB_<4Ci*c8P>+wY&2BRdZS_pQCiU_#gkmf z;{&=FmNi3G6^ofyn5#yN0;|<5l)Mu671EN06g|NXQe>in#&EeTlgT8BNskr@2V+B% zL6_e`}50h?6&3Gyw@CgR+!WEfEvrgLPsNguBb@C4P9juFI zStLnZnU*7N`u!{}=L{6~BAqE1deNbwjDn`uxl1MH6%hZT{Q0kds8J=}Q5Yd>U|FcRu1M3Y`xGClw+roCWLih?zsZ%g-w?{#*(L$>51)KUJ%Xm z%qyB(0!SWaKx=APNoT?)|JMnO=SS>A*J!8%%EdNRJXK6JbP`>yF&cz0D5`~P;?j0| zJnukbdI1k({sIK$fm0E09XLa=jStuC;2HIp2OAGp100zUn+49p3~EbNj_WJUSq(;F z`g|J;FZlBZuY?utPPbNF+=_OmTT{*l6xs0F64lb05tn)T#t(*a_@Ds1c}}O@>0#2F z(;cO96a*`MGTgzsxh`#vgeSctqp@lzBhryD#-|GTNsrBBycIq$z-JXE`LHr@l9OBE ze-2W2^gky?(~%-54QxzsVG*GMf(xaAjR`I+B2++dp){~D!G%SH3J5Ng1~w+Ru!v9r z!G+Sm#sn7@5h@_KP#V~n;KCw81q2sL0~-@uSVX9R;6iC&V}c8d2o(@qC=F~(aA6Ul z0)h*rfsF|+EFx4uaG^A?F~NmJgbD~Qlm<2?xUh&&0l|gRz{Ug@77;2SxKJ9{nBc-9 zLIngDN&_1cTv$Y?fZ#%DU}J&{iwG4ETqq4}OmJZlp#p*nrGbqJE-WHcKyaZnura}f zMT80nE|dl~z9_Do)a!phf$#h^z?b_LxK1B~F9upfe_4Q{nr@}2mcY* zqK?m@D1IeHU9Ubjd-vTGmGw)Buc#vW&93LW>&M)GO-Hl3fdf-QQ>wN+SG~UXvIW^q z*=PI4KEB8|cE{2(=0wq%A2#*uTU^WBK7Q=3w&s>wCV#)XEqls!udG;fZr!-zo=3MS zZ99JRtZY5^Y0UxOn!S5=yxjl6sz&==_1&lXdau!LdHdAF>3{6GkD7J9{pDo`sg75F zc7NDeZ@Wr*mw$Em{IA}Bdia=S6kSr~KKsQx%bwZX(mLU=H0sIqeP>qnIh;l{%YJIkA^?X9avQX`s{U+ds| zmB)McuNXE*{jsQ-daTobo?c5IJo<<9agY1Ug)58t#=f`e^Fvt&i=L9y)jPlO%o=g? zd&AaFJv4FLo>SWVE2qD(nyr0XSYJ!Eg-sLl2F+=iZGkv}`;wl`8F7QCLgQv~^U^d$e5MxFy=Wv%CGZ z*{{9$)A{bA?OC6Pmj5|#(wyMu)6<%_mp|fS5huan5Md8>Kd!~)XY--4iS-iD;+jk qA1wc}zUmh*&xzT30x@cg1q|or@oaCpbFvp`BZH@_pUXO@geCx6Y;?5% literal 0 HcmV?d00001 diff --git a/public/assets/file_ext/excel.png b/public/assets/file_ext/excel.png new file mode 100644 index 0000000000000000000000000000000000000000..d40d805e93771d06dc902093932cc0f5f4367954 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA)dl#3xB}_qBT5VIQ~(i>fsFqD z{|^-W@%QVypU-FAD#$-+lyzMD_uro{zTLa@ZvT;&tJ^LHH(&6pIO9-q+B)r+`j_AD zKmB_1^y{sMU#{N$bpFPN6Z@Yp-SceW_9wHpJ)XYwZo`7xl?!fHOuL>n@mfmXmH3*o zZf%V|ASZH^1o;IsJa20BdUW6OXJOSYpjelui(`n!`K=dr3N;(>umnt=;L_c5mUrj- z*Z=Dc&iQC0b$2Cp>wY`CVnR@%Oa08%@q6Y@iaXJsqUQX{rDdD=BqO#gzu5U(z8+k& zbE){Zhb!5+7VqS2^m?*mGDFy61%Bnz%uKzd-w@2+gmIGfaiVuEsyQ0dy6Er>mdKI;Vst0OVt<>;M1& literal 0 HcmV?d00001 diff --git a/public/assets/file_ext/exe.png b/public/assets/file_ext/exe.png new file mode 100644 index 0000000000000000000000000000000000000000..0036fdaa3a7701b7500e89ad99c329738f26d086 GIT binary patch literal 14847 zcmeI3eQXnD9LH~&j5)wW%mhW?EHEasy}Pd6)}t+qb+`eAy@{LujNA3ucGBM6dRN*l z#E~Hh7!nX)f`|$tz9tJ10tyBVu=th*Nqm8caRKE$5T>Z02|m|$?X#}q0mGlqC0&1e zp6~bfd+zhR^!~YZRg0e(m-BEAMN#7_D?Byud!q5l&VqmY!>+&K*S%^*gGNzf9xy%` z)RwJKQIap!)$8@%MZBm4EP_vI0+vWXg=&g&&WWgkxE$zo6KIiSm+8uZ&rG!BbD5s9 zds(kq23nGs43J0iX+XB;c1dKH@S(^YSn@ni&%vmFUY| zrc$FIUGJ@;%akCX?Uo|5$Z;H9?67e5l0vKfaoWmqc7}B@9BXDdo@03{OUEyhI|oM2 zps$&)@yw5xga5fqt-7xA3=o>ILxovumvtdxmbGcIB!hW8 zKof(Ks!NJY8+nB$C8WDdCZkZ|ir-g2O%#%~I6Fv@i3lpgSy(2W$tNZ}YAEQB4$UVr zzz+gI)-~wk()!d^MOU;|WrUK6?hy;aIq`ZEwbPC_5J+2E)5}*t1aYKkomySH3YZ$8 zDWRYU%2&W!nU?PEb*VWyIYTlTJtK}CM5GaHMo-KZT?(-oa>9G%%Ys1Am0+Es_}#Hp zRyBx_E-Q~n@eay+Envye~%m+Mz4%~1>7MWSQ*=nofIG!!$ZMFioglAbK zNlclN!>jnD=Jqr>Y(>1?isnF+sX5>d@(H?dTUk&olE)|V%}OvJ=x!+>v;anxTbxX? z5m6@A6y4LtgS#6B$blAr|7I>C=0!WQMdRhm~-~ZPNdpz*v67K5~t4E0Axsp<=0`s*#guO0ymof}peou8G^* z?XkQ=jj08kjPVQLmxfM7taa!N4X)YYGwL)BHXg19I5HtR3!IY~)|RXs)7Klb>JLTr z#a0$x@aGR+aVy%LYHhf+741&7CY?{plJ2&~tEDs}F5~o#9SpVbK>@gn?Dj&qe^Z-N z9aT~U`0G6q+`*c$F0Hn>C$%H3v0)@5(h)btrV9BFdT%BIGi`4p8=UFj*Ui}am*$+htC+=*XwhASIY?yan+N6mbF<*S~3UE;B$ z-}aQg-MIbbKg-sxrk~Aj`LXN8(7Aq7_THbn7A}14%p;4uwcefQbC28{`1SIpn^)dA zdwE^eg6j7^Y46Y4wQl>4^$nve^Uvl?db9e*>5CtqIr#P5-`-vGD1G?StjzE8KVNjA zy>Y|NwzUt=J^YYo-gBK_=Jf7&+1BhGn(iQhnE{cS`%R&%Cl}kQgEz0cjfU*`3sh0-k7p^{H&j{E{-|G?6~LC^M$*{XKcILeeRzr z-J`F)u%F4xn>uiEQt$fut$n+yv}^Xh6RRgZ-#7dEGrx@Od0(ln+uu3R_(vz@?LEkx nURAqo=U4ycmQ20RokfYg%Z`>0{4m*gMYFPev8Q|9vabIC^@c`H literal 0 HcmV?d00001 diff --git a/public/assets/file_ext/folder.png b/public/assets/file_ext/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..32648b021fcc31de71bc0a15b9898a44ce459332 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%?Vc`IRogqY)6U!P6gQJ)|lG?mY{-~{7A6Y(VutXct$ r|5&q(ExtGC&XSwR_FL{h|6X&cN};GHTbot@oy6ej>gTe~DWM4fBfLxY literal 0 HcmV?d00001 diff --git a/public/assets/file_ext/fonts.png b/public/assets/file_ext/fonts.png new file mode 100644 index 0000000000000000000000000000000000000000..6d97d0f15ae696744e78acaa5b755e88b6fec977 GIT binary patch literal 14996 zcmeI3eQXnD9LEm~2vw#izA#KYZis-i*WT7`J=?-)hZ~`6Y!fzKbho?Pc3Imy?{2i4 ziemy}8vTQah|wqth{gc&A|mJr2n5a4IHQ10nM5b3h#NtP0zTJv?X#}qQRAP_C0&1e zp6~bfd+zhR^!~Zl;yL$?GNqdcf*4g;;4J~)w;P`k!@=K^A=e+^Yot<8p%KJ&HyfWJ z#PcrzMeZc2tXwbm&1QKyVBrM0O0e4ZEmFUKYegGfj~ZiC*WT z@{EFHxv!Y?$f`)%E!k$?X0wqw4vWp6o5|Rxl8n`6r>zd!W;I)Ftj)?YRx)-`ZWD-{ zs!+|AcxT4Sf&W}ot*$F9O@~4uODNMKt2MOE;c(DahGrNuP?)ubpw5NOK`kSiq%V(G z)Ob}=bV&}9MqaK;uGd`@WfY2EvHJ=r@j^i@#tu-V!<<6fELJ*|N#NrirC#+%h9>Z| z=obTGP}hLZmeQxx%DSx8%7c`QcMn<^%!$tzubpzdfk4XAnx4M|Ac!GN>D0;^6p=0w zHMw5p#r!4URx(oEy)IQJCZ}H}qi4{ui(zRHo6!@sMV3NzhMeGDS&u4mx~!JTvfmwD zWyO66NslM8s>n$`j+cT4*U3&g*_4>^L_X2W>7pB~$ZWIKZf3H|Y&O=K%UW~pG5%Vi zBvEBj4xcPY)eR|fWM#8<2F?K~lXHL_Byc+SkFvm8D38Fi)v_Akbhi}XYD8KI);Q@z zBczP4E7l|XWfcrdbZ0v0RLzhpvewwbpr&&{UM%#wL4!q-1Xjq&&CL{;EOU0Y=rCtx zalE<8A!M3!dCnnJaaoxTCOZPr=Y#D7QhQ~--qb0M)^UDFV~qaa zmPnCiK&b*r11q!vTDf5TMozO*@uB{$eI0%&aw;jDs)@#)b5VVpE`E%~PbtF_*}E*q z8|RsuH@1W*IO%?^iDAW^F`M*XCoq~HvJYM(R4WFrwxOb_BC5fYXmYh4;#4uO2CRvH zw%en5`x}!BIBDY-z%TWmifC*98R}cJ183A}9BeFD4PazkWEN~rdO%yEa#UY#%&NaW zqR(Nh-~vB?;EGw{?qqAl)va)MvNhqnKPc&LCRQz}8FCq?Z}ea&1rG|MJKJv0v^(kK z=43~)6c+vEUJ2}A%~+RAR?L&!kK*kss5)mxGxL_K{7~?`Bf&~~COamEXTu4N) z0ONvbAY+URi3k>8Trdq}jBz0m!2*m6rh$wxE+isYfN{YzkTJ%EL<9>kE|>-~#<-A( zU;)Mj(?G@;7ZMRHz_?%<$Qa{7B7y}N7fb^gV_Zl?umIzNX&_^a3yBC8U|cW_WQ=hk z5y1kC3#NgLF)kz`Sb%ZCG>|dIg+v4kFfNz|GRC-&h+qN61=B#r7#9)|EWo&68ps&q zLL!0%7#BwFIGRi2)r0b@&zS6f@r*pAetU0h>KUi_i2Kt zw-UseN`hdYBZ%AN)ejz;Nf1MRDD>u)g-?9`Oj}*)+%ZR{b$71)V8VvN=iR%en5s68 zC|R9nntScFqp!45>`2SmdF`JbUH|GTGMILG{N(R8kOlctiz&Or-s*es?7eC9Q{$ys z9qzep%AU59kDPV1{CUg$;+7Ndr#Y`l+i}CK7k9)b(}wb1Oy{q=(NPR<+mLf7<%tF8<@% zyQUP4`1a9b$C~He`0VM`-TGs{Jh`Unvv-tJJ0D-$JwS`HHazS2Q1N9rH+U*KgYo zjTqBgy>lY)tl8AF{_3Z8TAp zwt2?F@xRPCam&&L8_#+U?BCRR{K?_Ww)Cf$UUcoBIWFCG`PiL*ef!%hS4`V(edz0= pOHB*+cdu&RI&}B$oVMY_OXH-JcF#{d5y z!9TzMcSip|we5eM&;K7^|G&8Z|J?5X$2b1pv-tn~s{a$y{y#JpKRR z%KvkF{%@J_e^uxIxfTEWk~3KzgaIvJFA4GsW_aG@`LOY&LSaoBP^i(<#W6(V{NB^v zVoe4DE*Fn22<>DMIJo~^{miDe%ac+bbeO+zydSKT*6te3DH@TM?#NR%xjlITOIzfG z*Ze!K=gOUXGNE5@E8l@L=Uq8rh>pV0y#h7oOa4Wm>{LUu( uz}0mRUap80S#+(1Df20d+SE%Odl=^*;8&QKGcy(F7zR&QKbLh*2~7azx0)yb literal 0 HcmV?d00001 diff --git a/public/assets/file_ext/ipa.png b/public/assets/file_ext/ipa.png new file mode 100644 index 0000000000000000000000000000000000000000..3fe9fa5c2eb6948b87346d07c2919fe22c957f5a GIT binary patch literal 14876 zcmeI3e{2(F7{_lCCffoGFbHDg>_CRBy}NeZ)}t+qbz=oO#x~ec7kj*LLl@uHyy6pYJ7I zpS|z*d7k$^&-1>$e{O4K#nOqHPh=7VG0|D>r~={z?h3nMspr%q!}|sTPTLs(+tbdtdS;Tm(HFE zENjr)z*afRV(GwtHeHjd$}B~NLLo!QWRQZ56l1YiDB4IFje4NaE3E;Q3+n?)PBh4H z9EYIrK~YvkDL`s*Igiw$+H^WCQT&SCmtT%23MeslfFc#d}3>ZYw%jTOb4PJABSI^PB zNuTerc=Vj7(5Npk)20Tq$HG}mOa!9K1-p+5?U48uZNJ1qdmk_~5wtyL(+zLB_%Rkgr8J+& z-eoynJJ0OAwj~6wl^QXcSXSIK<|h8%0!HIQ?qlZ&H3@-xZK!Cdh-&O0iqxQnxS&wn z2zuiFc6&7LNXO&^R!aK?@QEW!5gi>_q2Zn#T~Vucu(6;Uz{g%+s z`dT9TLL&_>@bd?*m@7P;?7H^euJClSYr=DNKveC|sNg+v4kFfNz|(#E)uh+qN61=B#<7#9)|EWo&68b}-C zLL!0%7#Bj0>iLv@tFuB3OWN!8DLI z#)U)#3otI22GYj3kceOb#s$+r+87rS5iG#CU>Zmp<3b{W1sE4h18HMiNJOvz zK-w4=5)mxGxL_Jc`<}Qm6R-aX0r1XW2)x{PYI^fN@M0jzmshz6qHQigw7*6Wf8Pb) zzYs(VO%T7j34+~05RXgSUi_wvAkqR(M{!N~$BXYTTt2QiyZzXOotv|N-m`^Sy{*F2 zIQQ(v#|EkFJP&tia(3REJ7&B2c^wlv?qp;wT+q90YW85(-mhyny!*mXpKj|r1DDo? zcAfeCq`~x)_3V^o^G`4RY^HnGjNXlNa-N%Bce{1_+kGp~bss*TE|sU({qtLA#+HG4 zqU{;TYMV%MfZ zCU?gh&YSJW7nUBFwDi`-mwT>n9^8HT-_8}YZcx6PcM12E^Uv(d`gUUPiM@kgc9qZQ zc)Gs(`R>o#YWoTE_*t#rpV@z1sJ}b8=dDxgvJSP6-+j6I>T>rd;)Y4Ylxr{LIL_^R Q9aM>MmR2}EUgGZf5A88er2qf` literal 0 HcmV?d00001 diff --git a/public/assets/file_ext/links.png b/public/assets/file_ext/links.png new file mode 100644 index 0000000000000000000000000000000000000000..299efbd5dac8739cc3080707e779f8089e58c25f GIT binary patch literal 14962 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 literal 0 HcmV?d00001 diff --git a/public/assets/file_ext/text.png b/public/assets/file_ext/text.png new file mode 100644 index 0000000000000000000000000000000000000000..81395f0099045427defab5347e59aa49764baaaa GIT binary patch literal 412 zcmV;N0b~A&P)Px$R!KxbR7gu>WS}u%#Ad$VmFW=-{~6SYvHRw`hj(t;cPz!F7Q+JnE7PAc{AZ9N z#&D3DQ!lSG@Ue0|xoO`ai%k!T1p!xPtor}|e<-nr!z=*NxGX`j!2j~}k07<=Sb)nC zbPN8IVmL_c{ZG#sUVr}p*CxQmbL6^Rn=MR$Vheu${mt;<*Jp-5|Neo^{QLjk%g^uM z$lvjr{1e2d*aB=m-l&@iH}Tx&0000{uH+;jftH|L&n<_^I*U*w$QqbI=Ey*-^yY`mis zj{xE$05d8m1saKLu_TI8#B|Yl|FO$e9^|V4pp-JfNNfurcSa4`Z5PiLQLLOm$FW(v z(d~J-;{4N3O92oJ?Y^RfzMnL>?AHR2pY1p8hx+(yyMgxPEN3|}ZCW?w+GK9R=5sV=Dc=hJoQ~+|y+%s0VZPwEsE>=$vPi0W3 zRE8#w^Dpst38}XX$KC?(tR3?f0f|f=`>8Y<65zF4oA+)qg=Ait`gSU+=M8Hf&nf9x z0D7Loir0h4aSDk{8hVavYS$YQ>?R|wx}EsBpFp`*>zj$G0PH3cmgemEwiA(uOh*t= zl5p>m568Izj_fj7AYa-pgCQMZ_~% zqzc8e0T@)`E~^ELb{n>$zd>ootm$x@ss?%ia0~;_j13O63EPPyl!mmTssKF4;>Lm- z^+p3fVh7+DfYB(oN3}NW&cLi7z&mTh=j{;8`q8Ghsu>Ur2FP2GF7_|FZfI2jT{06dxu~AMQfv z+kk)h^*{i5aWfqI2;li}#jz|RRL`%ppN3@bzW;{7aO{Z$JR_7o03rNXq5c_5pg5oe sU(6QM%j*tDsaxm&{5hTQZ6|X33xT;-Fyg%LE&u=k07*qoM6N<$f?Kq8fdBvi literal 0 HcmV?d00001 diff --git a/public/assets/file_ext/video.png b/public/assets/file_ext/video.png new file mode 100644 index 0000000000000000000000000000000000000000..987bf84bc971382cc4f8fc599fd97b058e8f629b GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAc?9@`xB}_*8~!&oe?&w7|Nrmo z{sffz_U+&2&;M4f`SEm`*U>9ap~?)*M=>gTTA-?#1f-Z$av)ajppyVpJe zn#Eoc zH~%j`^MB5n|0&DD%uy2L z7tGM)`Rrli%jXi_D@=i6vproLLp08BJ$sX{$w9#7qTqHdwzNcdmh%7qg|E5@RXsR) zli{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/public/assets/icon/font/glyphicons-halflings-regular.eot b/public/assets/icon/font/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 zcma%hV{j!vx9y2-`@~L8?1^pLwlPU2wr$&<*tR|KBoo`2;LUg6eW-eW-tKDb)vH%` z^`A!Vd<6hNSRMcX|Cb;E|1qflDggj6Kmr)xA10^t-vIc3*Z+F{r%|K(GyE^?|I{=9 zNq`(c8=wS`0!RZy0g3{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6 z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr&^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xCk z>w+s)@`O4(4_I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3eV)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHnf$Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_Bc;$)xN4Ti>Lgg4vaip!%M z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J$F!EB0YF1je9hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901*R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzql5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=>Exm{b@>UCW|c8vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDRcHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!It#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPmSW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIyi(dvG3<1KoVt>kGV=zZiG7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki<`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r)z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_iSZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaEvC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X)Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpECTbfYgPI4#LZq0PKqnPCD}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNcP{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX>EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr!*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o*uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Glu!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53=MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)VNPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^&E4BGc{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a`(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y?=H9EYQy8N$8^bni9TpDp zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tveN{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?OknLw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmODaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOMs=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!HpA5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG>bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4Or&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi`5>MxPe(DmjjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;?bdSt8V&IIi}sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q`rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcLL%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIYFPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8Hy`bv}qbgs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgklJV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzzn|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJfV;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq_#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1;M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}mBO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}#&01rlrW`Z!56xXTGQR4C z3vR~wXq>NDx$c~e?;ia3YjJ*$!C>69a?2$lLyhpI!CFfJsP=|`8@K0|bbMpWwVUEygg0=0x_)HeHpGSJagJNLA3c!$EuOV>j$wi! zbo{vZ(s8tl>@!?}dmNHXo)ABy7ohD7_1G-P@SdJWT8*oeyBVYVW9*vn}&VI4q++W;Z+uz=QTK}^C75!`aFYCX# zf7fC2;o`%!huaTNJAB&VWrx=szU=VLhwnbT`vc<#<`4WI6n_x@AofA~2d90o?1L3w z9!I|#P*NQ)$#9aASijuw>JRld^-t)Zhmy|i-`Iam|IWkguaMR%lhi4p~cX-9& zjfbx}yz}s`4-6>D^+6FzihR)Y!GsUy=_MWi_v7y#KmYi-{iZ+s@ekkq!@Wxz!~BQwiI&ti z>hC&iBe2m(dpNVvSbZe3DVgl(dxHt-k@{xv;&`^c8GJY%&^LpM;}7)B;5Qg5J^E${ z7z~k8eWOucjX6)7q1a%EVtmnND8cclz8R1=X4W@D8IDeUGXxEWe&p>Z*voO0u_2!! zj3dT(Ki+4E;uykKi*yr?w6!BW2FD55PD6SMj`OfBLwXL5EA-9KjpMo4*5Eqs^>4&> z8PezAcn!9jk-h-Oo!E9EjX8W6@EkTHeI<@AY{f|5fMW<-Ez-z)xCvW3()Z#x0oydB zzm4MzY^NdpIF9qMp-jU;99LjlgY@@s+=z`}_%V*xV7nRV*Kwrx-i`FzI0BZ#yOI8# z!SDeNA5b6u9!Imj89v0(g$;dT_y|Yz!3V`i{{_dez8U@##|X9A};s^7vEd!3AcdyVlhVk$v?$O442KIM1-wX^R{U7`JW&lPr3N(%kXfXT_`7w^? z=#ntx`tTF|N$UT?pELvw7T*2;=Q-x@KmDUIbLyXZ>f5=y7z1DT<7>Bp0k;eItHF?1 zErzhlD2B$Tm|^7DrxnTYm-tgg`Mt4Eivp5{r$o9e)8(fXBO4g|G^6Xy?y$SM*&V52 z6SR*%`%DZC^w(gOWQL?6DRoI*hBNT)xW9sxvmi@!vI^!mI$3kvAMmR_q#SGn3zRb_ zGe$=;Tv3dXN~9XuIHow*NEU4y&u}FcZEZoSlXb9IBOA}!@J3uovp}yerhPMaiI8|SDhvWVr z^BE&yx6e3&RYqIg;mYVZ*3#A-cDJ;#ms4txEmwm@g^s`BB}KmSr7K+ruIoKs=s|gOXP|2 zb1!)87h9?(+1^QRWb(Vo8+@G=o24gyuzF3ytfsKjTHZJ}o{YznGcTDm!s)DRnmOX} z3pPL4wExoN$kyc2>#J`k+<67sy-VsfbQ-1u+HkyFR?9G`9r6g4*8!(!c65Be-5hUg zZHY$M0k(Yd+DT1*8)G(q)1&tDl=g9H7!bZTOvEEFnBOk_K=DXF(d4JOaH zI}*A3jGmy{gR>s}EQzyJa_q_?TYPNXRU1O;fcV_&TQZhd{@*8Tgpraf~nT0BYktu*n{a~ub^UUqQPyr~yBY{k2O zgV)honv{B_CqY|*S~3up%Wn%7i*_>Lu|%5~j)}rQLT1ZN?5%QN`LTJ}vA!EE=1`So z!$$Mv?6T)xk)H8JTrZ~m)oNXxS}pwPd#);<*>zWsYoL6iK!gRSBB{JCgB28C#E{T? z5VOCMW^;h~eMke(w6vLlKvm!!TyIf;k*RtK)|Q>_@nY#J%=h%aVb)?Ni_By)XNxY)E3`|}_u}fn+Kp^3p4RbhFUBRtGsDyx9Eolg77iWN z2iH-}CiM!pfYDIn7;i#Ui1KG01{3D<{e}uWTdlX4Vr*nsb^>l0%{O?0L9tP|KGw8w z+T5F}md>3qDZQ_IVkQ|BzuN08uN?SsVt$~wcHO4pB9~ykFTJO3g<4X({-Tm1w{Ufo zI03<6KK`ZjqVyQ(>{_aMxu7Zm^ck&~)Q84MOsQ-XS~{6j>0lTl@lMtfWjj;PT{nlZ zIn0YL?kK7CYJa)(8?unZ)j8L(O}%$5S#lTcq{rr5_gqqtZ@*0Yw4}OdjL*kBv+>+@ z&*24U=y{Nl58qJyW1vTwqsvs=VRAzojm&V zEn6=WzdL1y+^}%Vg!ap>x%%nFi=V#wn# zUuheBR@*KS)5Mn0`f=3fMwR|#-rPMQJg(fW*5e`7xO&^UUH{L(U8D$JtI!ac!g(Ze89<`UiO@L+)^D zjPk2_Ie0p~4|LiI?-+pHXuRaZKG$%zVT0jn!yTvvM^jlcp`|VSHRt-G@_&~<4&qW@ z?b#zIN)G(}L|60jer*P7#KCu*Af;{mpWWvYK$@Squ|n-Vtfgr@ZOmR5Xpl;0q~VILmjk$$mgp+`<2jP z@+nW5Oap%fF4nFwnVwR7rpFaOdmnfB$-rkO6T3#w^|*rft~acgCP|ZkgA6PHD#Of| zY%E!3tXtsWS`udLsE7cSE8g@p$ceu*tI71V31uA7jwmXUCT7+Cu3uv|W>ZwD{&O4Nfjjvl43N#A$|FWxId! z%=X!HSiQ-#4nS&smww~iXRn<-`&zc)nR~js?|Ei-cei$^$KsqtxNDZvl1oavXK#Pz zT&%Wln^Y5M95w=vJxj0a-ko_iQt(LTX_5x#*QfQLtPil;kkR|kz}`*xHiLWr35ajx zHRL-QQv$|PK-$ges|NHw8k6v?&d;{A$*q15hz9{}-`e6ys1EQ1oNNKDFGQ0xA!x^( zkG*-ueZT(GukSnK&Bs=4+w|(kuWs5V_2#3`!;f}q?>xU5IgoMl^DNf+Xd<=sl2XvkqviJ>d?+G@Z5nxxd5Sqd$*ENUB_mb8Z+7CyyU zA6mDQ&e+S~w49csl*UePzY;^K)Fbs^%?7;+hFc(xz#mWoek4_&QvmT7Fe)*{h-9R4 zqyXuN5{)HdQ6yVi#tRUO#M%;pL>rQxN~6yoZ)*{{!?jU)RD*oOxDoTjVh6iNmhWNC zB5_{R=o{qvxEvi(khbRS`FOXmOO|&Dj$&~>*oo)bZz%lPhEA@ zQ;;w5eu5^%i;)w?T&*=UaK?*|U3~{0tC`rvfEsRPgR~16;~{_S2&=E{fE2=c>{+y} zx1*NTv-*zO^px5TA|B```#NetKg`19O!BK*-#~wDM@KEllk^nfQ2quy25G%)l72<> zzL$^{DDM#jKt?<>m;!?E2p0l12`j+QJjr{Lx*47Nq(v6i3M&*P{jkZB{xR?NOSPN% zU>I+~d_ny=pX??qjF*E78>}Mgts@_yn`)C`wN-He_!OyE+gRI?-a>Om>Vh~3OX5+& z6MX*d1`SkdXwvb7KH&=31RCC|&H!aA1g_=ZY0hP)-Wm6?A7SG0*|$mC7N^SSBh@MG z9?V0tv_sE>X==yV{)^LsygK2=$Mo_0N!JCOU?r}rmWdHD%$h~~G3;bt`lH& zAuOOZ=G1Mih**0>lB5x+r)X^8mz!0K{SScj4|a=s^VhUEp#2M=^#WRqe?T&H9GnWa zYOq{+gBn9Q0e0*Zu>C(BAX=I-Af9wIFhCW6_>TsIH$d>|{fIrs&BX?2G>GvFc=<8` zVJ`#^knMU~65dWGgXcht`Kb>{V2oo%<{NK|iH+R^|Gx%q+env#Js*(EBT3V0=w4F@W+oLFsA)l7Qy8mx_;6Vrk;F2RjKFvmeq} zro&>@b^(?f))OoQ#^#s)tRL>b0gzhRYRG}EU%wr9GjQ#~Rpo|RSkeik^p9x2+=rUr}vfnQoeFAlv=oX%YqbLpvyvcZ3l$B z5bo;hDd(fjT;9o7g9xUg3|#?wU2#BJ0G&W1#wn?mfNR{O7bq747tc~mM%m%t+7YN}^tMa24O4@w<|$lk@pGx!;%pKiq&mZB z?3h<&w>un8r?Xua6(@Txu~Za9tI@|C4#!dmHMzDF_-_~Jolztm=e)@vG11bZQAs!tFvd9{C;oxC7VfWq377Y(LR^X_TyX9bn$)I765l=rJ%9uXcjggX*r?u zk|0!db_*1$&i8>d&G3C}A`{Fun_1J;Vx0gk7P_}8KBZDowr*8$@X?W6v^LYmNWI)lN92yQ;tDpN zOUdS-W4JZUjwF-X#w0r;97;i(l}ZZT$DRd4u#?pf^e2yaFo zbm>I@5}#8FjsmigM8w_f#m4fEP~r~_?OWB%SGWcn$ThnJ@Y`ZI-O&Qs#Y14To( zWAl>9Gw7#}eT(!c%D0m>5D8**a@h;sLW=6_AsT5v1Sd_T-C4pgu_kvc?7+X&n_fct znkHy(_LExh=N%o3I-q#f$F4QJpy>jZBW zRF7?EhqTGk)w&Koi}QQY3sVh?@e-Z3C9)P!(hMhxmXLC zF_+ZSTQU`Gqx@o(~B$dbr zHlEUKoK&`2gl>zKXlEi8w6}`X3kh3as1~sX5@^`X_nYl}hlbpeeVlj#2sv)CIMe%b zBs7f|37f8qq}gA~Is9gj&=te^wN8ma?;vF)7gce;&sZ64!7LqpR!fy)?4cEZposQ8 zf;rZF7Q>YMF1~eQ|Z*!5j0DuA=`~VG$Gg6B?Om1 z6fM@`Ck-K*k(eJ)Kvysb8sccsFf@7~3vfnC=<$q+VNv)FyVh6ZsWw}*vs>%k3$)9| zR9ek-@pA23qswe1io)(Vz!vS1o*XEN*LhVYOq#T`;rDkgt86T@O`23xW~;W_#ZS|x zvwx-XMb7_!hIte-#JNpFxskMMpo2OYhHRr0Yn8d^(jh3-+!CNs0K2B!1dL$9UuAD= zQ%7Ae(Y@}%Cd~!`h|wAdm$2WoZ(iA1(a_-1?znZ%8h72o&Mm*4x8Ta<4++;Yr6|}u zW8$p&izhdqF=m8$)HyS2J6cKyo;Yvb>DTfx4`4R{ zPSODe9E|uflE<`xTO=r>u~u=NuyB&H!(2a8vwh!jP!yfE3N>IiO1jI>7e&3rR#RO3_}G23W?gwDHgSgekzQ^PU&G5z&}V5GO? zfg#*72*$DP1T8i`S7=P;bQ8lYF9_@8^C(|;9v8ZaK2GnWz4$Th2a0$)XTiaxNWfdq z;yNi9veH!j)ba$9pke8`y2^63BP zIyYKj^7;2don3se!P&%I2jzFf|LA&tQ=NDs{r9fIi-F{-yiG-}@2`VR^-LIFN8BC4 z&?*IvLiGHH5>NY(Z^CL_A;yISNdq58}=u~9!Ia7 zm7MkDiK~lsfLpvmPMo!0$keA$`%Tm`>Fx9JpG^EfEb(;}%5}B4Dw!O3BCkf$$W-dF z$BupUPgLpHvr<<+QcNX*w@+Rz&VQz)Uh!j4|DYeKm5IC05T$KqVV3Y|MSXom+Jn8c zgUEaFW1McGi^44xoG*b0JWE4T`vka7qTo#dcS4RauUpE{O!ZQ?r=-MlY#;VBzhHGU zS@kCaZ*H73XX6~HtHd*4qr2h}Pf0Re@!WOyvres_9l2!AhPiV$@O2sX>$21)-3i+_ z*sHO4Ika^!&2utZ@5%VbpH(m2wE3qOPn-I5Tbnt&yn9{k*eMr3^u6zG-~PSr(w$p> zw)x^a*8Ru$PE+{&)%VQUvAKKiWiwvc{`|GqK2K|ZMy^Tv3g|zENL86z7i<c zW`W>zV1u}X%P;Ajn+>A)2iXZbJ5YB_r>K-h5g^N=LkN^h0Y6dPFfSBh(L`G$D%7c` z&0RXDv$}c7#w*7!x^LUes_|V*=bd&aP+KFi((tG*gakSR+FA26%{QJdB5G1F=UuU&koU*^zQA=cEN9}Vd?OEh| zgzbFf1?@LlPkcXH$;YZe`WEJ3si6&R2MRb}LYK&zK9WRD=kY-JMPUurX-t4(Wy{%` zZ@0WM2+IqPa9D(^*+MXw2NWwSX-_WdF0nMWpEhAyotIgqu5Y$wA=zfuXJ0Y2lL3#ji26-P3Z?-&0^KBc*`T$+8+cqp`%g0WB zTH9L)FZ&t073H4?t=(U6{8B+uRW_J_n*vW|p`DugT^3xe8Tomh^d}0k^G7$3wLgP& zn)vTWiMA&=bR8lX9H=uh4G04R6>C&Zjnx_f@MMY!6HK5v$T%vaFm;E8q=`w2Y}ucJ zkz~dKGqv9$E80NTtnx|Rf_)|3wxpnY6nh3U9<)fv2-vhQ6v=WhKO@~@X57N-`7Ppc zF;I7)eL?RN23FmGh0s;Z#+p)}-TgTJE%&>{W+}C`^-sy{gTm<$>rR z-X7F%MB9Sf%6o7A%ZHReD4R;imU6<9h81{%avv}hqugeaf=~^3A=x(Om6Lku-Pn9i zC;LP%Q7Xw*0`Kg1)X~nAsUfdV%HWrpr8dZRpd-#%)c#Fu^mqo|^b{9Mam`^Zw_@j@ zR&ZdBr3?@<@%4Z-%LT&RLgDUFs4a(CTah_5x4X`xDRugi#vI-cw*^{ncwMtA4NKjByYBza)Y$hozZCpuxL{IP&=tw6ZO52WY3|iwGf&IJCn+u(>icK zZB1~bWXCmwAUz|^<&ysd#*!DSp8}DLNbl5lRFat4NkvItxy;9tpp9~|@ z;JctShv^Iq4(z+y7^j&I?GCdKMVg&jCwtCkc4*@O7HY*veGDBtAIn*JgD$QftP}8= zxFAdF=(S>Ra6(4slk#h%b?EOU-96TIX$Jbfl*_7IY-|R%H zF8u|~hYS-YwWt5+^!uGcnKL~jM;)ObZ#q68ZkA?}CzV-%6_vPIdzh_wHT_$mM%vws9lxUj;E@#1UX?WO2R^41(X!nk$+2oJGr!sgcbn1f^yl1 z#pbPB&Bf;1&2+?};Jg5qgD1{4_|%X#s48rOLE!vx3@ktstyBsDQWwDz4GYlcgu$UJ zp|z_32yN72T*oT$SF8<}>e;FN^X&vWNCz>b2W0rwK#<1#kbV)Cf`vN-F$&knLo5T& z8!sO-*^x4=kJ$L&*h%rQ@49l?7_9IG99~xJDDil00<${~D&;kiqRQqeW5*22A`8I2 z(^@`qZoF7_`CO_e;8#qF!&g>UY;wD5MxWU>azoo=E{kW(GU#pbOi%XAn%?W{b>-bTt&2?G=E&BnK9m0zs{qr$*&g8afR_x`B~o zd#dxPpaap;I=>1j8=9Oj)i}s@V}oXhP*{R|@DAQXzQJekJnmuQ;vL90_)H_nD1g6e zS1H#dzg)U&6$fz0g%|jxDdz|FQN{KJ&Yx0vfuzAFewJjv`pdMRpY-wU`-Y6WQnJ(@ zGVb!-8DRJZvHnRFiR3PG3Tu^nCn(CcZHh7hQvyd7i6Q3&ot86XI{jo%WZqCPcTR0< zMRg$ZE=PQx66ovJDvI_JChN~k@L^Pyxv#?X^<)-TS5gk`M~d<~j%!UOWG;ZMi1af< z+86U0=sm!qAVJAIqqU`Qs1uJhQJA&n@9F1PUrYuW!-~IT>l$I!#5dBaiAK}RUufjg{$#GdQBkxF1=KU2E@N=i^;xgG2Y4|{H>s` z$t`k8c-8`fS7Yfb1FM#)vPKVE4Uf(Pk&%HLe z%^4L>@Z^9Z{ZOX<^e)~adVRkKJDanJ6VBC_m@6qUq_WF@Epw>AYqf%r6qDzQ~AEJ!jtUvLp^CcqZ^G-;Kz3T;O4WG45Z zFhrluCxlY`M+OKr2SeI697btH7Kj`O>A!+2DTEQ=48cR>Gg2^5uqp(+y5Sl09MRl* zp|28!v*wvMd_~e2DdKDMMQ|({HMn3D%%ATEecGG8V9>`JeL)T0KG}=}6K8NiSN5W< z79-ZdYWRUb`T}(b{RjN8>?M~opnSRl$$^gT`B27kMym5LNHu-k;A;VF8R(HtDYJHS zU7;L{a@`>jd0svOYKbwzq+pWSC(C~SPgG~nWR3pBA8@OICK$Cy#U`kS$I;?|^-SBC zBFkoO8Z^%8Fc-@X!KebF2Ob3%`8zlVHj6H;^(m7J35(_bS;cZPd}TY~qixY{MhykQ zV&7u7s%E=?i`}Ax-7dB0ih47w*7!@GBt<*7ImM|_mYS|9_K7CH+i}?*#o~a&tF-?C zlynEu1DmiAbGurEX2Flfy$wEVk7AU;`k#=IQE*6DMWafTL|9-vT0qs{A3mmZGzOyN zcM9#Rgo7WgB_ujU+?Q@Ql?V-!E=jbypS+*chI&zA+C_3_@aJal}!Q54?qsL0In({Ly zjH;e+_SK8yi0NQB%TO+Dl77jp#2pMGtwsgaC>K!)NimXG3;m7y`W+&<(ZaV>N*K$j zLL~I+6ouPk6_(iO>61cIsinx`5}DcKSaHjYkkMuDoVl>mKO<4$F<>YJ5J9A2Vl}#BP7+u~L8C6~D zsk`pZ$9Bz3teQS1Wb|8&c2SZ;qo<#F&gS;j`!~!ADr(jJXMtcDJ9cVi>&p3~{bqaP zgo%s8i+8V{UrYTc9)HiUR_c?cfx{Yan2#%PqJ{%?Wux4J;T$#cumM0{Es3@$>}DJg zqe*c8##t;X(4$?A`ve)e@YU3d2Balcivot{1(ahlE5qg@S-h(mPNH&`pBX$_~HdG48~)$x5p z{>ghzqqn_t8~pY<5?-To>cy^6o~mifr;KWvx_oMtXOw$$d6jddXG)V@a#lL4o%N@A zNJlQAz6R8{7jax-kQsH6JU_u*En%k^NHlvBB!$JAK!cYmS)HkLAkm0*9G3!vwMIWv zo#)+EamIJHEUV|$d|<)2iJ`lqBQLx;HgD}c3mRu{iK23C>G{0Mp1K)bt6OU?xC4!_ zZLqpFzeu&+>O1F>%g-%U^~yRg(-wSp@vmD-PT#bCWy!%&H;qT7rfuRCEgw67V!Qob z&tvPU@*4*$YF#2_>M0(75QxqrJr3Tvh~iDeFhxl=MzV@(psx%G8|I{~9;tv#BBE`l z3)_98eZqFNwEF1h)uqhBmT~mSmT8k$7vSHdR97K~kM)P9PuZdS;|Op4A?O<*%!?h` zn`}r_j%xvffs46x2hCWuo0BfIQWCw9aKkH==#B(TJ%p}p-RuIVzsRlaPL_Co{&R0h zQrqn=g1PGjQg3&sc2IlKG0Io#v%@p>tFwF)RG0ahYs@Zng6}M*d}Xua)+h&?$`%rb z;>M=iMh5eIHuJ5c$aC`y@CYjbFsJnSPH&}LQz4}za9YjDuao>Z^EdL@%saRm&LGQWXs*;FzwN#pH&j~SLhDZ+QzhplV_ij(NyMl z;v|}amvxRddO81LJFa~2QFUs z+Lk zZck)}9uK^buJNMo4G(rSdX{57(7&n=Q6$QZ@lIO9#<3pA2ceDpO_340B*pHlh_y{>i&c1?vdpN1j>3UN-;;Yq?P+V5oY`4Z(|P8SwWq<)n`W@AwcQ?E9 zd5j8>FT^m=MHEWfN9jS}UHHsU`&SScib$qd0i=ky0>4dz5ADy70AeIuSzw#gHhQ_c zOp1!v6qU)@8MY+ zMNIID?(CysRc2uZQ$l*QZVY)$X?@4$VT^>djbugLQJdm^P>?51#lXBkdXglYm|4{L zL%Sr?2f`J+xrcN@=0tiJt(<-=+v>tHy{XaGj7^cA6felUn_KPa?V4ebfq7~4i~GKE zpm)e@1=E;PP%?`vK6KVPKXjUXyLS1^NbnQ&?z>epHCd+J$ktT1G&L~T)nQeExe;0Z zlei}<_ni ztFo}j7nBl$)s_3odmdafVieFxc)m!wM+U`2u%yhJ90giFcU1`dR6BBTKc2cQ*d zm-{?M&%(={xYHy?VCx!ogr|4g5;V{2q(L?QzJGsirn~kWHU`l`rHiIrc-Nan!hR7zaLsPr4uR zG{En&gaRK&B@lyWV@yfFpD_^&z>84~_0Rd!v(Nr%PJhFF_ci3D#ixf|(r@$igZiWw za*qbXIJ_Hm4)TaQ=zW^g)FC6uvyO~Hg-#Z5Vsrybz6uOTF>Rq1($JS`imyNB7myWWpxYL(t7`H8*voI3Qz6mvm z$JxtArLJ(1wlCO_te?L{>8YPzQ})xJlvc5wv8p7Z=HviPYB#^#_vGO#*`<0r%MR#u zN_mV4vaBb2RwtoOYCw)X^>r{2a0kK|WyEYoBjGxcObFl&P*??)WEWKU*V~zG5o=s@ z;rc~uuQQf9wf)MYWsWgPR!wKGt6q;^8!cD_vxrG8GMoFGOVV=(J3w6Xk;}i)9(7*U zwR4VkP_5Zx7wqn8%M8uDj4f1aP+vh1Wue&ry@h|wuN(D2W;v6b1^ z`)7XBZ385zg;}&Pt@?dunQ=RduGRJn^9HLU&HaeUE_cA1{+oSIjmj3z+1YiOGiu-H zf8u-oVnG%KfhB8H?cg%@#V5n+L$MO2F4>XoBjBeX>css^h}Omu#)ExTfUE^07KOQS znMfQY2wz?!7!{*C^)aZ^UhMZf=TJNDv8VrrW;JJ9`=|L0`w9DE8MS>+o{f#{7}B4P z{I34>342vLsP}o=ny1eZkEabr@niT5J2AhByUz&i3Ck0H*H`LRHz;>3C_ru!X+EhJ z6(+(lI#4c`2{`q0o9aZhI|jRjBZOV~IA_km7ItNtUa(Wsr*Hmb;b4=;R(gF@GmsRI`pF+0tmq0zy~wnoJD(LSEwHjTOt4xb0XB-+ z&4RO{Snw4G%gS9w#uSUK$Zbb#=jxEl;}6&!b-rSY$0M4pftat-$Q)*y!bpx)R%P>8 zrB&`YEX2%+s#lFCIV;cUFUTIR$Gn2%F(3yLeiG8eG8&)+cpBlzx4)sK?>uIlH+$?2 z9q9wk5zY-xr_fzFSGxYp^KSY0s%1BhsI>ai2VAc8&JiwQ>3RRk?ITx!t~r45qsMnj zkX4bl06ojFCMq<9l*4NHMAtIxDJOX)H=K*$NkkNG<^nl46 zHWH1GXb?Og1f0S+8-((5yaeegCT62&4N*pNQY;%asz9r9Lfr;@Bl${1@a4QAvMLbV6JDp>8SO^q1)#(o%k!QiRSd0eTmzC< zNIFWY5?)+JTl1Roi=nS4%@5iF+%XztpR^BSuM~DX9q`;Mv=+$M+GgE$_>o+~$#?*y zAcD4nd~L~EsAjXV-+li6Lua4;(EFdi|M2qV53`^4|7gR8AJI;0Xb6QGLaYl1zr&eu zH_vFUt+Ouf4SXA~ z&Hh8K@ms^`(hJfdicecj>J^Aqd00^ccqN!-f-!=N7C1?`4J+`_f^nV!B3Q^|fuU)7 z1NDNT04hd4QqE+qBP+>ZE7{v;n3OGN`->|lHjNL5w40pePJ?^Y6bFk@^k%^5CXZ<+4qbOplxpe)l7c6m%o-l1oWmCx%c6@rx85hi(F=v(2 zJ$jN>?yPgU#DnbDXPkHLeQwED5)W5sH#-eS z%#^4dxiVs{+q(Yd^ShMN3GH)!h!@W&N`$L!SbElXCuvnqh{U7lcCvHI#{ZjwnKvu~ zAeo7Pqot+Ohm{8|RJsTr3J4GjCy5UTo_u_~p)MS&Z5UrUc|+;Mc(YS+ju|m3Y_Dvt zonVtpBWlM718YwaN3a3wUNqX;7TqvAFnVUoD5v5WTh~}r)KoLUDw%8Rrqso~bJqd> z_T!&Rmr6ebpV^4|knJZ%qmzL;OvG3~A*loGY7?YS%hS{2R0%NQ@fRoEK52Aiu%gj( z_7~a}eQUh8PnyI^J!>pxB(x7FeINHHC4zLDT`&C*XUpp@s0_B^!k5Uu)^j_uuu^T> z8WW!QK0SgwFHTA%M!L`bl3hHjPp)|wL5Var_*A1-H8LV?uY5&ou{hRjj>#X@rxV>5%-9hbP+v?$4}3EfoRH;l_wSiz{&1<+`Y5%o%q~4rdpRF0jOsCoLnWY5x?V)0ga>CDo`NpqS) z@x`mh1QGkx;f)p-n^*g5M^zRTHz%b2IkLBY{F+HsjrFC9_H(=9Z5W&Eymh~A_FUJ} znhTc9KG((OnjFO=+q>JQZJbeOoUM77M{)$)qQMcxK9f;=L;IOv_J>*~w^YOW744QZ zoG;!b9VD3ww}OX<8sZ0F##8hvfDP{hpa3HjaLsKbLJ8 z0WpY2E!w?&cWi7&N%bOMZD~o7QT*$xCRJ@{t31~qx~+0yYrLXubXh2{_L699Nl_pn z6)9eu+uUTUdjHXYs#pX^L)AIb!FjjNsTp7C399w&B{Q4q%yKfmy}T2uQdU|1EpNcY zDk~(h#AdxybjfzB+mg6rdU9mDZ^V>|U13Dl$Gj+pAL}lR2a1u!SJXU_YqP9N{ose4 zk+$v}BIHX60WSGVWv;S%zvHOWdDP(-ceo(<8`y@Goy%4wDu>57QZNJc)f>Ls+}9h7 z^N=#3q3|l?aG8K#HwiW2^PJu{v|x5;awYfahC?>_af3$LmMc4%N~JwVlRZa4c+eW2 zE!zosAjOv&UeCeu;Bn5OQUC=jtZjF;NDk9$fGbxf3d29SUBekX1!a$Vmq_VK*MHQ4)eB!dQrHH)LVYNF%-t8!d`@!cb z2CsKs3|!}T^7fSZm?0dJ^JE`ZGxA&a!jC<>6_y67On0M)hd$m*RAzo_qM?aeqkm`* zXpDYcc_>TFZYaC3JV>{>mp(5H^efu!Waa7hGTAts29jjuVd1vI*fEeB?A&uG<8dLZ z(j6;-%vJ7R0U9}XkH)1g>&uptXPHBEA*7PSO2TZ+dbhVxspNW~ZQT3fApz}2 z_@0-lZODcd>dLrYp!mHn4k>>7kibI!Em+Vh*;z}l?0qro=aJt68joCr5Jo(Vk<@i) z5BCKb4p6Gdr9=JSf(2Mgr=_6}%4?SwhV+JZj3Ox^_^OrQk$B^v?eNz}d^xRaz&~ zKVnlLnK#8^y=If2f1zmb~^5lPLe?%l}>?~wN4IN((2~U{e9fKhLMtYFj)I$(y zgnKv?R+ZpxA$f)Q2l=aqE6EPTK=i0sY&MDFJp!vQayyvzh4wee<}kybNthRlX>SHh z7S}9he^EBOqzBCww^duHu!u+dnf9veG{HjW!}aT7aJqzze9K6-Z~8pZAgdm1n~aDs z8_s7?WXMPJ3EPJHi}NL&d;lZP8hDhAXf5Hd!x|^kEHu`6QukXrVdLnq5zbI~oPo?7 z2Cbu8U?$K!Z4_yNM1a(bL!GRe!@{Qom+DxjrJ!B99qu5b*Ma%^&-=6UEbC+S2zX&= zQ!%bgJTvmv^2}hhvNQg!l=kbapAgM^hruE3k@jTxsG(B6d=4thBC*4tzVpCYXFc$a zeqgVB^zua)y-YjpiibCCdU%txXYeNFnXcbNj*D?~)5AGjL+!!ij_4{5EWKGav0^={~M^q}baAFOPzxfUM>`KPf|G z&hsaR*7(M6KzTj8Z?;45zX@L#xU{4n$9Q_<-ac(y4g~S|Hyp^-<*d8+P4NHe?~vfm z@y309=`lGdvN8*jw-CL<;o#DKc-%lb0i9a3%{v&2X($|Qxv(_*()&=xD=5oBg=$B0 zU?41h9)JKvP0yR{KsHoC>&`(Uz>?_`tlLjw1&5tPH3FoB%}j;yffm$$s$C=RHi`I3*m@%CPqWnP@B~%DEe;7ZT{9!IMTo1hT3Q347HJ&!)BM2 z3~aClf>aFh0_9||4G}(Npu`9xYY1*SD|M~9!CCFn{-J$u2&Dg*=5$_nozpoD2nxqq zB!--eA8UWZlcEDp4r#vhZ6|vq^9sFvRnA9HpHch5Mq4*T)oGbruj!U8Lx_G%Lby}o zTQ-_4A7b)5A42vA0U}hUJq6&wQ0J%$`w#ph!EGmW96)@{AUx>q6E>-r^Emk!iCR+X zdIaNH`$}7%57D1FyTccs3}Aq0<0Ei{`=S7*>pyg=Kv3nrqblqZcpsCWSQl^uMSsdj zYzh73?6th$c~CI0>%5@!Ej`o)Xm38u0fp9=HE@Sa6l2oX9^^4|Aq%GA z3(AbFR9gA_2T2i%Ck5V2Q2WW-(a&(j#@l6wE4Z`xg#S za#-UWUpU2U!TmIo`CN0JwG^>{+V#9;zvx;ztc$}@NlcyJr?q(Y`UdW6qhq!aWyB5xV1#Jb{I-ghFNO0 zFU~+QgPs{FY1AbiU&S$QSix>*rqYVma<-~s%ALhFyVhAYepId1 zs!gOB&weC18yhE-v6ltKZMV|>JwTX+X)Y_EI(Ff^3$WTD|Ea-1HlP;6L~&40Q&5{0 z$e$2KhUgH8ucMJxJV#M%cs!d~#hR^nRwk|uuCSf6irJCkSyI<%CR==tftx6d%;?ef zYIcjZrP@APzbtOeUe>m-TW}c-ugh+U*RbL1eIY{?>@8aW9bb1NGRy@MTse@>= za%;5=U}X%K2tKTYe9gjMcBvX%qrC&uZ`d(t)g)X8snf?vBe3H%dG=bl^rv8Z@YN$gd9yveHY0@Wt0$s zh^7jCp(q+6XDoekb;=%y=Wr8%6;z0ANH5dDR_VudDG|&_lYykJaiR+(y{zpR=qL3|2e${8 z2V;?jgHj7}Kl(d8C9xWRjhpf_)KOXl+@c4wrHy zL3#9U(`=N59og2KqVh>nK~g9>fX*PI0`>i;;b6KF|8zg+k2hViCt}4dfMdvb1NJ-Rfa7vL2;lPK{Lq*u`JT>S zoM_bZ_?UY6oV6Ja14X^;LqJPl+w?vf*C!nGK;uU^0GRN|UeFF@;H(Hgp8x^|;ygh? zIZx3DuO(lD01ksanR@Mn#lti=p28RTNYY6yK={RMFiVd~k8!@a&^jicZ&rxD3CCI! zVb=fI?;c#f{K4Pp2lnb8iF2mig)|6JEmU86Y%l}m>(VnI*Bj`a6qk8QL&~PFDxI8b z2mcsQBe9$q`Q$LfG2wdvK`M1}7?SwLAV&)nO;kAk`SAz%x9CDVHVbUd$O(*aI@D|s zLxJW7W(QeGpQY<$dSD6U$ja(;Hb3{Zx@)*fIQaW{8<$KJ&fS0caI2Py^clOq9@Irt z7th7F?7W`j{&UmM==Lo~T&^R7A?G=K_e-zfTX|)i`pLitlNE(~tq*}sS1x2}Jlul6 z5+r#4SpQu8h{ntIv#qCVH`uG~+I8l+7ZG&d`Dm!+(rZQDV*1LS^WfH%-!5aTAxry~ z4xl&rot5ct{xQ$w$MtVTUi6tBFSJWq2Rj@?HAX1H$eL*fk{Hq;E`x|hghRkipYNyt zKCO=*KSziiVk|+)qQCGrTYH9X!Z0$k{Nde~0Wl`P{}ca%nv<6fnYw^~9dYxTnTZB&&962jX0DM&wy&8fdxX8xeHSe=UU&Mq zRTaUKnQO|A>E#|PUo+F=Q@dMdt`P*6e92za(TH{5C*2I2S~p?~O@hYiT>1(n^Lqqn zqewq3ctAA%0E)r53*P-a8Ak32mGtUG`L^WVcm`QovX`ecB4E9X60wrA(6NZ7z~*_DV_e z8$I*eZ8m=WtChE{#QzeyHpZ%7GwFHlwo2*tAuloI-j2exx3#x7EL^&D;Re|Kj-XT- zt908^soV2`7s+Hha!d^#J+B)0-`{qIF_x=B811SZlbUe%kvPce^xu7?LY|C z@f1gRPha1jq|=f}Se)}v-7MWH9)YAs*FJ&v3ZT9TSi?e#jarin0tjPNmxZNU_JFJG z+tZi!q)JP|4pQ)?l8$hRaPeoKf!3>MM-bp06RodLa*wD=g3)@pYJ^*YrwSIO!SaZo zDTb!G9d!hb%Y0QdYxqNSCT5o0I!GDD$Z@N!8J3eI@@0AiJmD7brkvF!pJGg_AiJ1I zO^^cKe`w$DsO|1#^_|`6XTfw6E3SJ(agG*G9qj?JiqFSL|6tSD6vUwK?Cwr~gg)Do zp@$D~7~66-=p4`!!UzJDKAymb!!R(}%O?Uel|rMH>OpRGINALtg%gpg`=}M^Q#V5( zMgJY&gF)+;`e38QHI*c%B}m94o&tOfae;og&!J2;6ENW}QeL73jatbI1*9X~y=$Dm%6FwDcnCyMRL}zo`0=y7=}*Uw zo3!qZncAL{HCgY!+}eKr{P8o27ye+;qJP;kOB%RpSesGoHLT6tcYp*6v~Z9NCyb6m zP#qds0jyqXX46qMNhXDn3pyIxw2f_z;L_X9EIB}AhyC`FYI}G3$WnW>#NMy{0aw}nB%1=Z4&*(FaCn5QG(zvdG^pQRU25;{wwG4h z@kuLO0F->{@g2!;NNd!PfqM-;@F0;&wK}0fT9UrH}(8A5I zt33(+&U;CLN|8+71@g z(s!f-kZZZILUG$QXm9iYiE*>2w;gpM>lgM{R9vT3q>qI{ELO2hJHVi`)*jzOk$r)9 zq}$VrE0$GUCm6A3H5J-=Z9i*biw8ng zi<1nM0lo^KqRY@Asucc#DMmWsnCS;5uPR)GL3pL=-IqSd>4&D&NKSGHH?pG;=Xo`w zw~VV9ddkwbp~m>9G0*b?j7-0fOwR?*U#BE#n7A=_fDS>`fwatxQ+`FzhBGQUAyIRZ??eJt46vHBlR>9m!vfb6I)8!v6TmtZ%G6&E|1e zOtx5xy%yOSu+<9Ul5w5N=&~4Oph?I=ZKLX5DXO(*&Po>5KjbY7s@tp$8(fO|`Xy}Y z;NmMypLoG7r#Xz4aHz7n)MYZ7Z1v;DFHLNV{)to;(;TJ=bbMgud96xRMME#0d$z-S z-r1ROBbW^&YdQWA>U|Y>{whex#~K!ZgEEk=LYG8Wqo28NFv)!t!~}quaAt}I^y-m| z8~E{9H2VnyVxb_wCZ7v%y(B@VrM6lzk~|ywCi3HeiSV`TF>j+Ijd|p*kyn;=mqtf8&DK^|*f+y$38+9!sis9N=S)nINm9=CJ<;Y z!t&C>MIeyou4XLM*ywT_JuOXR>VkpFwuT9j5>667A=CU*{TBrMTgb4HuW&!%Yt`;#md7-`R`ouOi$rEd!ErI zo#>qggAcx?C7`rQ2;)~PYCw%CkS(@EJHZ|!!lhi@Dp$*n^mgrrImsS~(ioGak>3)w zvop0lq@IISuA0Ou*#1JkG{U>xSQV1e}c)!d$L1plFX5XDXX5N7Ns{kT{y5|6MfhBD+esT)e7&CgSW8FxsXTAY=}?0A!j_V9 zJ;IJ~d%av<@=fNPJ9)T3qE78kaz64E>dJaYab5uaU`n~Zdp2h{8DV%SKE5G^$LfuOTRRjB;TnT(Jk$r{Pfe4CO!SM_7d)I zquW~FVCpSycJ~c*B*V8?Qqo=GwU8CkmmLFugfHQ7;A{yCy1OL-+X=twLYg9|H=~8H znnN@|tCs^ZLlCBl5wHvYF}2vo>a6%mUWpTds_mt*@wMN4-r`%NTA%+$(`m6{MNpi@ zMx)8f>U4hd!row@gM&PVo&Hx+lV@$j9yWTjTue zG9n0DP<*HUmJ7ZZWwI2x+{t3QEfr6?T}2iXl=6e0b~)J>X3`!fXd9+2wc1%cj&F@Z zgYR|r5Xd5jy9;YW&=4{-0rJ*L5CgDPj9^3%bp-`HkyBs`j1iTUGD4?WilZ6RO8mIE z+~Joc?GID6K96dyuv(dWREK9Os~%?$$FxswxQsoOi8M?RnL%B~Lyk&(-09D0M?^Jy zWjP)n(b)TF<-|CG%!Vz?8Fu&6iU<>oG#kGcrcrrBlfZMVl0wOJvsq%RL9To%iCW@)#& zZAJWhgzYAq)#NTNb~3GBcD%ZZOc43!YWSyA7TD6xkk)n^FaRAz73b}%9d&YisBic(?mv=Iq^r%Ug zzHq-rRrhfOOF+yR=AN!a9*Rd#sM9ONt5h~w)yMP7Dl9lfpi$H0%GPW^lS4~~?vI8Z z%^ToK#NOe0ExmUsb`lLO$W*}yXNOxPe@zD*90uTDULnH6C?InP3J=jYEO2d)&e|mP z1DSd0QOZeuLWo*NqZzopA+LXy9)fJC00NSX=_4Mi1Z)YyZVC>C!g}cY(Amaj%QN+bev|Xxd2OPD zk!dfkY6k!(sDBvsFC2r^?}hb81(WG5Lt9|riT`2?P;B%jaf5UX<~OJ;uAL$=Ien+V zC!V8u0v?CUa)4*Q+Q_u zkx{q;NjLcvyMuU*{+uDsCQ4U{JLowYby-tn@hatL zy}X>9y08#}oytdn^qfFesF)Tt(2!XGw#r%?7&zzFFh2U;#U9XBO8W--#gOpfbJ`Ey z|M8FCKlWQrOJwE;@Sm02l9OBr7N}go4V8ur)}M@m2uWjggb)DC4s`I4d7_8O&E(j; z?3$9~R$QDxNM^rNh9Y;6P7w+bo2q}NEd6f&_raor-v`UCaTM3TT8HK2-$|n{N@U>_ zL-`P7EXoEU5JRMa)?tNUEe8XFis+w8g9k(QQ)%?&Oac}S`2V$b?%`DwXBgja&&fR@ zH_XidF$p1wA)J|Wk1;?lCl?fgc)=TB3>Y8;BoMqHwJqhL)Tgydv9(?(TBX)fq%=~C zmLj!iX-kn7QA(9snzk0LRf<%SzO&~IhLor6A3f*U^UcoAygRe!H#@UCv$JUP&vPxs zeDj$1%#<2T1!e|!7xI+~_VXLl5|jHqvOhU7ZDUGee;HnkcPP=_k_FFxPjXg*9KyI+ zIh0@+s)1JDSuKMeaDZ3|<_*J8{TUFDLl|mXmY8B>Wj_?4mC#=XjsCKPEO=p0c&t&Z zd1%kHxR#o9S*C?du*}tEHfAC7WetnvS}`<%j=o7YVna)6pw(xzkUi7f#$|^y4WQ{7 zu@@lu=j6xr*11VEIY+`B{tgd(c3zO8%nGk0U^%ec6h)G_`ki|XQXr!?NsQkxzV6Bn1ea9L+@ z(Zr7CU_oXaW>VOdfzENm+FlFQ7Se0ROrNdw(QLvb6{f}HRQ{$Je>(c&rws#{dFI^r zZ4^(`J*G0~Pu_+p5AAh>RRpkcbaS2a?Fe&JqxDTp`dIW9;DL%0wxX5;`KxyA4F{(~_`93>NF@bj4LF!NC&D6Zm+Di$Q-tb2*Q z&csGmXyqA%Z9s(AxNO3@Ij=WGt=UG6J7F;r*uqdQa z?7j!nV{8eQE-cwY7L(3AEXF3&V*9{DpSYdyCjRhv#&2johwf{r+k`QB81%!aRVN<& z@b*N^xiw_lU>H~@4MWzgHxSOGVfnD|iC7=hf0%CPm_@@4^t-nj#GHMug&S|FJtr?i z^JVrobltd(-?Ll>)6>jwgX=dUy+^n_ifzM>3)an3iOzpG9Tu;+96TP<0Jm_PIqof3 zMn=~M!#Ky{CTN_2f7Y-i#|gW~32RCWKA4-J9sS&>kYpTOx#xVNLCo)A$LUme^fVNH z@^S7VU^UJ0YR8?Oy$^IYuG*bm|g;@aX~i60%`7XLy*AYpYvZ^F^U(!|RW z*C!rJ@+7TGdL=nNd1gv^%B+;Fcr$y)i0!GRsZXRHPs>QVGVR{9r_#&Qd(wL|5;H;> zD>HUw=4CF++&{7$<8G@j*nGjhEO%BQYfjeItp4mPvY*JYb1HKd!{HJ9*)(3%BR%{Pp?AM&*yHAJsW({ivOzj*qS!-7|XEn6@zo z3L*tBT%<4RxoAh>q{0n_JBmgW6&8hx?kL(_^k%VL>?xjAyrKBmSl`$=V|SK}ELl}@ zd|d0eo#RfG`bw9SK3%r4Y+rdvc}w}~ixV%tqawbdqvE-WcgE+BUpxMT%F@btm76MG zn=oQRWWuTm+a{dy)Oc2V4yX(@M{QAkx>(QB59*`dLT`Pz3Lsj9iB=HSHAiCq()ns|Cr)1*c605Cx}3V&x}Lg?b+6Q?)z7Kl zQh&1Hx`y6JY-Cwvd*ozeps}a1xAA0CR+Da;+O(i)P1C;SjOI}Dtmf6tPqo-Bl`U78 zv$kYgPntPp@G)n1an9tEoL*Vumu9`>_@I(;+5+fBa-*?fEx=mTEjZ7wq}#@Gd5_cW z!mP{N=yqEntDo)|>oy6{9cu+-3*GTnmb^`O0^FzRPO^&aG`f@F_R*aQ_e{F+_9%NW z4KG_B`@X3EVV9L>?_RNDMddA>w=e0KfAiw5?#i1NFT%Zz#nuv(&!yIU>lVxmzYKQ` zzJ*0w9<&L4aJ6A;0j|_~i>+y(q-=;2Xxhx2v%CYY^{} z^J@LO()eLo|7!{ghQ+(u$wxO*xY#)cL(|miH2_ck2yN{mu4O9=hBW*pM_()-_YdH#Ru{JtwJ^R2}3?!>>m1pohh zrn(!xCjE0Q&EH1QK?zA%sxVh&H99cObJUY$veZhQ)MLu-h%`!*G)s$2k;~+A z)Kk->Ri?`oGDEJEtI*wijm(s5f$W78FH{+qBxiU{~kq((J3uK{m z$|C8K#j-?hm8H@x%VfFqpnvu@xn1s%J7uNZC9C99a<_b1J|mx%)$%!6gPU|~<@2&m zz99GDp`|a%m*iggvfL;4%X;~WY>)@!tMWB@P`)k?$;0x9JSrRI8?s3rlgH(o@`OAo zn{f*gZ#t2u6K??hx|aElOM`Xd0t+SAIUEHvFw%?Wsm$s zUXq{6UU?a>Nc@@Xlb_2k9M1Ctr<#+O?yd}rv z_wu&=_t$!Yngd@N_AUj}T; z#*Ce|%XZr_sQcsWcsl{pCnnj+c8ZNIMmx<;w=-g$Q>BU;9k;w|zQ;4!W32Xg2Cd?{ zvmO3kuKQ^Hv;o>6ZHP8ZJ2`4~Bx?N;cf<0fi=!*G^^WzbTF3e$b&d^qqB{>nqLG81 zs94bBh%|Vj+hLu=!8(b9brJ>ZBns9^6s(gdSVyP9qnu2_I{Sg8j-rloG6{d`De5We zDe5WeY3ga}Y3ga}Y3ga}Y3ga}Y3ga}d8y~6o|k%F>UpW>rJk31Ug~+N=cS&HdOqs; zsOO`ek9t1p`Kafko{xGy>iMbXr=FjBxZMYc8a#gL`Kjlpo}YSt>iMY`pk9DF0qO*( z6QE9jIsxhgs1u-0kUBx8D@eT{^@7w3QZGooAoYUO3sNscy%6<6)C*BBM7L`dk$Xk%6}eZQXgo#!75P`>Uy*-B{uTLGUy*-B{uTLGUy*-B{uTLG))v8{5gt_uj9!t5)^yb-JtjRGrhi zYInOUNJxNyf_yKX01)K=WP|Si>HqEj|B{eUl?MR<)%<1&{(~)D+NPwKxWqT-@~snp zg9KCz1VTZDiS?UH`PRk1VPM{29cgT9=D?!Wc_@}qzggFv;gb@2cJQAYWWtpEZ7?y@jSVqjx${B5UV@SO|wH<<0; z{><1KdVI%Ki}>~<`46C0AggwUwx-|QcU;iiZ{NZu`ur>hd*|Hb(|6veERqxu=b@5Bab=rqptGxd{QJg!4*-i_$sES~)AB46}Fjg|ea#e@?J}z%CUJ zOsLWRQR1#ng^sD)A4FDuY!iUhzlgfJh(J@BRqd&P#v2B`+saBx>m+M&q7vk-75$NH%T5pi%m z5FX?`2-5l53=a&GkC9^NZCLpN5(DMKMwwab$FDIs?q>4!!xBS}75gX_5;(luk;3Vl zLCLd5a_8`Iyz}K}+#RMwu6DVk3O_-}n>aE!4NaD*sQn`GxY?cHe!Bl9n?u&g6?aKm z-P8z&;Q3gr;h`YIxX%z^o&GZZg1=>_+hP2$$-DnL_?7?3^!WAsY4I7|@K;aL<>OTK zByfjl2PA$T83*LM9(;espx-qB%wv7H2i6CFsfAg<9V>Pj*OpwX)l?^mQfr$*OPPS$ z=`mzTYs{*(UW^ij1U8UfXjNoY7GK*+YHht(2oKE&tfZuvAyoN(;_OF>-J6AMmS5fB z^sY6wea&&${+!}@R1f$5oC-2J>J-A${@r(dRzc`wnK>a7~8{Y-scc|ETOI8 zjtNY%Y2!PI;8-@a=O}+{ap1Ewk0@T`C`q!|=KceX9gK8wtOtIC96}-^7)v23Mu;MH zhKyLGOQMujfRG$p(s`(2*nP4EH7*J57^=|%t(#PwCcW7U%e=8Jb>p6~>RAlY4a*ts=pl}_J{->@kKzxH|8XQ5{t=E zV&o`$D#ZHdv&iZWFa)(~oBh-Osl{~CS0hfM7?PyWUWsr5oYlsyC1cwULoQ4|Y5RHA2*rN+EnFPnu z`Y_&Yz*#550YJwDy@brZU>0pWV^RxRjL221@2ABq)AtA%Cz?+FG(}Yh?^v)1Lnh%D zeM{{3&-4#F9rZhS@DT0E(WRkrG!jC#5?OFjZv*xQjUP~XsaxL2rqRKvPW$zHqHr8Urp2Z)L z+)EvQeoeJ8c6A#Iy9>3lxiH3=@86uiTbnnJJJoypZ7gco_*HvKOH97B? zWiwp>+r}*Zf9b3ImxwvjL~h~j<<3shN8$k-$V1p|96I!=N6VBqmb==Bec|*;HUg?) z4!5#R*(#Fe)w%+RH#y{8&%%!|fQ5JcFzUE;-yVYR^&Ek55AXb{^w|@j|&G z|6C-+*On%j;W|f8mj?;679?!qY86c{(s1-PI2Wahoclf%1*8%JAvRh1(0)5Vu37Iz z`JY?RW@qKr+FMmBC{TC7k@}fv-k8t6iO}4K-i3WkF!Lc=D`nuD)v#Na zA|R*no51fkUN3^rmI;tty#IK284*2Zu!kG13!$OlxJAt@zLU`kvsazO25TpJLbK&;M8kw*0)*14kpf*)3;GiDh;C(F}$- z1;!=OBkW#ctacN=je*Pr)lnGzX=OwgNZjTpVbFxqb;8kTc@X&L2XR0A7oc!Mf2?u9 zcctQLCCr+tYipa_k=;1ETIpHt!Jeo;iy^xqBES^Ct6-+wHi%2g&)?7N^Yy zUrMIu){Jk)luDa@7We5U!$$3XFNbyRT!YPIbMKj5$IEpTX1IOtVP~(UPO2-+9ZFi6 z-$3<|{Xb#@tABt0M0s1TVCWKwveDy^S!!@4$s|DAqhsEv--Z}Dl)t%0G>U#ycJ7cy z^8%;|pg32=7~MJmqlC-x07Sd!2YX^|2D`?y;-$a!rZ3R5ia{v1QI_^>gi(HSS_e%2 zUbdg^zjMBBiLr8eSI^BqXM6HKKg#@-w`a**w(}RMe%XWl3MipvBODo*hi?+ykYq)z ziqy4goZw0@VIUY65+L7DaM5q=KWFd$;W3S!Zi>sOzpEF#(*3V-27N;^pDRoMh~(ZD zJLZXIam0lM7U#)119Hm947W)p3$%V`0Tv+*n=&ybF&}h~FA}7hEpA&1Y!BiYIb~~D z$TSo9#3ee02e^%*@4|*+=Nq6&JG5>zX4k5f?)z*#pI-G(+j|jye%13CUdcSP;rNlY z#Q!X%zHf|V)GWIcEz-=fW6AahfxI~y7w7i|PK6H@@twdgH>D_R@>&OtKl}%MuAQ7I zcpFmV^~w~8$4@zzh~P~+?B~%L@EM3x(^KXJSgc6I=;)B6 zpRco2LKIlURPE*XUmZ^|1vb?w*ZfF}EXvY13I4af+()bAI5V?BRbFp`Sb{8GRJHd* z4S2s%4A)6Uc=PK%4@PbJ<{1R6+2THMk0c+kif**#ZGE)w6WsqH z`r^DL&r8|OEAumm^qyrryd(HQ9olv$ltnVGB{aY?_76Uk%6p;e)2DTvF(;t=Q+|8b zqfT(u5@BP);6;jmRAEV057E*2d^wx@*aL1GqWU|$6h5%O@cQtVtC^isd%gD7PZ_Io z_BDP5w(2*)Mu&JxS@X%%ByH_@+l>y07jIc~!@;Raw)q_;9oy@*U#mCnc7%t85qa4? z%_Vr5tkN^}(^>`EFhag;!MpRh!&bKnveQZAJ4)gEJo1@wHtT$Gs6IpznN$Lk-$NcM z3ReVC&qcXvfGX$I0nfkS$a|Pm%x+lq{WweNc;K>a1M@EAVWs2IBcQPiEJNt}+Ea8~WiapASoMvo(&PdUO}AfC~>ZGzqWjd)4no( ziLi#e3lOU~sI*XPH&n&J0cWfoh*}eWEEZW%vX?YK!$?w}htY|GALx3;YZoo=JCF4@ zdiaA-uq!*L5;Yg)z-_`MciiIwDAAR3-snC4V+KA>&V%Ak;p{1u>{Lw$NFj)Yn0Ms2*kxUZ)OTddbiJM}PK!DM}Ot zczn?EZXhx3wyu6i{QMz_Ht%b?K&-@5r;8b076YDir`KXF0&2i9NQ~#JYaq*}Ylb}^ z<{{6xy&;dQ;|@k_(31PDr!}}W$zF7Jv@f%um0M$#=8ygpu%j(VU-d5JtQwT714#f0z+Cm$F9JjGr_G!~NS@L9P;C1? z;Ij2YVYuv}tzU+HugU=f9b1Wbx3418+xj$RKD;$gf$0j_A&c;-OhoF*z@DhEW@d9o zbQBjqEQnn2aG?N9{bmD^A#Um6SDKsm0g{g_<4^dJjg_l_HXdDMk!p`oFv8+@_v_9> zq;#WkQ!GNGfLT7f8m60H@$tu?p;o_It#TApmE`xnZr|_|cb3XXE)N^buLE`9R=Qbg zXJu}6r07me2HU<)S7m?@GzrQDTE3UH?FXM7V+-lT#l}P(U>Fvnyw8T7RTeP`R579m zj=Y>qDw1h-;|mX-)cSXCc$?hr;43LQt)7z$1QG^pyclQ1Bd!jbzsVEgIg~u9b38;> zfsRa%U`l%did6HzPRd;TK{_EW;n^Ivp-%pu0%9G-z@Au{Ry+EqEcqW=z-#6;-!{WA z;l+xC6Zke>dl+(R1q7B^Hu~HmrG~Kt575mzve>x*cL-shl+zqp6yuGX)DDGm`cid! znlnZY=+a5*xQ=$qM}5$N+o!^(TqTFHDdyCcL8NM4VY@2gnNXF|D?5a558Lb*Yfm4) z_;0%2EF7k{)i(tTvS`l5he^KvW%l&-suPwpIlWB_Za1Hfa$@J!emrcyPpTKKM@NqL z?X_SqHt#DucWm<3Lp}W|&YyQE27zbGP55=HtZmB(k*WZA79f##?TweCt{%5yuc+Kx zgfSrIZI*Y57FOD9l@H0nzqOu|Bhrm&^m_RK6^Z<^N($=DDxyyPLA z+J)E(gs9AfaO`5qk$IGGY+_*tEk0n_wrM}n4G#So>8Dw6#K7tx@g;U`8hN_R;^Uw9JLRUgOQ?PTMr4YD5H7=ryv)bPtl=<&4&% z*w6k|D-%Tg*F~sh0Ns(h&mOQ_Qf{`#_XU44(VDY8b})RFpLykg10uxUztD>gswTH} z&&xgt>zc(+=GdM2gIQ%3V4AGxPFW0*l0YsbA|nFZpN~ih4u-P!{39d@_MN)DC%d1w z7>SaUs-g@Hp7xqZ3Tn)e z7x^sC`xJ{V<3YrmbB{h9i5rdancCEyL=9ZOJXoVHo@$$-%ZaNm-75Z-Ry9Z%!^+STWyv~To>{^T&MW0-;$3yc9L2mhq z;ZbQ5LGNM+aN628)Cs16>p55^T^*8$Dw&ss_~4G5Go63gW^CY+0+Z07f2WB4Dh0^q z-|6QgV8__5>~&z1gq0FxDWr`OzmR}3aJmCA^d_eufde7;d|OCrKdnaM>4(M%4V`PxpCJc~UhEuddx9)@)9qe_|i z)0EA%&P@_&9&o#9eqZCUCbh?`j!zgih5sJ%c4(7_#|Xt#r7MVL&Q+^PQEg3MBW;4T zG^4-*8L%s|A}R%*eGdx&i}B1He(mLygTmIAc^G(9Si zK7e{Ngoq>r-r-zhyygK)*9cj8_%g z)`>ANlipCdzw(raeqP-+ldhyUv_VOht+!w*>Sh+Z7(7(l=9~_Vk ztsM|g1xW`?)?|@m2jyAgC_IB`Mtz(O`mwgP15`lPb2V+VihV#29>y=H6ujE#rdnK` zH`EaHzABs~teIrh`ScxMz}FC**_Ii?^EbL(n90b(F0r0PMQ70UkL}tv;*4~bKCiYm zqngRuGy`^c_*M6{*_~%7FmOMquOEZXAg1^kM`)0ZrFqgC>C%RJvQSo_OAA(WF3{euE}GaeA?tu5kF@#62mM$a051I zNhE>u>!gFE8g#Jj95BqHQS%|>DOj71MZ?EYfM+MiJcX?>*}vKfGaBfQFZ3f^Q-R1# znhyK1*RvO@nHb|^i4Ep_0s{lZwCNa;Ix<{E5cUReguJf+72QRZIc%`9-Vy)D zWKhb?FbluyDTgT^naN%l2|rm}oO6D0=3kfXO2L{tqj(kDqjbl(pYz9DykeZlk4iW5 zER`)vqJxx(NOa;so@buE!389-YLbEi@6rZG0#GBsC+Z0fzT6+d7deYVU;dy!rPXiE zmu73@Jr&~K{-9MVQD}&`)e>yLNWr>Yh8CXae9XqfvVQ&eC_;#zpoaMxZ0GpZz7xjx z`t_Q-F?u=vrRPaj3r<9&t6K=+egimiJ8D4gh-rUYvaVy zG($v+3zk5sMuOhjxkH7bQ}(5{PD3Mg?!@8PkK&w>n7tO8FmAmoF30_#^B~c(Q_`4L zYWOoDVSnK|1=p{+@`Fk^Qb81Xf89_S`RSTzv(a4ID%71nll%{Wad$!CKfeTKkyC?n zCkMKHU#*nz_(tO$M)UP&ZfJ#*q(0Gr!E(l5(ce<3xut+_i8XrK8?Xr7_oeHz(bZ?~8q5q~$Rah{5@@7SMN zx9PnJ-5?^xeW2m?yC_7A#WK*B@oIy*Y@iC1n7lYKj&m7vV;KP4TVll=II)$39dOJ^czLRU>L> z68P*PFMN+WXxdAu=Hyt3g$l(GTeTVOZYw3KY|W0Fk-$S_`@9`K=60)bEy?Z%tT+Iq z7f>%M9P)FGg3EY$ood+v$pdsXvG? zd2q3abeu-}LfAQWY@=*+#`CX8RChoA`=1!hS1x5dOF)rGjX4KFg!iPHZE2E=rv|A} zro(8h38LLFljl^>?nJkc+wdY&MOOlVa@6>vBki#gKhNVv+%Add{g6#-@Z$k*ps}0Y zQ=8$)+Nm||)mVz^aa4b-Vpg=1daRaOU)8@BY4jS>=5n#6abG@(F2`=k-eQ9@u# zxfNFHv=z2w@{p1dzSOgHokX1AUGT0DY4jQI@YMw)EWQ~q5wmR$KQ}Y;(HPMSQCwzu zdli|G?bj(>++CP)yQ4s6YfpDc3KqPmquQSxg%*EnTWumWugbDW5ef%8j-rT#3rJu? z)5n;4b2c*;2LIW%LmvUu6t1~di~}0&Svy}QX#ER|hDFZwl!~zUP&}B1oKAxIzt~so zb!GaJYOb#&qRUjEI1xe_`@7qv_-LggQ$JE8+{ryT4%ldwC5ete+{G3C#g@^oxfY3#F zcLlj(l2G8>tC<5XWV|6_DZQZ7ow?MD8EZ9mM2oV~WoV-uoExmbwpzc6eMV}%J_{3l zW(4t2a-o}XRlU|NSiYn!*nR(Sc>*@TuU*(S77gfCi7+WR%2b;4#RiyxWR3(u5BIdf zo@#g4wQjtG3T$PqdX$2z8Zi|QP~I^*9iC+(!;?qkyk&Q7v>DLJGjS44q|%yBz}}>i z&Ve%^6>xY<=Pi9WlwpWB%K10Iz`*#gS^YqMeV9$4qFchMFO}(%y}xs2Hn_E}s4=*3 z+lAeCKtS}9E{l(P=PBI;rsYVG-gw}-_x;KwUefIB@V%RLA&}WU2XCL_?hZHoR<7ED zY}4#P_MmX(_G_lqfp=+iX|!*)RdLCr-1w`4rB_@bI&Uz# z!>9C3&LdoB$r+O#n);WTPi;V52OhNeKfW6_NLnw zpFTuLC^@aPy~ZGUPZr;)=-p|b$-R8htO)JXy{ecE5a|b{{&0O%H2rN&9(VHxmvNly zbY?sVk}@^{aw)%#J}|UW=ucLWs%%j)^n7S%8D1Woi$UT}VuU6@Sd6zc2+t_2IMBxd zb4R#ykMr8s5gKy=v+opw6;4R&&46$V+OOpDZwp3iR0Osqpjx))joB*iX+diVl?E~Q zc|$qmb#T#7Kcal042LUNAoPTPUxF-iGFw>ZFnUqU@y$&s8%h-HGD`EoNBbe#S>Y-4 zlkeAP>62k~-N zHQqXXyN67hGD6CxQIq_zoepU&j0 zYO&}<4cS^2sp!;5))(aAD!KmUED#QGr48DVlwbyft31WlS2yU<1>#VMp?>D1BCFfB z_JJ-kxTB{OLI}5XcPHXUo}x~->VP%of!G_N-(3Snvq`*gX3u0GR&}*fFwHo3-vIw0 zeiWskq3ZT9hTg^je{sC^@+z3FAd}KNhbpE5RO+lsLgv$;1igG7pRwI|;BO7o($2>mS(E z$CO@qYf5i=Zh6-xB=U8@mR7Yjk%OUp;_MMBfe_v1A(Hqk6!D})x%JNl838^ZA13Xu zz}LyD@X2;5o1P61Rc$%jcUnJ>`;6r{h5yrEbnbM$$ntA@P2IS1PyW^RyG0$S2tUlh z8?E(McS?7}X3nAAJs2u_n{^05)*D7 zW{Y>o99!I9&KQdzgtG(k@BT|J*;{Pt*b|?A_})e98pXCbMWbhBZ$t&YbNQOwN^=F) z_yIb_az2Pyya2530n@Y@s>s>n?L79;U-O9oPY$==~f1gXro5Y z*3~JaenSl_I}1*&dpYD?i8s<7w%~sEojqq~iFnaYyLgM#so%_ZZ^WTV0`R*H@{m2+ zja4MX^|#>xS9YQo{@F1I)!%RhM{4ZUapHTKgLZLcn$ehRq(emb8 z9<&Nx*RLcS#)SdTxcURrJhxPM2IBP%I zf1bWu&uRf{60-?Gclb5(IFI*!%tU*7d`i!l@>TaHzYQqH4_Y*6!Wy0d-B#Lz7Rg3l zqKsvXUk9@6iKV6#!bDy5n&j9MYpcKm!vG7z*2&4G*Yl}iccl*@WqKZWQSJCgQSj+d ze&}E1mAs^hP}>`{BJ6lv*>0-ft<;P@`u&VFI~P3qRtufE11+|#Y6|RJccqo27Wzr}Tp|DH z`G4^v)_8}R24X3}=6X&@Uqu;hKEQV^-)VKnBzI*|Iskecw~l?+R|WKO*~(1LrpdJ? z0!JKnCe<|m*WR>m+Qm+NKNH<_yefIml z+x32qzkNRrhR^IhT#yCiYU{3oq196nC3ePkB)f%7X1G^Ibog$ZnYu4(HyHUiFB`6x zo$ty-8pknmO|B9|(5TzoHG|%>s#7)CM(i=M7Nl=@GyDi-*ng6ahK(&-_4h(lyUN-oOa$` zo+P;C4d@m^p9J4c~rbi$rq9nhGxayFjhg+Rqa{l#`Y z!(P6K7fK3T;y!VZhGiC#)|pl$QX?a)a9$(4l(usVSH>2&5pIu5ALn*CqBt)9$yAl; z-{fOmgu><7YJ5k>*0Q~>lq72!XFX6P5Z{vW&zLsraKq5H%Z26}$OKDMv=sim;K?vsoVs(JNbgTU8-M%+ zN(+7Xl}`BDl=KDkUHM9fLlV)gN&PqbyX)$86!Wv!y+r*~kAyjFUKPDWL3A)m$@ir9 zjJ;uQV9#3$*`Dqo1Cy5*;^8DQcid^Td=CivAP+D;gl4b7*xa9IQ-R|lY5tIpiM~9- z%Hm9*vDV@_1FfiR|Kqh_5Ml0sm?abD>@peo(cnhiSWs$uy&$RYcd+m`6%X9FN%?w}s~Q=3!pJzbN~iJ}bbM*PPi@!E0eN zhKcuT=kAsz8TQo76CMO+FW#hr6da({mqpGK2K4T|xv9SNIXZ}a=4_K5pbz1HE6T}9 zbApW~m0C`q)S^F}B9Kw5!eT)Bj_h9vlCX8%VRvMOg8PJ*>PU>%yt-hyGOhjg!2pZR4{ z=VR_*?Hw|aai##~+^H>3p$W@6Zi`o4^iO2Iy=FPdEAI58Ebc~*%1#sh8KzUKOVHs( z<3$LMSCFP|!>fmF^oESZR|c|2JI3|gucuLq4R(||_!8L@gHU8hUQZKn2S#z@EVf3? zTroZd&}JK(mJLe>#x8xL)jfx$6`okcHP?8i%dW?F%nZh=VJ)32CmY;^y5C1^?V0;M z<3!e8GZcPej-h&-Osc>6PU2f4x=XhA*<_K*D6U6R)4xbEx~{3*ldB#N+7QEXD^v=I z+i^L+V7_2ld}O2b-(#bmv*PyZI4|U#Q5|22a(-VLOTZc3!9ns1RI-? zA<~h|tPH0y*bO1#EMrsWN>4yJM7vqFZr?uw$H8*PhiHRQg1U9YoscX-G|gck+SSRX!(e7@~eeUEw+POsT;=W9J&=EV`cUc{PIg_#TQVGnZsQbCs7#Q-)v#BicxLw#Fb?#)8TYbu zN)5R=MI1i7FHhF|X}xEl=sW~`-kf;fOR^h1yjthSw?%#F{HqrY2$q>7!nbw~nZ8q9 zh{vY! z%i=H!!P&wh z7_E%pB7l5)*VU>_O-S~d5Z!+;f{pQ4e86*&);?G<9*Q$JEJ!ZxY;Oj5&@^eg0Zs!iLCAR`2K?MSFzjX;kHD6)^`&=EZOIdW>L#O`J zf~$M4}JiV}v6B-e{NUBGFgj-*H%NG zfY0X(@|S8?V)drF;2OQcpDl2LV=~=%gGx?_$fbSsi@%J~taHcMTLLpjNF8FkjnjyM zW;4sSf6RHaa~LijL#EJ0W2m!BmQP(f=%Km_N@hsBFw%q#7{Er?y1V~UEPEih87B`~ zv$jE%>Ug9&=o+sZVZL7^+sp)PSrS;ZIJac4S-M>#V;T--4FXZ*>CI7w%583<{>tb6 zOZ8gZ#B0jplyTbzto2VOs)s9U%trre`m=RlKf{I_Nwdxn(xNG%zaVNurEYiMV3*g| z``3;{j7`UyfFrjlEbIJN{0db|r>|LA@=vX9CHFZYiexnkn$b%8Rvw0TZOQIXa;oTI zv@j;ZP+#~|!J(aBz9S{wL7W%Dr1H)G-XUNt9-lP?ijJ-XEj1e*CI~-Xz@4(Xg;UoG z{uzBf-U+(SHe}6oG%;A*93Zb=oE>uTb^%qsL>|bQf?7_6=KIiPU`I|r;YcZ!YG7y~ zQu@UldAwz$^|uoz3mz1;An-WVBtefSh-pv<`n&TU3oM!hrEI?l@v8A4#^$4t&~T32 zl*J=1q~h+60sNc43>0aVvhzyfjshgPYZoQ(OOh>LbUIoblb@1z~zp?))n?^)q6WGuDh}gMUaA9|X z3qq-XlcNldy5==T4rq*~g@XVY!9sYZjo#R7 zr{n)r5^S{9+$+8l7IVB*3_k5%-TBY@C%`P@&tZf>82sm#nfw7L%92>nN$663yW!yt zhS>EfLcE_Z)gv-Y^h1;xj(<4nD4GY{C-nWUgQc9cMmH{qpa!uEznrGF^?bbJHApScQ$j>$JZHAX80DdXu z--AMgrA0$Otdd#N9#!cg2Z~N8&lj1d+wDh+^ZObWJ$J)_h(&2#msu>q0B$DEERy{1 zCJN{7M@%#E@8pda`@u!v@{gcT3bA*>g*xYLXlbb&o@1vX*x+l}Voys6o~^_7>#GB| z*r!R%kA9k%J`?m>1tMHB9x$ZRe0$r~ui}X}jOC)9LH=Po*2SLdtf3^4?VKnu2ox&mV~0oDgi` z;9d}P$g~9%ThTK8s}5ow2V4?(-lU*ed8ro|}mU}pk% z;bqB0bx3AOk<0Joeh}Vl@_7Po&C`Cg>>gff>e7fu41U3Ic{JQu1W%+!Gvz3GDO2ixKd;KF6UEw8F_cDAh08gB>@ zaRH2Q96sBJ>`4aXvrF0xPtIWoA1pPsRQtU~xDtnEfTJnl{A9u5pR^K8=UdNq%T8F$)FbN> zgK+_(BF#D>R>kK!M#OT~=@@}3yAYqm33?{Bv?2iBr|-aRK0@uapzuXI)wE0=R@m^7 zQ`wLBn(M*wg!mgmQT1d!@3<2z>~rmDW)KG0*B4>_R6LjiI0^9QT8gtDDT|Lclxppm z+OeL6H3QpearJAB%1ellZ6d*)wBQ(hPbE=%?y6i^uf%`RXm*JW*WQ%>&J+=V(=qf{ zri~yItvTZbII+7S0>4Q0U9@>HnMP$X>8TqAfD(vAh};2P{QK)ik`a6$W$nG<{bR2Ufd!^iE z#1K58$gW!xpeYHeehuhQCXZ9p%N8m zB+l~T_u-Ycr!U>!?xu!!*6rNxq37{`DhMMfY6NpD3Jw zkYQDstvt30Hc_SaZuuMP2YrdW@HsPMbf^Y9lI<9$bnMil2X7`Ba-DGLbzgqP>mxwe zf1&JkDH54D3nLar2KjJ3z`*R+rUABq4;>>4Kjc2iQEj7pVLcZYZ~pteAG4rm1{>PQy=!QiV5G|tVk)53 zP?Azw+N)Yq3zZ`dW7Q9Bq@Y*jSK0<1f`HM;_>GH57pf_S%Ounz_yhTY8lplQSM`xx zU{r-Deqs+*I~sLI$Oq`>i`J1kJ(+yNOYy$_>R3Jfi680<|^u#J@aY%Q>O zqfI~sCbk#3--^zMkV&Yj0D(R^rK}+_npgPr_4^kYuG=pO%$C_7v{s@-{M-P@RL3^<`kO@b=YdKMuccfO1ZW# zeRYE%D~CMAgPlo?T!O6?b|pOZv{iMWb;sN=jF%=?$Iz_5zH?K;aFGU^8l7u%zHgiy z%)~y|k;Es-7YX69AMj^epGX#&^c@pp+lc}kKc`5CjPN4Z$$e58$Yn*J?81%`0~A)D zPg-db*pj-t4-G9>ImW4IMi*v#9z^9VD9h@9t;3jMAUVxt=oor+16yHf{lT|G4 zya6{4#BxFw!!~UTRwXXawKU4iz$$GMY6=Z8VM{2@0{=5A0+A#p6$aT3ubRyWMWPq9 zCEH5(Il0v4e4=Yxg(tDglfYAy!UpC>&^4=x7#6_S&Ktds)a8^`^tp6RnRd{KImB^o z2n=t#>iKx<*evmvoE{+fH#@WXGWs$)Uxrtf?r>AaxV0?kf0o@oDboJ6z0cgP@A$;k>SK1UqC?Q_ zk_I?j74;}uNXhOf_5ZxQSgB4otDEb9JJrX1kq`-o%T>g%M5~xXf!2_4P~K64tKgXq z&KHZ0@!cPvUJG4kw-0;tPo$zJrU-Nop>Uo65Pm|yaNvKjhi7V1g98;^N1~V3% zTR>yWa+X2FJ_wpPwz3i^6AGwOa_VMS-&`*KoKgF2&oR10Jn6{!pvVG@n=Jk@vjNuY zL~P7aDGhg~O9G^!bHi$8?G9v9Gp0cmekYkK;(q=47;~gI>h-kx-ceM{ml$#8KI$4ltyjaqP zki^cyDERloAb)dcDBU4na9C(pfD{P@eBGA}0|Rb)p{ISqi60=^FUEdF!ok{Gs;vb) zfj9(#1QA64w*ud^YsN5&PeiI>c`VioE8h)e}W%S9NMA55Gs zrWL6l+@3CKd@8(UQLTwe12SGWMqRn+j)QZRj*g)Xua)%ayzpqs{pD(WWESJYL3{M$ z%qkpM`jFoqLYVv6{IbCkL?fEiJj$VG=$taup&RL9e{s(Sgse2xVJlw0h74EXJKt2eX|dxz{->0)3W`JN7Bv!rLvRZc z0tAOZ2yVe4g9iq826qXAg`f!*+}(o1;1FDb>kKexumFS40KvK0yH1_@Z=LgWZ+}(Y zwYsa;OLz6tTA%gS=>8$=Z7pLh>|K2QElL)E=Q*(n*H`8R`8={-@4mTD-SWBOYRxV? zmF(-rJB8^Wlp?319rTrh^?QEP?|Msxrv?WbJ-+id+V#F2Y4(JPJ6U9bv+U1cIIH^W z)lg$_=g^Ma>2~Pyd_YOAv29Cb-U6DJO?NxnW7~QP*SmYi*vdUVuW#LWQ_u0`hymZi zaQS3Nb^4`ro$>0G%zbXmr5|D|iq0R<;S@?kr0j5Ruq87-Z1>crx%EzVZ9#U;{?}ti zW2W%*9MQg3Nbh%Ti6LhDd|-aFSgXoPG`mHlUU1iCHr>ru>DX?W_#13(`u*!Plu2OP z6jk=2>BC0l)aw;HCmxoYD1i4b%m$1`DYC_^L~ zIEAnFcHvad=-aO3(_MI=9#`z6-9*_!&$?<%meb5;jGd5Qp=MGf z6BD{%`L#TAOq%z%@*ib95Ey7NbUF=BlszVk3Iu3imD&*91N-ij%hW?W@~2TtdHTfP z#n0@Xd7X8Dyu36n{k#PwQ~T~X7mAO^cNV+z<HO@3X-# z_@rAn$k~(l@kciCC;&Qd*fWRI>=;fL{UPlciNDWyj$bX<#r^(r;EE8wwUVQm&7~QY zCXRj!**r^xybAEPq>h3W$uvI1j=yNIyzkE_D7fpGw)OV{U*Uwm{xB;mEg2(|y|ICd zMdQVqzMb-=XM6|E-a9kNh)^9lY`-DjhhHD1w5lufRcy+QLgJ47!fFne86#F; zX{ufroVBEZJOY?rDo!;Te6aOZ^1SO!dYRxQ*2njyA~dCWawn)>!*k7~>8Ikt&e*0>>V5ZbO|*1+2LFOqVe zXHb!aMk03^h%&9L8GMy7UDI2Kev>V@(R}*Iu6x+!Hn4~D@wj`P%#Hdbf(lK{+DD7f zJ&(v*mhn_e(R$^5L#bM^^Q@-!*b!l|+Xrb(q*MRFJYnrE7*xko!SJOy9LngR2|q5k zY`Ioiu+YBfzF{Labszk-E#*BYQk>$()=xWEGZRKwY)*UxP}0dGuPLZOkNJDI9Hy zFjfwiK6RjhH#rHW#B0(MW}i%V`943<6@Z*Nd^JEP5uZonXm=u%AM>{H^U@&Jy*i0s za_Da^xI6pMtXzHc{e~_ZcnKP*;=YL2Z^RmzDl{dJTk7*}E_h*NvgnhnxVKB59Duh~ zqouS_WoOR*{UvUw_K#OWz;gMracr%8>QQ&V*jv!8)ho;U8}9~8EU{N<=Z_gR%IpMT zbkePUG_afm=#|iIfFmdqkpLMGxY5D$`?I}&T7>TexU@v zkBx09kG)O;09ckj#(_Uov6vv{{HOcr-%H#DUQ@*GzF8Zh{iSM13%fuB%>wjdU@3Nf zlnYE!GTyNrqes|;nLFXfWU*Wg-9wmr=NBd$nCk+H?iwNvcd0Wab^3CT9a`>3V~oWI z9=_H+N-Q=MQ(io4u4mpdQ;k&5FXnKV5M7R`@WJ9h(GrAirO#XXOU{qQpk^B^Vd=Dt{wiqT zg-#j9J~@o%H2;W9mg)o6@*Vo;BSs2*4HAHpDk02mndAsov08R_48zJZ@J)s7+hyCo zy*0L#y)?AqZt-wX%+_Vx`8*A95OLHvs1$k~{h-_N_vov_gHJE=`X>L?5K+ zD?u59=mjtImMvd1GsDytuYp{IyUkW&?h zF>$#`n$~bZ)KN0B$XGeMYh&`;g8 zo_2-koaO6+8O!+L>SpIQbG(i;QW9UJi{Ecewlo?s&D!^>i$|#jaW}#HJuxt|W48=? zb^Y&O$a1s5ddr8DIt!sD!t=y1g(d4GR(s;s-HfV$GXl&m;+sAAxB^rk(3_NjE$p#L z*t4em?tA0d+XwRxN^OQwzbDZMuSE0J1)Ky{mq)^t4bnSl*)s>zNM@mMdtd78&ebHN z`!(|lE5q-p+TsRaNnMXwALaN5QIZ2IUi^Z22tsN5>nvIO+YU}Q*xh6}ee6@rR~<&1 z(PB4z>9ZBUMXZwSMmd9-aKKsmJeJq^G|#JclOh*xf0?^e0(`40nsg1z)(48;4}B_( zGwPI)yo|{oX{dVDL-5-aMGr;~vU1cPtJP5JM(sswz&Q`e<@0?y{YhsO9YK8EYJA;L z>7oG_Mts+(wCBC*Md82#XdKw&J*IizR?9k^rf1r{Ot-&>V^ke{9nI9zavlcNkIJtN z7T>?o|4rENk-?|lewZ(EfdR;%BUrzKJ^UkCpsM)EA9QHBVV8trT&*O(9?FO{MLTFL z=5P0H+T6C^jAuX0k4U;~GM!x`!X2N~3_n?qXY$HI>x@(DHEy&Q3ucT1R6fj28wX!I zC=&d$@bJ_v^%?W2Ngl}e8ww`b%BrN-PzGH;$@B2Ky1?%GMkm#~Okj(-Admyy;qya| zOi73kr_pwt?5Nj3p=&H>81!w#>Agj z(QXx{j0r=pTl>micAI_5vUw<3`Sht?Z}-j2Wx~F8DKCUQrsXl2?W8hur42(F_ zsSJ)_36&x6A|YkY6c<2a94SXbv~d>4CC4nkDPvf9Z5Fys^6^5r0j5=E>Cgy_Dk@tS z%?c}9!qB?t6t8(XMH%le8UeNWp@Nsma~Ql+^3Bo%_npMryeQJz4V=BAqE~T?dejng z3ge{fjCHoNAfYBvsfq;G%VL|j7t z`X0sy1EEgpyD;)tS1x+fnv-?C@glP0{RCW}Ma?3qpoq_&IJAYOy3G#s`rsh5=3>`K zkj``=;|*x5HSjZC zXNvPLh372q;=+6ja|SC!R-`JcL}}wwskajjTUGTpL(1zkN-p?BA2lmf+J3WsB7!k`0Brx8^cLTF9h)r+LZ$vsZo}`OpOs)?c6$hclR!R#MAeh|_DY|9r zy+_3c%IO9h9X?ksp?an&>Lw;QeQ`T-Ku6HaK~H?E9-Z5$cZu{YU;1+-6B$|JD;%!^ zt(4l>F8}a-UkC4YtOxFHckhl4VKr6P$P_O*U!)IDory%}Wz`YeFx6TO{y2Y${SBm?H9cTWV=WWJ z`_*CGso!ZN>l@~_jkeXtV}fczfA{TUkyeD>)i3|NFGcCsBmK3HXp&ol_@GVs7PIpfULy!hi zs+%KYgS%(n7_z_}6)hblk~W#LZ@&2)fwm6xkFP%&Ju|MFWbNiTwy{{g-pV1RK`L&=RE2D z4|g;~vd8xd|teYS%w!IlT4W$&FTrk-hcTADX!P?*f1YWEIRwq$Ys%^(Z9w&HT$>} zsMD#6Df=uJrX!JHP7<>Or;e_Cf=}`!`qR=i8fBj)$6Lxx{HRzd8Tnzd0p>kSps{OG zKJkml>bUj8$u|F=``l(-aMxWBC@CGZ#FXClQZ<4|&%jN}Tkg#q8z)=>Ly{$i0`rjU zvt|QddO&i=91e?h3>s~i;+6{ z8X4i6a1wDLrSuE#W(zhan+U*Zq+8p3a))JFVF4ffaV51K^YgTso~3;Y*NmM; zx8T?y-N0uyWY(8=me-HUC9xtABvX5~%yg+Cp&XF$Bq=OcK6T*D7eZ2EmIoCFWm{$S z1PNw8HDpe5hHeCusN8kdeb&f2#=3M^A~7YwJ7FRrhq*)PG9x?JIAaC{MV}5}g#7R$-Ly%)4=IUkRCGOR|XTMjn&okRmFjaO^YF5^* z@)#MCBOBezD)*xQNxydlUyN?dW{fS(s-T`gv*0BEnk}`BdmrbmPO8q8y(X$AA}*RH%I7Av!~84pudHb&%Q5-j zt?=6x(iR?<^_7X0v6Ys#VAL}dKk^hcjI=|EY;kPcZ_w<*H`_*|N7SacaM1ERD@6ab zg`!iTm7$URV+lpW_{V$ruR&A>jrX68k4x2wo$45}&wf7o<|o(@B!u-L@bKyQBAGwy z4#}UrRAu>^>Vb6k2-th^>WjvP;Nl|i3WrjWv3ISkj{m{eAcQIW^_ndxSX@|8T(ASJ z?_$fcP2u*6uOBk-{d>^ z0vWlfGQMvysI%R=iE|A+!!Nw?C917EU*_$`;;)px?s83CRd3i_jBN)k#nR5t$dJ(+ z_sP;wG@Ad)^(3LRj7q}0b2O(b`|i0~5SYb%Sjk^*5ISZ-Ab+}DGu$-X1n^TF1Ndw_ zF|e*1)cI2%`TR&AW~XpqpFb!=3cHbS>np9hYD_Mr5}y5Y`SY^r7isA2Q4(z zazRQEqWDKT2zIEbjSYdCPi1ZOGz80Nsl}gxO^DWMY0AV<2K&OL{&^6#@L1?lXu#6xSMh%3^5c*}oM6DQGY#(a^@z<&D zF(43I9e&5`h|A$5!+UFuOH0>F3$shBV4`0#M4RSB8=6F0ZgIbq<2LQ$Hh^(kAJu=! zt8ZGXTacD{(3W{V1$j_{Jc)Ka7t6u}ho`4kF+4@t_0!mCBn z)}o%eA}L)_L?=jw6BIfll7tb3n}?*yLt&XADa=rW>qz=_6s9ziOd5sXjil>FVFx3r zf>Feewk0v#W9>Gp4GacTRr>Sd2T6dWi-{YX`v!D)kCWzG5xQB=?es5ON(%nkwUhNl zV>@xkWWWv*N+{e$(SrExvN6BXzU(Hxlx27{VYHf+LpIbTO+Yu(ltMk<;)3A(LU@ytVYFkYvTa79idMtUFhfxx?P!)2F`prNWW#Fub#l>N2s@nh&n_ zA4{#}|AIs9|A4P0ZF%fy=hDN!t#ifH<)4u2kirK~JUpjQ-J+~cXOZI&dIts;P}UeXslP6zKvpEKSN-$y>kJ^nw2tC9bv zo(|lT@?vZ!{_l|d^8Yh)eEBh*5ABh+Lzjw+?V)o z#P-W7361>E(Y4;@`sv;VKn G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/public/assets/icon/font/glyphicons-halflings-regular.woff2 b/public/assets/icon/font/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/public/assets/icon/font/yunfont.eot b/public/assets/icon/font/yunfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..ceff968ee6d8f5eea9cb1238943474670d338014 GIT binary patch literal 24868 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 literal 0 HcmV?d00001 diff --git a/public/assets/icon/font/yunfont.ttf b/public/assets/icon/font/yunfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..904d46be0f2d28ee84250d121ac1e6bb3af7cb80 GIT binary patch literal 24704 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 literal 0 HcmV?d00001 diff --git a/public/assets/icon/font/yunfont.woff b/public/assets/icon/font/yunfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..a02ca418374c793c91768c0253eb19b30bfbf9b3 GIT binary patch literal 24780 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 literal 0 HcmV?d00001 diff --git a/public/assets/icon/icon.css b/public/assets/icon/icon.css new file mode 100644 index 0000000..9750f3a --- /dev/null +++ b/public/assets/icon/icon.css @@ -0,0 +1,499 @@ +@font-face { + font-family:yunfont; + src:url(./font/yunfont.eot?t=1610419101922?de437c); + src:url(./font/yunfont.eot?t=1610419101922?de437c#iefix) + format('embedded-opentype'),url(./font/yunfont.ttf?t=1610419101922?de437c) + format('truetype'),url(./font/yunfont.woff?t=1610419101922?de437c) + format('woff'),url(./font/yunfont.svg?t=1610419101922?de437c#yunfont) format('svg'); + font-weight:400; + font-style:normal; +} + + +.g-button-right{ + padding-left: 20px; + color: #666; + background-color: rgb(247, 247, 247); +} + +.g-button-right .icon{ + height: 38px; + width: 23px; + line-height: 38px; + margin-left: 5px; + margin-top: -2px; + font-size: 16px; + display: inline-block; +} + +.icon { + font-family: yunfont!important; + speak: never; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.icon-my-share:before { + content: "\e900" +} + +.icon-disk:before { + content: "\e901" +} + +.icon-share:before { + content: "\e902" +} + +.icon-delete:before { + content: "\e903" +} + +.icon-theme:before { + content: "\e904" +} + +.icon-search:before { + content: "\e905" +} + +.icon-newfolder:before { + content: "\e906" +} + +.icon-download:before { + content: "\e907" +} + +.icon-border:before { + content: "\e908" +} + +.icon-face:before { + content: "\e909" +} + +.icon-android:before { + content: "\e90a" +} + +.icon-apple:before { + content: "\e90b" +} + +.icon-device:before { + content: "\e90c" +} + +.icon-check:before { + content: "\e90d" +} + +.icon-cancel:before { + content: "\e90e" +} + +.icon-print:before { + content: "\e90f" +} + +.icon-order:before { + content: "\e910" +} + +.icon-grid:before { + content: "\e911" +} + +.icon-right:before { + content: "\e912" +} + +.icon-more:before { + content: "\e913" +} + +.icon-copy:before { + content: "\e914" +} + +.icon-upload:before { + content: "\e915" +} + +.icon-yunguanjia:before { + content: "\e916" +} + +.icon-iPad:before { + content: "\e917" +} + +.icon-win:before { + content: "\e918" +} + +.icon-mail:before { + content: "\e919" +} + +.icon-sync:before { + content: "\e91a" +} + +.icon-share-cancel:before { + content: "\e91b" +} + +.icon-qrcode:before { + content: "\e91c" +} + +.icon-beauty:before { + content: "\e91d" +} + +.icon-edit:before { + content: "\e91e" +} + +.icon-save-disk:before { + content: "\e91f" +} + +.icon-list:before { + content: "\e920" +} + +.icon-history:before { + content: "\e921" +} + +.icon-notice:before { + content: "\e922" +} + +.icon-recovery:before { + content: "\e923" +} + +.icon-mosaic:before { + content: "\e924" +} + +.icon-speed:before { + content: "\e925" +} + +.icon-play:before { + content: "\e926" +} + +.icon-poly:before { + content: "\e927" +} + +.icon-feedback:before { + content: "\e928" +} + +.icon-search-del:before { + content: "\e929" +} + +.icon-small-lock:before { + content: "\e92a" +} + +.icon-close:before { + content: "\e92b" +} + +.icon-minimize:before { + content: "\e92c" +} + +.icon-maximizing:before { + content: "\e92d" +} + +.icon-share-community:before { + content: "\e92e" +} + +.icon-share-email:before { + content: "\e92f" +} + +.icon-share-link:before { + content: "\e930" +} + +.icon-share-friend:before { + content: "\e931" +} + +.icon-sort-select:before { + content: "\e932" +} + +.icon-dropdown-arrow:before { + content: "\e933" +} + +.icon-friendlist:before { + content: "\e934" +} + +.icon-checkgridsmall:before { + content: "\e935" +} + +.icon-mboxchate:before { + content: "\e936" +} + +.icon-checksmall:before { + content: "\e937" +} + +.icon-downtitle:before { + content: "\e938" +} + +.icon-up:before { + content: "\e939" +} + +.icon-rename-cancel:before { + content: "\e93a" +} + +.icon-circle:before { + content: "\e93b" +} + +.icon-mac:before { + content: "\e93c" +} + +.icon-musicpause:before { + content: "\e93d" +} + +.icon-musicloop:before { + content: "\e93e" +} + +.icon-musicprev:before { + content: "\e93f" +} + +.icon-musicrandom:before { + content: "\e940" +} + +.icon-musicloop2:before { + content: "\e941" +} + +.icon-musicnext:before { + content: "\e942" +} + +.icon-musicplay:before { + content: "\e943" +} + +.icon-musicvolume:before { + content: "\e944" +} + +.icon-arrow-up:before { + content: "\e945" +} + +.icon-arrow-down:before { + content: "\e946" +} + +.icon-arrow-right:before { + content: "\e947" +} + +.icon-arrow-left:before { + content: "\e948" +} + +.icon-appeal:before { + content: "\e949" +} + +.icon-radio-checked:before { + content: "\e94a" +} + +.icon-radio-non:before { + content: "\e94b" +} + +.icon-director:before { + content: "\e94c" +} + +.icon-dropdown-select:before { + content: "\e94d" +} + +.icon-tips-detail:before { + content: "\e94e" +} + +.icon-tips-success:before { + content: "\e94f" +} + +.icon-tips-close:before { + content: "\e950" +} + +.icon-tips-caution:before { + content: "\e951" +} + +.icon-imageEnlarge:before { + content: "\e952" +} + +.icon-hollowCircle:before { + content: "\e953" +} + +.icon-picpre-enlarge:before { + content: "\e954" +} + +.icon-picpre-close:before { + content: "\e955" +} + +.icon-picpre-beautify:before { + content: "\e956" +} + +.icon-picpre-delete:before { + content: "\e957" +} + +.icon-picpre-before:before { + content: "\e958" +} + +.icon-picpre-pulldown2:before { + content: "\e959" +} + +.icon-picpre-next:before { + content: "\e95a" +} + +.icon-picpre-download:before { + content: "\e95b" +} + +.icon-picpre-detail:before { + content: "\e95c" +} + +.icon-picpre-pullup:before { + content: "\e95d" +} + +.icon-picpre-rotate:before { + content: "\e95e" +} + +.icon-picpre-phone:before { + content: "\e95f" +} + +.icon-picpre-cloudprint:before { + content: "\e960" +} + +.icon-picpre-facesearch:before { + content: "\e961" +} + +.icon-remark-edit:before { + content: "\e962" +} + +.icon-remark-remove:before { + content: "\e963" +} + +.icon-camera:before { + content: "\e964" +} + +.icon-sharedir:before { + content: "\e965" +} + +.icon-sharedir-info:before { + content: "\e966" +} + +.icon-classify-modify-remove:before { + content: "\e967" +} + +.icon-setting:before { + content: "\e968" +} + +.icon-share-sellmall:before { + content: "\e969" +} + +.icon-pdf2word:before { + content: "\e96a" +} + +.icon-uniE96D:before { + content: "\e96b" +} + +.icon-uniE96E:before { + content: "\e96c" +} + +.icon-uniE96F:before { + content: "\e96d" +} + +.icon-sjck:before { + content: "\e96e" +} + +.icon-addwp:before { + content: "\e96f" +} + +.icon-wpedit:before { + content: "\e970" +} + +.icon-share-lock:before { + content: "\e971" +} + +.icon-svg-s-close:before { + content: "\e972" +} \ No newline at end of file diff --git a/public/assets/image/apps-android.png b/public/assets/image/apps-android.png new file mode 100644 index 0000000000000000000000000000000000000000..df78e462ddd8a6c1e013fb72058d7b6f03e18def GIT binary patch literal 12793 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 literal 0 HcmV?d00001 diff --git a/public/assets/image/clear.png b/public/assets/image/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..580b52a5be8a644f826def0c7ed6a13f90c0915c GIT binary patch literal 509 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4u6ByT*@`3|I*lDyqr82-2SpV<%OaTa()76WMy zFm^kcZ3hx8D{xE)(qO#|GLJ6IVqjoo^>lFzk+^JnVSiR|B17B9``_m-NuMxfR?C!* zh07MrSo)3sr09zP_wDzlhX=fPF>UDu=?vANf(w(JrZ%)>D41|8J9+Zugm01epVrPx zINBDzitE|2b$6T`9`!DJFmdU=eKrTz=_*cb3=s8r9VQ%8yxBf7d%v=5Nxh^7ZP6=ia-yr`GWA z@1JRG_RM@X%BIyHqImbIN_g6wl?zIFvhME$`)4a}gbAnqdolZft=%U7gPsvQH z#I2z#?2;8wgCxj?;QX|b^2DN42FH~Aq*MjZ+{Ezopr E0Crl)MgRZ+ literal 0 HcmV?d00001 diff --git a/public/assets/image/collect-image-left.png b/public/assets/image/collect-image-left.png new file mode 100644 index 0000000000000000000000000000000000000000..eea091caac2e50ff83aa84e63076baac4063c6ca GIT binary patch literal 23276 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 Q6951J07*qoM6N<$g0XOb&;S4c literal 0 HcmV?d00001 diff --git a/public/assets/image/collect-image-right.png b/public/assets/image/collect-image-right.png new file mode 100644 index 0000000000000000000000000000000000000000..d84749e9d400d537758e2cd7c478366fe429d29a GIT binary patch literal 22650 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 LNkvXXu0mjfexl5o literal 0 HcmV?d00001 diff --git a/public/assets/image/collect-img1.png b/public/assets/image/collect-img1.png new file mode 100644 index 0000000000000000000000000000000000000000..02714c12ad8d153ec1fbfb5ec498ec741ae51da6 GIT binary patch literal 91156 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 literal 0 HcmV?d00001 diff --git a/public/assets/image/collect-img3.png b/public/assets/image/collect-img3.png new file mode 100644 index 0000000000000000000000000000000000000000..fedf9c98ccb0be9b6e5c1041a8a799d052637d5e GIT binary patch literal 62441 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 k13|K=|; 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 G=>GxgdvdS< literal 0 HcmV?d00001 diff --git a/public/assets/image/collect-line.svg b/public/assets/image/collect-line.svg new file mode 100644 index 0000000..a341deb --- /dev/null +++ b/public/assets/image/collect-line.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/assets/image/emptyRecyclebin.png b/public/assets/image/emptyRecyclebin.png new file mode 100644 index 0000000000000000000000000000000000000000..044c332cc3a5ceb61f4f047fcd86d5aa3f06c27e GIT binary patch literal 1412 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�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

    g-NFbPK?539H?>}MoK#f$ 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

    $G#?28V9{?Dpd^v-95YiYP-mzh2nZ?k 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

    NK&8T#-rH^V))uW&$~MZE~u0RJ+T znUFBYIykr!8RqWl`hVRk01`l_z4p*v!#u3xO6+kYLFB||@RtO;lQP(;)Y1P$Dmq`o zTnMOyQg9S?V0Wd3I6Yb&IB$yG>31(R2{h=Nwno1d_T=^f!HP4qILf}%ti3JLbqv@O zV&$K>Qt;GaDk(@sDR9|Hw%$hKmb~wsLjSt}0A&8J(Lf0t4hvt%l*#ja6spIA?aw*8 z!Z~)Xe9Fh#A8=T5(qlUC(B$U&*5Mjd46d6Wq0luet~>Rt^1E&^7hwcxAaV3TkY^$g z(|+zXkImi#zrhC+=+2~HyQhdFq$}LrZN;u;cVQPXkU~$g^b6i~SC^qA;!su+WL^T!O*wyF3NF5t)}Wi zO}JI=6_kj~B&|F>Q!6L)E$|E%^loM=z8JVqS74f*jZYYS?ZY=l@~0N+-N$+Z0pw&H%yavS6{wuUnva@l77uDD z1zP;zX~ejueQqs$l7gK6|Q4qzRrlc_x1V8v>Jv?!&{)1Vc|J|dDl80e-0eWvQCZ^B) zn1J0H>;D+fFJOz24DZ}MVQu2#q9Klz=#LDQimv|kvC!{>3t%H=T*s44+>VP38%Tp3 zIj^+F3N50#wfWNu>RQ6~?TEHli^oW)b!J!X*1Lnb*x&!~d%pST%K~QooI>`?SihOD zaEIO`X_y3Mi{=fys(7~JoP9wGnj7}?*z+xN>y=+Xc-iKzq7vk+w~fSiN_(#zTpzSG z{cuAK01#(4#{#k~>3kB1A+~NJ5YL`%p>tES;v1kAq5a+>5*5D1sL>x%L(&#?ZMKqn z!<-4mLZykoLIdf5<@jHsJnK)uZOm9vkR4I^p&SX{tM~AR%F<2{(3%hc%vG72C4UiX zlKboG7M%uU2g6H>t7hvRyCn?XCL+GFJ4Kgq^%Y#F44BJdM(~fVI*Q9F-!HV^NlbwU zG{Es3-NKFJ;Sw_Fy-}2Old^?(C+MOAM!UjXF7b2pkj2JgE?XoS^Vy9h;uj{kUSHFg zjuiuJKbbn|ID(+{fVH(DGP6%9ZqzSm8)s&D#3z8oZy|BHxHbMZIlV@(b$*q%*zrrc z`i2$v&ycY%aIz^-g8t}(e`^pHGu?NGyd^fY{!k|;ZDB}zN+&5fcXW%nd;B8vEqJC=?jSMadG;UAax6Mey<}3Y4>)_7a_&sec#|EV_reKF znB%&Ix>7m1ihsKA932Gqc=3$l zlS@HEvbHW4b1?v3+@)ijcyk0D-Dw6sA=K)`kaE>h$g7^Ai|>UF-4UQ&zaJY2Qw3(( z`FDbLjERjhM}!xGT`$^Va1l{J#LD2W z!C=Uq8AL{i9zhFw@3btlzx9S4f>`Kz*Dz2l?l& zy=HBsY}&8Yg&dkeAKhG<_8*45%#kP^T;uw#-GkOsQeaPurmGxaGgA0lDCAvKOAJ-~ zmAedhBpd~lK*JG`g&df;gc@iBM>u8 z@R?BAs!Q+G`ItKYQ!p?XCC_6R0sa2zQBdSx^NU8yaugOex1>u-e;>b zG4O1F$B%woq#Q%ni^g^4&(aT@OH zG|H2=tIeQe{*f%I0TcaHw!9zx8szSmE=Bs(;Pl{w>aVuu8 z8aLQ?s1{r%2T)~zJBs&m zQG)Fc{oy2HBW1B0F}DPNzWxVoyW8%sGtxj$ulCr#0H8}B0Bwi4)|*vjkKWm?yXy_) zvkr_)v~H~tm?G2{ft_@@8-AIc?mxQ0w8R>{Q0eV+I&bGcToqvk*Y3&O=J)rfpMxUr zB!lR(MDq=LwXqxjE8f#zR~W&*@Z-n+1V8`gRAuDCDSxk#Xa!8JaVHa8< literal 0 HcmV?d00001 diff --git a/public/assets/image/footer-img2.png b/public/assets/image/footer-img2.png new file mode 100644 index 0000000000000000000000000000000000000000..be6809870b508b40bacfb1eb82a949529d1573df GIT binary patch literal 152175 zcmd2?Wmj8WxD4*@?(XjH6nA&0NO22JaVr!p?ou3D+=@eScX!ty;nMfsA91r*PFBvB zob1_;%sjKB)l}qA5D5_h004@DytD=Y0Feg(Kytyue%#rd!~XH{f#52y?+yUq()@cv zC}>b$ecXg_*N~G0)chqr{`dlIE1@g_0MsWUy_&-SAT^*Bq$RX`AkN-=r&xwO$>4J} zJulxLenFt22}OO!7S~vlj`{XmJgs9m)zA(4ScalXL}w}YOQK+(h^0_zQREbv$nH@l zzUr{~a)ZTMZp$DBZJ*ni*QXXqUUPM7`Q$CcVCeeG)77s13vJt*JwFwjbu>V|2*5M= za^1hG!L4fiR>;r>@@`I3RpkEv@1+xjP*9e;F(@r<7bW`GIyrwC^!@@@G;MdwWC|MX zz1|(-b8b7XWC;fCnFj5nmGY6by6rX)Z3y^W-j|`Gvxxxsyy5*$D$2;B{H~6Von(-C zUqO@aATiUIxiV4Do$W|6=S0&6AgBZ{r!6F{P8;PkHnP8$Mp=r8cDbR_%&f=WvGud< zm={RWxZfG(w;tvN&+PzIqyB9z9wAt=(H+8mP=yIy;A<|h=0hgD%ad!ur3<|uu@ZR)UUs#wHYwhX+ zrz1}W)pB?{ab&y1>+~s+4XFKkH3g$GCbm}~f5}izwlXr5(E?+dVY`VV!-`rp+bi+< z6s+?EgVx+yU!Oe$K^j6tL64?y58dw@cwJW!`{%zlH^fy%IwQ*e{p8%;PZyx$Y1?Vd z)3B@4DVwhLy@KUYTiQwsA^)j#BOzQpU@0XHUjxN)XtFuv{1t+jgH zwz~XojSRV)4c`NfGO}6@k6Dw8_}z>0>;_*BX@Ir2_wz*e<0E(@Ww2@KfwnDo<7_TW zRnpdIs)G*HS-J<_5hrOVJD#g(LthZjhV(KdwldWvU z%ihy&ybI#*J9o%n$P8aBl5mGM-m8erYZ?yp94@h3{gw&fRLdquV3EH~=C&chTNK=p1zPEhYVR6FIhP`pN5S^cP(YgP$H_X3%*aRB(}6 zN&N*|P>5M^FS$vSL9p%aaRykPDjj-klt&tl_;KSo^$L&G9CV`6%8osDZmOT|Et`x2 zt13%XNyP%seE~5qn8Ss}|L67ig;BzeZ{0v@?!_3vsjXlxBujY(P^M93bae zZnWm}*W?ka>pubDtrWhECoZm|iZY}m*eOj_7s_Y3_aibVmvf`nblCYTJSK78=K0ZD zsvpk~!fsv4)J-JOJZ5-+Rx*moCyE~;*UuCO0wqQ;nz?*0Fz9_+c-RrG!Ti{siuXy$ z{=_5362O^&-0HgLo_x~G)$ zriur9pY;JQ;Z8)6Sm0@5ppB!)o-PVr*Bk)tvbz-Dvo1WD-57=}E*Kq@IAf$JmL!?o z&)|Mqd`Uw19nh>5dc~)%+loEmg`T3O%hG4+$X)Ofmv^)Q3J7=vUu<}_1mtQ*GlI`cJ zvn^wn<2H?K6X}gFdA=u^wPeKOs*CqeXN{8ybU_!BZ>=16bF-(?ANj(gclPk3Fioq1 z?^MBm77h+JiM7J=_&$3BD5WzQ2$rnGB_cDGiW@iSGkY2g2|U-~gJm^t>Z0K`opYe+LGg3vnXcP=c{(+TuB%}erL zV#gs7WQkhDRTttp&NXGuY9DMI!9(?WBz+y#y?9>O*x1;qT>ktl_K0Nc@Av&*B4f4l zyJ$UZ;Y<7sCX>BCdUw#f(D{VYs9NvC1%^7Yy~@s?5-k>^d2Geb?)<3{QvQd%VtXl% z^lPz~%}=0y6Hzkjfaq82b?XqAs1e~?LGKW{Xdao~xJZc?!z@Sl4X57XOpNA4US

    YWPog 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%0D#S7_Mu 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

    vqZ5 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 F{{_V?!P)=- literal 0 HcmV?d00001 diff --git a/public/assets/image/header.png b/public/assets/image/header.png new file mode 100644 index 0000000000000000000000000000000000000000..aa0afe6b2fa056d1e2171e5854fea5d7fd4d550c GIT binary patch literal 974802 zcmZU)RajhG(>02_hX#T}AP_V-G)`~`?(XjH?(QzZ-QC?SxI2xzJAd}Ov%hn3F8b;2 zb+P7L)iuW$HL5yPMoI)30T%%b3=COJR8S5K45|SP43Y*8=FgQ}#2D^BZ}2vvs`g-D zSmgh_z{TXqF8^Evx0e$U0IQtDKl<|p%9#HrKNwg|G~%l+G#JXJv6vvgf(!WRn`^bD zdeTC0B*Ws$3v-jJW~WE0s;Z)@j1agOb?9VJOpGOo0hz^j-3UvLN6613K5zlCeXIf` z5-PgEYm`V)HfRAd#rEhVpGB6E3?d*!e4rH-O2oyKj0|s9R@n|V+|Q35(tg-SUHw_W zRgn*%Ae(v-MSrtyKe6k|MusuawXY@EHU%mU2E+(m&e!{_}Xu+H@i<=t*ay0NmQ`P%C&}ct7X(H zjhh0it?{OGwF)~z0d%-c7(2D;M!@W^Kue?(hmFyjv!HCrz;kIlH=Ak^=fY5;h7Upw z&9kn@%8T6OGYb(A(}Rhil+CTt)25e-N}6o3%7r& zER)#S)MTJuBi*d?4K!Rx}@15t+tFbjkV@u#XWZGbao{os+$Nyb&$@eCE}-(=44Fci!+G_<$vzSRs*6!lkwe(k> z`GvJurX?*}&-`otv%<&5a^e{h9XW&wV9M#SV3MZJ9-a?tz`A0EaJNy2Gtprx(TcP& z{9R^+O-Il0_#;#@GQOdT*}56>d+OIC@~GrhTB51d=VHr;VvEC`aZq35YVd5md*}LS zpWNeN!{Xxz*CxCBE;7)3>TKrd?=BO?-(IP6l>V2zgU1Cy&Rwqe1XEID7j9nTAGb#m z&sm@_2}qTC4RlRS23iS!>F}D;R`ZYfcZuK<-}RIPCg5gGH5byhT|(y zkg!%}!^%)o1H#1(%nv8thE!OMm+nuRz1RoyTg2WdUjs2G^?BL7Sw3_cI&_M8^5~ zCc2;E7dx6)OWDZCo4DM`GhQ7f?2SbZ{P zgjMzKgshipMUa>iUQjH_*8&?iTz6g2)F#LW?>AM=2X?M3w)9lObQq+qdK;>)ERLD> zB?q32v{O)gn(aGFx=2Xf*yK&wT$Q@>7oN>(>WFe`TQ3=|2=C~4sPwvo?XtN8(Z|1r z^5$UDXa0X@Svu#xXDs2*_a}Oao#l0VwRnCzFa|Z0A?DVNY3UUkdPcI>FqW6z2D7xU zk3vSmeRDOF{w}vMP`k4_E1X<9Hy9YEuvyjC-pusHn{Qo9xU}6V7LfJr&XlvPqU>Vt zF7$1+qzSb~qt)8IzMj<~WZqM4bZH6SKzQp^SwC0-Lvk!bJMBb~bF!8dU|tC9%%@mW z2hTqX;d_BUuW?l(6uFs$JTuQ+*aSm~VdzdX^|d)79wIl|o^ zZZ%xH@GQCCAK^JjV(E2}o&JZU9mjuxv@5Ukp2hX$@#%@k<2vDEd7a}zTjRTP@w^05 zM|<`C3=fENac7IR4PjHy_s5IYnY7X&MUU~;X6=s^@F98d@^R4t71UVWG7L4^+>l{c z3qTM9mw&u7vC^7I;gE8sq+ww6y6!%>&VaJ^=}-Eg_LWA`X0kHV1lt;m^Q!mg zM&C2R0dXqM*O{0Xn8tkL-_}jF386`*Ka>kDg&-{sZWN^VBe}jYaj#nxSxeD8;3c$a z7e41Jc=1e)Ap%pP9*(z7IcJ}+JNY=pAOAy;XQ;mb^4{q7C}XwJV*ftH>nZth`gC;r zJisA4_51j@FtS>2H8V$k=`UcJ2G!NhkNBIC9rUY9k;r=5O>trPU%WfPbBUj*&5({( zYQrp`LzPII{VdY@3ZN=@m023f7;%4-Ec8Zxou8~F9ny+T>~;-O6GP6ucxf{3UT@|c z!1UoLr|uxEGcnC|3<~z&rV^U#H&T7}%FLs;#5Qod!>`iXV0T0i>1eN+Z8pqG(tLRb zF)!{;6ypE<#Jwcx&_wV!?IeM!PS3k+RTRD9l};o%`#z@LbeNyHFVIG+`yZ+wuWI~- znWnkLF1l>5_t#Txm)Dq&qj08HM^}bBMP!zr9bq*%v@EAjO6$~$<)@Vq2>g5M;KGjT zi=!O|u}aghu;_<5BQ(c zQ1{COYtOpoM$z8}erZwK)8HCxD%+8zx&sb`ac_4t-A~*3o9kR9hBTb$@4vPxH@*fG zU7s7J5hjpECmV7AxiYjYn(p@YC;a0VwHGmlP`b=|{{z~&rqaIzT%@24x`g$<+>7RN z=X#5ckGHdN9XTyS8P$U-z4^+InW%ULO;@WQ^O5V@QL2WdRMqyWJJrg@EJHE}N8}zL z#vhQB6|L9Nuc({n+89=7&~wr-NPlV=)YA>*V~Piiew}|CXhx|W#7ux&nVxqfKj-?y z8_GR$T1j6|(XH<8RU@S^Q?ylKaz`TF$WC@cw&SX`r+Z(Xb0d7y99Q6ATAdP*Iq{;n zuA?YHQh;86jGe>EJ`Ev4;q%62C~s<}K3+Fnf3LVNRyo?JWr2H})_9$paNSIBVUl%d zn+n?SASOBmv^t+G?4MVtuNF~I-0qw;0i2F%!Qk8fN+dbn?Ef@UKE0<{j^!m&G zHHCE4lYQH|pd)wE6GNtLZG2H7DVnpY^9w{m8&A>n|3h9G+7X9UL02`#cs1Yeu&}i#=Ki{Dq<%i}$-A40_g4uIW!rOr zt1IhI_bC*Vq+L_s>F<-%o9rU$QOW;Hh^d^v2|;m0tqpu)A@U&eK7N`#!oHwlvB-rE zoMS4AajvYaSYawnC;)q$HRQue*p;uY163e|f%Ad*7T$MO1iu~m&@w5An z2_B;;#so1lF=DzE(ZsBRhath9%Aj~lm-UEv#S>xu5biD{-}?>I+>%?f!?drBHgq*G z@bv4*M(1>dpor?ePyq(yx+)_PbK~Y26UMsn>AA^j7i=|(pO!-{o6-|^7-?*8?Pn^; zZa?Ka%$QFNIB(FU?dGCBEI7yd7#Cqzxm%jnrJPZ%EzjF+^>4ObGo&^=;wRPoot(xn zT>cZ)@8^j!)c@e-;_ZezMfTgEax(AT-u8W0%_%N;Dh<8F$pkP_6_{bVSE91eibZT^ z&^NmR51JeH0T7ZlNlv@;=jJfSX!2u4%D5t6E2wk~o8y;(74)R$$AyfLI#cJ=SKkms z4qoF_`lto4J^;DR57QhuUif8m31*-3VW*Ny3qlNfZnNlN1ceEyjLcaU92Kx5iQn#m zm`##Hf``fiCpa6G{KNG)bliHh3`#_+ho6^l8LL{ftSG312paO>4U?dQW!%$hY1PD8 zB9s;zIp@+bM0ipT{8S5-o1$xs+>Zbg;TAM&?*=Qs!(EexkUh9F4z7`@?qoTicKy$8 zb?jxbC2P%PEZl5Q7F_+ct^cS6=W&gH%bb72^0$P4Ba{PUu>WxioBgqY+QsuWW?Xb* zeiPKf>F$=P1MsIfMzd>@WrGJ-0r0|!#_pmxON0&%Giit;cn!;-jukJcb5=dmamR#_ z`=rv>94^qg3sNIaSoE7W3)T2ya#aNeLhGL2ThyFDq|2WwlnUtzrRLHqiTW5qY^DU- zKKbHs=(hIeW|;_Gx>R%I>vN=iI?F{Df^o);4Eat%@8Xb~ZyEk9a`I`S02{$LRlN&~ znd>~hj>*w?-pL)Wg(@q^2oyPYf>!1Sgw~r}ijn!Mpmg4NKP;E|BE}AKi+b1a5RofV zHqDP$p#jJ;pmgcXH*|Nc z_?9wZsU-R-We&b!VAZ;TP6!f$&n| z`2hcg#EVf+)#A8Q*eqP|)><47+SNQo;dbr*OTQXJ$IOllbbZkmccvytYe80d ze{FfqQ5xm+&}dv7_r~?hmowsMwYH7y1GnrJp4B!6Uf@zfQTpOTRx%UN^U{Z|^HGS_ zew^>+ugaD#{uj8!=ZOd2wV%CtpEkQbHtrwLEQ`(-^r~oVGSMJF;RI=m#d^?ugK>UK zGe6SZbh9`rO{!5?#O_vv7#3tycB`7ztP+H5RcSY=;Ca;GN%aT(+qJH%gZ#yU3P$-S z_++;n)LIWY-JP&X-^%kDetpVqGy$vVoYC3t7G4;K02+|{emNTJFy2un>B%mHDWY1j zMhc0E*N)&L`DzhqF!yFeusnv;0B_?YMv!ma%|w4bXHNMZ??0jVFztnet#(|#BMm|GT0^=}PAefbswtie6uD-q|F~_W-sPq5{qZK}25)42nycQ+&}zNacyYp> z`Ov4(83}vWNIIe-eFNRdKtfs??|E$@b|ohVcBA(u%DTP4Sog2`p@M8tBSVuTdCN*d zs%NZ6Zxv42Zvy#_f((o4j|frFu)1Bxp*ExEw`!Wkus-o$FRPwMq?W?JhgbYA&Zu-k z%p&Eprae-;uRK@P3gjnQ{U}->F|3_gH0?VxR>NHbQpl_jkEJ0+p6 z`VyXAWb=Bz-7Q`;>1S@Vi5zIZl4=(8{f`s=m>TNp|EfzNBCp5SiLUF9u16-+jrEtI zdz5=q>s6m_i~BDkgeds!^)$63BZSJ*@$!H#^h#fc=1IhetFp<0ahIl<%HEZnDCj-$ z=j~5$f2gZXOJg2<(nOIJuAXnsk{t_%4D$@^3URq}d2DmhX_E zddfR!);Rgna*w!@UIZq)t|-`9zvm-Md9-`ywK&RSi%to?r+5$msG%=$D z_viQb?cjopb&6Kt%j#4a|d&X+Kj-e_RngQ;%h@j#l(_ z_^U#8&V$e9^hzQ?KbJa*L%A4yRn^VT2{q*6j{0eEBz;Oesv*nG6zUF7I*&16YU9xo zE&fmilY8q><`0xA-Lk4nXq_9R{fe#tR@u97=Hs^uNhzj4(aJF6OTU78X+|ocA!BLMoqcSq9*9|hSG3rdtt7vD2u0Jpy=ds z#?A`@&-)=OA|88eZN+5kGD6gb;y%2r_E~}*B?dM=<32&H{`t&E%^LGSJwp=L@+N|g zTzO-q6RqgXiagru^MGzrX44ihrDoK}OJAoE6;!ZdT6*_M{ltQ0tkcoi^D5|=OKf@E zj>Qt>!8DRL5yZQ4K9)Q-&TD&PbF+woN`KyQGdWRIA?@^^@%QXHE%}dW2&(IZXM z1zLW4+M2y!Ua3dZR5f9r9}!<2wIJ6SSX`i%#lY4ZTBEDwZIT`B$f-v<*eagvQkk6jY66*Z>XmZ1vP#qb$SO`xcg|*Fe|0*C5lrBKrHPbBlwcjlP#6 z-si-sjE{NKQtjuB3vQP+r{>|ffxo=d!>z z2l2HE6TL%8wGpTxqJB9Y7)D@lx#R-TPGb7_M;(`hbkp?MTb9hohvdRy7oa2Z8@$g_ z%w{myn;%;d5zeb2ekme#4%e)*hKZoZD0ETA>XCjKB?nDP(_Ogps@UnRr(g8#OW zzLrB2nKoe}ZLMxAGpG+39LDYIxMq!r8@ENeP1m$x83p~8)l-zLH$L0hv0cvs$C?PT zANRWnh8`Ei74q}G7*gHeSf-#Y6h`A6G2f&>_0KT~dCvQ< z$f&BCoO4d}zPymFT5_+RPq(?l-c?;(jA;Kc%$}@0hMe)&CNTbsXSO@}+&^5TtYX>A z^RfCd>Cb!rg_rrwch$Yg%KQ23o7p7uVTo^f2Y2qo9C3G{Z8*G6pYA8WUkRoP)aZzI z+Xuh4lm}@_+mbVg(F0LKl`2c-Wua2Uebw$j(7Ly!O4KTIF8V{4LTIuC&A`4<+dy+1 zxDiTW_$@t(->*gHnS<2~n$D2}rD6H6KP*gpwl!Om_+gYk_0cKF!XHR;%BUI6$72(( zIKu@MnRgAJMXBgl8tP6{wQoErLa&8Ydudstq%aSL-qGYC#X`i2Ins^v86I$6i}u5s zkg^Y_;LpW6g8QAxZhX_{V_#3m5|y^mDrty_)iF}PJ=fw%y8T+c9TGV*WZ?@xhp_mRg-i)>7K}1HwV)wb&q=D9vlpsvb3K1IGVp= z<9RmhI!)G;`)ghw9|-=Bh>igZ+8-zMyf?`oycE2b8*B&KZ<(96;nsw9>80`p9n$K@ z@s517nk`ZfkaL#}2z_G?w8+P;V$=|evNNzEF`v+2av6~Tmp#4-Ma8qnE>JSNGGk+- zO6pJIt{97$`LLxsBgjg0uAR5aB~oO;|{zz9Io4Z&)TIugKfsa4@&aJmLj#&Ics(x^xlLFEKQZ4 z3XUx6GML#rD}Cu)wkuJQa``JlNGT=C=#|@N7pX7Dw2e(Tj%S&AdDw&Ik73G(0&rv; zmK29FVdh9RWo@Yz3YbfY2iHv#_@dR|J2ssEV&cL*l~;o;hj4?WisUpMH3Uw{=CEeZ&qzUm~R)B+VK zebwLqh8FyiJu1S&SY8OfW)w@YYre%$rFlYa5$lTX)Wl|nl&?*dO<1sSGm-X8$#Xp+ ztOkymSSsz_^eE|qYJBdtI6j>ci~VkX$bUqa#$lc1v6 zy)%X?9erz4fr8(Z)}>d^{8`<4nQVnnv0}fMjXw zoFqKCy5dF%g*v$RPW&RGgf`q0$ATLo${z+&0H0SV_|ce=r81vmOArcx49{zWOV)0X zN4r5mDx&^8ng)1gQ7LSPYvUJ#&lvDf6mFx$vbycC=|o8&LyMl@QLO)x@pHla)DkKF zlZGqScYvY484do56(2~&jzshkti*1tNJ3^?**#^yrVdAiZinh@MZMyXPNAsFNB-XT6vYyuOSnC$HmSn;DX!c0>Ox#ke%10hbwSe@#Vc# zQyMkV`gbxaN}yGTu!Bn;X9p0C+QF4!c6n^V-o&+5N+En5YgICj7m0WQx<;i8kFKC$ zPFiK_+Nud~nT`4IxH-KPdohVbrgw6sk47P9`2K#T+cPqKY^f?dlp@5i4&RO^JvEFQ z)XGo^eTnYpgC~rnQ=w2={z}=RZ$lZza&88WPW7I#>R+ApE5?|Axh`syEN&;(TJh54 zbCF>;bAZN?BV+z3M`){7!S$8E~4V}EhT6U*8n3&m`c};|=xnrdmaF*ZM?6PPy zd6t;m_*-_G=ZA}@FH{<&0X~l1gJ0SZz>qL2RiHX?s`YVRg!5G)RRBk70@U_c(NM1W zNv?Sf^tbmRv3#Vr?tH>dA?DSVx)ik?Yc?Dgu^N(Ng_iBoj@FFjP2Mu5Z6KKX5IQ;) zx~c$YOCQN(jY_(s%-Oo<7b&T|#ZDKOYirLV3Dl2WdatW9*cLUte<65ov*Ul&=^S-w zczE8Q4ztNaCM+9@>&9$}7h6HIn0SQ}4u^M_XRpSD|M(ASsa zN?aQXD1XG!cLWQbV*j$J@d!f`EhWJ;JTiC%rg3ievI1TB(Rl?LtzKgmOV1&viohZ( z7<;%}<^gOlvZmOd)M!GGv)|r|;S8?l2|2f@7OZ|qQ=Xi3{~iXAwwpMJ?u|U;vUPLo z$<(zL`YF8`Em~DmDbdU^b{9j|zYE+e^7i`iB!JhFiQ@{bYbo}BHq24X1q>_%;EDTK zKow;OLQ^;$!JiNOH2vN?f}8gFRWIQ7MR&~)#D(6JBey1EEAdM+xWY_T2j|Adz0J(- zmk}a%<&Wj+th^o7BnC=`(g=ZjbWMh@&!li?2c6Fcxiz|H#`b=iS=g=Z36p`Qv+udB zZ)&lw(k>flMEG*t=2O`nn2uKSh=uD?tYgdbybfNquW{*BXK(veUb~=dbBgD&ifzRI zL+?TH7x#Y@n%^-3yHnux)Gy^EoSiE~$Z7&jOEgmj1&G;%qN6ial(dJ0HaP26}uS~ zXOan}FM~ap%=H~1MJ07ZVl|MEP_E`VYLAAeEoOT@6y)d%5_d5+yZlNdFj3uF%tk|k z7DPB`A8(mN)utDkYh5Ty)z3>V%olD==TC6Ko=l}E2RMS@TDMu7YiOf_m+ zn@j0zeV&!aq|3CNLrj?0Xd9{2uWWxuFCAXYt*&ZuwNd9_Po+*y25h>N)vUbrrgO)! zJ*1*o)wa8Q_3&DGt~rxWPIcx4Hm}fr?1GM$A2f#}y&EzQyL6n?QvX_v&z#@>HzCmB z_dNA+W6UO|pWB`5E?fK~U}Us?pU3w?ut=df8dv7q{-MA=M;peE?l*bfL?4ob+IFw%}NyVm2|pAf7^kiV$4G=upl z?h|1Leu+7U<^)NNadL0t!)q7MP&W%lVTc9v;E^yM&OM}-TazEZmlw;>(}P8+L{pR0 zx0jm@#T@=nO)W&Qn*uV;f_c-(hse9ICgn)p-lu6Qmb1arKqV=^ZK}ce&1#iM0c?AA z9u%5MVi3n zjt>)l15jGG9v(w0770b@*H53RN;x)r5k-ZZ=a=PBX2 zPc`aUXc>gm*UN#y6(Z5pwnX^(46S8?>Sv+|=4q6AbC|0mr1Uu)rU{E??cC55WTT4cMq*dr`nbI6h;KPmgv!plXcsy@1Etz1 z$9BUC4=L>&`qI#0R+zw&bv=i|!RzbmEyMIk%`hOz)#K)8A=?I3ZK{})GELjMWOA~) zn=P~V{&XJ*mD_9dV~wrr>6+m02@roH_}69E;wRu;Yk#`T@;KNooER}i^U2<9>xWI)8oAx3i$9v*8)do+NR z{k2UE6030`k6y+Y;yICH3ec&k`fegc)Es)7K8eem3{P$rE;M3(&+Tf{>7PZ27Ujn= zHDhK`A>7@33;6PqBfggzpM&!l5<#4!nnY2+uS3p`Y9U40g~>*OK6+0%Zp;|kIEy8g zPudq-SUmU?Lq1~fTNA!sD-@OJQxYS{5_T)IAaYm(VFiDX0(=ZvKopl-qkR1Wm_vx5 zw9)$23UmvtAC4g~ae`PnGcWt`8$%=-iPbzis-fDDq)sw|L6xc_>I=DT$UrSLM6))` z@^MxVC;xWD#=X&!&z7t|kfWdFykKHxMT)bv6JaGY6>n`t6Jy<*7&NW99iQCa*4X!s zoZG}J;jw$y_z`t@TzWYGA|&csdb#aDJ^na-d!T#otMa-Vur{-l67l>`7YYAcnJUiZ zcpU87cQ$ZS<{qttCpq|*gwX95rHx}NY{wkcxofvr`MC~*g$)V)aggnb+p%bOViYJ< zXV2gYyme9J)A)u9n=}zeY#v-jvUGEWT;p79iHK2h_9il!v})OM1d)fDYFR*^gd)V? z;!4qq4BlzN1lSPGi)7)An?u?Yq$Cc>=$ODVU#cM{9nx|8tXWLcaQHL~H#;5zbLkbX zIS7&9$iAZqB_(hc_FrksXAak{DT|sWq8cU3()5M*&OrS#dJtC{9+L`iYgZd&pv}n) z7>c#z(ixGo2CC^vanEd!h4Mfi_ch${P%A>@rrKI!ehH(~^AYIZkkgL)m6A$@Z{;T- z5e4OOb#8D*in_xF9D`{d_cT#QMDpFJs=ZF{ffA);Cn$(oKswSfZzJd6q;Pf7-g{Ja zua2FaX#AaSZTm9S>e+G(e)CB)>mt!udW`<%(!b1mS3=wEJ-zF`q3TTb-=HfT7b*NT zSm!97l!ri^PxTi29VK~KyQl_}#1J`**@})o5C*P;Qch6)k)cz3XhZy-m*9C9z(i=w z&KN2C`Orku*@S1lbTS(tE~K&G>Q5X|nFK?i=@67liD-EqdPJF$go-m;*S8f^>NDXY zBC3)6>Sv1&ZON2*DwJZMn--#vavI`5z85WM z;6`{5K4HVI3eV$H?bRYV+M81PCFoAWB#|0HB&1};KBUf0+KtCij+j!{xxSHlqHYl) zjsG@+;JysGmqe?&{$nCqB;}*Q|K%z(hU5CCLnU`lPFOwBpZ5H?)>g2L)0)JJ@tDdK zXIv?Y0n(ziejmYOq`RquevGVLL6anwa1GGe{#yv@&(iIiDSctmST|> znc0yQ;44L2lo`llK!V%$;&a)TO1c?eO6b5^tt#2Xi)$u(L8E<{uM6H5ZpbfugnFmIsO|xo6FCt5S zla2Dzh|%np;>lVvy(;1QiSLyf^9XEkf3{n&=|}Z-rGLd(=t->zebgiN#>?fg_Mf4g zW$&uYmze)Jb1^{``5!ap*z}^uf8BYi;I~trkowN@;eg+EBGN5J|9hRP)A#5hJ0IcC z%(fXyC`6GFi$0YN7vjQFtv59`_h`sWaaBpMfuDvlC2IVC?MFZlk`Plt>L9+BBsiXq`Jh1}!{p}F_-4J0Il17;l$qCC+%LT0(Wjibp`}l(zZ`DAX#CEOd>JxO< zO(M))4(@mPHI2oto3Qa>n0a5UH}rc>oYP_XeQ1(%)__wn%}n&C8zVM->PiEo2_V?< zvys@+y`JbYTYNu8(#BwSaC-XNUD%cios6@7edw`@sg`F?ggFyOrQ_9w=qZk=y3dzPALLXho1*i zG~x{@IJ{zgh_IG01nhwNlAdHHgsUz@CyNTp9hx`t@grAU(!g-KrnX^=iE*4aORDnd zAsnnw1(ai@7(lv?kYacX5utcKsP@?_W(sr{nDra;02U^;`Ypn);bfuuJC!Rp!A{W< zQwI@123{?SY3$|+3Tt&cDJAj-XMuDnU80cNq!Qv3 zhA;hH%_xUC{0sz3V3J5+Vz-u(fMMPL|XW767&D{V`pa{veq{=C!3m(%_g|U+4ify z#SRj5k>Iz0ov=g2SHr>!J(0S`=5Dzs$%asXbCOzxK_GrE#*Ictahw1H`D$8q_eRN$ zq+28$?BeS?er{HX8k0}Si7@z$P}cGTgyZwG91(6)*0I|kQiLYaFA4x%vd5aE2>RvQ z%8zyy8b(z1kb@SP)u>1XdVY`nP<(x4gm~?sQ05jusp+rlg|TKVR+4aN1@6gwRbA&C zfJwkvR>J(O3`rC_9~<=^J1y-g?evkcNBSE+cDJW>kL$GNO7mz$a2 zC`O=*Bq*63(WBx$I|?;t+*{tCCO+(u%*F>Rp>S9RY`A0^whe4M+jI8tWD@>yQf}Ts zUDpNl+%MLily-k+ssBf1Rn33>s=~ayv8I*&Cz~va9eA7`O-c*G#ITYUKWtS%Qmpg^ z{5b%(+yn$S6TB`|=d^#xCs1Z#2Z^LK1U(ktgTTh*nDUD_WOpex7K##3O?E1PkO1Wv zgMSb)k7%AyR0AD_jc_U0li%*^bSBBajBk-3s)r#^?S{GfB;enl7bCs?BSeUZZ|c3l z!hV<4mJIC^Q%+5@Db2Y^H%Xop%$Q5}7sV?bDrP{SM>)Fsq29!Y9vcw7;(Jzgbl?dn z{_s0%I3W6t0iF`QdNRxT9h2mqIgQX`TsP-Y*+Bsu`3^(Sy%X+K^MskzX_!o<5p3B; z-)5#2yxpl3zLHiP)zRb74PhUzZKLY>d+;iX6ccY6RK_Pn)iN)hCY$BY2P1S_harcL zDs!}r>-w#4!tRwz6RNHLR;i;$SGNm&FV`YjZ;v;dqW`~`j@5xGsK2?Vzm?DfmkQq+ zm45M4l(n3IfdSMA<14K2va7WbWl(=0D&df+Pf5cN%U)F%2jmS}h{wu<*!x@NyA9Pa zmT8sJFbH*qYWPu|lx=#;utwl0A7*NIrov#|)hCrg1?h2u43M?@HO!k)m~>qUd6p8f zhfKAxm}Hm3!rJLTc+`+9EN)w$`mPKY4bfk%d~TK=I`vb6se~?mImq1%V0I8wjh(OZ z`8P7^>Hxz4=p)=_kuUwY0r-JQKFY`J)Z^y%aV(lh`2d;_N@^|4^Um$TnedQHmk%l& z|1wVOOS}1teWf~kvoL^#JHEMy+A5%u%q-x)o9>-rUqHx3t1wX|bC3A~}^+4@;5j4_U~@t7uTi64o|n zc@mr&ML1T~{IUW1*f-bqx<`E_8&3L{!tN0M`W$+#A11EB&h3lJy6Mj=ww4&${B}Ts zR5Mi(h(K{nytwqZR{G&&sD!|mT&oD&8p55*8#f_c#c&W6K0ConOp99Bbh2Bd&fVv( zOxo{?!AdHoG5j7_S3rIm?cwvu+J)6XLhO&7%E!%e~G{F4ipXe^S>& zp;a3GB;`%JWw^iifJ`-(dovUc+xmMoO0d%1`zKiC_h>;LPn=mAh@ZNNwsaJ_7?urI z^c9IHQN76Iwgxxd93MLySzsw%f(L8^8uFb%`8Avwo1w(WyK$fUVA4LpiW?wuxDjlK zV)_$A^^Wg_k{D}MxvQio!~&cLLb&1`03u^$%1We9oOByjWSH) z?8=GcMVVI;>5JniH@5TDj8(1t>GNxJgkW!9+tjJ5ySsSsUd#?9YIRm)ET4f-n^z^? z@66aQwyypLSut^YD|KG@w~Y~bKdj$e5?ojw!)?nVABiN83QrF`k4@db`$Ld^l#tb6nr(K}J;;Y}R%j zA6!*xQ?JJtz^+H9r|2QOR;pjUq#GQGTIQtXuR_FWj>JNg=0zIR5|-Euv{7`R#PImJ z?gj7`1Mnsh&2Qr&nPi&K;xHTC&Y%M*qtId4rjp9;_P}SCLzAp#wn=6y7FSM8oE{cw z9G7QqjPKYyZ+niq-tVe5KOBIK{|bqYuzzQkt5O7$q_MNYS_JxY!*1arfob>#IzJ9p z_Hi&EfdPSU!#!B?23GTwg?a4wDlji{zDVVJ)sV|lDoXS-L)2LWoPN&?yIZ;SvD?50H^ZAXsXz>tJowdp*XA5C0EtP+u zY**MRDMEu&4v8VL!Ntlbw&-Yw5KmO?&3NX;R<1^X` z1sNnnE9}<~R^~L0tMF4olMOFtUEuZ>eEMjN)rlf5y-CyxU$4A=L45r;=*j4#NAsB? zi)a1iP5bS5H~sG<&0W}EFcC0Q(B)aB&Atd!zX@0)XCtz$s@Fr9ggV?BP-sL>|5Thd z05$7qz_+ZRT_Uw=xI^h2ZtZZ#Gwdm#wP-}{GZ5+r51};sGyrF zmnMi&fiBRhQ8iJ6OddTC)w^uFGz3t`@A?TAn+XoEQmOH%%4iK~QK{xYYzrZRXf7Qk{h!T+c=9b;YR`F4963!{MO)OSjltWE$(Eq!pmoM+9&E#jjUV!^D z(RDYP7$977g*z}*rX};&84aK1!k2}33s(cD4WJv<;O9}(JB(Xz!+EPKaT(Gs@&%Q= zR3$UBJXit($w^kqh2?#QoA;8XcrLKXo{Vz38L7c7cfBfqts#l@)We;)!|gtCdTGn` zesycc_2!YJn|b=?^JyzKX(CUTC)h0B>~|USUc$f4oDPA%`JU9QF^q>dW5+K9ZwTL( zl!SI4iKYQ6u-Ss3aFc(FEKRGJ$R*Xzek7p3MzVwe(^XCbJ2lDpbRgW|%Fu{`v)++KRp~ z&?ro9hhI}5P;_`?QM{>l&00Lv-F04H4Qlvv5tm1%Y^)%yw3@hI#w))gi#-f+b8 zg6jFWsikHI4X@sX?3;-x4yi@Hl?fuKB)tA)W)H+fSkw0$Fmj|$ znkG~7pn!p|AcqD-V(nD%QbyKLNr1mxBJjeT*4Xz&FW{00e7PARG^{I6EeiV$-&v`b zFzA~4jUD$lw!cK`H!*z7Z^PfviG+ysJ$6288%bPC)tn>W;0OMgWG(YO^*avaA93H{ zFaOo9!1X>+t`L<5#bJh^mPod;es`=`XO(&oHNak~$!%Jc=YX;6M_`j%B5ndGUe*G1 z7;WFl_2w7obDg?*!qFe9s;-A4?6j(U+xgQt*i9BdC8`guM3{&a?YhSrGcxz?rwvnX zy4_LfeCeptd{5`S-ktiG9$);cZ%Qfu?c)dlc?$jG<-IB-%eP9UXTk&S!qE5)g=u@q zG9vbx)4!_3fGuE#qLF+kkF701@A6Qd*6F%Ag8f4WlK{v>nnr&>$%1& zYUa+!aw!lfM>=A|N0s{sg3+_X^e93zGCt3`X3^alx64)))W%bCn+eHrEasLMHmiyu zwGOz&4fpwdMB-!Ro>yv2(buVU@R|6~mm!tuFk78dL;Ui$s6l|0A8=&wi2=o_dKy6n z1g^sf_kA1SCmZRz<^D3^sfW+gOKiAQAw$g2)g=TrkADl^rz@$Bo8o>P1}@2##$Y$w zulv~~J@$K&OYBcI0xGXe4c7q=S|&-bpYXed=rZ8A`P-~z5e!1|ocqgT_s`t5Gou~c zg{xIHY7an(gjRA@+$A@<&5y&pG2Z*0-Px(XBUN+Mzy2*c5ssdo!r7*zPPnWoe&A&? zE8L}}NED_AJ7CccYL$omWK)L{9sEg!AN9#@PY@i(4@uQG{gTqY?#Mk7x0w({F?M^P zRUpHzA$K3!Uq#;W0MqQY|62l1yDl0BMCc9k7h5T#vN1ryT1Si-I&d8*?sQjj%~++7gth3Ut}Whz(&)9xwmcdQRZ`NvcxpTi`Ww zccGc8Dzd}e@jyBRTe6VH=LrEoA;XB%bLMZBjN%?yzZrSEltHg##H|cx{pQSP08_ON zG{Auk^V?L7wGHBLey42cZ9~4?EpO?YGs^`;aHiAt>auOYs(}lgEW4pWwVhVqL@t1!4F@KesVE8+QZ>W&k z6-0}s$zWTUIkDAHTCb29H3r8y22 zn4|!yf@>Z~y$C57=ba!E7D<~RDtw(39O*lA3seRp`ifg3w<6L}`)L=pFMN4aGo0RE z)CAUw8_DIge?mhMrJO4~LYIOmIj!IF_TH9e>?liMjn?TL2h#0MfE3wk)~nvYoxN<$ z%Glq#0jn6GiX~zPR^s3tHPrjZYKX8gJ^)N*ow3G!-A%QYcBE+FEFQ^bOpBrCqbJZCf4NHafO#+qP}nwrzK8+jesMduQhUg|p7u z&#u}9j7x#cP(^ZrIH4SS0EZqu;o*s4BF0UC$XCQVE_o3D$VMhTntmR7F_k_7yLNiy z{@nv~NP^=k*+uz7or-xSoZ)w^s^?nK(4=}?N=W-$7FuZ6^>-mDR&tP2&1y2w3YACA zaLt1nLbwARBiZ;^YF#7yqpOGfqx7?e^8)3Sm3i7>ZHmNb7r9O7e2Qum@Z7LX^j^k% zdAD`_N|5IP7yGF;@-|4sZ@AP{_D-OJq*I;?rN(A?t61oGwW0+;vv~!LO$g5>Ae85= zd5klcG<;tp(rp-NL*##u2lkhQ0ZoFczVlnV}JrN^Jl@?|G z3IQq@WVfn00tzY`H%Wl0M^9H@hFaRWvDEoof99kFH$esG0P;chAYzmRmgRiQG6}ox z7*o6WksNOR?ZBn_fFgFidr8R~a6H_w01m2Rrpfj7I})IrwuYi=Ygwu!(XMkvx7{pi zePup2F34*sJ&Ctf|1qXzv)9To)yPZhCRD822SsQ>X36~G2 z$E@C)J?%GS-S7Le+9^~-#s3ju-bnu*-*KnOXI*R&WR+O;G46jg6DHjyb z#UUX>y#*1yZv1JE3}Ofq!)u#|Y3ra?-`G^^=*i3lHyd1u2c`*VCoMx;pcr*HC9&f& zC$0b?KvKVw1=Eof=5{Yv>x0xqK&*sGD9mlcd-W1k&txU*c|vi#PovIPb~b2Q!qc|1 zW~o4T4i*`PQ??dGIi^8si)ZfK{Nmzw0x1D0IAHO&FCDv|0m}pu1KKjM(jJ$TAN6j% zc?_UNnT|br$qZ8M;kmbb1|J;&fSTGhbdWpg6AR&xe#v3Bm3CXQ1`Gl_cE~brmENFZ z;PgD^yjvB_E!&p83&YBC%M%{Sfb6fx0`!o`=Q!V#XQ{IGuLS$uBqbCH`iUf~^V3+# zr)u>kCf5QWTjw3_{%(Z8>YOvJJh-3BgY4m;)VUSYf?Y6(&0`4-+|3T-<|0l-3pp}zyHfIrAGefKd>5@02TA5mJgE0~3G)a#c^x=!rZiQZCFRRlU z20|$kMnhb2?}>1hnfx_#6?hF&jWlnJB`BW?6>U0tUjdVU@)kYap6pLMpznKzBj7HM zM$mr89HBrZ4whPYzNsK&r+GyDf-p$dPHXzcY6o-cnR$O4S>T9dhj~--HBs*&7DEhIUo5)Wnmi{ne8P z1y*zeKYft~kgx@0IWYr|_g%cdqxmV1d{o!ov17?9*CY882{Gj5ff3Ax`gERNJ&0zp z-ICtTP+LQ+XCqh(5Zbd27;d15?Gny~s=6pj=ATNWTAJAL(U#}#!UJ&$Q(VXL)2OT#5NJUTuXY&)Ls;MY67zJdQhpkiKue}QP&^)?SLcSR?g zJ1w)ciSGQ;^?PEPmFjHt%g;KP6rf%}prr{_{5?_+ulIAG>sBREJ0#UBtlZHI{YzgQ z&p6WUP+H)e9mSiW)v#K(J+fTZky(4T#N_rSmC&GOvr1aeKy)A}!E~k3G$wYZVHtP= z^txY^n{_l=qy7@l97kWOoA6vKF`!iJ6{hTV8fONL%?MUawq)7$LIfvhoQqu`q5jYS zBsbGkrZD3KacKJ3%Pt~xZ1x9U@}^Sg#$sqNO0O}B7Z^1qM6_uTtWV%4^%)#9{@ehvYeq@_kgQl(10#`P8G|GdTuw;pKx5`TYf=a82 z3cMA#dIH+YR4tGC0)XA{7Z^0_LxDe^^cmprC%J(tSC1lg7rba_CWTH_E2}e1*6YVt z!>*5Nub)l+)z}{U!tT@*w#zWYdngUa#0GlBS zCLumpOmnaokMRgz59pgR38^Fp>ly&a4h9=80#N{;geH#1XAoSB)#id*LPN_42krR< z0C;$AZrLa|j=CF#O`a;oWY_+5L@(iGdns2rjZ(=bgPPxkK_{ZppBE=x`(X17%D1(i zD+<(bjYT`>;yPaCVMS45$*}lbR^4N962Clf)HV*n*RGVM3(2NlSV2M9Eoq|oFbqmk z?H)cdts|30%^Ue~J%8b-4q#GTNI^rO+kc@LCs4K(<2c@TXu`k+3|j196+OaQ_1(3x z{T^HbXIo~0G23w$&7kAlUBP4<&;_Qpmwm@bYrSgrmT-71vTk7-U5?IN1U|B7Q)6nO zoju-=&7t*u&D`PsT1v0|pL#**Jn`RCTEywmkR8V=@2>|I3&P9Vi)(oI$ z((>TuaD?`qT1Ju zK#vx|hyIdK{-Ej(scGxSad*bnsG-5xjBm~v4B<3CRUXb|>`snwsPpE4SvYeXl1{Q| z$F9oz&aC5eUnw6RU*hoM5GpNm}i0vibT_b6XJ+EIEglb)2 z2B#_8vd&hvLMn9%WQzQxb0iw=6*zC|uUw+yPW0+v85sABWaQi1OOWP^b{d|RMth^t z6hSLO&Wpwj#-ySEaK;CUsw_#)4-D7Efy*IPCMA(f1?aJ`D0n!}jKU?;BX{c|E}iXJ zI18>m2iT@R@3CL254zI-o`iA%{xv%ZmzIjL&A2)kUR;x(*GUYn_vek3eB)4!Va7#J zvS&`9BjitTlbw5KLa`524wb=)@rM&BK**%T458i9ctW9iqxgk<81-O%5x8pgzYQKj z)3-2%eOM0x;7+dZ2@S#rP1KDQAw}8&O_bBWocg2HpOP(JJtdXM01W;y9s<)GgD|Q^ zxsxdCGBQ$@N2vXtZ2dEa{^0i+J^&g-C78$kV!zmTOM|>_7p!Bvg@ED>|&po~q(U<>hcn ze#0f&ld9xe_GXtLUtcaw6ZOf|$^zJeRH5_11H8Vlr!Jr)6VV_ENl$8W1?tVN_sBev99N1(RZY5&Y1Oo4<+k=$kFNN?)llPy}Mc0 z>U`RS!(vk$O4bTdO}X?ED^$i$ra6%eQUPJkgh*E0KwX46{#*5z3jU$Ip=jFG#byrx zlR1Rfkj)bs2t&NW9s(44bUwNBxp;jt{2Gl3is?oBfihSFJ*B?s+`uH(Q7BkRMKU5K z^DVy(-caDQSBYN$?sa+Nh(b&ih_ohJ3Bk0mU{Au|xSQ3a0gSs{*GYHqIS5IGg0KDJ zoOM}|4;chK-48=lu6qj5riEtQ!zIW_Z6%wiU0zy7CEmx=59Nn>j8{Dzc4-nVX0ruiO~A} z0xC?I(b)#fa<=L4%Dq}KbSP5p9i-DYg{YPdEI#2u)Zje}}fe-4@cfCaJu~BRs?zY|kFtoJ1VFHr5*uxSJ-NUFMIC zKdsaoE)C_}-U_}KD?RU*@V-~ucN_n~dh4oxxR!|1uAFUl(=|;KLbiY~JtUhMJntqK zfIQ^Of?{b<8Jt_HeF`ok&2VXL(P0=l1Nz9dJcL1SL7@g2QL&7`s`3YWhGzXe zi6x0*g^>)FuJ3IK2=ej`%oBMTgq4 zpv5re zAYBtoJk0HUgz(uwqLOvcSR6P1(uV?L_HoZb2G80^elrw@;kBmyagC7^cY6#@5n!dK92%2p%5&n%ASAV`#4&3of{SMXp0*ml@pBxZht-Cw4c|n;7iO3l zTawVt7}5ZC-ClMz7X_bBQbi>zOhWvV)#fuhHXhql&?NT7L4Oye4NBW}M^t+7B^Qh~ za8v402a84lG{m`iW6=d!f(W0RZnLb;YnBk$INzYnAvR_cg5~N*Api2oQsapu*-aCo zZWU*62SGpQS>u31Dq4k<>!%6JoP{$_*`5t!qJpE^Fhu5()ZDpN-YTk9@}sJ>%BzD$ z<7kOv;4(X_Y8Gd|O(O2UHF06nPvY0us5(!W>W65>iIr610ZQ?yI)qsS(-LTPX488T zfuRbqapJ|?V-mswD9fWn`lV$=+wV|))1{b|yTX2cKU$^Ey2cu8+cxeT>_j6L$+6nmdwZgKF$;TVJ%rkqVGun74n?Zves zh}}$%%cKRAW`O*#ngq9OUBJL{_9j$H%8{x7?ouK&+L10v=LAIh68faD&HND?%)(Pp za&di|^R80-iUJa4Z5xxDg`*F4cIEP8A|}6*mx=)1r-i2kH3!DCu+f_WMb?=5IqX(H zXl0`jWqPLB{|mGd?k^-w{6%xsQ}2=;Y>W$e5<>sn$6RyiuH3}hlMDd|J*u9+7i2Uv z-~Lmnh7D8T-s{?n8U06>O=i81#I&eQmz9ymviiQsJg@2N<&wklmqG2-CSKg8Pi1$L z$s+Z$>TyH-LA~Pp9h+&j--I*G2Ele*rU52RFCxNdxr)b79vM1_*j%RuH`T za9u&##6>AHN_N-W#PM>Z3H;hfOGUv(q18xFoLdB1`&0Sc-;h@o8$%2kYJS|jA(Ojd z#(5fb=-0mAa?Z*##yc9_==p6{i*<-8jUVjO_dt?_y880C=DUoQ{0^6ac!auZGaKd< zmgPW9@pVHSFtE1xyQ zoXgfG0G4Yb*OI4tl&RaM>P$&rkfDIiFW!+1Ki86F?LR~&>A0TmOuh4gdJB~o4*MJ| zVQe&Lz_7N?QcGu_2L$kUkm&N{3(I#X9Dw9W?x3_oN0f(B30Ukj;yps;4N+Tg4&u_m z)`{Wu8=JUbMrW#;dUbK?yWD6QQw2XheuuJ6`IQ%z*toei=a`f*-`lqWgk=dSn9BLrAJ{rN_b~BZd`V=qvZLK4#EuF;hw!aamKEAmGfHC4$dAZ z8MzrF8~_KZWC@#D<^6zVCiM4`_(_{09{)1jCEx>ANp=hvf_TBJAw2Y|j!QkUh2=sg zbd~DtM|(POUO4x|T#cJ13ZbWRut990@>Gi$M8y03+rqiPc(h4@x6z(M*bver0Et;h zAA~*t6eF-E>N@Ur1#~uWB}(o(G!m$gQjGvXl?H`gP6`<_2?Do|<=U#3S#9l+U7w4} zq##gWrm@6m^UrPp#Y$rs)g*V}?IWZOs>s6U-hQ|A(u6*F&Lg!Wqf`>kQL zNs4s>dztkw7t$zo!E5TqjiP7+DW(VX+U3T8f`muzYHe)W*&GC2orK5x!NAPlY&P<3 zy=69U_f|b`uY1=o+#Hm>FQGo-tp9%p`xhBPm6?)dYhP_6r6cAXmEZz%fiAev+$mgy zbtVZP)QSUlffL!2$&n&J^@EDE#AIjYS9w|3)%S6kVM3L5T|y~7qfQXOrxv8WHEvh| zFf8^L*+riB$#eeH>gyf#ZKK1GxE z=f_UjWQt&lLweO-@}jigKBAZc)PjFi6-WL8GL?5r>MEMi2>BqlM`@6wj}hc2()bDO zRiLaD#jN*dqQ``v%<$s)4N^6XX{L0+P^*jVGJL)0@OYSgxpkf$J{{?*`6NyYr<>Kw z`k8`lL3-af+6qV(nmq?CJ-l&}gj@)nTF@QSNm2La-s^V^Te0$s#F{LAE9Uf0Xm64# zWqQit!6kk=hc>C4;knu7^wFy0>2&-4!=3k==Fbkrzid+v>_0hbIGBgRzqOeZVyuNk_=GF+5=~v~4?uT#}nQMw&|Zc~$}#2wF_6>8ievs(oNo z`c5Q@Bonn1GLY>|V&r!n76p2sf+(^5*@2V9c;bD1h|$4lp%2DsNt+5_*vp)9yfLKx z!fA48rLpGM-5(Z4{M{3Kkc=77(*5c-~uWU#wJZ93i7R>rPWN#k(mV0BG5QTasFQ6W!MjHkxkk=bqU zNA1{^DarupERC-g5h%3umi=n51d{Bq%nF-rPrtyc{^lU|XaX_?Cc-8C8mkg0w^6UG z6dER60ils`vo4#@s|u=mn?Dw`nD$1+Av8aWG*w5))PN8K6H=)mAQm%SWe0S1qTohjO|0J3Tz*d2jjlm(C+fyQy`(+> za?CP(-yR&vq?YS%18JOKi~U9LCm+zw>5qv&x7~ot5gKz}_QFoW+IQreLcyAqE#Mzf zmKyTaF6s|sV2-63#Dp+P!2b1Kdl^j)ub^*dq3+OE7_Q*JC`aKQvQjXp2^Tai`qN!l z&B8IDJk^ zF|W?3MvQ%XPbhF$3|{9mB*hJT?cT{x2664MFulECoN3QL^|8)L;{&vBLEQ z|5F2XQH`&G)a0|s>fSW&-%->eT8$HDSW*uBhk^a@1K-~4Q845xbv&V(EFC+Dl%NYm z9mh;q*gI01AL{|2mho7|jEb?#bbA#H#?i2|JAct`U4@R)EU%RJ9I$Johw=c-2P_c<$ zuaEMcd~VBN&RlcR*ut&47nR%vxXwb84M(Z7leJwB+rzn^cUp)H|6~0YTmO@K=ZTG) zveC+(d|h#KJTRp6U!T{zQKm!akZ%R3K>UJ86u@+hFKe#EFAfSe0R^ZMhFy45LzE>x z$E=}>fuh3jw@Sd97w^MEbrTurGOBE~Cm?wk2I!cF(sOI@@~iybF|fhH(7@qc#l+wc z%OM>Ww`@iI6s^w3mBuKF0Kdc>7Z1pl%37-_bxq429@D=;Mx0GTZzbGw8}Wj=6i1Q)RzMG-3?`N&j?J}%#2Gz2;qP)m-No(4DUh!iFve;%3Tk4+zAI@k+?)w~w{Es}3kGIP+JY z+;8E&$|E?#G6jP>3r1wFwZbVD0R&*a>vNYVEapP4+rPD-#fne<=fX`ny+nUkRll#`8kVFf_~_kfCNjiJL&@k%_jiVS6=|Uk#90 zV_pHvhCarnKZM-g<`wa-B7axYDS8jl${K~{KEIpHUVh>XU@o>Uign!MQKeS{LG`lL ze9B_29)}0%`Y7y6#N&Z%VNZI$ym8XyC3P#MCdHlCL$deaLRWh9e{uK<<+j@Ya;^NO zvod^JV}niBa+Y^%wS414*OX`GDh$4^3cJwd@qNyVtS`c@HCXw~5$8BG7%cRw^3iQ^ zdc*y28Jo!sIZa#ud8l%jYWZ!}!8F=FSIdwP0BMIcgz&Jntj+jYQ!)0itn}3Z1DF7` zRh$8)PNe+=oM`^=VMsQa%0INsb2Ct3i#9ZZ_^(eHJmFnM@*&{T0X>kHocnn}ao#st z(#)2V69)!M0+0L69(JeJPua!9-^AQL;0tx$ttRb>2iWH_|{J|EXhrGrc?|Gsn%G14gLo(a;lyv z{2lRwN3jxiB@xMlsx^X^LLy$v75P+h=B>rxJGF7BGmF{|E>?uDrTwO8Z>DXkmOz(7 zP(r}uzr<4?EMGe3Y6`4c1Wiv!WbvD8OO?y-ENxNR->~YFe?5CuM_<;ke#qwjvGu&Y zUh926qQn1b&_exh-emk^Eg{$P4)A<8a5v=0oZyzm>nC0^nQDpI8o)7#!nM93^o`yC%@Li}sA9Q93c$(m0zKB7+uY>Y%EHR9EnowSY= zYbzzdgGv34-Li#8H{NH-v2sWtj3fO0b6YO^mICtPN0&KRd|3*g(=S~4^inqmkb#?Z zyy6Ccuu6up4V99LFU9@vD6q=d+c2AFHv>zUI$&&3S{X9(8ncR0Ev#M%oVSoJQvTO7 zjISpSJd#ak_L7z8%S%t={s-M+ARc>0HF$N~# z0ovdi!c?Kz-FReIA~YaJW97)9CW4kHsf8NEBRbeHl4mK5`4rut?FNW15gcs}e~e$s z490)w>qnr3$Txg3*#^zXO2ptHYG<|dnA7!b)G}X{ikg`bSS~L^a+~F=pm`tG0NQZe%vfRs61knhf96ZfOn*7BRU7Xla9LpnSxP<(ZQ|i0M)cp`twD>lxZGLmWNH2>Y znc%2eTY%?MW*#RSzR6zGz28Fccn|)5CIn+ru$KH99`FXi1NMN+{LVg4?;{!`g)W|3 z?aWA>aRtH8T(!V{g0L6O&=oRPhQHq=D)8-_yZj4@x(EVd!+V+SWU#a#4+=A$E;UZ< z>6!mpR`F?eER$;goEl>GyKX9$V8$YTA?z3s`B`WTh z$_C5KpsdRSYu>+Sk~q$;Si0uZVt1@wNz3L;@O^%NsQ!%Xyk3mP|lHh~z z14jQU!2E6EUVnh0efk$!{Fz{(QUYnszr9ma&U6GEQen`SU?;ZbR_Jpc_1U(7%VEEM zvf$8sj^}KG)Qv7pbF>P)@E;X#Evv_s#K9y@h5LnrV&7)}n0Abncpch~w&-L1f!d3a zeyG7)vEu~Bp~ZXNwGfSFZ>Zub$MDYE7c0IvLAX%axhe@eSFqC3r-H7DiJ}f;^n_j9 ze+mb=7sDucuqv$=VHx{-nbglR=6Xn4*ob}jM#9tU>?idCT4gs6T(7B5^_V%^s9K+PLtDo=73#Y?5M@Bg1Xjd* zT8#8pNIlpy@g_`REQOW!aqVL&iC1KwBhYcD_?;$rSepxkMK8r_hWbowdJb=umxslg zB^w-c_cz%Bx2D)qB`i(q2dq!>j@{n_5`LJ?_dHD8KcS^h)&B}Y$5q|$9(SL=oINBk%QhTardMkloCa#(iYYkvI} zf7angpvD@PHKMQ45J1P#gF5r@FEC?86|?Hm&a4CZg(wH+LQ?jjJ~|0NiMx*xJO7)a zKIer@T&sgtVI|hTi;`MH?0WH66ea)Pr!~4bPSugJ>fBxK9h{$3ZOJVTlUS%MXVB1D zxy2N>@Pd_cQvlZzu=(L!l$-zZL`3z~erP1CZM+;VqST~Xz#@qIcQ3w4gBf)&o5pte zivM>#ww|$1hgnH>!-ylwb$`Qg!N7q}VJ=m5A31t=>3mUuW<_a&#%BTm>o|CPa&Cu! z6iwhZqD?K7OO>{5aJ_=nrRZ}OMpKmJj?b&aX6KQs%%~&7s39qBzhGp&#f2>b>rL$+ z&L(CzXODsV*ZjG+aR2I!*6_cr59U94xK)UYm6Zce7E*LFY`GqGrQh?mJ)Ub2` zuduow>nqRytzjn;|Io9EwQuteTNjRnYMBGqLJh$mWPwr!_P<9eDT!)_KdA%BqnvDc z{A7-z^M31ykm5BAF+%{5E#YAWB~hVxwX;k*_$`;<5WRZA(7zejaFTWT5LFAa?tjOWSBoY zJ*Nv5Aa3azxuJd6ztP6%&>8jwGfEX?2QM9(CXGnL8b=2J9N>})8S9=|Ck&MX^IM=({Zc5( zI~h1ML=7on43IS|@!ZaGc3Lw(@~=DxFAj$fd5z}x1Mhrh?wWMOOJq9AQNw_)AC4 zl;Tn!rI(h&;Y@zC)J<}lZ&&j<@B#YXW1K!woN`FluF>S+n4kM1{u3_vH&{a#_Y^CjEf5qsSc%ZR=#LbR* zYsnU@x`lADV}QB@v|yO%Jj^d+izrI(N4)$_TGTH%L441zZYyIvkV7Pm8^|#j7$Zm$6CwORM zWFTSevhOp82XG`)s@li*y(C?b4Qt%fa%nm%HtCR)`-FoN$(STB4z=(1ZQUnm!62RQ&dVL>zc1F8w;bpHRXLp_*DQoCba9mmWo(c*Sx`$wDKMWF z3X76|TA^47h9~G1cSzzzlb~f5Im=-=$WV+lI5etd%vDLWZ0F0zLluUtxo_Gl?^W0T zq4NhWE2}O`eUB$6;y||lNDTG9IFqz=2CZ!P)q%@HAY84rOoqK$vWa9;SGfN4OGP11 z5O67AH7=hsj+0mxHIlC25Z>5xT|Pjep}-H8;}PaiAJkz*l1XG*9!icfoDRmk|Na<` zvX85!2cL3rcaO14w8c(W-~)5q0ICVZTu<;2jxsbFwWP~}LTVf=_6WTCfpT80Lg8be zq0)~1!bu58L6;i|<2MYw#&@cjuNwhpn>CcKv=^Qe_Hh z2VyyWd+U^AHHQC1*#pSsKr%-Hke#E~k#P%9pM{!(K#khdXO**C`Vaoj2l8&12}P3^ zM`=4!4r4?bopzwT`PW&Gn0;u0=68;Ooe*Orr- z^66{X>wLFlDc#0$=bv4)o`g-dXzw&}LLdm^J0nM2CZiu?Dt?jC- zWQ5Cr5#6`F5Fa$-=PB9N0PZQ-bqRa)8wW*r7C+I8y&d6V5nhFw1!72qd`ShlOtc=$ zD36I%n>;>_3nZyz*hVxE%!?xX;xXEJ+oq^2unh?%d|8I6^}Z~AN{Yz-48_@Ef@>8K zw_-gCUrDXfZ4`^q7#f?AKoTR^tR~wR18J?l$sX$#CX!M)sD2~ly<-( zEb_fAi3jOcRxkIKyMNH|Wub>%DIX$bW%zdU3M4~#`_A5apzt{EYZ(m(c!pzM%VQF& zkRbYU%^Zv2h)^SsOT@M@>C~|sy2pK(VfqeC;~=;WX@<+y9MfLGE+k^2nSpxb4@Ca? z!R)6;qFbk3qx}h`%sGlOSJ&!kArKUcIamf^^Ej4LzzI^V%Kc>~s-v*`-y)MKk3m1} zn_i*-f<~Q`$zlJLCyXj{3J&I`O>j|?racYxOAAZaeIJj5tEoRL>6e|#8!gUY=k-{9@Bj1Cru}PO>b^r zYkkhdWWUe*rQa-Vd)yBOS9D7aaohj)$$&*|Iqfjc?= zNOfN9b$;Hot(H>!fY4##ST3C($;#(Fj_o0D!kGbo7{=;g+sN0=hu-e_u>5?zH1N`@ z$kUzyuVd5d^wvJxtR3$1#SPix^Zc0lb050%^79T)_x)x3l790ub;3r#pv*9`Xfm{w z&d?gmevF6FjhIwXtq))U`DI$n2kf<)l>vI&j~rJAmLEk-$gWv>gK|tRMpO1wfCweq zw2ghF)s1^WK;&8~*A_OQWo&~Zh>Km_a7|-k`Kl(mEmy=Nzi7|VbP*bvz&;lrBg{P4 zHAdO^ivY|Ai_a20Nlm~`uE(CC<*?8dBqzbHHyw@P0xe)lZ%My>*;U@xReOmN9#}LV z-Rg+nP$37HC1OpOh-*?M6J^>X;6Y;K?>feGuu0q)wGX!TRsmxtF~bA9ArVyYVPB10 zl@wzLkPkQ!nXfSgh}5WJ=(#$m4IO1W8} zv6s&2z{Rt7)$#^aq@Q{Pcl=EqT(i2=6GLP6)Y8y!;XCu$Vr%DqxQhe`mK^X2p{)M+io=WUqo{G;da!{^^Lq<0uFPqcnM9&+ihe5Aa z&^LH`*sgTD`DPbFXK!d-OBJriyF4GGZM(djKAxjTbKg;L7wp`WCBLGc?gMPIlzZxB z6Qz%%A}J$ zMO8+XH(>}MZDVesTrnuZSE&r(7LeSw`7TOo{A3;p?OAF+7ivB**2loR6k+hXz~gJ^t`WdxpqfyA-MV%2qAtCV?+jY zPBIjM*@6BBN=jfc#)TO7RuQnP-uWB4pb2P}Z(80ba~!CVZN(Z>3A2grIy*@YJUb4R zp~Hp|lf{TFG(-ADN_99|U>VXfKkO2xt|~&|eE#b>y?S?gG$<&JPg>`Fzd^n;{@mkmhW2OpwF{S%Bw(bVsIpjx>SDP(V7u}Lyka82Kk9xW# z5VzWg_r0xNAMmDqwlLytv=bo!eNqUfNW)|WfyiaQ&OF^Qjl<}2-BA$N$TKoOauRt! zXSL*I7x!GWc+T2Q4Z#jvTmkaIOUJIo6vL<`-Hb)PuxD3{=CS@$AtK5mOdkz@ zmLXm>L(vkcX1dOyv3lEba~N?U%b0zDykbG`&p<6nFEwW?--4zY z>3=l+?D^iQU0Xd*i0!E z2@61$!wha@6sgTxt`x+~+uCU1its;BBTC~`9wuAlp5C$>J&g1TysWm$mH zcy6Lub{h~vwrPxqYBdd}$MGqRo;E%d-dJ>j=v@x*8%$1U0B>&p6zA=LZ9^lRqBd39 zW7EX}o|vf>2RMPYHP^3v=p!LWX~dVXv`1EAM`G217!FSYG`B8$uo7576S6}-4ptl? zs*cQO+QDd~mvqnE9+Eug4;{ICI`WuikOvez}Un6I!0MQ7&9pByEjzFC2gk;o;zRKfi8wKfGW? z`F3rUcHVTmdi>nhaj);}aCJCK;r4t{r|l|MOWswBvYa**wzz$2NQB_4pibf5skcZjhBMqMv^E~*$V zc(Wu<4pjS#_~l3J1rbpxG`WzO`*Fcz4LT>AGD`w;;E=*Vk>LzMIGegeO1Y`jY+3mQ z>8Oqd*Rb@(SlXX2U9yY`U|o}Mm90L95n-9&v)jZic2m9~O}<1R*a5L?M{G0748xY}9J z^*4PC+NcN)xr=b*7;rj^zI8;3r>(?2Qz$sA2wOs+q6-Y;h#xSj0HC1p*%yiIsZl!N zYBe~}UgQ9n1+b9W@8Bq4#x-|Vrz;~;fms-ZTUmfDkiytCQqGj>Ep<67XZ`iLMJ;~V z5w4eEJP#8B3O5~$+UZlH&~FB~$nTa%v;u9M(VX7&gT9$uD1(tnt1cQ#x|>f~wd>)U z75CPn=TkHqPpb)|D`C%h&rd~o7|IE2Hy6aFS^&IMbd%46)@m1KwrrWuI;oj>bn@Ir zZg_fI((6uV9#wqRaF~a>ufe$wWG)nbrT;Dd_F3&)75f`fGM=r#`XW^>OIOl;;A%5J z{>E_?w`Ufv583lS^~igR^8eYQpIR5^3g#?_* zzxdQsSf|bTEhE+xGcBf!Y|>e!v~^Uzrf|%+GGL}|2Ol}8n`h59N^k!3MFi9}nC8A; z7)BR7-ris7Z#Zyi`pEr!dY2*}yL_`Y>zHk8-)YI73%CMOr!`%zGt9hG+t*4@OIjX& zJIJ%D(v^neaeKah&UBY^uS!pTb;IryOSk_Z^WA-ZYuax0EIhm29cP{szX~6=H@Tl( zv8rdCNSDTbS?`$admA^U!-~4OuTRJpD(=qEddIV|rj*wpRmwA>Lv+4`tud|W`}KdZ zviwRvRH_Ee@|zx#IvG+ej`X5zk_BKKo9u&7m!+zVajO)cEJO(gsT5Qv9!wy) zoC_W9k8b4I>m$FNwo5avs+OVu&5aexiqT+KntW^bxmv$sH>E?4C^-WR(he;N#HX=F z8o~LbD-}XSfPnxDsIR4n>3G^#FDhgB_wd&te5kIGLlZ11fwxl4*B}}X+JwYBW&^Kf za(G)2`|Cz(j)`{9%prA74S5dg%_<8*WXVYH@6h~Em%>wh=^s^23a1o~+6#vxFEpER z1GpRcB0NZwTnk#Rq2h|wRy1naFl4sSqWU;(?N=OAg^RXFFirte1)s#MjuW`td}Z|` z*`UhaY!vHPJlHJ+v8NE+U+Yfg_2H-x9{w=W?>I&=!f(~5D_U<|i}qr7=rU#7X&6}b zQ7wywie>OK`^nYVk23jy9i1be;N@fC+(UyyCpwAj5^OT3y6jDOysdp@Uo>hrw3x3(>4%JPUe{h>-M5M4Mck@b^e>Bftc)k&_0ko`H z%1({dugTGcF0R$eG}csImhrV*FsVCwJ*i6)E35D>ob)?4RvJ&jhBwQ8z8n?+HXpd; zoGg&Qn-ja1TD!Y$CvjPac21UXXP*4Y+34oxLz0h1gTH2fIeYx5E(ET3$ zf&7}k`PpVG#s2uMItd`?c+omN0Et^M&Z`%~0k771fI&Wmy{F>z*7x9WH%)b$^ z=y15}c^(H2+rB0x9brOqz#ftcZBd2B@e0+l+tfED8W`ENg@5Zp7f>%@-WX_uC~?mnKq zf-<5F@aqo?6wG>9dr?tU4MbI#dsIkUEpx=fa$q2MroU;lhze;M^L0eDl&fibBn7)p}^3Ep(8&VS5IX&WUJD-vt*me0eXAd8zOV`|hZh^aIi_tfh6G)-$@CRd!n0%cvBTQ-4c$fyx+gZr z-y-as4RHJgEk299OPRGf@1DcZjlnbV=M?nXtE*nG&sTZhpPOAO)qnI~=O^m_D=gqE zroEQ!Js)1VxY_19>NYP-R3nsvBvW5+D*E~5YtGD1ZnQv29ICpInbW;w0{t$~1tSzP z-ASJuVwvw-9pJub(Ab7Yzf%g^>F8H)us199VS4^#qqE<(V~M`e`sMh+3!P!jsAPj= zZCZ(aVX8v@cWP=qQ`frWRbDl9CbY9S_BQV?qdt@_1~bzsdAd(7YAoujekAoyP0lwJ zcV1=1x;6gn?R?Io!&mZM066ex`OFRr91znvmUM zHsm=6iyM-1W`eG3$=`(ai3kvvZ2T;RmwHO3d4*VfMp7ef9{1o7YJ=`%{uSl}+23hZ zXUS*du+npCKmn)z&4iNl^awIYm-e7-(X-3$Q3V=8!V-=GpQ>;%$_uks))3jC35lZQ znoDAM(3x+NCppFYWk{j#W?v*0yz*e})-bgKB5cND7IU~8w4e$&%Io7(BG?a8l`i@J z0M|e$zX{5i+{azFX2B(;O|Gz%=}*<#ppLa-fWKlW#`qLk zaX@F97M2cQqF7cv$pJw>x!Zl2L#v{swRF z2D+MN|Fu%l&x=1<)Zy3fOMyF52eJs9b`0?4V@fmqwAFLL{b74M@YwyH-?&>!bQ|}N zN2KAb(s+I;ho$IyVRv`^f-<$=FH`By*7iH#YTodR`E>WJy;dGQr;pQ{l9;_vh&virBbO>DwX;#cU#zp&3%c-mFk zwD!;CtO2iuw{k*LJ$~?w7Y}4p?`^nz^ras;`EY-lKD^poKCAWW#XKK8+inj|zVHP) zr$66%@OS-v$#N+tyWM9m%SI=xwhEk0iw&!A&>zJWa6>rB>EEKXN-%$vN}kLEzl6B; zM9j9sqXf*Mi2{LY4508Rr6O9_vN_Day;G<*Vu>8c*@0vKfJ*pH=xhcLxx0z@cwQ0y&C7<6;&=x78Mp}4CA3TjDG zIwrc|#Y_FXJqG8*j9g+A0BrH~|B=HO|8X(Pwzrjy(3tHI1?B)i{l+`dStGk5efF%V9 zwCBUZ=uMTlF)VmLM2l=)0P@#^m@8Icuk{tmMCBU(!@1BBe~qumW57&aEKP3IAyV|8 z{)iU{ub@~!yKyp$*o#j$Do<^j?jF~OPte*5<^28aKm5kLEmL>*m_J4hJ~{ztbf@TYRyym@ zY2DmDj_=dRvYM}zo^RDYr7t@Q7njenrUoE7PpB|b^zZvdQ)RDTDSEPEYo&?SC3zq< z_j!D^Px%>EA0#7PYAK8K2~gjsGzztx^>8c=7_a?|-Qrbx7E~`?oZAFtuYJGYzP1@w zMTq^p&$^x+k5*@Uw@rW$yRIp+5Cim zT3%j#c9O%+8)*`qqef|AA&Io4P7n%@f+hzsI>oPghd?NLCsLBytOzp1a6+6B8M6SB#^s^Rvu77ogCoJxj%{L~F=_ zD!D68bU}i?wU!C?cR1K1+2ROG07cw$hi?jV6vnbd?I-z5)-Kn3z;<^lpx~lbV2^@~ zh9k}wrqtsuh_DwP8wVHyy|R@?$AX>RrB>lfv^SRuhnn3(gG<%g)jymNeG%Em7V$g8 z-kFNssl~qV+BF&2So0cfO!r?>JL9eThObqJ?M<(*YT(8$8o!J5vf(;ZXQ*aB;@Y@4 z!)#D^NBS8JSy{Wj@Z07Mcl8uVIc&cxUYpuonKq+4`zJwdg9g2ptL=Vy`Lb-DK6!Hb zs-@OqOIY%g_c2mt4(l_R4QjB+!z%_uk{n@29) zan@R|ma7J-j#*thK67m|V=9}TyVBaSZ4d9YBW`-BRy23P8!r9dfXN4FoYa=uWw`JK-T#cliYIM5=HSv7ZMEL*2~;?=O|`m7Jx#?La>aaRRJ}lM<$$_Y*k&#c_@xZ9Nu=BBeG~~xN3a5R zA^>m`PMqQ;oQ8dkewoR{99tr*9}J0$r8PNe-ix#lRnX zW#{U4u+g{SY=K!!fo-HVQBc5Yu*+7ulyDwJ2a4TTqiOb{#7tfs@_=(dC@ZCbp<*x? zg$wtUI@dap=*LFYV%!9OnZq1~+l8mN(yA3q6w8Ve!{@qQL_re@ z+`8QOIw+-`R-rs?*}+qa*d zzWL^x=VTt{T(vQkN~KaMN~o1er9P&!FJFGK-l1Q+-$SZ4Hb2qH>o}aeEq$n_omI^ z-Tm8_Pd@YF<_UeyR_p3Lw4Ug^{Wi_dFUzfMn>kH0%g$G!ba2EP%xzIped5|?a1BE0 zzRn)RY&3dgnScSRr>UF4hLv?zw)8aid~nAr04cnxe`04aRY@jWnV3(8tNXaB`+yW| ziVc)uD$x;v5+uEER<`B^QP{KEL{>}YtTe8dmKJm2bf-v}9L!lrxsN(_eo>fw=Ixlw zCcX-^EDWk*EEaL_Vv}y4Ay*(75wCr63~R5YHk|6B-6`%*^H&vK6*l4bl_7Df5z3{d zTs^|BH?iNr>eX!M3lS?4HscYq4*|o6=x(cc(-N;DQAJj8TLdnz1}Ca^w=*u* zTZ6FLAP&m~IHVFed8rbH7#$Roy#UP_r=e-=9Hn}Nn`Oe;MHTYZ70rg^t1#l6dif%> z?g*e*U9=!V;eBk_i=N5-g$0#&6t#tMYwT6T6!GPikcU37@iY&ufL|&kZ-c#;HLGi^z?Ft}Pbjgiixpk> z&F$rm_oVhf`+!3$IJ;}u_?+|)Ot!l=ZnmX;WWw}X`(4sbQ@)2cT94eIS9=?tX_=V+qbo>aYqTeQmIrb z^@@opl}e?cUM=(&|LiyawX+}E`$M08`%T{LQ_mw&Lsl=bTdvx4;G+G#d}Z{ce+qw zPM^Gf_|9jxJWWP%I@9Y$w6fRcdQ&f^?Dr8J5bhK+|DZ38fHCYZ2zDOc7<53f@FjO; zxRay*GnosB+{U3LbR77{s(x5#y$YaDt!r!TEH!>>c}`MHf{U`9KxSmefqlbnm_iG+ z1A*1?wehwZF8~O}CltNbHs!?RyVyM1LdXFJXzfoi&ZXaon^?j`Mc!$Ify*#l*-25v zNWdNxi{Js)jO7R!qyW?e<}O^iJ&#oci{GQzLQogx8wawwhVCj#2X&;cn6$5ki0kn5 zF?CB-1A0aT-4|r=Tg^IT#FKG>qHwGboKl8@uyBESj&L7F$MQONURj|HM;_P5J_vA$ zm7~VY$2QTRCKc~1{rr7lP`C@7vym^khbz?f6$JW(0>~rxxvAW^_xBiMSPDTTQ+sXk{!&MmrIF2Z5x8Jz;v*5Be8{-aMFx6a8tk8Xb{+em>*$vw3$B-T8<&J15NGf2f&CIRLQ+te>o*1ip;txa-xmY!FUY>=$2@U|c6FX**-X+`?S0lhP`Oh|{b;k9KWLjh zm^N4U+R2{m?d_f(9PraxZ=QVab6VcG=*p$3R4SE9eFBtDtyC(t*1^dU|LXl|ZcGNV ziwZ2EC3^<9bWYIzB))1htxf-9d_p0Ze>`1n+S4bKb!kjsqNo+JkGR$R&?jv*KE&7A zz0DW|b%lb-WA&Li=EFu*x@n--5KflBQ|ri_#`Bi^L^^@cy!q0@?u$(u`UIwZir>&s zugvp#GWi5~YM-u8H~^FF*SDYh#Kg=%o$B$jvuT)_V@S+dw3OZX(%7GNnM@#nY7yEn z%?$uj`+R=0U!?4D)j;D-J9P(34SsDVokr5q!PZ4Pz|IyCTb9Yd(FM`vCC|%_=GN8Q z3zpYUNxpYCx6P(yCkJvdZ|ci-yk})^x%frjeQ>*ewqO0y_}e5`7gVo0JZnvw`{HD* z-UPK{71WOrO7t)}H7H{?6`Kp%1epotS`6?JlXOPZ4tr%B0@>&qN5LuqtP}T1%~s-$ zhoEKVn5l3+fDXyvD#V^U)zPU1NsEmfkB&BKg3>6&s=Ff!1fWoa?&xF|UE)a&Q0?0N>^|V!`iklUC zDd%K2%I#PRVD&!K5iL$$dx*n(^&6|}(t1O@IFs1{lFr{FVafbG`m+su!EuZ}qi)gq zFx-83li=08D{%W<;~PW{e;6IZ7%JeJaxM4Ce~4}d4-wq=5~EG~1Hca8&hVb+!L!Aa zgGa4ciu!lR!>Y6o?5lB%LOzNJuC75@9N%~n7X$q1Xa)1C97ZxMhQK~9;KH)|Usf(5 zitPYrMMhVU^D75QIt~r!IK_pFD-feu3(Y;b=0!n(QJUPlW$`jnxYUY+tbxb$wpM4# z`mWFMdjQ?IbWpRv!R0_ysiI>=L7^*gbg7yMYr&nx{H{0T;@XFw{RqU;+9aH#{)yXLoMVe$QLH6sN+mL9uzI`z9RvR0iYQM{VVVUOI zL+m$PucmEzUM7AymF?qsBlmbZIXXJxN9{f8?z``veRDb}k6%CB-oJG#!t1XE*ZT{D zQmIrbmHHMIQ!158L0|dG(_iu9fA-m5c&ong&cW+@Y`HI(O1D3EcbDz!RR>&Er(0^` z+LZoDvhco5f{JD&y9r8c5~>pqn;z8Se3iE_W+~A*M>Y4wwDf8~v1PM*j@AxSn8^~bHLFYTi9BHfF9uk= z21>A;ptf~s5K2iAnHvc6{9azCx%!O=>Ktg9G|7ILB`oi1YO^Tn<%>P6zQL`&LgRec z9aQb{*;aI%ws5TUwq5od7qXJjHuJgK*$J<7Wy(sI?dMBFJbS$yvxoLi4KPYO{-V>P zsZaP?Q%b#rL&(^m8OSt=|Kk&yifncd_-FRHJ$l1ZEfl7zaFlSETgLevJ;28@ zz>ZyU0g4bu8Rq5FWN>SE4VWMpMjgj3W)Ji0GPe}@38}^eztn<5c<}hR0HPp8MQLH& zAnQ7N{nd}%GsaC-3 z#7&Om7hyA z#YjU(S`#GPweE0(O-^}{L0&6QHE7sPwP+uHgNX0!!;qcrs(X-}Z|QSbephf~Kuq2J z>&VEu&Hp64YAyHcrCD)p@*rc^4GBKu?d|N9re_TPT;|J?h(e8=G% zH#awI9khx-^xb*;YFtCVf4vadt z$-!b9sq2Bqv{^8*BmLB#e9om4dHd`i6H^3oX#ry|9N86JSh4mA$IfPmz1x=FPH`iE zUA4Lh7Mq2a(xxIEODHJo=C_5X%RXtTIzv)6)_K=V<{0a<><+#53T^g#4N7}z%QD>% z4KMC1IrhdbK8vdAh2sXj_If+6PD(E!?HOOP;~l^W^VLC*s%lrVA$L%8Yl2i5>GT@v ztZ`h6vbjktxXfq@PyA{k^wQj5$ zPNT{ESIA0gw+FT#OP90jh5gC0_(5nXU=xO?+K+?-3)rm`>uSYz6RHL48cf(1yJxWU zM44!i5Jytv#0FkE{HzPr^~5s^!?VWv_vQoA3Q6_?IG{Bde{fV9?-MpR_6kMu*PFJf zhS3uJ!rjf+hBHO4aETFQ#}d1iRSx@jWut%GNTz_jSXrrBlcs8ghxU`T+uPzj=&T51 zj91_t?y2H97TAb9e9o^!{GAYZHyWz%w}Q}efzyfOZ4f5}Ue%8FyACT9#haEn={lUY zl3{yy_2b1w05c9)#-pN67d8z89Y70{Xh+3ek09j-&x^d|djAB4C)4H!#LQ zi(vv=0o7WD^KVp9a&XQ-pZ?ZS#>=MnhJmi$7Ym>^)5^T5S#E9z6VJhO=v5T(bDR

    o4ZDEO_zs15Em1i=NDb>X3t2K*~p7 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�@pIgY(8X$w1;mXENrc4mz z-aG0D$4QC3ZzHq&A6Ptg9Qyrq85U&122B8V2&MFqLYyi}QF^j#kfd&fAfBs)nQ@#oMk4@5TQ38;y#!)O5*UD%r3)xz*8tV! zJ7!nMzWsIqliD$EU$-`&TDRb2>M~PxTwwGh9i!M(;Wt$qIGQei*7c#;W&e`8C4yIE zhgWs;W2>F`zJM*%R91D^tR=bxR(ex$S5@AEwK2e&zZv(pl6i#h7k>@|s6hw7rOe?V zImA#kV64r@xUjshO01Q(y4%hX7`)`-NpVNHVaN#~{p-|y zQ66yk*?!Lgz)}i%VG3!X{+1~}v`ubk@gBd6LIa8k4)UrfWy1%#KZ<{2N`E z_h%^pN?dDW9J2EHi_Oj+^s(@PyBO3g`Yx({0^{xIBHp+5Q$%`MI79`B?0XWw7&T0<;?Wq=KcJ%x0lz;>+1CaYQ4OE zjF;#1%Nr7gQ>$Cm)S}PUin#?;tAa-^k|P*YtJd^X8aU+@r%rnLIkOX55(;KPldtS_ z7lj~gw8VcQqpJ~jGLgcXKDUlUG9G4ea}C+zl48x5!vjOlZmY*`RvB91E%?tyAc_Sg zf>aq@gb6Uwx26h|YrZDo-pL#R5dq|vBf1qX;+FAXalFA0N|78zEE0jF>}yvTmg6wt z-O@FnEGqGa;z_1diq$$)P);d=fdn6Jf^bXk$1sbPBWF+O_5UF&`Z0^P&!0 z^p*j|y~vYkrM1&aDj86;8QMlHx)`&yRQOE=6emeiqJK|aiYj=RhaEEV6l@wS$i71` zJ1}@l?o|ypF;FJ(EY4K`*8-+WVb{v@?gY9@Lg%3~0i%$n!c$_|iB(t>clNDOJ((q) zH8b8b+T`I(JaRnv+=LPMjc;=V{SZxzd|M;6t=vyN`NbOG-{lkHxs%kwBP3O6E9`?h z%GR*AQ|@HkPO0Nc`62zL*tJecIb>?74CHP@4!0Bsf6@ui8Nsn9w8tdPWd?{R`2xYD zy?_e?;MkMZbL#=kvmG6Z@}LC%UcSE_KiLUvgFMmy_T-z}`F?bl0@OIr6^m>kvd$`l zm_RaU+FqlA>u8Ff>sv#QLK^&Clo_q@*xsR00h;Wx*jYX_}m-45d4%tflAF-}z0Pn|$v6c-Ng5?spaV$)LHLjy1}m>dEocq)6u|i|04Q!DK&0BdD1%tD zv7h)nZD#LzgMBEUlN#&y?4cg3LvM( z8eapr)w|a$s>`s)r?2=}b&E4Jh5|ckY$I*5v40FwalkgPM}L=(;N|Q$URms`3E!@y zaod&!>Re8&{a0*b>0P1=v6!&MS~gFmCi`nr!4g1Dr0x73p8f3j*S1$LAX$xgq11FW zI&m?sKp}#wWKjiJRg}aEs7e7;X_xYPYJY2{{BfKSTZv`3MrXgOf?NPu1>J^cf40u> z7mQALWRK;I71hSD0dDCExD+?5Y#aas4{=mRvn z0IgzfYJ00cf0k+Ih{9`1p~0l8D!e9KR}|~UBo#qNGt|0GHTL5!RQPEQgk*t5M*j%R z*Fg^B497DDu|u^@Xp6TY1zci2@(zl79i6PBjRn@O1S^IU0e=-PSdr_XatPLE)Fu*R zhDxw2VpVoYWYdpKh88^&w>}YQc(E#g#hKryJqKhFV=>j`@UI>s6O6bZ8z9| z`O8D%^m?31I{SL{pZuC(o%xqfzPs1odOWb&Z*Je(-=e$od9nZCanoP;+UgIa1}^IM-X&;DF^Jtg~@gI?&Uh%tw^WC{DF5naS`LHzh*JL;Ig!KGO(Z*cF6bW=}}s6or1-c z82DHx7EY755d8t844uBBM0Jrpn7*4Y+as5Ui!Iqys;gCz$d{@*BLSvbHw-KI+FPJW zBhyup#|&CATP-tqkB-@eChjG+r(mE4K1f?ng;a%39#RDcQ!OwnB{~3eC^?Mx2E>(w z%2XypU^27FRSS_K{-F|`1FAGC7$KF*SJ2k&3i};QvK>ksM?dl>W&$b%=D? zk87BQG$QjxqMtBCY&}im`O|&@i^qXQFtQvT@;d^uD_Y)TZh&UDk_nSgtDa$e?kCfi z9=L0rdpTr4`ZrU4JBvJr3YrHHM|2ePWAZ|)$D$Jh9JpR6s#_FhGZ+~aMA9&pJ?aSd ztYB+b8Nka}y)fBF=z;4vJD{wT69Eozz?WsGV{EB8K4oC=B4S-HY9X*++40XOC%Sd=IzRV1 zj+$lo3XeG?#~HpBV65SLdgjs>1oI0Z`F_daRZuCn#NnVJ;d)p^%Qb;bN>qgZBk_Rr z5v(f$JfcC#=MVtqpsE67n2F~sfC51;rQW7)hhVq$t2}hzFE)gCM=#t?o@W3f!N$$e z)eqk(dKLgw%u&R^z>hSwP3*#`r@L5h0Gq&U1E5WREL@khF|vFgJ5zF6!z0S{3~G{^ z)#OWtzk{K*(sV!TE-Uh7)V0w(g3JPJ(IM~;Jvgy{Y3x(@P|=4>kdv5EjZxIFkz6)l zr2$qAb?e%CR}M-B$vV+L5in zmePf*(J~{}(K=$Q371!aag&;OW1nFHhkqF%gcZIKGwQ0rprlS z)!6TC91jj=`8oohp02yFqJo*#m{%#7gz|f@VeFnZ&^M>Z4+0RBVjHPF@4}Pv6R(tbdXKx+` zJ1#f&D_@6Kbg6vW`QEF&-#yxwzE1xG)CPVSZ#`B#dQ5TW_rQ9XxGuvJ6f~uOe=Bg7 z#Sp(JDER!&V~5W_qIpfRH-3Rn{`cGG9Jz_nD-#{8yOY-IJsPQ0-JzcxGdplUbh_Wc zz``{}x6DTXyk|yxYDD8P(OWN|?W(Lb7z4~|%7Vh)j?V$D%e@~n3T#-PhO9UXaXXu| zpg859Kl(nuIRrRw#<&CX3(Z|-bP~q9{`<|-P6Z?X^^r}<{XFiUxfcG?fw)@&$b)_A z8~DW6$XoyUrpTh?ybuNP0Pm)8$|z4bNs;p6lwt*=Pz5j9!M zmTZ?=^#>-Esta>P()tzEU+MF+csLg8p|2@<3mIyPLh!06AjJ+YExzmK^gz;4ix2 zHpxdzi6muxMc2Vs{MvQ&_e#T4&*T_~&T+udFNy3qLp6?z)<8@ulH6*73C`p%so+MG56tvTjXyj0gxm-T2Cf0}@;s<34uiE`0nh?J ziL<9dp7|Fh#|SyqTPYC~L#MzL7YUrYE|iKjA(dSgd166xmLho5OwFXxVN8cYxUqI? z2$?X09n}^A2LI*c8Yr60=>*SdMD5d0?4Hdvf z@yqH%3swpoEEbl^uwK93kYQMtT90Yg{UhqXBk7*l0xQ~XrSLK(F_EX?dvIT)-xE-AqUY3 zzAa;s6(JuYeiw`jlL0)S=_eL!SBwF@KNd9;$Z;NgCZe;G=@@o%qBLSH!Q|~EE1Mwo zM7K~#dAi2bXr50^;-z`sq7ZesQ-3TG$NObO)>_Xjr@5)J}w0Y0Y2 zSmEP4ynt#A8yiV8SrQ^UE0`lW9%xB`QQJ-^yxow$z z773pPgwm@gB!>W?mcrkcRRBLb5Ecs32{PfCD(pVMjT)U4Tg<3d1~mEa0svA2f(BZJ z3{a7t=3dpcN$G+Xr*`%7)wPt?aT~ivYP`UrS2Ed{S`DYXeqH8ywd+}L;p>>T^C)6i zU){^?nzpT$D>hz%9fE^^@XoyPc|15swK7n{D(%I#EO2os>Wr(a7w~P?v8)8`c+lzq zUTJLwO9~bS90;jLaJd0$q=>Sk{*dLSKs5q*U`K!vi|!qknehMusi=rqU*jeQXex@9Ypjv z&+XyOSN2JIZJ#{t?a}Ay7d}2;?|i@1V~oxmSF`(bWy6#jg;vD8Ou;%e(ZQMvTMpF2 z5sAE6xkKBX)fsvM8{YSOk76?lpuUge0B_Z5C#V3bOz3xhbw7tEtpiuEXt?v)4DZzw ztT=qWo}PF1xu3_I$;jfqU8^tc=NAm)<@LSS%Y=A&{ovQKv%~X4I#^V~7$U4#+Yq2c z6}Z;un?j`?e$+lF|H5d(j27P@D5M}o-S|=i%7_+4FQz(o^h>JOVJBM!U$Ly{N>svl zJqkfuv_-FtI81+}Jf}AHw}lHRb0C}n7S_Qt2&PNT?kJb$Rpe`OkyU26{36knMOFBC z0Z3|tu*h&1zENNbt&!9~0-s5fsFzrZge6bWd&QWo;~N9etP0@HSM_O0p-k}ofNeF4 zwEz$d*hMZL6?vkTX1R~x_q(jw`42~<>SzkTF>zGuqX(R(AL;u9G=~Kj!7G@K z6pq*dD$H3DpjBJAmrK4c(E zFjoO+ASj%v0kI4=m7mLiTOX$N!$Ozeb+6A7ATIK~ng}NOmrf%m7G!~-6rJy8c8^M8 zNiqpoNF#s- zD2L#j$vE<-p%CO6*UF$a5zxfPWK0Vjud#L6jkG3pBJBilVO}$Jo(CEg=VQ+R9$;G6 zOMZbz&b0IW!gpmBxWGpegKJu0QEEtb@34}MR$4*}Olx9;Ml!@sNbr08TN%6@*oUY!xVz5aLmHc0pjm7c{)Mu)VqHn)KnVkV2lO0}Iw%x*G9I zVN%CqVu28p_NO=gy%2~g^0opJ^R}fMndb+x4>R*_y0*Ta;FC zZ9{W4k1qck!J~z@-gcm|(|Tb)HK4fAD>U2L$M0d<+dO;0>d@n{N-s<}PGWroKUwl~ zj|e-d4RB2ASXz@mZ|m6?0>$6ZE>^aMW}}B9NDZ(g8Y`34jAzZbkR{Bxk+)clc~=>) zDYnub#9EDiaKP^3*~(pcC8+mGP#P=TCxj)MS);kFw3w(t%~Jf0*uD;W9%;8h+A^`; za*8QfS)Wc6dRBD?zuZg43EAzEhYZVm`{A$hJa{Q^_hg^{!`|L{-0`#F+3Igz`vKqB zcdsApS9eD*M18Q&A3w2U|7`zbxv@X{U2h-1cxUU=Cw4dO_)NU_SmA$hbnpN6nCM>G7Ru*xdMuE_0Unt=f`QE>G?`z$sCjeVf0C8Xn76f2a ztAn(f@i1@k@9bee5NaD_BoByHJYE~{nMF--4(Gv6UZ}g7L$q5Y!-N9k!9l%G!TO+NRba=`QM39-;^wVxhm`!?U%7bgegKK?P$aJ&B_tfd7 zRhqe=7UrgL{GvCNplzXRAHM8hTOoBC3puepm;n>oQ+&*=iAhZ~S&j*BosDuJ2%S%OPxXjka09&5mDF(;T#HuF)b_}L}r$?RHPdgEZ zqjWLCH_jutcOl=VO%p-^9H%2o2p|W5pgVQY8|K2!Z=}*M;9G&}kGZuh@_A^Uo8;Ao=gZ}oA9Y3KdJXh;9Vt$+TZJK0T{S@o-B^6h7WbC3T1;DKEw3;@gc ziM}7RAN|NKb9)B&Cjd}J;$$#idIDJZiFVa&BDtz9!-A?l>&XrTjZY5f+!L?^^!L2; z{QmaP-V>K$Xzo#2C~^Ae+L@~ zPl|;d0v(ugRB2>)LBCEsp2F(r$l%hikAEJ($qC@+vPy1R7h3Z-L0I-{o;exi;RXO0 zUR40=x}9GUB#l#67rQXZ2S|mc0C*tce3k*eTO%JQB$e(~J#e#H$>S6ulfd&wpgdWw z0-J?;*m+PY*!i)ejXUNzW*-2zd8{EL>?mnKmqSpNXtmRcSldPAo!(awX!iuLR7gNK zP%yDZJSaT69uU!^OVjNnkd0nfE5`%OG?UefKr*F(!g5z3t zy#(hqUxa2|$SBE-rEDW}Uaw3zSB@tcV(`1_wax*&YI4OC^MOhE(r>I1B%o^-Y@H<2 ze0JhY>h36ixx{&8u`bC=Cm1|Y%%K6aHL$H&&V=t`5}={{T)+>{3(Ig;)xR{*%;LC$ zk+g2vV{JA)7ci<`0EYO8z=x`YoqK9UFRN`m)%F{h6NWmJK5uNQwz#KliElee4J6t= z8!V_upqq3q*Kqo5TS;|;oKk#GTh}v3T`e!**7Zrnp>B}UhNo=5x0SnW%pbczPQ1sI z&R+npS}$xJfo*GG9s+b4sMI{G)CJ(0!M0NFo3^9U^{7HSH4deLWCD{YGc^Gy+1ho> z0jlP(PsnjtG53S%Ct0*4l4YIAD&nyLob5BELw&!GPM88-xz#MWUmri)wslS9U4@1v zEST}F3!r%cmn?v(HijwY_-fZ66vrn8x3B?`8z9&`(bD(kR*DHG`K4_l1MHo}j-nz& zyIxnktbg=soW>NaY>n;adv!H~_)H)awFXmf<#%R(fS#wt9?=o*CbQM*%;yUw>dC=+ zggmIrrI`&rjMSYq3kVYHy<_)kmMM7&3&i>?H-mdk8(2sDrAqhGUBQ#ZV-!dQ$c2(r zv(UhSHDDBQ>cQ8S39(j{=#`6KC$x%@>aY;-qSP|(N)~U($)-qBXHSgG%U8aso0;8# zSuddUK9x{zq}EWXB>5Do?QD{VuYgUheOS}RoX$D-AMA&}^5>^vd5<~y%E7B?w!ii| z-~Iig9pPZ$z{;Qdb^H4HbNWE3t~uM+ej#qZ`P}AL@Wz~Jn=mc6u*9(6op$z_Z}4|- z7W>32E5A8p`)9|Fg;>P)cPM&!O!C!C7MvaZ`#<-4>#^#(fAF;e-2|%_oSsvnC+@qO zlLJJZ{p5LXpE)S?`vb#z`(%aDd}qJiB|FCREcsge4|l%rMIKn^{o*l@e7SZW6MVc~ z)M?qbyIU(6d=sy2wRgK}zwpn2CDvC-@=xuVOPNS%MlLv#Bn?EbS|U2-Q5m;H?J=Z%^aDuh zZpd{$7i!MQF6(6+N`q6#^pZMItpQ?@Y*8B{jTMth`gBzw3?5EV6;!!h5g-G*2~qWp z$A`pLp31~kbnKR;DkF8M1(OIElu1*&-YFD7zKftxRXD|m0E?C!VSWi>l?A4T6$MBg zE27Y*`##{Eb8x7JT1`LGU8Mu(!oGpNOar7EWil0V%Sz24KpeJ}Ok|-^x&(m$K&QS6 zoMK$2t~$aHjh%LI-l>6m2zpk5oRk6fOUqNlTv!+SVfA2|ff2@;QfTg=E_=R-9qXn^ zV4sO81!f$oMIK~^ab2GC=%7PCm#0q54(fB`@)~R)7RFxkuvcw;kkUutZ09#5^C;9SlKz8@KGH zRw+VYV!b6hMqMr2Cr`ta1kaeScM5rt;}$3xvY zzy={2jNw7s-_u{~lmNzMyPNO*T+ab|JILYS*T@>C0J6%ihbOOeHkQpyu_evoVOU<} z>i~de-s>L3O|y(kSjA+qpQfH57b5)bNMksHb-20CFh1>zHF*WTyMF>z2w)gMl0pFG z+>0qO9jfgg27*fjLIBWqi9uwCj*BBG_mwOKdec!xywK$L2npVz#ENVO0Ah#2K$4%E z4xUs3!0QQm3;h4Df_~bYg!(E=j+^xnq!ydwjsN0#yWnVuyu+ zcXa>?k_7;gLm1@aHeXaqu$V;Zz$FA$>{ycm{4|Pz1U?<)kIxQ50etPw`slP<1>8jL z4(~6p7g5E9q%yJVp#ZU+KRgTMI2bn{BN*52x=xZvR)obAg9jO&O_0-}du4wP*>&7+ zkZD#nOpq_j3^s06-q08#p6z5;=0nLB=%B{?rMCR{BF}3Ks%zkAV~wTw z#KlqDHtAow03HzteD6FgT|T=3P}>gj_RWCP_`hTWTi$?)a1T?wP}BB}3%e{uDMKKI zjtAS4pJ8KQ>C@V-7(#VB)(vc_ml>f7VHbP&zBzq^5=h1; z4+=VUWdWy#KNU-dLAO&$s)1>%Z9rukFq)qCl%0!d7Sh<%U5#jfm!@^47R`6G2d3$I zk`!5vOL=2orSRKQZLze?#J(Gd5iBQLZ8M&z0`pU2J8l4$ZSy-_U49L$?i~TN^#Y*P zxW6}GvfU#V^Q>-jN%N(>%GF%VR<{{`^_4c58_O)>rWyiIJhx|uL;Sh)#y_*0cMkkG zm;}inJ_K|g&t2(*8RxVcAvyW7jJl9aN7516OF$DgeEg z4!mmQ&{>gpc}3j=>%wdTtJ_SY>Y->OU<~CX=yizuykWK*8x8wNm*Ew{&*t z4opn}E-mkkl~;@z)T~3#y0gcfMa~}~>-XjAdB2~Z?1#TRikaqful2KY5bH0V2K()M ztToT}%_kFMBS_5ua{b0$Ki%8kbO-z0>t|bEe`7!EclNXO;A=^?4?YGz-JduP?>#QS z^Z(fg^9wU}-v#*e2VchlETO~l?NG>q8of9J=G2WpM;<4{s2-P`b$=ZoC-w1o^|<3T zN0IH`=gr=WI~{Bx76Dj@Z=U_0zQc9f`)5`$zu>V2))pnf9t*wQYoAEKo^oe*Ma8of zbI#Y%pPXcy@`fD{RXd+i5cI)^S0_jfuRKj%HS{qXb}nj-)SXf8(&6q;Q*T(rvJyhvrW1@H`PC@kauvN%PZ8>mf7 zp#KQ`V}=67$T?!a%=YNya7htE)`8-YB7J@z@q$U$7}Tl=H%N~nj8lu`MkFXfBnAH@ zsPNEW4*Q4@nexIKY6hsl*Q(MC*ItC36vgp_(^)6ju?228nV7e;kBcF+~ON4X~xMeZWY7%}#DIvxzlLZCy z^F=^W#BO3%!H~UVr6};Kf^28uxTnKQZ=-HFORWA;)8 zAEzn8a*R1xQD9$S%^LwaCQ{=4YNE7PA&sCX4rQ2y*9QStM-8W{@_wADpH~5TbTD0r zj-lIQj+}uu&N*43tuk1&0D9k3p(RXy{ezQ28v&MsnM9s9VS6Wb5X!{bHYp=0IZRAf48F6Hl+zn7D`f= zI`pSBuOq8)h#H47I1W+MV|T8j=xdS(;x6lTN6nDREedu>756IOejQ@o1?3y^KM!M3 z7=+R1Tux#}I5K!9We&#*XRw~tI?SUZL8mhTn;nvTvJ8A%zWv>NP#49zr@W+77eWt7 z2FW-JT0xIYMR2Gtqm=*-*^C~nK6ro%z^3y+@U#=O zmg9aMpA-yYdhbsHpCA|L=Yhd9_M5;0D_WrYqr+-m`OE`_s4&0MHP1?D>Cc2X5P|m? zF&?fxg4G<0N!Pg95e9%uoYBU zHqZc@4&G1zo(Hhj9K765l4NE9{cA|o`1PQ=9{hQ;`u_TdJ!LPD62fCjjFOJewKaZ6 zw=l9pupbBAo_y?Kst@f8>5wML;ll1oLN9RN!>AoyD)F}sB!iDwB)k3EywFy4PsF~* zh20q8MS}NMwkY@O(se2bn1Cx9KZoJ6^3wo=vOL20Y)QeAiEfNsca{(gG6~got{^LG z&MCRulmw4@v?na!3a)T>&9k6(wuO!vQPS z%*dHE)~lX^sex8uUCHBU;7c5=)rQ0gV6zKQuz?G0kJUEWTN@R9wE0 zz{Vzv)CJ%8Q|SuHxI#8+LD7! zn`HAMp~QcSz@(xzsRZ*w{B_wlY}j7W7&qynx)Qec#Kfu_=vM+Pk_VM$fzSwa-y_J> zWQI9i)RZ+@>soD5Fpwt}Kgf?zy4Wz8B(N=M$qp-t_?^$F6b!RbBg@j+gP_h4b6gEI zrO^F5kxUZ|!y-xZ-Aa}^3Z0b|JTIhyyo$IJ1Iw=C3f%O>lv<*qD;=NhSEqG0|bIQ((crtp-oBF=cV~eCu6@G*DZ|z|esJO2!9&hX_g~`+|uVD=U)j*{! zXQhH*X{rs>T#E|Tod-v#{dT!wt+5tjzUT7jm5pcn;jiWGp?ge`pM2$G`t<2r`~3-J zx!>7OK7M9@^UJ@rfA#xc*l!>Du^k?;M5tA6*oZ+1Xu9McoFcJ zbq|bas#O&iV7q(CK)k>S?=Q(-Pkw*0HcoHTWMAEw{n2x_M+eiePM`h!?mT`z-OlzJ zU5PzzM2vFqs{h-Y#XkGsVBg)@e(EtnH|_1-&*4KJ?I#}&cJwv>#>XwcK6zZ%+3mDj zJnnb_wO(G|d%fsUUtT}x1-Rtn*Xt)9UXLkcSYRH(sIZ3nC=x-28w(dfH8<>%a%fW= zN7K)xQxg;E^U21N3NLMe7L^ya)eITptP0Y%a%f0H)cgc15?z-SL=N%YxvFtc3%LPg zAq!u_)SYzaEP$>H=!f+nU~ZX~_9XBx;qa@%As~TF)>qFME9`Ki;4~=iN-}RMq+py! zHL9jY&Hn(l1w-YCvG67m!V`vK$@1u|(Fu~wa)CBzJ(EZ}L$|(yz#}yo8|*qAKakmD zRpG0LuT-x<3rQbo%aP{NVihLP~`o#udR7inCy#4V4`BHHCLel1EP` z6o5vhGirrmZ7J{rL&5_tj3C%$igi{da53h99T}&BrNoAeI8&mExt`f^&_Cbju$5hD z9)kcU!R$K8u!r0viV(rHs49f+N;>pwC0%?52*x}<#uTRQm@fo7@sq!UiGyuGPSt_0 z)GcI7C?nu0#je)|l!>cJ|Ebh2-N~0U8#v?^zp9&tou(5a6J)=|csu z=&%k93}s_+_94eX4s?K->4gJdtwa!c=hZE?HIKj<01uOTxr{OJ1z!NbQFd_WHO6y! zWw7GxivtP_shFmu8#FNhc*VP{=lz1)^cL-xMZd9gp6xK-a38(zcLaG4(mn^FeD1RY zDiWA8_U^}WsOW*%aXXN(ClDM@~i5?sCzxEWUs6N zT3M7Jb(bO9KAb+RKsqH{)jOtnt0YOI0nj%R>F zk~Se>2Kx%hHj@$pb6}TslQjM^BNxq-h1fQhq!m|qd$9yGI1K=Dgx4xYb%)d^I1Qrzh zTu#9hQ+m7*;DQtZu`}2K*kAT%6#(F25=#kSwTdQcm;v)HNExO8n81#EKCEQfK}P=U z*Y4>5KKsvnPU>pe3j_h!1|T1IB(^(NCWHb&@rXt$$=0Y!T5Gwu@H%vTMwX|Q0O$ZXse`YWS-A+rA>#$8T@Jt}43^jU zUg3SH_ex8)%f(n;q~c&0m0)13Y4dz4!TQz88y$8{QZv~Nqzfa8$DOSi)vrn28VR?A z)X-W(lmG)Z>7g~rU$reV2;@pdunWs33RVGUZE#Nu3qq#Z7(=N+7TYJ9pOOW5lH&XV z7KzUXC#~UCA)*t5sl+G5B&xw23NdRir;1tYCRhZ3)Bpx~UfMx%oY%&zA{l43 z?Wp*Ej&r`q-*k8=K>6GS8*_pjaN)J>vM1m@)#zs%uPU5NMbP-r35pJZBzvUv7i~92_?}BFpn(qH4NxiO3?9hT`f8Zs*9q=yli78 zXf>`x10v&EbC;WBu*nyjUm3pE>AUp`kZLog+SW-@a?IFPk%N_{Gad#@97|(==@?gb zpe($8r{m5RF9sg^d)iXK1_>^bOJ*gNg#;=Ge9d)`B4O!Zmsaw$%%a8xL+;em%pE`$ zZ#)7HLGtH0U0(>qde2qQ(9-?o9fW;(4|!AAI8f z7@!uwqpzQ+e(-Xj164m+4)*5{eoy6}&<^1L{Gb1fYx()7zwvnCWdF^F*S7b#`J3A( zuBBi3y8X)6!asY+l*ywYvOcOKG^__6{J+^h|IUB@%V*7{J743#T6!087$ko1QM>h| zO!(^cE*i~?0 z(abAL4mu@vT^u|XgRkg)p7peWdk1nk|IVkl&rtkAuC!u}?`RRQL!8Wb7cA;*pZYOB zj)`j^=H}0zI~J4QeB9Zs#|=O8GXn!*_UBRmc*nTn&C|i)hDrmAX=e|ACl9 zP3JrN+>3X+LwVbEw?E2tetG@Z^LhcbUS2==^>kWaK~ANrRTNEV4gy<}ro@*N4VX>X zW{^3Oxo9dnD6OY<6piWk9wx=PP!yrOaq8EL9&#)db(@ zd!+;>#Q}NNLm%|Md0~hxwu`D& z+=;gkhD<6Z7Nv3+9e_nZx8@!l_2^lSywTP@KsTN)SNE1nM6pev5X_CIo>&&bs4N-* zJ3xb-B{qCzC2ywvW(Xcgk&7BMHn(`#GSUMloe>9}JA7Z~1)yjV*$e^P8hTEIEqUqH zWxSUGJ31xyK!`deKx?0YX{DJlpJPyqtP$9lsrDZH_+}SWA#u|5WN<8RB^{z$89rfr zX>0}=oVwYA5dv%t#~o6QSspGO4N~drMNuUt6{y%`W{}1YKkAZHiFatm5j35TS~|k_ z$`i;6sn`HYJ;xaH#{W7afTK?a1tJSRSEIY8Z?i{7H%O9paK0FL6YOSEPS{ngD|6kS zb2<(180cAK1b|m6o4VHlI;ARs zN2BJB&6*+Y%k0JoH?ReU@qW{v05a5>+x#$m^zny0abOY+SF*_=FBrTd*x4^)h~e=8 ztNY%+eZx7&*`LXZRNiPYgaA=SKS(nFPIXttHIPpxt3+o6NQ0h25*gXx_XSFEz zop!@QmJ@x8A^|}+N=KE9=JKbGrm0>bS1Pp1%VHYTO^6e^!gze<-)FFu&MCUwCra9A ze!35q3xGNgTESAnV{5)$C_e-kzJ!&@Oc?{i&d5ch_E_?#4Q*Ou5xA8zo5fh;U zNuj_I0Ql`0hqmMdV+b;JVyVrN`*p#TNL6gN)W8x*Mt!h$$LO@WTbO|Id4(E7oEMH4 z0s6}ByOqxhCQd`z65g~nK%@autvhKVu-{~A$k!ohZ%sv*XGXWeu5F=c9ZYK{<{RZ# zS~HoT5P(vW$rdS0kTZ)4maUOegH4sUC9nzWlIa=Exex~7bUEa&>Uu``cB;V|3#Jjr zumMjs*h@gM zb#@H^tPq4H_=0OtRY((ZxNgVRSYsO_i@&XcV$#|IEo~1Vc99nofG0=^1!jo>MXQ3; z&NQxrHQ*J$_XNFw6rjr>z6Wpj4$sH{rvQZY1AwV)xvBla1F8W=nmd6PHaTq)o2|=@ zktKOy>s;7H{Lrptl7YCGW8t&KtCWgefT`wB)~>S7gMY087u#5?w%TNv0hrYbSZOg| zb^iqGs)}~a__E~76j1!L9Y^CV)_5*dwUdlFK$uF$!;X+u*Q!Xl5LA4PSv=DPotioy zo=4d{fVG{f3WNS|7#9sbfGT(%fhmQt=>q-kJMk{TIftf?Vu^^saijNCFBCRsq@Ae; zU9ivaqK7=Yguj6-OdytQQa(r-KQbOb{W*%a39vh5kV!KWfR)$w2xArB9|L}xjFW|w z)e)HEBNAO^vphafx`C@(fb%O<7!}`BhZ7c!5^Mvq*kyc%GKQ^+^Vy3t=l6g5N1q?< zM|d5|_>RqvcC&rzal)@?5IWfY!@=$zUfZuf`^x@ye6X9Rz5T28BSEOI900yQ9XQ8s zjt9<69NVWIuZS1!98~iEUimzD^W3TPqo3Q~j@jOU4Hazhn+`S$Fl0A-@HpjtpV@Hb z{b7!^K++U?arq+lle7Q+JhI>OLrB=sq((LUM4w0Ak*Uy>{vI_fzgW+H1-odZ0xz>; z&-Rj>UuTa~JV52=G46=>?vwnoM#%rY0Jb*)lc$_$_)d2?|M!G^#p9PA*S?ocz`}+v zs{>t#348nfq4V?W zeyWi4<@NGvuNV2@%j<`}((xO+?`AZG?YYE9_msli2#g#mJLCaSKu%EX49yn$)ZT!GYQS<y!w3<*`DN#X|7nLD%2`)Cn;! z(XUj|ApvN0mMXV3pSypeMO~_`nWS=UxOe78(6Ks%Pu)TJq}!QZ+O>s=DKc;cRv4j*h$aVBryjf(J%7I`DMfG5Ig@S2p{W2t z{Yh*>vrD zltb#2*yMfihy#d*2PnHlhR;pa%EiSjukkzXq8vUzAx)Ir%#`HvSq3JJI;>L06S6=W z+UL6YQqdzT3!Ew@7dbJS1B7be4ds%ma;%XMiJ2tHo4R_6HMMbr)?h(f4GEXtrH~Z)&VqH%0Jrk(5 zp=>4)h%rJSAWH4C4o4LcyGRW6wcz}<@P^O9*7vmmnHvCSA*bY@0%%I{)UAEQH&cKp z@r+>VUoJ924qGt5O5V0uuf|<6MzMRWHg1`uh6JJ#*i{W=iKT`+#tQN!HeOjbwogj-{h%;_rxbHMUopp9k>#TNIKzN2eZ zqN^kx=wcRe@x5^AYMV9jBIq_-iQ+-d{WfRFIK!;Eggc^p%fJqMZlJsQ^}uzz{PWEA5#vSwb` zb%?=<;+;AqQME`1)fauf;b$CBME~?QTx&vU~<>dpOznc(B(P`5t5GF`7>en6Sg1;kb-8 z>{t4E7GFD`Q5f?g-3JGHPQG~U1F(H8wXR*E58#kN0PLHQ{foB&&#X zu&(=dZ<)09?5b>I6w^>}bM)~Etm>pP=7(1k=N7Kd{R*I}vxDDfkHK!-BL;=C!MA(w zaS;sTM;|Zve*XTj*k^w1U|{d}C;QCD=iLok-7xOUr)sbLk@vJu_QuB^#kB{IDb8-ECadU^fOS9!e9!Sk z$7RRDMO~$g@qSV(``AWSen9%QHfiG9XfX#FNP@WV`6;cu3)(RAk4p9pu_G`mj+yeB z0+2-gm>tCE*;O!d3P}l3*u&yfq-vN_Fo!S^DuhFL6l&ygx z411Rybt{z>Io5f*qFl$p9k90W?~LB|2qaK(*;Vnqsd4PMM50X7EwG^Ur169bAQ=L6 zbijv6y@lyJ)iH^Q`v4uEu7CF66&rePDLcA14<{uqmyM6e?N))YLOU8#~R zA+DovpU1rBlV}A})G)MY6ngb>9l^iI{=>&ffPSK89RIir7 z-we1JloVu|Wzp_gA6sSwf}rz*j@{7@4D+k^;9>Gf1pWUyEW~ef-BNW&lP}L z#V7)-sQa{A^*G+u!NzW3;g?cf09Xl0`DD*92Tw=;z0e+ANp(kWCt2jeoW7&E`M~sb z_JG(V_cJMKkKM_GAKa~wBaZYu$_|v-bgO`#ZV+cOr2zVz@}npEQ9(6hG5AJ$#qZ|~$b@!y}ym#>Fi5(Z|*yZ0np(0!F{aU_Z@H2z?RMAlpECE#F zp8c{v8ycA7DyA4B z_ac}-dWKb_5ea-JK+RZSEN=wPEehbchuM7(_wHF;7Qq;L{n*>^)H7J`gK2`F@KA%v zE9dN5cs^jRk{O7U$?xgmX;kOGtfa6UAYtqnU{aLmLFWE(7xHQ&xQ5CsIwzrGi>`## z(H_wLSx=Z@PV3)&9K$Ejca3eB0%-)_CA#myS4$HfzF{4~Er4R^dQ|o+8#K)Rg~co2 zeGWDpq<28~!6J?ABN4kf3%miy1Hdc~GnrdxFmQsDGh}>Bs{nRa$tD5nfhky~PMuam zl2m{$LdJP+vOsltYQ8p0Rx;c#x^^eXK#>!}OU(pKwC;eomXzA$l|P%rgFvGgpYp_t zwS>uNZ9Yn30<+)}G92X~MN&cs%E-*(#O%UEy8&ZKlES#BAroN|noGky?6T7+aKu|8 z?CR&-q+I2~V&bFID6_vP^h`itsY-HN&%LgO&!X7|r0KI!s9+r^STfe6T^1k{PeguS z0WOLqbCHBK*;ft*TG~*VYe2@VZje)hYZ}OPEz@gk9Wf^alw@n>)#6MyfoQTO7n8eL zfLKMxN9chJDPb5ZxwZ0u0$71{4r_5)3#D-Uw;Haux!r}V z)>1-l1=e5hb9nDb?>KI4%F94f(il<21|ph{KFOIJb_ zGd55)K&-8~LDg9Est#0bdKdjPezr);8*`Yg{rU;XrJd%itedj5nm z_5ZN@V0Xi#{mCD`u+Ki++HgMj+V+t}s^8q48I!}O@*aSnuSZ`ypz{x~Ch&j%;q|kx z=ZS@yU9K#yJotL`p-P&+^8x(MW4J#!Vm14Bz^+DI-T6BB2%7|7*I$A4i8~SV#pgQ8 zke#oipQKm|9jN+jQgQ5DGrh6i*Pe*r{Ru@Nb*n~#^V;XTFYAg0{FwgW`+R=`19%nT z5bt13Klq1G4n|3Ga-i>V53f;U>~Mp5?7&^;+c>Q|dWaqTx&iP)(eBod0~Q-83PXr4 zcmB68e2jkKK;dhTJF*wUY8mYtj~D*qD=@%10)7A7uk}N>uMgwRZ!OB!(Oat2>Qbzfvg8GM?hw%gCacw zC1P+zWLCgcS_FO5aT6Zax%=wxD%gQ{Kb0y3)5OpJ%kBWUDro_+T!-FK{1~ z+z70xsU-QTsl<3vKlYaG-~vJd=7^Nk=+L%aww1v!VJH+$=?JRF<~L^vwvq*GfEippL5z}NHGh&&5pYTK%awT9m}0q zpqB!1WQXx_pvS=$2YqN)LdF%1c_Au+hfun~PS=;1GKC-eV6Rx`pg2aHJ;KxUVorKeMU`KQKt$XeiHlWV1v0K;}n?oeYrCwALQx0E%a%i+%dyP1&aI{=Xf(D)hj9}JSdqy5AIw4)(_JMr_2 zgNpY6!2BpbpKg49Pf8NO)bV2-DQxs0-vPPRFXoV7HGd$R3ulJ=?8&d~O}eq8!+nQz zXAojO+dD&;4eR)Go;+|m!(+r?z;^cg@oq4hutK<4PXG=a1Oz|~&};B>^GYI^LY5`Y z1$cJ6S;&wY=79k=6s4s1`-b}C9!&%sFd3}w;oHyj34dve5jgc@%;o zileC`Q}MAQ+ZAAJQo#X!Sn$bO7sw3~J)`HW{2r17cy(Bnv;~qvJ_-Sb{j#J*~kY!8fwRcU#SwF%?Un%Cl97Go&|BgzO!EFqbLq*DoQ zEK^v=a7>-pSA2@s91N3cvA_uM+YG4%ppn3_rH%2dukvw88(1Jfjy`Ke`)?fx>Dv{Z zifQOyTlY6HCI46U{;k)REX@wX<|QucvM=YHJXx7l-PK)9k=+z&3ot;#h5^6Z|H-em z0Rn>U2OEYB5RjiN*nY7rKKQ{G7`9+pun3Y3k`mQyHmkd;D=Rb4*=O%{i-t;oxV zzHCiur7dk*sVl3@kc+)IJCtfRCKo{l_W+0?T)nm02HC;D6)9`XBLO!hG$xeioI+#W z1pm}l{myL%8Y740bY};?YG{6+RdiqnBRFt)&gO*`+TAo+WpQz2ZC83>KdpdL^y{mB z-6gF+i)ITlcjag0Kou(wM#WU>kk;cRtQBn>JgN?&s0|23hbwGW9V855g|+sLf=)SV zs^|G?YwZRoR!Ibl%t9ARMz4%RzGg*5<4ymkuxb=tiracEG@hV)g~r;707zyjsLLxy zIs>r!Iq40tw!ZImi@UB>kEdd*u;>6^td8N$V&65sp!=Wkda77a>T_xHyego#Umx_8 zUB}qf^xZSGwcQ`f>NprDpn0ttjx!ehZnimKo(!0GRh?~(*~h- zDm}!T85X7?7<99uY*4(f3aiy`3$a(C_o^yX%T5+C&EP(SV3PGdwvvaxSnHA!uUdDJ z8H5(oP_K*4J=;N^B`U~3t#fU%;fFWzC*juwcGU6o<37g2(>CotT6|DWci|s?_A&hT z{^+;D&(EjuPamJc_rLyLc$nVU8u>>6aX^m0;qU#yABJ}?KL{vo^Z4}_;U(OKN9&WH z?@x?bE*3Ao-MxfIi+_+3JljM3_GpPETaP|jOz`=|eruVuw`Z8lgY{(bo=ttjAU}K*tCAm}W}|b(Ao6maqaa#cIVFhU>+WpJ4iCj;}8f6vKuf z>6yTmWOJ}sU=Y0-PXdb8d@pI;VezIA87rMF208&iLqgZieMC|f*;6D!5}5uL$85y5 zyth92xV824I2h`ZAQiC*$PTsEdW6;;j3%xwwN;!)`9sg} zCQ1yLnClpfsEQbCssQ9^QU$jRA=pK#k^mRxP%$Brou%w|VVM+<7o9ytrN)w!7mT5q zyvx_b1!1u|BR)xGg$%oXKdf%{!rra92OIIlM8?psk*gNWNkW$k2VR+$N^ zs)D7ADWV_%D4>Lq>uqTs7?`_-gsv7f89_^*I{APB)e{0pBWoNb)7+ixHu~5^vC&%c zj#ymc>PUs)oWb16tX8>j17v*-?L0oPL#4AwvwC2J*zjUkU_rZqON9-dygawzA&99A z3qoQiLhi&w>IAJMJh?ECY-3wzjS+^crHKRZUV{#^=<(BThDCsZ0ws>P0oqmtf>&Ty zQN&|64e${CWYJ@*e$BKd1rGoyvpi`gxMhJpUbr!0o)y4uvKyKx;Y(ymjrPLLq}@d> zJDUH)Z(_0?A3)O?!3NkC07_VqVB-5~9J#q8x(X->X6ICIbZl#c_;8#Wt2P_JAo2Y4 zG>ETZ2Nn?kxHM55JkqZO^#*&Ij~;wekKqp+dR7fY^+7Pc0!-cu0WA1JozjUJY_GjX z=dGFJ5xx*JH~J^KYoVgyfrj1qq^>9wLU{ctz1aEp9CU!qP@Wt#_WPPSnm@&XEU*_c z(!}0OL59k>UidiFJcc7mQo_2vKHELb+-!^nXk7?LREBpWp|CC4YXhCXW)&_lP!Dax zq70NDW(IxO5Wq`VG4GvGML zmcplkn}8~wEKSle34zu>%OD)!C$0%V5DZtz7MirFqc7M{DVanmaL5n|(g4xK*qOQ& zKtM%9v~vf>*;$)puz6;B5X!_HOf*zmT70sfx%mbll~x8@@ajy&q3svrp{Fq|y;o3y z^2nkWG9jKLJ<84o6yos#TMU~wWiJw+yR!%FU?u|0;{1<<$D9QoVQ^CuZ$Y{R?cfA- z4HVDXytTO#PdLtl%^uin9esuXusEoK(X}-1rYcXWqKO)Fc5=_E;Q#2&76c%OxFG2e z5(o6eD!0s;K+u@B#3?*d73yviy;PC!8oTO4SKSQNAkea~&vZciK2G zi`N!r#o!QDc^7MiM1eKhKQ}-t-mrbbdOpedZos6VzjGdFtfv~CjpJ-7_d1f1y8sjR zzk4Z>bpyT{UP9yYLU4&5SPLrEE(F(?C0@OooOPq~>E0zoKygl_zV_gMrm$HsoN0>qzEX@$V`X}grzW3zGN?4_gp*H_( zruj*)&t&oEm+bh(8F7+lvYpAKYV0XzaozY|$&bDPl>$0-G!RgdYWat?4~|^ZXrs<% z&`9N98=EOONXo|oUweP6+E0Dc#?2xu4C|E5dzXW)anWX@ek5jxZ06#|Xgf+AEl~+s zJblnCL6ik)X9I)g%!e9DH(my(9V8A=zy|Z+BE)l!n#<^15w9$`&Eg3VNL=ljkaU0_j*;NipV+haw*MG@`u@qmx)gr&X$+TX6TYz|(MLPy zhr5}cjflfw#c*e9<;Qv8`u|VfeX=#L3wr~DJ{jPHIbr~P+a>oX%7QA@DClyqIOb!g z?b1*0RdfkSHMF^XL|{_X*7&3KG=L+V1EAuGb*Kdn@8Hdql(-n_$tu8#-o>!OfW3qT zK}a%fiWuV%cYr~Mf+qL&9K5kUc((T0qGRm(KJ1pTMCa473CY z{=={O<&xfDQd?BRH#Bcf*oYHk@PHO86=gCZFrdiFEQ5VSjdxvSDD2+f+9ZikOd2%f zp*guLM``Lto=_PjX$rUiE1@PJzqG34dMEbn^v&|*A3>=;tS+ZHw<>-$G;&tDrZBm| zjB=YNs^gLlGN=@)w2)8UQ`}5+jWQk964y*f&k8z2OIj{8o9D$Kks_*_*j}EtVl*PP zhUZ;9t3nV2AW`-{fFy?X>k|Zg(K71VY883WB$lUViFvZP>62pt3aW)6x`-eay``WuIuR0j8jcyGRG{ z{Q%KPuMq?y!LZhs;zEf_!yZ^^C0X8J5gZ&`M9{Z%Gn<>Lo~bf`JHcqbkio&gj~hRW z1T$Gnk@cwyfH^}dd#~JsG$#T8P_7|s5;abnYK}P@3foEkAauE}4m!X;2y&F#sa!RE z&LA1=0j#hlVND&;L0td2Tj;PsY>O^ZRU246MHS}ef&HechtXOS1DKm|Y;WOdg=J7Vk!8M8@UrV-jH0*eBC8{;@1}e1L+)|)44(($Z?74mZ zs|@oX=GA#?VC>1R`7|@+BFD;#cQIc*) z-@Ha|_t3K6&Wa&GM~YN+KdN#CsDfBwZOv%8>5h6zNf^nKgU(qwX^yYXSPDV& z@a&)ubMFB47tIr`>Mntjq;-Ofr>un%?4X`l1jdWJln8e;d7w8DWs2pdI;3B7X+D~Q z1y}c~#i&Y~yS~!IAs0OSUdVB{;GtuW+r(uy6XN|fhP7fSC8K{L8`}5>|{w? zh1K;Wb zac>|uW05K^O#J?9OHh3rP#w{d@4GWWDa3g2xSWc-))1RsT1DSsW&&|%0{{&EkAud} zy^XnJjx>D#7NvMRA+@=vGW1ewLlQlfOZ=vJDA2BICqD#LRqn82RW?W z&x>KP_eg?T{Jkd*8p9j>?Ejcpr`hy9|YuXP>He`j5Jc=KXmMGEgMX8obH<>}rc z#{F#f9m69E=vd-+U+RzF#h0Ij*W>m0h2s^}dOd!nV;pV!T6YfU%6U?RpA7sI5R3d-to$mr4G z;vtNZ7Yfp_89+wd>F;%Muq(QeJAH3FW@3VAS7R@PtsUTO-k3*h~; zxF!*sJSFopz%+4eoZio^MiK*zzG5?L7Fol) zTDRAhS1(bRWLBJGs8z?(h((4|tUPB~ph%x{ekS*G+=|stjLoA>?B8&g~`Xl&YE3Pf>)3nWuG}yz9hRZP~|BFB2|!-{t6~m zAl1(ncQ9dcWw5ufV1QVLQ&yCQdqws%(=&{9*I1U@!cAJL5DGof`=TRw(Gw`^!?)-~1EP`vLvYPfZwe#^uL~yckO$sJfRhseGBS^%KpDBx zB!j`m@I*PF0bD^9ngG}2vI*N|i2FrVpmN&rX+$WzrNl7Mh#cYY&cd(J?(u~)%#Iwa z!GNrhS#xa~PGpfy+&-#E9AtYFH#=kppwdqog6$U|%~jA&W}W&Yuof7#q8LEw_zavj zl6R0{RAt5vtx2*hE55Q72{c20GSl-S1Thn)LDvHI4XP089Gb5%>aj5xP68m|Z&f%M zM}kF=e_%61V94Ij!Upy|qzITdFmZAGLfU9R6Mfq$e=Dqvh@JpL3_wo42&~C=|GSfY z=0zLd?vxqyl4;hdx*g4u0VE?3Puj@NsjR!_es%!&5(qBh^TjTkRZS5dSOAZUSg8x0 zEJR$^yX4eumMm_FsCIl7mtmYuv*KUj+k@5@+GY;A{?THs<8j zdBeJ2U;KyV22g4&u6ip&i*3X1n?Lv3sjFXCbUC3zBR)@amT+)~i;JemApgdwYLP+f z94BA`w2_J=-aI;wuO5xjwL&LNR@WB)5FNBp`_y>FAZ|Ug%E}rG zVj|TlAQj+8aX&0)mJ@6ZE~R9KPT+~E^EH33=66-SnykQ!;tP+4il@060Lgy#_mzou z1BGl@fK~=x^ac(akTs5*FpQRZ=z7Y9@(N%zu%x!mTxFNFK_}h^w@A!)+pDf%(=DJ= z{dya-uGAHJ^L9+$pKXj)2e(!SGY7>Q0JfrEH{UlPt+eh9O*R&8{{_JpFE%=e0VYt77a*~r12Q~PML%_(13xD2qFuBKSb z21X``mbH>89#@caceaOQiT_VgoR;VDQC>?Xc3B(I#LC-=LbQ{T?i=)QipjWP^tOSc4L(uweN45LFe}VwF>7p(9!_ zV2Sz2im34Xg86%<4Mw*61;8~Sxhj>ay=JB)ay)IRo`JdiZc)*k!N9IzvE=LdAv^>X zZ^85N1B;J(ySC-MC3x*?-&-uboBq*H>+^GXJzkGrI9@@m*W*_@e*ELpU>kx*(w7QB zhtRwnfB_W$DxdavUHglQ86vi6I)9>GQg8)n;DQ1oArZ((SC#E`qL$|bC8Ja1TJkku zYo_u}+F=M%WtSsrHE7JP^>?WNBT|-fk6I|{DZQSqcn770HBU5=t}xa=25z|P8Eu|voWYFgnVV_b z>}Qymbu{v41``G6I#lOe2;`uNkZ*%8RJQxt+kFkCBO|I12)%GaJQc99WEz?yKrDlV zY!F>)@#+hsja39WgKg$U1D+0{0j5jLv{Hli%-}FQxp2#}^G%i+!yR`VtCVlm9ZhNB za{$2>{JRjU9?;JAJzT>OsO1RD`b;sPK`@kdZS369z^I-)uDyX0B_0i;`qaV5{n^el zF&o)MpdqIq>qm4DD3-7#KXKFFQNFlmU!hjwM{7@197*LyuNGkelJS2h! z^~Nk69$T2>w$CiAz-;-+&=RnZFlJ8sv)DbIswEsS?!eHnbHMvz>e>WYR&WE7Xh;GH z0(D~aP+7v!*DdKA0>rmn}VO{$&uqh&k+__0#FT>}hf;h6=TAJRUQM1|b( zl67wMUP2IV?Qy`fVb9?H!w@D&{>F*EN~nlP8RDD>Ochog%wpid^CKuL&nkZalNR@D za!DNx(g_^eJ)r_8HeqP&669}Xw{hA{G_VIq0}rsy{sAm20N||0z}7cb&Q~Q* z;##t##^zlC9p+I0BF=igeJ8G^K-^mMD6ou%iR}NY=19|ys#n1rA?|!cS#o7S4#)G_h z4Zq7PtLmyUYk!9{a^ipo+o>!QD+yB4$v(Z28`gR~v&T*=x)XhqH0b zic%?Lk9#>TsbQe27?Vr*u3M6zLwdC`Shb{QWK6Pgf@r1skCp9YEfJ6;u2|O?>%dt8 z0VD4mNyY5+TGdS?Yky+)b|GsQrCN$JQjEsf;Tz&Oz4Yg&`RxZSyk-8U>% z)y0E@v5xAaf4jb3-ft;C{Iwi^{jXaHdiVSvy}AFiREtG_cZRh97}1CcY+gU#hYto$ z{nelRAUvK8==$ad;XmCj;is1^0mp10&425~04d98{m9m$lf`)tHU@vs7QycwJ9gxo zICGu*v1Jina%8gQ4r#$oZ2?nvG$WXFNUR^SWTW&ktbu?P+T}CoDC|AIeT)u7mGEev z^^;v;Rl?__u>p{*xAhaCSr4=KB)=@=rbfgqcpqYeSu%K>3wxhE)?D<5t&Q6nSs@t7 z#x3ScR71D55_T6)+e(!HM*2r+2`#RA>Fu*Y$Fkr57M??k(LdT7VZ#Mw$Jg5s4x5GR z#T!e8{baQBkDqK58K9K`rrGsx;1w2u=uHoG^Z)<1zWCx4UXRz~7mim@>-G4Rj`I9G z9#83^(!0SI(hvyqu&URj3|FaMY&%BJ6xS$&009!*w5^$1v9-92F0P#i#-R#;G)Py( zE4_t$!Gny`Nja(nzvLI-yNksQV`CLA#GsgF?|$%B>pITBjOUtH>06z=Q_s_REGUZ*I(&@I-}Y-%Zc%?xNo=|MYNQd%&qwR<{*aLKDLD%%Qh$^vK0a~EZij` zGoNXaI@q~8FvOz97b;r?RvIet(j6nr=rd?16HBPM*y3VyJ`3+&07I#gVlvnk?+%x||=`3rz zgzZZwhT~CwZ1tR2m;n6?zk8LXF9gB>4s4F9R=9vY<+4V5fH@;B);@D>USpDXks*g? zmqyl^Ri+Xd3xy0Tt~pDVZzFzh*TGHJMQlIvFaY*pb8HiM-8u^g8!MRZ!%GH$Wb~RE z#Lwm7)W%mSZh9PwNJvvwgr>d-4YX0!6jZ_a!3=>Mpn_}q+7|bV?qU+ z6b`_S;Aq?Mi&d=l;P@|EPsmadgRQb*O3Slf`4|n8pm@p?o}Ow^MO_{qp{VZgK4^->YzrjimBB;FU`z z!!5AXI5N%4$=OZe2H;xXQN%QJkb{+ui(?Wl;|tDQt4*$VrE@u>sGT#e^2XSHrW`Xl ztmB{I;6!7$g_Y$tyR%B9AWTJ(Xah0O^r*? zdB+TIQ;(Gz?H=r|99rzm5t$o3YZh}BB@35DU?pus7+1krw2+mVJ=UDPh(M8#tb$Ty zDXADho*^SJw)y%DKUNlDQ7lcTI|jvd_1tak7gwes=0td)Pv3@L(}6}C>*s%WzuZ3! zLk^$rtRD>AnjTVk9FF0?VbA;*_PIa)oqrhq&ihZH-+c&w?a&)geG1=le(1yb<9q9a zK76$P`oiX)pIe;s4+aCrz=B4T9EY&Q+8!jGf7+m`VaI+uTC9lp;vRDkyvgi_U+i3c zluz*IV0j~chOI2tIqMHpDMVAF8ugQni|>=29mD4q+rW$M5*0s>*1mVPUO&!^lfym2 z^}?!Klp;ReO^iY6_QJ}AVCa3=1jU6|-);Ro1Be3a+|KuG;OlXazb996$O`Ry0BZ<= z@9nqDy8#@tZhxSPwX<>Fg)h#KH=^{9eYS-OZ?;e2N0%||tc~t$%nk--JsLnrfGg&g zX$XHWToLWpH-?{zm@>xmnhbMU1?kj0Fz{o`jr46w|7W#cIV`e z3&HQPRm;)QG66vVC~7mk#Y)OtV)Vcgo(D;&*5We2*y;OLa+tfDNrJ-Uu?)bxp61P& zxkG5r<5GPi;2|l&I;LkBlr1#V%!=b2@QI$bs=kS&=m9i^<}bjV6-0>(Sq7wFMImzb zznbWIV=zchsswb1$o??{hmy+^P7ZIHETIKM6qux47G`~B_%@tbVGPy2BPiBs5pyqP zvK3gdZyBVaOba;<-1Kc{N*p3f*V~vurVbk~ctgRwI8WNtgISY;Zwi5sVe^koW)-^t zX4t3{Ngw75nlZav1(gQ@CKQ6Ga2hoP4G>3+?)Z)-hD0k3s1#Z0p#+p~uveTc2plfC zj&>0f04{(5S+ccCDWNLhLBd#Q5&?t>EIA)9c7d5-iCx2Nph6ky?1aN)gIgxdon7L@ zY%6++@p*)g88TR#utk-ia0v?S5laF*vfzg@JAf=R0jVff9-ug8O0lUt!aRQN!V7{W z{;p@GKX`4;tUriQWugh_j1AU|cW!Bdd!kG2iGe3Kt;{TL?E53ZP8=6LyP0gPKf>`Z?J6LRD0HT7Zt9&M1;Fabr84wO^wzjJ=nhPj?H!vcUkKc|WsyAjaSspb|h^ zn!d(x+7)_fEL;0L1Ay>&15`V|wa+~nkO*+b=Ld|e{+M`==bhb?b;oGe2o@Kl2Q~SDK?UARTU~^~y%l{LcA`1?ycN z%Xz5HVZLrGUGeeiiJT~TdT}sFi-16Qu#c0=7by)*DiFX4v1+}HE}tc89-459`h9|B zOOP}v^)5SfKY+Tf6U{{0L8d5>n9EuU?#b4o0IgM=vsz*$glpBu7_Tg@a201!W}WH{ zXv0K?g9_fJWPr&lOoy+d;R+%&a7CK+)(^{nK~A?y->S>linEd8;_u12&Z^CJJ0DkA zGO;A@C9rn`9x`8J%P2yi^# zK!$$K>f_a~E8bQ`WTWIDm#_5|-acwev|}ln2STd{=wRM$f9uUr?`xopgL1QN-k0+e ztI4qnU?=~-jetuYVOHyP>Td0n{}q=Ea5G%b6EC3<+j(Vhh*SK)FX0*0iIvT-&|_W1X2(? zmIXtS641UPGa^i+iLp>LrHdZ@GmP#;0p%i5UBOnYfIDlR7pzU}Crs!weX1ZU%oZ%XATfo$wmj zR2~=%pHS=oV4J<+J>rR8)-0U?a>%K}4gk;QPYuobEv)kvpnU)3KD^kv{qdoM-~N=s z_hzaW3^ZE|^eR97d^i66*UE>l$3O3QWoo@1ztS;I{W!g(f!STw!czc&K<45}Q)XqT zd~+WKPXe_7tTbLfkPbPZd!QO!S`!2q$=uz6q?Q2^jumT5Mz{Q>sI#Fu<+=K66lDj6 z6OnINSPsmAxWhyZB5a=0GV91C@~*ECaxRjfJIsZ#OpQBLm=5F0^8Y2rJbcH!%`s2Ks3MWCHVOvjFA+cx4+idoSRt z?DC5y@31fm+e(5?odsU_%)=74c~g;e@dn zC$bODEL&$m9=8ZbyXqIQ-~eEe&vRggkOlhCHk55vyAQw^Q)ryE9XHr_1j0_Zqw>Ia zgS~Wu;4ne%IIvBT`M;|NO5`p8xRPZpdjYUWF)m4xvDk?fG|((b75xV4lmgAo^CUT5 zWuHux;*BMM9Ws6;V%Lf zL00uf%*RWcpQ~6^0C$e?C8Lj@JOE<@6VOHQ95c|as&WGFd&){CKqh^}SV)pz_o((b zd4*V1o5e#MmsJwVE{2@r{-lHp*}KufLJ>UZTX=z_*Uoj)CXK);D}2}`a^G3ikeEN1 zvvIldr1LeYUud$#Nrt-^{t;&Nn0=gyl@?XC#IA0+VWm`;4C+Q5sj5xTBxYD~;GxOi zxK0%Juq^WBqujBrlR;8lMFazx(g7pyCaf)g*+H3aYwH+XuRQ(|>Lr zV@;M<8mL?}ra0C@V}0F70UOwO15)uRaDa@?oKe7T>oJl0y6ewqov3Pf@@(_55|nhL zK|UKUhsF%l+0xq1s{E)n#Xr1W6(Bn%#=5Mes(c~z`{=UHbTg9lvF%y~&^7Vw%F6P) ztfAqE&I)u!nqrhFkQq+_$3whcqkq4ShoHc*y5Sojg~Qp-^#UjFM^Gq{C;|65o-ID> zAr;H^Gv=yJ9$k<(gUFQqIlxHSE>+S&`{U$=jevASm#ZU2TKwAEqY1V*q}?7A_T`s%Pk(6{|AV((y&N7bwe_xqpZ)gF zLV0rxp9XuvKmYUamk(dELSa1Lg>Njzxc~P1j5&|pOZa5#+wQy#-+Q_@pvn?dnC?#- zu3K0e02qBr^37x=L|2G>-x7f6U-(D9wLaM%1_F9uV{eKcFeJmklKOh%g-0Njx5nIB zgZ#N=17#AQDD8hSQ0d8f@Tc1tK6Z+~!Gyy)08iY5wK0l-e6(|I7wt=?O`)Xlt*u=T z_PH$70$(rtoV{H?4DJ&Wde#qbtbdSz+y{c8EP8_^RJ4rL7LrCRc3UNOl^KDxfS%KP zd;bqCMgbVMx0vJO4j^p|8^l!jy1#_MLhH?@l)hX3Uw`~rcr}TCJ^s1JE2#B){7Q#y z4j(RuxCvDonm{vQvQ|nrw=HvVK&Pspk^8ad{*)eG`zw1T5JfJ*;YoBcnFxnZm`LV!KMV) zO^F^1mS<|))SfcgB%($)eS6vDmAGUNM!zCP2a6UlXzr_5M#;0nX0HxS5h3(^0wrOW z0J&YZjeZpX)JaabTsl;G^h{bttVz!WwiDbu3qd2?CKq;sM5C%LBHFP86>COuLwA-( zSZG8o`wZGCT%ycfZI=gt;nGL?>DanoFF9GWTG+Zss8W*C_z(%%`!gkfxlW_vIC@^G zU?v%AlcoQXD!at85Qs&sHYYlutTfHOrN^|LC?t{$oQh0tc9%_^twAgRF_^^Q3Jl@@#=)+U)r&HuerGYS?2+v2oupa_j_QRhteQ^l^)eV>WS~Vl z+TT0*9|2~u>sZQ5piw+BY1GLxC1pXjDF zS4a*QN}WDgRC-Uq?r51i_;wk{l`pEoSW#wr@ePc-NJaQJphBNmVc4ua50kyO7}$l# z`BPX}nA!rus0n3@N|5oznPsBOZx#!R>SzF$0=@yPL&U_E!iryD-o zFkXKd3PBh=HvsIm&m#dSRAPj|IvH0%!8_)&nT42URyyp?eEi75nzCSP8qCkyD1vQ- z@!Nx$1qoQEV06i1j$+tt$#$AFzZO+81VF+JDp*}Mo=@ChS#UZi#m>a{2{nw!7`rzeClLAj?bJcD_XXSgxEkpUPynw)X@-~62K%N zt+-4oP6Cdq=R?BWs*kykmQVotmNl#e>%zsqX9d)ydX-CV_V}4Z4`;D^36>RSs5Z$~ zaD)E_E8t^rVY9PAiu*=k?wlnpa#f=wW>E~Y&?@PH{prkUJ_p6+>p{s1caaPYM9MDt zOAVi@(E%I%ob}Qbmyt_A@LI)H3`qylw9Y#)6B{^Q9XxZAb!?0yjn(3buvKy-I5xDC z)Y^Qp1YXSmviNUimBHdaSAMPT(^%I^oHB|p4lb(Fp-9si3co-8x$6W6~%SXipj62gxd98@#ZzZ_&W`T>hoq? z;U@>S9E5S$HH4M1)*uEBkkF)svejA~^ebU?*bg_%Fi-Zi(IM(y^mC>aw2KW6yI$tC z&z#ZLz^W^AssUgQ1O=@L(OG;~d1i2nwYauL1G(yr4;#i2d0C*&Cq2)u7FdDSm7(SF zqgZW?L03bw$&WYBLujoRYiPb&D{w`;@`e>gU`?C&4xU3Ru<5Z}Ym;ILqYH|M6iT>; z2tIa&>2@6#@}gL2mW*I{7a~rbvo~jyHK^m@1)f*b5{tPRVK5psLKw1i@`r*FFgat7 z@oiQ#3{YuebrW1-Wd&_Ajx%ElgVcuV|ihpy+O5uSaMz2$To`jv61jV8ryY%rd|78)6e~riGFoyr{xDVg#c5`@t z*@W*O9z(yWtZ4mPmdsh+{4~5hzqLrj;)HKM3;p5Fz?qKoI@m|wv$^Na?g@oSVC?>* zb0u?aYm4g-41(L*8uoEJlcjgEvGHWd)+ZY`ca9Z*GC=C3OOz;fNPZ>7)j$#fOuok* zqsnC`up8q6$(R!uU{#fj-`N5Ui6Qd10He-ZfKgx`ca|tbGBJh^7H5MAII&i>jWNqG z9^fkqAc~CWpvsdY>=`USZEf%XRfEO%0Onw+@nrXLhB9MkG1nm07kn@e7MDROfJE{H zf6+~3l5SgBJXw|74Mdv_8AC#OW8-#2507%>iz5KGa9B3^KlmGw<|?np>+xSWUO}zb z<5xQ3JiX%{I(hb0Bxe^&Fc{^cD(ej8V~S@Pi+d??V^BQ-!;}wQL=yDj^tblBF2NC? zQ&cE;POXR?7M8Gjd^G6?H>5=yFa()%aN0Xl-inAASQoFu)asnqxW-&dhW(SWP_O`( z1!fiVtjZf8uYr*y6|L+zxnEtaE$EVwxk8v6<=p3Zj*t~1k6KCdUf5?4_VwP6xHMFr0o&(H zdE_OMVS;LaWO|I;Ecf=q21f9NWdXwsh%#}G*hgixVSvr^)}Hz0Tn4bW03(s-ln5kU zLh#C503+Zl1rFj^_7=FnZ>kUXz9B}w)dmBH<+ehYX7^CHmK9qVL}uEw^miM%36jiisOKQJC)*5GF(+bvHV|ox+K;H8X-T_%ct~oi zv)#)%4&kHS*%7{5bEM}i(G6Px8sX9BU2t*oR zdR9q<4+Q{mY!x~hylaZX<^~KY07{S)#KoTx$XM)rFp1Btq7@i3a9t0|1Y_<|g`-K+ zT?cdeg;GK$12CVRRq>7T!6+Hs$pY2I+6+u7091>;ANLRG74aSTuo&QlGUI%rvL?83 z(mH_l2E_JqHxYFDw4M3bNq_U_&6r*k~YCE8CV90^-)ru~#${hU6@Q)sKk=Kgv0g7GldS?wS z?mI-_0Yu8V@);##Z1O|^nXAENQ0rEi4C#(CL7Dgx4vI>E1dfU#v*xx0I=)c-wZQ>a zuJ5U=46NF!RVHU7B_}#_TFovTiYpkP|4%odKp=RiPjLB^g9b_*1qX`A1`k&cquT6< zTxKW+V)MzWURAQr0Qm%T0Z7JrR-6rre@IQt_V8b30QzTpt(&}~LRbcvWi#SvfR=$; zUA7smgL!f0_XM*D4hCl=c_82nr3Mz(+DzRWBqWbIfnK7USCZa)y5b+sCyS05uSD)URM@yecRK2gH1lE25}DEet>%r!<*^jNF)rpR;-6s_zh zmk|1A#uapOplKDN`b!!z8d_tfTdd04*rC%D*Y*{FsMm_EB><7tr{i^81qZtvPF!)Q z+M>1KfmjIMf1X@yz+z16{RWrC>T_KJ5F4Ns1aRV?$2cmwkXF`~F1GV~YLyr@ropg1 zFE18*eia@p-IGT(_#9GQhepJ7t>o*%VkQftQ%d?~-i7E-ObWB=VAbeKG%WZrD+@q9 zq?zNVgN;Eyb3O+4grw54x8$M49hGtyg)a5QezzG^gk^8n@&j9c zzlXKZ&bhJ1M#bXZ*4>YrLPpmPep^Tk!fz65fsKbx_Mu?cZz#P$%rJy4{NBJ^v%l}r z?|X|6En)Ql_BeprP6?1L_7QLd=o5iofLKeHXkL#>j@w@A%u5Ha(1?5edlt0*hvD^j zJ^ls9E2#B){7T1iUf#|nUJ1d4Fi0%dVu#YSa3PG+vEg-K)rhYoUlK|8StdBjyHmDU zZhi??j_=DD`r*ecB!Y=Y$ayF^XhC_1?niQ!l@M3)Sem#6H`MV;tH%}jMaLqpNK%qA zVj~IsXihTyMNrJL^$Mb+vPqHNOl*wOB6D3Z0*j@(S^d%kg@u%BRgqFqz-lpWW{Zu< zbBCWxKn9CIs>%^NoN@LDULe@kAoE?;y>vf*^xwJF#tEMK}OMXpSz6 zq(4>!^8{@;A^ftHxU(G=d>JTb5b6@x5w=6?s8ulNh6Dq0C2a8y+Ue3($*U&8hsyJl z&f!N<6*e-B-Qisia;Ij- zj55fcTINO@X6~mT@1r@M3?TUAV|>f|yU;C;P$X*XumT~Uspy_|^(6%QbRiOb40n(t zvh2J85C%EnosUr!Z&KZW4M@o$#tRJOr}Pq3r7#fG0ssU#V=ND1g5cp!3x7K&1K;em z#A68$7kOF1;NC#02fT+3w}I_EP3gh5nQil#XiSfah)_Ro>DPsxJk|qc62)GNN{@Wn z3`E?W4InX45fwwhU}C>r2H{W<0L{#MK)db?OgfKZOZAt`>V`9o!L|9JGSLR?^B_sj z;$BP`dnibH9J$+K<-ZqXA?<#_E}}1#fnK8lHyaz+n`fE04#$C#J$kue48b54pqjn@ zgskWt%PtrYBM|wdxSm!0E=i14NP@{kM5eZF?oqW9Z3~$&e7)@7?nBS8A6{6q8}A}h zI@vR}Il~uhp~*V%cvOBxMMD60n7_zKvTH)6#=(AfZz*L~B!rw1l^bVOoJ@xS8UC=$ z0^tOR7nnyak_4-oDkZtnske6UM}k&3Wn|kD)=>1T1*fpsk&@sa!)``ljcRCdaG1a@PY~mv;pEEB|s~LX5?O5oUuyUTBnAUb(e1XHF(6v?@IMg#5K1_s;+E9Re=o^o zD;BlN`PTl_Cy7ojK(fJg4e*K{|LC20t*V(;rc_#itr)M@+90T#+jAgGV}6AgV|2-< zkLEVGLIdS;X#Qfn6UA&HI(S#>?KY`7<~hI>^*O<1kHMK(Vru#CFs5Sr9d7Qspd2d{ zhGk`9E(XGeGYuym}L8UPZ|hZF%6a*weES^liq{K0xd zQF2_W2PliM%R5F{z%R`uk0qoT#tEyVQ9R-lLx>;xCGrN1Dnzwq3*vv%zkU z<+r~Hucgm^d;8NjWBl9SGvq0L_NU<|yByx!8Ng+8#BSM8KKIA_bC?hJl>4Fb@w464 z9&EGAE-at+1`5sL-uml5y8{cLgs0t+YyHmFtGAecP(a55-w&g#H9q7_DIu6!1eCgo z)&OYhi%O0MWd1u;0-t-1O2`0DWPEiNJISs9>nVZOB&i`r1lIeWoe&7NjwP?j1Sk){ z_Woo*RNhW3Lh{)eKBDMCBzgPr%_iFU?Yaz1+koNi#ZB*RErMilpC+>Ulil0i-v35Q z3bM!cwtoNFy~RVlK=8{bYhJ8LNal?=50=MmV1>om-gE)0te>ZGjQ`i~Eg%0RydJN| zzu(=6>IQ(i5BXjgg?t*5ICS-zp_$G@shNu5GtU|3iuK$ z{-P>9UZ=DU0#ByMFozaajI#x#I6!RkIv#CPI>1{XDM5^iI28t` zo!#fmMH&<+`jBUsZ6UtI2%@1oZCWpbfd`Xq@9DGEV>4f?1r*?F&z*&Or5A9*jRJnO zAn6R1s4e#sYCGm?!2t&YNImdLLIH&CvXG)P(?^QbxH^iKG=2c z2#{cyZydnO`4i2+`|z#Z17J0Ph=m~QF3Wo?=b0=sFvs9k0aNm$HO+ViU(GU@G*p_o z!Af8WZ7pz3y>xG#Wicn)Ap4|25ExPpFlEl5>Fj~eF5k1c#}FqZ1K^iO`6%xH z;!^h{<|sX_sy3@&EnqID>A!;#jahc__hcn}w3$b{B(bb;ub9?ZS&TAoOp4h7AUHu{ zKAr`{lg+8m1q~PsDSB5%XJxVYM^M3$K>N5=I!~X&q_sP(K#ZR&d4UywPXj_$&`Enu z{l113WRUk`73HnU@HlwF$eY0d9sRB`$H)lb`x=w1N&FiJ${9q_!Kx}COMBai>shNb zr$TrDEe*Q2=X5G(`T|LMrZV=qx0%F%D}q(d4#Ed@1R;WZJZWuML7;dmJ##2devYyd z2-)XXPN1$dyuu~|y;5k^8yh?$=9J%KbTEZd_~^i{11Qx&$moz)X||X$Twg&ho~=pR z8Y9Wi;owZTLQKxisbQ@Ez}s{AZ1nfX;2sfv=dpT~Suv5AF>)C=P21NyDr&dJVvoVu zP0pI~`>QwOD}<~3vR=vcp?U7D1sQ^mQONOwWM~BUlD?``$`zPm@2zNU1M%9Spo(qb zvd|K*l^&ITyMB*34+#t1OT1~{8`)?B@78OmH~p^HwknT+5ht79FNX)als~r(KT6A? zuqHyd1Ts8~UHP0~t?_3d4i{?jYATxdOT4BvXE<{p&{}lgeYX&6C)FPF7h=f5LObM& zODTwY=A^@0f}^^!0PzhxPMH9Uv`Fwr1QJ8kP%2F!Fj){d%56|>m=xp5_7tQXx;r2` zXB-Zo#?CX^CxW?ySa{Z;BJH{|ZeI9oTXYojP}VI5(#R9#>z3OM=_lbga6mutcmLV> z|9RIH9NyV{{d?z2_@mFC z!{PYGVz)8uKlR~@8SzjGUqTuP2A2g$Z!EU>($?7z1I*SfW}6CGO14&yy;a;`834GtMKKV~`XgiNrYE7IL@;V9f)&3X#apJsN+$nZmo$kum#ZacQ?N zVP~&{%y4fD+73x78)RF1?O#1tf}PKpe^G?y;S%23+V;FxGG~X_!^XhR?Xw@N5{D0A z{&^nDzyJAXpTC6H2^!edh9VRaxLMS!@jzcM* zyh2p@Z|Qu6^$?eFB#U50fj>l8f|x-JyelR8fo92=#BJ+ZTR_ZuGwWh1DWub&nXpDh zL&@~X>PobLs!qhOi&n|nF-@&pQ4~2VWffQvTH|U(ECSfn4X6-?3+PmonWgk1tGb{< zbF2!yD?YQzcB(F<4a7>DgrU08m%$7NY`2*fBjvnFIdbv)!An^&#$}UTrN5X;$}3zX zIlx}PEKW)+vx_Qw)qTgX2_jPoyz~+5tOR3rdC?4uhu)Et0LEmtvFbZ^Nu)|}QM3ec zJcWfLGH;S;Vkq!lh>PJ4tT|?={R#~nb{@#iUNgR*4U{rK3fb>v)Nr8#kX=_DF4a1t z=Ci;qX&)o6JF08s712X;RcL%oU}{5bjTXBj!z22(88%SrJf00ul8h6V+FVGoZyeKw z<4yZ8T4OD7V>f`N9A=M&5o9(iuMk{P06#2iE_*-5#Qk&!*%*T{8%}lhO+ZxqStpA! z!JL6Het}6@A}FSMhp^MKn_y~`!6SUcJ^-+^Q|!p2k{yqpGn(Niv8|TckyV(PR5wt? zHhUIMg`tS`H&M3Php#)-hP)48fT4&qjM{Tl%1pHo4OYXo#FIfpTd|QK=^{g_h3p+S zoq)8?u_GYTvtksg;&kC%%f17uvsZtjp*nW$`*3%mla^iA$m`icYC+Z*XzQP7W?xxp z4t`gA0%0-rtw+O0z=_d79RyPLZ!BVdQND=lSnk57ic;DZxLJ^g3U>K0+IZVokY?d; zUwMs3j6-Bp@f;sj_WJq$Y#R#eD@y+cO74K9cLwr;eFTu9!Yj)_6)i zFqVbP58x!K9$GL8pEP*T!T25^83BVufIMc;mwUY*(z^40qFfIf8dMGh8x7z~I`otw zb~B|X1aRPwNRN~SepWEWNHoxAwNZ?6ti5UW&a*)+sft?k&Wr39?PeX_IfBwFU}_T2^?#C5A15Q}kPTVl`G#SlKSO;8X)A z8ViUZU8}HLSMixMms%CXc=LWqAtfo(2PJ>a%J8XvJypI~W$g#|jw)WLpsf* zSWO-of8ndJ8UHzjn`b1sWru*;SXDZt%v1PeNu#`M!)Tj+cn+~Zp~Z_}1~RU^a9lC& z?xJcQmaw92b#Rt0Qo)1$A1d6UB5zEKTU~(UgV@P>8vvBpk9dsY4Ev9yT&)ThDE=<0 zZp4Qi;T`g^jId&IXND@ntV#p>7oVHq@7gh4Q-h77Kg zWb5^w49xwP2&^Y&zk8@u<9W2MX=HV|KJ zXR@!)TY9>Zb&muPytN+r*xB!FEdoIF`B|*bjWsHyfB?5%ti66>G4Q;bB^AtK#-UR1 zhm;Ab!La^JnIMOE*x9+hZwa9<&SGsPcBREnl`t>d&}0=Lytr&@@dw$n@WG!kM{F}o$q}IiKWG1wqCsj zVAcbyix%>9|IwG9?f&q!>f!70Uv|7QwO)^3<>+1x=f|411VC8fX69l_HC3gSjG#6p@UsnHyFdTw4Z)L{WSU9`i&=-7JV;b}Loe6k9R|c`hMv zU?|ip<(_+odO*@I^T>7k|yKZ8>vvax|0eF zjRaL{Ur_2A8^MJhM&vuV1khk8kiluL4G;^am#}hYH(_&&;B&A+aG;4kyBm@(1bOni z86wytmvW9C_cJI<*umlvF^~!}+mVc|8ey7=>!Uw)hfOh^Ur8y)=6jDyIU)Ogj^eJ+ z+k497d3XbQ@;tMWOa|aWgYlDX)JFmYG$)&Bmu?`=(c13bf}~I3jWzpI{Mv@eXaU!r z!ot47txJAbU{2wl?;-uO8-W2k*kF*|pfz8>a9XkqT2U*41NIm`1o$&-!$ZZHKC&9v znfie-d~WAD)9n5eH<@!8tidgSFC(9s*+RW3?pYZz((qjXTPB~$vV`?${bctxAlvvD z4)*=VfGwEX6V5Jgtd9-asi^90{SBbaHn3lwx8YKsEvq(>g5S}2ANx=Bt zo+)})0mKC0)Gq?-FNMBY(XM6L86*mW|H%NGfi_W~_WSzJr2Lidxs3KrGw z*$s7rKvS9D>w9@#YSCU~U8wbp*DBVQ{2_}ZiCNOcT$_(j0~11U(oGOc>$@zb2F~dB z0;#exR4dRU6`Gc~s2ovf7*KLKoq_~sc_`1panCA+QS2m|0F|=J67{|*$a;Wiqh!JW z;ddLdu>gu|amFUUBX~vlBRfu)R5`B!8BJa$FD8Y{0&wt}#a~nW)p2E8HFI{wDGs*8 zusUgZ^b$go`gv&4jGn49q}1HY3bzCYtyVTzP!d95mIGD|{Bmr}OxUlj)Wvmlv#X#8?>rPt`*jGVqfs#bTg$u&lCe7!t zQep8@No3}btRQERh{f2^4P@Ewvs~8H#YOLhrAO2pgYKS}mLO)EU?B_50&lpe+%3Xi zRDg_=y%SP$PFym%M}POwFXZx7_zfL@@CWao|C4|E=l{;{&*^{g<|TgqhhH4RKQXjw z_wg8>Y)yH7-iODR5WX5M(mK`frL6^D8vyi~#czM|{wrG>--gq}F??xBwY~M@(bl4` ztRKHWq4KqOb?+}4Jsna6cs`@G$4IaFE3ys8IO9+7%3} zBbj_%_`a=ie`Yb^*YD2Z(ar_G$i21ygAJ8WU_jd#p;x9g@0|?@!N|G#so zWa}QG_yC*A*2Yhx2=cC~%YH3%Rvx8?kxXUBct@hVcz5GGniG zd26xTr)+U~WwmRN$hu7lcZkJ0T+M31Gl9w>VQ>K=*Z*E$G*jQ0qdL}N{KrTvt=t)(~ z|BB^2R%fCQzAIfxb9Sm&2sApb)QLr6h{$eDRTcP>P7u+CRCVbK1F&4=PR1f=h)XsA zP-0f^q^W~fq@1*#LOF0l{XQh z1KDY_XB_c|eAWgM&E5eXKoAZB#30L-tn!U@n92I6qag(yy_93jr-d6fc&x#5sBjZV zfdH!$Qe3JU*R`KTTcdE#&T}cAzh!cLq#Q8{*R@L=tJ0CEcx3lN=E1q1;-%87qkvTf zUn$G`K{^Lc5(~jt7Hxubagwa5?&)ULFEjTgT~H-61PB)ch!8}!!&(=bA9%LgIva0BJW$#6`9~#~d4whPwcS+<&zvS>e_04gDp z$34!z;VELs?7tnj(My6>Xi;~F0EsRH7HJTCvVVt6pb2v&_5!#r_$&2C!*EWC_XP7g zfJ^ksf|L#!)+!dBNF-5=JpgDJl=l3h$|BfPN6)}M-`RT)iE?J-1OQ7<3rc=hN@b(V z$Z%e;s!-{0mX!>HakN1kCRUq#foGUq>ob{ak^_~y6F1HPCGhzG?l9Z+7vH=x2_jY# z`j_5eA<(=Qo3DXY90TWoi;Zi@N-@>|(z9OyR$Y>Bw&g_?M4zP}3H;NJ_FP=Z$WZ0l z>XN*RdkN+0etFKUp`~I_#jaL)mja_XUyak3tJsMkIiIXb@K7t3uAdVh5gcd~(!DtPvtr9J6F>E&?gCn^8+zCqO_|1vPyZR^(N)P|DOc8?ezRrk2@r(6O&N< z9S7b*WA!*D6C2=>6`^QN35pV$6O+Rpu{uiPEI0>$+Slm763zB&2)9fm`DYbxpX#_- zZ3PU2svb6g%O$HTu+zXWF}9uSBHy-f^P1K3N_`r2S$3=7$%6r7CEa$Mw z8RdW%8UWUsqPlE+m1mN2UsgcSv8&Jov-*9xxetG~>J^0YU;0>cIi!y#j(MSuYBo=v zw(3BHoRY=>o)MY7CmFv3nDfeoh((j%PV#n&v9T33Zuq^&t@7RSri@J+;D9XGKHU@I zoC}%h_)J^pJA$0d03uPBGV9VR))cjxx!W?Q*v$Pc<{-%%z&Hu1ivsLRlIJSk+`+qp z^8n|48py|WAjz5{wWKgCOq2I-QdLA0PC8mJbYW^UL2Mul9SPEjKBkOQdHGotEHICF z=*T&Za}(roYIs_REZOHZFsG5J&4l?ePeho`FI=w!%c8FVGTt$kDfO1Q`VAe}$n4&3 z|Knkk|KoQS(QF{l>?~SJo6wJ_AUKD^!zH|*cGhN=C_~cqvNsT^5C7)VW4O1u;H{nK zTMHt;0@>Nx;S5WKq z_@$4#yU@RU8y*b}AUxGPL$G*dj~XJeu0>7-sG`*^bR_psj0+VKNhC4LK!d;pDejcL z(Q+zW_XG-Spc?}%6<83JdR5K}p5SEyH>)yWq{n>X8ePQPQXb07k4M!rrWBHN>a0Xs zC4)FSwnUj=p<#XWa#0NVX1bSvBp|PVq9DFiCJsqV4_R!~5E|&C^iqmoTx}LA6ca12 z)d&x9R%n(VSnPz-v9z*n#6-{vD(M_l(~p6Ne9jBK4JgeCZlK>Y3m9=jix4fb8Vm)T zHWHSk3t3I1w_yV~`(9$sF5|(qPt4jN_(4fX8Y-hAA|gVCzraNvtg4!+y|h2z1MG7FIOJY(zuD14fHxht1&RI_1NZ6)@+5SOT@!lE0+ku| zU=vNgPaZUvsmV(=+&HJQAy9;1p(p!kCXkWH?pb`#1henwfLe%$cnb6(vyR(ybV&Q7_@}<6%HNWqG9Op1r`9A0qW%NHujWBJ`kvT3};mQNnQBL#^RAX{B!uT4NU9}kORPzwUO`S?M81VFn(qS zp1{fi2!`xpy>$HBIm%GHB8$rBerBb=17xaT*PJD%#v5JL)3ZSUkH+&ihViL3{s$Tfb{e^5L zum)iw4+bcJ>Z1jUU{V1nOAc6}Qc?DbfgO!qBP$HT>kFe1Mzr%x*oAWC;koC=erMM@ zfh}hD*>m$g2fC!&m%|1d`8o7B;ai*T zCzbieGzyb_c&g#L;RQx8E4iN;=D8(|NG01`GkIl1%ykzeF{-Lz0^kF{wta?qec@gg z&j*tbE=fdR7HeDpOXIX5ORMi348o*{K?4cqrK98vS!q1q_$;t*Sy&_pz+nOf*9h

    #`=bTO}m$_8Nj`&Gf|(XUXwBcP3$UnJ4eQ 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 Q&`^I$@~U!`GA6XLgAa;>;*?MnzO-lhMgY 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 literal 0 HcmV?d00001 diff --git a/public/assets/image/i18.gif b/public/assets/image/i18.gif new file mode 100644 index 0000000000000000000000000000000000000000..b679615669643bb572800e95680824f023429052 GIT binary patch literal 21053 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 XF6+`R?-DQbQZM(CFZ;430|Ed$C%qZx literal 0 HcmV?d00001 diff --git a/public/assets/image/i9.png b/public/assets/image/i9.png new file mode 100644 index 0000000000000000000000000000000000000000..1271340067e54e1ed8736b1190514ed09c8b7820 GIT binary patch literal 2884 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 EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/public/assets/image/login_iconb536.png b/public/assets/image/login_iconb536.png new file mode 100644 index 0000000000000000000000000000000000000000..afbe403b37801cfb65efebc7e133322e5d4a328b GIT binary patch literal 4109 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 literal 0 HcmV?d00001 diff --git a/public/assets/image/logo.gif b/public/assets/image/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..44a5fbc7bb667423317613e0c5444a21d3841d7b GIT binary patch literal 1918 zcmeIx`#01H9|!R7WX2*M)?nO?gJ!m5<;|S#&w3=g;<0T zwUIW~rZqxrZI89>wy8vs*r})<_j*6y_UxbWe9r5<&-wiNd7qDy3)jjzL_n~KMdITC zSY5;0MJz01?LGX8(e)c{J;caU%*;b342qFZjsiUjs)xad2IC0SzlH{h4^2L_NHNfk zfle%RW1)8p%%jjh2K|4-AP$CcFp9$lQao7kV3QK?87UE)NGD)S`UWPXlQ21j&rf2@ zDQroCMKUZ?uvLIB1h7hlbt=9jrC}Q>9otD6u*txVOzg;lZ5HfELf8wz5yF8af+Hy# zTv864vf-2iXVPi7kaDr}GwH81(~a8p4GkwA@DfFgixi{Re)!kG@e1kfl7s zZ$#hmN(MVCo!e^rv(?QH zJsNDQyOqb}h_qd<)DIP{d)VYP#65l1Y=7^dq&MBQjLm8F5x(gY7O}RM8{4@Q*J@fE z+S6=p&dpIT4?28E+!nsRgw3mTn3y>*G+Z03S8IKAU`oTxz2emJ)2Tbswi)5P@?LsN z(T07Bxhu{hpFek<&??-#e?i`@F-jpPnNE1h8wa$<`PwfB2j$hTW9UrnHoarM|8~vE zm41aBts2wsd9lC0nl##}6s~L4eC_4Kj)Tv}ehDxiAM1(IlDJ;)oWDyAIir!YHGD>k z#ipsN*xwFh7k2l0SOqZoDUT_7&`SzD%74m-Zk9(AdoE9)e~Y+y^Vkxv*1W!_}!*(w!Km4EDdP}|_Fy!&a6!fZxxQ+92g6x~mE0d{qGvw!VOEbRU!|#8CWNFZmIp?? zrl?VWr7ExO6CKFr$97Fd$E-Y<6isMWPX8bsO1a$bS}%6eOE)%?Wi9xPh~>TC-G1Gn zu;R-XPyWF*OP$fIc+*q9L8k7eX{J~I`VEx?=U<$=^Fw)6bGG(sx=D|YG>)HRu)dYN ze{L9IJTl1db%gMUU8EnyTrD8dtDnwUYwb~`tu=9_{rxp91|1rIxiaGB+8vQtw~%nL zM^4e9|FQ4xn8nB5{y1l6uw#~Dr*c^OUTMaO+C-q55eqPLKd9ea=Zl}EaY_poZY+NVl_Y6ImLO0=2t zH!n?!oAq8a2qk9ftCB4vHcD{;zItD&Z0`(qAu966*Qxd~JS`r7l6moZb%ojL1xfsw z9XwB-Lxv7-&w*ekf+{f;s7_=*ndS_w(uK@7*B3PS(NgoWJhi1FmZ82>fsC!T3320t z&Z}daIpZr-|1aE)HhD_2tE62gN~)LYoxKT4?T0yn?LVA!Ytw^!Ilj%5jR#`A_iKy8 zWh#{8`Zu}vBpU`OjVJ4?+!aI?X*vzw7iS-vvTRLQxBe9&t2#U``}w;kLD!t~=^hzo zE=^+Hu^Pcd*t{Un%|Nzvj?=E8FK65NRO9=mfiFkrbK~#S=`If5vRRqWOO~%^+9@j$ G+x`a)fJ`s| literal 0 HcmV?d00001 diff --git a/public/assets/image/logo.png b/public/assets/image/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f064f89f175fdf12b0abead8b3d0307eddd42a26 GIT binary patch literal 5614 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 IM6N<$g1FX!DgXcg literal 0 HcmV?d00001 diff --git a/public/assets/image/logo3.gif b/public/assets/image/logo3.gif new file mode 100644 index 0000000000000000000000000000000000000000..16f6aa567fbf1c09595041420e4be6437eff3866 GIT binary patch literal 3084 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 dkl-ENMQ|H~fHr0FVp;U`3*E$s4bAJ|VgV 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 z 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 MC9gL$5Wv;{0U71DasU7T literal 0 HcmV?d00001 diff --git a/public/assets/image/q9.gif b/public/assets/image/q9.gif new file mode 100644 index 0000000000000000000000000000000000000000..30f2e248936b0f7461b2ea94cec9de8ea9122e42 GIT binary patch literal 1769 zcmd_pk3ZB09LMqR<;UF>?V9pf>&H1i=6F;)MbVGt{Qgybl*M+NA0@IfMSEyb?)=D! zhO|nTMVqBsBU)wsLUbpQb3{3Ja^%OAJ3mk4z3cDT=RbJ9-j9#Fr<=V)*ea48F+~u- z2Vf3!?=kZhvub>pM3V!Wzru4io;#t%6=F|_y&&<2BmixJXb;AV@6Zv3j&O8FpmQ%? z9l)y?NDo7H400~yJoKdFH6Oj%=sg8R9{SFp?^pB};LSz6Da1e#28uCQg5eubmP2_H zZ*Sr4KX_LKRW(#KP}f0Sk5Lgu8!+|^V@()u!MGR`ZJ21sWG5zHVoHjsZfJU-d5!5l zydT8-A?j)7q0ttNc6hb{O`FiP8BJTzycNw_kuzF6AohmX2jXpL^+l^6Bs(D4 z2}vN@cA+f@?cbuEgZA(6A_Ol&(Xj^|T4p3(?nhS~qzRB7LHAK~CqZ@`vSi4#`Hy4V0D75Nx=sS;ot@<|%Ucq1~hOT4yZw!|~Spj7wlv?;*yt|K)hZxb? zYoU4!m6rbmYAwGJqgsA5#-3xm72^_&YYV)JAn_=nA7h5@reKTF{X7%1aXyE^)bW8pCBk8 zvMI|w$}Ux>P>ifO!m^^;6Erg~fk%09-O10^MRy6yFF*Ok#5r@h=gr?mruE(xRClu+(d74NL~11Dp&vFcW^|C;tacH3T6 z8ZY{VGu-{bBlXvpj}{zv$lZ5aEj_sNJ-8-&ma#2wROQc8S3H=D*?PKnm|Xfe#bSo2+RG<IlCdxd-cBhHr*ka}(#p!4(r|LXal8sJ&P_bR@p`GC;>P&*u z_qCe@#ft><#`&cs^osMI7pT#hog(uMsxTfsP4361xe9n*)>i}pskAe4zYO{piJ|Gb z3-0iDkdN07?k450D$X!FpS4!XJaaFWrys)VVfq*o46AJ2fgH-hmcVnKCUIHdKDuJ< z$`+O~!ozjU*cwd={lI3&Yo6xvp=d+VXSf|d9SWc{V zr`~fski=%*ti2P_Msw%L!WE<{Szw;WK~+H@mCC97wq;4K|KG| zaEM*k?BS42v8?CD7V%Hy78d(Sf@Ql$0^jXDxXzeZxkRF_&D<)f_t!hXl4Kj3J5ZWB z4Ra(yp}u>L8@D9=&l+KO?xsoSpY2L=e)RRrs7_yT%%n!gvN&pECUfo1?`uz-iF0!? z+_IkMw%za&*U8Y;w*QtqGhbX4`GZR^AGo&!jrje;<2T9>^ol>oWYry2osbEtf$e5u5%4$`fI{ literal 0 HcmV?d00001 diff --git a/public/assets/image/space-img1.png b/public/assets/image/space-img1.png new file mode 100644 index 0000000000000000000000000000000000000000..ebee8ea2e189ecc35fb2bf5475534392001ad111 GIT binary patch literal 59129 zcmeEtRa+fRur==P1b24{?(XicA-HVZ-GaO8MuWQtcZZF;1P>704tc-tFPyt`F*8rk z&Gd9tuUfULI!Z-J8X4gW0vH$=vaF1R8WQm#vdT2xUK46HsL@zoR>4D2XQRzg(66a2gzw$EN#le^0* z|2A!XL6(%Xh;|7_NcBKmNcinZMS~GsQUajmKb{UKo3n5IbQ04y~ z|4U0ifC7VsFoYhn0EVM<_TK)0Qr9^X1njgBEmX0Cqy0sXB@I^N^#%-J z;}>6nqr`zN;At{Bwi!^=S#bK!Z*OmY=3Q!&y$-%+d%AiMe7F7(@Y?tM9<%jug}T}4 z^Kgmt?<3GuI$?WNk+w5_yL1mvS^N3=OpI@=8UwHZiH_frl`p+_A8rAm{F}UP$1N|) zpe92MpV5}7sVTc>FMfPKmu@28`-a}91FCqT+x@D7@7jfrm16K(g^%m&WGgb6HN?q)#oy-de_{S*yo13-|j| z7H=D;JI?@qlDmnV8q9)IZh{A#4k$a zSMtv&w{Q4!diTaPY}b4kKVPcM_~3Hv*4#_&vk3a8nKOP2e>C@W++@ao+zx3ATu;W= z28tE7Nf$s>srZJmwjZXV5-~akbmBAm;WjC1RIC0RR`&STVNNhLm}i=(^G1_oyIAzz zMzivV#7(8O#eBK1of=qGG!Do&Vyor4JLg;A%+FJzA*rG%W@-Am>A$2ewc+=lrcC0kyrSaCcj?oT|-IE_YhHGBvY#IAeBI;

  • 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

    w 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 z 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�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%0DcP5W0ZQ>;*yWEj89WMN-q#^d#q@P&tj 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 literal 0 HcmV?d00001 diff --git a/public/assets/image/upload_cancel.gif b/public/assets/image/upload_cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8e24fb209ec431276394dcc5d9ed706712040d8 GIT binary patch literal 92 zcmZ?wbhEHblw#mzn8?7;(9p=i!SVn9e+C8y#h)yU3=B*RIzTo9NS=X7cS`@t({K6x uIVPzw@P$n-YfXK4$=7FxVZ8CGr=63Yb@k{bNmb63%w*x=YVTlTum%8t&Ksuy literal 0 HcmV?d00001 diff --git a/public/assets/image/userhead.png b/public/assets/image/userhead.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3eaac7def84a09876f1f0852d4f0dd0aa3b709 GIT binary patch literal 2817 zcmV+c3;y(pP)(O@0J8PSVhg_`xM6p&L+#JkOIX%Px-7=_IfCjE9ZUXk?BwO_T9>EU)%~&tgSXgpdGq z`tf*74u^yMT}8r~j9mT;M)s4zUdR9m zcBdDk{@l61NE1+bUHnsDC6R>UN_~GUWPubO)9Ew{a)J?pjyfs=c8Y+#K0t!>B073R z6*D?_dW+7IZCE15$9{Z<6jC-U&gcqa(K4ZL-_#L>fR2AS#8U z)Wt~E*92MWRs|GEC)EbD1A~GRGn>tXoUu9454;gl5V23Tn{BdDWS|3pRI83)>Vi%{ zQm9Xmf_CB+r1&PrIU%$Uo6SZJ5+TMFy4;mCbO60GO3mg}NX=Z4GG8pbs4{1SV6;Ih zK*D;xmIs5WE!0w6L|nlpMv=1F6kgwKK2PTAz%#g#W+#L|DnP(`wMy2CkX#wjhajSi zk#;B)F_7}(3AW~tEEY@Sl?{!-387T1R^LJjyrtY$z}J7wa!=ZciYvQS||kkXqF*b9j9KSjn)HE?9Pu}=-v`51_J_Dquk7rF0q z_aX!h!6*?jRKp;;AmeFNR0Ck{zgGr7(@}uFq;w{PWc>a6SJagcGH~To?9%zLCzN(@ z(gY{417D&pX1(?6{U0sA0hyW2V^1OEN{ z`@4~fzSjdGY;(F=iOOY^*##KU#&b|&o1pQT(8-wetwkK$Gv5>>+YjR--bB^;s+)+3T(-vd$ypwl)IYjdN%I7gE;9(B(q&(nwytPiY| zm?IowX5a$@^ulI9O}Qe2ASv|7&}ps!CqhVRXanz_fd;Qv2%qn2J)FLP)WLwy8;+#D zz&+qBP=zIqq=XYk1|{#dtM+1Aq-i%0D0C5vPGJHbqpJ!{EYsCGv1rJ=PL} z3#@hIcH(eR29rLzw!Xo8BNN4?D@@hJ71LX|NeB%&=Nqon2q?x3+?T2ccp zTEK8U?mdNPr=HbEysJ)1Dtp0~bjbB}kT5igK`}OAbXT}1C0B&_lnx*!LeLJ^5&|%9 zx$0h5gxC`$*U}*k&Bk81$7%Xp++cgM-2cApqBG%J;h@5mJd9sk*ZBMA;1kmKJQnhwoI?*%+B+uuGlc29T8JIsJ3hvLdY11 z@o8kM8WjTEB;?bcWqPNWJrGRKGbupcd_h8}K70}aMa}Jcgz0%9N%(J?Z1}Q?=8KJsnV|tvd>VL3Yx@2+iEW`m zIQG`<)P4gZ8)|kgd-~RE=lN0u?t#@%WME6A~^|g7JZjLL{+q z70=a(Wig!abryiMXvtA1+7}3ZM znd&VDOpYKy^j5e;${9Ed+i>Gg8u4EF;N_X_LU$Z%XzihH#;GJEl=H>xB4<1w;gBNh zGQQeaRX7t8@u&eV>yRkhk{|C@l@sY1Jy!JyA*6VKMAxc{yy3dDWAF%FK;%7^M1xm_ z-T#IVWZCAiTJ|T$6(Om9BZ6FmmxN7-*pR~bjiQqek=s(KR~l=(9IOr7&~w6Tdtazc z65Vr_3Bg0-$O5lzvr+@oIyu)El8~dWugJfBReGqy6(O9phRBaXGsae_R_qm-=o*Jz z<_>k|R#kd9U}qCaa$Hp47VOEbQCWC+W}WzeDVKqIhA1?tXWuSE8r+`DU?n$x%FJF7 zgJ{5B*AMnNIBycdiI>Z{i0sACJEjnyV#Uu;yQdgrlubL!rG!~P4C8377t1dCKCvc- zMr}C?GEySA^OZ!zGXJs3!C+xfl5730B*v`AXj~A2qX@zcdsAGOL~wm079z^v8VTCS zO4lI8)zWg=IWe&;Mox#!{E%us>Ve+g-sEsq$pwq|u6u z<&%*?;Q5Nd_AU!$UHhp@UCI09lM1!ft*QY;kKR;>G8w)=NkMh%uB!M}0k|udhpt{1 z;Cs(b2Ek`dJ8Y$9J;thjx+0_~hc|6~BT7f8nkBv=-j{k_bZlENZdWB;S3OsF6f+6( zwMj+c4EGuB#x3xf+w5<*rK1rcz*q{x6h$MO8ZCy(AKATa3l`VJYtvbLopi`GtKOuP zw6P_zl*sT64#XxBa!)#do5~)YJD<%POGzvxGJJ!sYZF4a+)&p~H$M?J^-ugXQA4kq zxnh?&uY+AEt@gaT7tw1L_oU<%$!H2zTy0W%{H~6Xd|GY^_(@Bt#Jx^N?5pX|Bi$v0 zstcst+tBlhQgZRkRrRm5s%q*WHL}8eCPA-*Yce=lmciU`ur_v!q|mWmdi_B&$U420 zpl$Abw(?WCCO+;F<$M)f*xnXsMTk_O7JE_z)qYS7kb$+JED|a|-gac|{`%Qkd5jx*9|X;F;m< z$j>tkpfP$c?J)_?j(ENbDa^8;TR-L37lRl8HiY#9W2iFf8qB0;6}q989tQulXf)E^ znE!0jLa8vnBsy?<>EPK2_9huSv-{DBv5DXYAQzgzNqUIgaF(65cRf84?A=&qTbx6c z>@;78YK%Jek%;k41mPut$|i=S*h{{#ki!lq2`*LBEqKjnvyEYy7?KjADkxveM1(-F z6hpi4rme=RRN7D^*(1HYQ`i1GB!cIBQfi1YA!X^QBBw6Vz%EW>*T}U=hzb7#kI8+; TLZlke00000NkvXXu0mjfv35RM literal 0 HcmV?d00001 diff --git a/public/assets/js/admin.js b/public/assets/js/admin.js new file mode 100644 index 0000000..25e46b2 --- /dev/null +++ b/public/assets/js/admin.js @@ -0,0 +1,1110 @@ +;(function () { + //全局ajax处理 + $.ajaxSetup({ + complete: function (jqXHR) { + }, + data: {}, + error: function (jqXHR, textStatus, errorThrown) { + //请求失败处理 + } + }); + + if ($.browser && $.browser.msie) { + //ie 都不缓存 + $.ajaxSetup({ + cache: false + }); + } + + //不支持placeholder浏览器下对placeholder进行处理 + if (document.createElement('input').placeholder !== '') { + $('[placeholder]').focus(function () { + var input = $(this); + if (input.val() == input.attr('placeholder')) { + input.val(''); + input.removeClass('placeholder'); + } + }).blur(function () { + var input = $(this); + if (input.val() == '' || input.val() == input.attr('placeholder')) { + input.addClass('placeholder'); + input.val(input.attr('placeholder')); + } + }).blur().parents('form').submit(function () { + $(this).find('[placeholder]').each(function () { + var input = $(this); + if (input.val() == input.attr('placeholder')) { + input.val(''); + } + }); + }); + } + + // 所有加了dialog类名的a链接,自动弹出它的href + if ($('a.js-dialog').length) { + Wind.css('artDialog'); + Wind.use('artDialog', 'iframeTools', function () { + $('.js-dialog').on('click', function (e) { + e.preventDefault(); + var $this = $(this); + art.dialog.open($(this).prop('href'), { + close: function () { + $this.focus(); // 关闭时让触发弹窗的元素获取焦点 + return true; + }, + title: $this.prop('title') + }); + }).attr('role', 'button'); + + }); + } + + // 所有的ajax form提交,由于大多业务逻辑都是一样的,故统一处理 + var ajaxForm_list = $('form.js-ajax-form'); + if (ajaxForm_list.length) { + + //设置td标签点击也选中 + $("td").click(function(){ + if($(this).find("input").length && $(this).find("input").hasClass("js-check")){ + $(this).find("input").attr("checked",true); + } + }); + + Wind.css('artDialog'); + Wind.use('ajaxForm', 'artDialog', 'noty', 'validate', function () { + var $btn; + $('button.js-ajax-submit').on('click', function (e) { + var btn = $(this), form = btn.parents('form.js-ajax-form'); + $btn = btn; + if (btn.data("loading")) { + return; + } + //批量操作 判断选项 + if (btn.data('subcheck')) { + btn.parent().find('span').remove(); + if (form.find('input.js-check:checked').length) { + btn.data('subcheck', false); + } else { + $('请至少选择一项').appendTo(btn.parent()).fadeIn('fast'); + return false; + } + } + + + var msg = btn.data('msg'); + if (msg) { + art.dialog({ + id: 'warning', + icon: 'warning', + content: btn.data('msg'), + cancelVal: '关闭', + cancel: function () { + //btn.data('subcheck', false); + //btn.click(); + }, + ok: function () { + btn.data('msg', false); + btn.click(); + } + }); + + return false; + } + + //ie处理placeholder提交问题 + if ($.browser && $.browser.msie) { + form.find('[placeholder]').each(function () { + var input = $(this); + if (input.val() == input.attr('placeholder')) { + input.val(''); + } + }); + } + }); + + ajaxForm_list.each(function () { + $(this).validate({ + //是否在获取焦点时验证 + //onfocusout : false, + //是否在敲击键盘时验证 + //onkeyup : false, + //当鼠标点击时验证 + //onclick : false, + //给未通过验证的元素加效果,闪烁等 + highlight: function (element, errorClass, validClass) { + if (element.type === "radio") { + this.findByName(element.name).addClass(errorClass).removeClass(validClass); + } else { + var $element = $(element); + $element.addClass(errorClass).removeClass(validClass); + $element.parent().addClass("has-error");//bootstrap3表单 + $element.parents('.control-group').addClass("error");//bootstrap2表单 + + } + }, + unhighlight: function (element, errorClass, validClass) { + if (element.type === "radio") { + this.findByName(element.name).removeClass(errorClass).addClass(validClass); + } else { + var $element = $(element); + $element.removeClass(errorClass).addClass(validClass); + $element.parent().removeClass("has-error");//bootstrap3表单 + $element.parents('.control-group').removeClass("error");//bootstrap2表单 + } + }, + showErrors: function (errorMap, errorArr) { + var i, elements, error; + for (i = 0; this.errorList[i]; i++) { + error = this.errorList[i]; + if (this.settings.highlight) { + this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass); + } + //this.showLabel( error.element, error.message ); + } + if (this.errorList.length) { + //this.toShow = this.toShow.add( this.containers ); + } + if (this.settings.success) { + for (i = 0; this.successList[i]; i++) { + //this.showLabel( this.successList[ i ] ); + } + } + if (this.settings.unhighlight) { + for (i = 0, elements = this.validElements(); elements[i]; i++) { + this.settings.unhighlight.call(this, elements[i], this.settings.errorClass, this.settings.validClass); + } + } + this.toHide = this.toHide.not(this.toShow); + this.hideErrors(); + this.addWrapper(this.toShow).show(); + }, + submitHandler: function (form) { + var $form = $(form); + $form.ajaxSubmit({ + url: $btn.data('action') ? $btn.data('action') : $form.attr('action'), //按钮上是否自定义提交地址(多按钮情况) + dataType: 'json', + beforeSubmit: function (arr, $form, options) { + + $btn.data("loading", true); + var text = $btn.text(); + + //按钮文案、状态修改 + $btn.text(text + '...').prop('disabled', true).addClass('disabled'); + }, + success: function (data, statusText, xhr, $form) { + + function _refresh() { + if (data.url) { + //返回带跳转地址 + window.location.href = data.url; + } else { + if (data.code == 1) { + //刷新当前页 + reloadPage(window); + } + } + } + + var text = $btn.text(); + + //按钮文案、状态修改 + $btn.removeClass('disabled').prop('disabled', false).text(text.replace('...', '')).parent().find('span').remove(); + if (data.code == 1) { + if ($btn.data('success')) { + var successCallback = $btn.data('success'); + window[successCallback](data, statusText, xhr, $form); + return; + } + if ($btn.data('refresh') == undefined || $btn.data('refresh')) { + _refresh(); + } + parent.layer.closeAll(); + parent.layer.msg(data.msg, {time:800, icon:1, shift:4}); + /* + noty({ + text: data.msg, + type: 'success', + layout: 'topCenter', + modal: true, + // animation: { + // open: 'animated bounceInDown', // Animate.css class names + // close: 'animated bounceOutUp', // Animate.css class names + // }, + timeout: 300, + callback: { + onShow: function () { + if ($btn.data('refresh') == undefined || $btn.data('refresh')) { + _refresh(); + } + } + } + }).show(); + */ + $(window).focus(); + } else if (data.code == 0) { + var $verify_img = $form.find(".verify_img"); + if ($verify_img.length) { + $verify_img.attr("src", $verify_img.attr("src") + "&refresh=" + Math.random()); + } + + var $verify_input = $form.find("[name='verify']"); + $verify_input.val(""); + + //$('' + data.msg + '').appendTo($btn.parent()).fadeIn('fast'); + $btn.removeProp('disabled').removeClass('disabled'); + + noty({ + text: data.msg, + type: 'error', + layout: 'topCenter', + modal: true, + // animation: { + // open: 'animated bounceInDown', // Animate.css class names + // close: 'animated bounceOutUp', // Animate.css class names + // }, + timeout: 800, + callback: { + afterClose: function () { + _refresh(); + } + } + }).show(); + $(window).focus(); + } + + + }, + error: function (xhr, e, statusText) { + art.dialog({ + id: 'warning', + icon: 'warning', + content: statusText, + cancelVal: '关闭', + cancel: function () { + reloadPage(window); + }, + ok: function () { + reloadPage(window); + } + }); + + }, + complete: function () { + $btn.data("loading", false); + } + }); + } + }); + }); + + }); + } + + //dialog弹窗内的关闭方法 + $('#js-dialog-close').on('click', function (e) { + e.preventDefault(); + try { + art.dialog.close(); + } catch (err) { + Wind.css('artDialog'); + Wind.use('artDialog', 'iframeTools', function () { + art.dialog.close(); + }); + } + ; + }); + + //所有的删除操作,删除数据后刷新页面 + if ($('a.js-ajax-delete').length) { + Wind.css('artDialog'); + Wind.use('artDialog', 'noty', function () { + $('.js-ajax-delete').on('click', function (e) { + e.preventDefault(); + var $_this = this, + $this = $($_this), + href = $this.data('href'), + refresh = $this.data('refresh'), + msg = $this.data('msg'); + href = href ? href : $this.attr('href'); + + art.dialog({ + title: false, + icon: 'question', + content: msg ? msg : '确定要删除吗?', + follow: $_this, + close: function () { + $_this.focus(); //关闭时让触发弹窗的元素获取焦点 + return true; + }, + okVal: "确定", + ok: function () { + $.getJSON(href).done(function (data) { + if (data.code == '1') { + + if (refresh == undefined || refresh) { + if (data.url) { + //返回带跳转地址 + window.location.href = data.url; + } else { + //刷新当前页 + reloadPage(window); + } + } + parent.layer.closeAll(); + parent.layer.msg(data.msg, {time:800, icon:1, shift:4}); + + /* + noty({ + text: data.msg, + type: 'success', + layout: 'topCenter', + modal: true, + // animation: { + // open: 'animated bounceInDown', // Animate.css class names + // close: 'animated bounceOutUp', // Animate.css class names + // }, + timeout: 800, + callback: { + afterClose: function () { + if (refresh == undefined || refresh) { + if (data.url) { + //返回带跳转地址 + window.location.href = data.url; + } else { + //刷新当前页 + reloadPage(window); + } + } + } + } + }).show(); + */ + + } else if (data.code == '0') { + //art.dialog.alert(data.info); + //alert(data.info);//暂时处理方案 + art.dialog({ + content: data.msg, + icon: 'warning', + ok: function () { + this.title(data.msg); + return true; + } + }); + } + }); + }, + cancelVal: '关闭', + cancel: true + }); + }); + + }); + } + + + if ($('a.js-ajax-dialog-btn').length) { + Wind.use('artDialog', 'noty', function () { + $('.js-ajax-dialog-btn').on('click', function (e) { + e.preventDefault(); + var $_this = this, + $this = $($_this), + href = $this.data('href'), + refresh = $this.data('refresh'), + msg = $this.data('msg'); + href = href ? href : $this.attr('href'); + if (!msg) { + msg = "您确定要进行此操作吗?"; + } + art.dialog({ + title: false, + icon: 'question', + content: msg, + follow: $_this, + close: function () { + $_this.focus(); //关闭时让触发弹窗的元素获取焦点 + return true; + }, + ok: function () { + + $.ajax({ + url: href, + type: 'post', + success: function (data) { + if (data.code == 1) { + + + if (refresh == undefined || refresh) { + if (data.url) { + //返回带跳转地址 + window.location.href = data.url; + } else { + //刷新当前页 + reloadPage(window); + } + } + parent.layer.closeAll(); + parent.layer.msg(data.msg, {time:800, icon:1, shift:4}); + + /* + noty({ + text: data.msg, + type: 'success', + layout: 'topCenter', + modal: true, + // animation: { + // open: 'animated bounceInDown', // Animate.css class names + // close: 'animated bounceOutUp', // Animate.css class names + // }, + timeout: 800, + callback: { + afterClose: function () { + if (refresh == undefined || refresh) { + if (data.url) { + //返回带跳转地址 + window.location.href = data.url; + } else { + //刷新当前页 + reloadPage(window); + } + } + } + } + }).show(); + */ + + } else if (data.code == 0) { + //art.dialog.alert(data.info); + art.dialog({ + content: data.msg, + icon: 'warning', + ok: function () { + this.title(data.msg); + return true; + } + }); + } + } + }) + }, + cancelVal: '关闭', + cancel: true + }); + }); + + }); + } + + if ($('a.js-ajax-btn').length) { + Wind.use('noty', function () { + $('.js-ajax-btn').on('click', function (e) { + e.preventDefault(); + var $_this = this, + $this = $($_this), + href = $this.data('href'), + msg = $this.data('msg'); + refresh = $this.data('refresh'); + href = href ? href : $this.attr('href'); + refresh = refresh == undefined ? 1 : refresh; + + + $.getJSON(href).done(function (data) { + if (data.code == 1) { + + if (data.url) { + location.href = data.url; + return; + } + + if (refresh || refresh == undefined) { + reloadPage(window); + } + parent.layer.closeAll(); + parent.layer.msg(data.msg, {time:800, icon:1, shift:4}); + + /* + noty({ + text: data.msg, + type: 'success', + layout: 'center', + callback: { + afterClose: function () { + if (data.url) { + location.href = data.url; + return; + } + + if (refresh || refresh == undefined) { + reloadPage(window); + } + } + } + }); + */ + } else if (data.code == 0) { + noty({ + text: data.msg, + type: 'error', + layout: 'center', + callback: { + afterClose: function () { + if (data.url) { + location.href = data.url; + } + } + } + }); + } + }); + + }); + + }); + } + + + /*复选框全选(支持多个,纵横双控全选)。 + *实例:版块编辑-权限相关(双控),验证机制-验证策略(单控) + *说明: + * "js-check"的"data-xid"对应其左侧"js-check-all"的"data-checklist"; + * "js-check"的"data-yid"对应其上方"js-check-all"的"data-checklist"; + * 全选框的"data-direction"代表其控制的全选方向(x或y); + * "js-check-wrap"同一块全选操作区域的父标签class,多个调用考虑 + */ + + if ($('.js-check-wrap').length) { + var total_check_all = $('input.js-check-all'); + + //遍历所有全选框 + $.each(total_check_all, function () { + var check_all = $(this), + check_items; + + //分组各纵横项 + var check_all_direction = check_all.data('direction'); + check_items = $('input.js-check[data-' + check_all_direction + 'id="' + check_all.data('checklist') + '"]').not(":disabled"); + + //点击全选框 + check_all.change(function (e) { + var check_wrap = check_all.parents('.js-check-wrap'); //当前操作区域所有复选框的父标签(重用考虑) + + if ($(this).prop('checked')) { + //全选状态 + check_items.prop('checked', true); + + //所有项都被选中 + if (check_wrap.find('input.js-check').length === check_wrap.find('input.js-check:checked').length) { + check_wrap.find(total_check_all).prop('checked', true); + } + + } else { + //非全选状态 + check_items.removeProp('checked'); + + check_wrap.find(total_check_all).removeProp('checked'); + + //另一方向的全选框取消全选状态 + var direction_invert = check_all_direction === 'x' ? 'y' : 'x'; + check_wrap.find($('input.js-check-all[data-direction="' + direction_invert + '"]')).removeProp('checked'); + } + + }); + + //点击非全选时判断是否全部勾选 + check_items.change(function () { + + if ($(this).prop('checked')) { + + if (check_items.filter(':checked').length === check_items.length) { + //已选择和未选择的复选框数相等 + check_all.prop('checked', true); + } + + } else { + check_all.removeProp('checked'); + } + + }); + + + }); + + } + + //日期选择器 + var dateInput = $("input.js-date"); + if (dateInput.length) { + Wind.use('datePicker', function () { + dateInput.datePicker(); + }); + } + + //日期+时间选择器 + var dateTimeInput = $("input.js-datetime"); + if (dateTimeInput.length) { + Wind.use('datePicker', function () { + dateTimeInput.datePicker({ + time: true + }); + }); + } + + var yearInput = $("input.js-year"); + if (yearInput.length) { + Wind.use('datePicker', function () { + yearInput.datePicker({ + startView: 'decade', + minView: 'decade', + format: 'yyyy', + autoclose: true + }); + }); + } + + // bootstrap年选择器 + var bootstrapYearInput = $("input.js-bootstrap-year") + if (bootstrapYearInput.length) { + Wind.css('bootstrapDatetimePicker'); + Wind.use('bootstrapDatetimePicker', function () { + bootstrapYearInput.datetimepicker({ + language: 'zh-CN', + format: 'yyyy', + minView: 'decade', + startView: 'decade', + todayBtn: 1, + autoclose: true + }); + }); + } + + // bootstrap日期选择器 + var bootstrapDateInput = $("input.js-bootstrap-date") + if (bootstrapDateInput.length) { + Wind.css('bootstrapDatetimePicker'); + Wind.use('bootstrapDatetimePicker', function () { + bootstrapDateInput.datetimepicker({ + language: 'zh-CN', + format: 'yyyy-mm-dd', + minView: 'month', + todayBtn: 1, + autoclose: true + }); + }); + } + + // bootstrap日期选择器日期+时间选择器 + var bootstrapDateTimeInput = $("input.js-bootstrap-datetime"); + if (bootstrapDateTimeInput.length) { + Wind.css('bootstrapDatetimePicker'); + Wind.use('bootstrapDatetimePicker', function () { + bootstrapDateTimeInput.datetimepicker({ + language: 'zh-CN', + format: 'yyyy-mm-dd hh:ii', + todayBtn: 1, + autoclose: true + }); + }); + } + + //tab + var tabs_nav = $('ul.js-tabs-nav'); + if (tabs_nav.length) { + Wind.use('tabs', function () { + tabs_nav.tabs('.js-tabs-content > div'); + }); + } + + //地址联动 + var $js_address_select = $('.js-address-select'); + if ($js_address_select.length > 0) { + $('.js-address-province-select,.js-address-city-select').change(function () { + var $this = $(this); + var id = $this.val(); + var $child_area_select; + var $this_js_address_select = $this.parents('.js-address-select'); + if ($this.is('.js-address-province-select')) { + $child_area_select = $this_js_address_select.find('.js-address-city-select'); + $this_js_address_select.find('.js-address-district-select').hide(); + } else { + $child_area_select = $this_js_address_select.find('.js-address-district-select'); + } + + var empty_option = ''; + $child_area_select.html(empty_option); + + var child_area_html = $this.data('childarea' + id); + if (child_area_html) { + $child_area_select.show(); + $child_area_select.html(child_area_html); + return; + } + + $.ajax({ + url: $this_js_address_select.data('url'), + type: 'POST', + dataType: 'JSON', + data: {id: id}, + success: function (data) { + if (data.code == 1) { + if (data.data.areas.length > 0) { + var html = [empty_option]; + + $.each(data.data.areas, function (i, area) { + var area_html = ''; + area_html = area_html.replace('[name]', area.name); + area_html = area_html.replace('[id]', area.id); + html.push(area_html); + }); + html = html.join('', html); + $this.data('childarea' + id, html); + $child_area_select.html(html); + $child_area_select.show(); + } else { + $child_area_select.hide(); + + } + } + }, + error: function () { + + }, + complete: function () { + + } + }); + }); + + } + //地址联动end + +})(); + +//重新刷新页面,使用location.reload()有可能导致重新提交 +function reloadPage(win) { + var location = win.location; + location.href = location.pathname + location.search; +} + +/** + * 页面跳转 + * @param url 要打开的页面地址 + */ +function redirect(url) { + location.href = url; +} + +/** + * 读取cookie + * @param name + * @returns + */ +function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; +} + +/** + * 设置cookie + */ +function setCookie(name, value, options) { + options = options || {}; + if (value === null) { + value = ''; + options.expires = -1; + } + var expires = ''; + if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { + var date; + if (typeof options.expires == 'number') { + date = new Date(); + date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); + } else { + date = options.expires; + } + expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE + } + var path = options.path ? '; path=' + options.path : ''; + var domain = options.domain ? '; domain=' + options.domain : ''; + var secure = options.secure ? '; secure' : ''; + document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); +} + +/** + * 打开iframe式的窗口对话框 + * @param url + * @param title + * @param options + */ +function openIframeDialog(url, title, options) { + Wind.css('artDialog'); + var params = { + title: title, + lock: true, + opacity: 0, + width: "95%", + height: '90%' + }; + params = options ? $.extend(params, options) : params; + Wind.use('artDialog', 'iframeTools', function () { + art.dialog.open(url, params); + }); +} + +/** + * 打开地图对话框 + * + * @param url + * @param title + * @param options + * @param callback + */ +function openMapDialog(url, title, options, callback) { + Wind.css('artDialog'); + var params = { + title: title, + lock: true, + opacity: 0, + width: "95%", + height: 400, + ok: function () { + if (callback) { + var d = this.iframe.contentWindow; + var lng = $("#lng_input", d.document).val(); + var lat = $("#lat_input", d.document).val(); + var address = {}; + address.address = $("#address_input", d.document).val(); + address.province = $("#province_input", d.document).val(); + address.city = $("#city_input", d.document).val(); + address.district = $("#district_input", d.document).val(); + callback.apply(this, [lng, lat, address]); + } + } + }; + params = options ? $.extend(params, options) : params; + Wind.use('artDialog', 'iframeTools', function () { + art.dialog.open(url, params); + }); +} + +/** + * 打开文件上传对话框 + * @param dialog_title 对话框标题 + * @param callback 回调方法,参数有(当前dialog对象,选择的文件数组,你设置的extra_params) + * @param extra_params 额外参数,object + * @param multi 是否可以多选 + * @param filetype 文件类型,image,video,audio,file + * @param app 应用名,CMF的应用名 + */ +function openUploadDialog(dialog_title, callback, extra_params, multi, filetype, app) { + Wind.css('artDialog'); + multi = multi ? 1 : 0; + filetype = filetype ? filetype : 'image'; + app = app ? app : GV.APP; + var params = '&multi=' + multi + '&filetype=' + filetype + '&app=' + app; + Wind.use("artDialog", "iframeTools", function () { + art.dialog.open(GV.ROOT + 'user/Asset/webuploader?' + params, { + title: dialog_title, + id: new Date().getTime(), + width: '600px', + height: '350px', + lock: true, + fixed: true, + background: "#CCCCCC", + opacity: 0, + ok: function () { + if (typeof callback == 'function') { + var iframewindow = this.iframe.contentWindow; + var files = iframewindow.get_selected_files(); + console.log(files); + if (files && files.length > 0) { + callback.apply(this, [this, files, extra_params]); + } else { + return false; + } + + } + }, + cancel: true + }); + }); +} + +/** + * 单个文件上传 + * @param dialog_title 上传对话框标题 + * @param input_selector 图片容器 + * @param filetype 文件类型,image,video,audio,file + * @param extra_params 额外参数,object + * @param app 应用名,CMF的应用名 + */ +function uploadOne(dialog_title, input_selector, filetype, extra_params, app) { + filetype = filetype ? filetype : 'file'; + openUploadDialog(dialog_title, function (dialog, files) { + $(input_selector).val(files[0].filepath); + $(input_selector + '-preview').attr('href', files[0].preview_url); + + $(input_selector + '-name').val(files[0].name); + $(input_selector + '-name-text').text(files[0].name); + }, extra_params, 0, filetype, app); +} + +/** + * 单个图片上传 + * @param dialog_title 上传对话框标题 + * @param input_selector 图片容器 + * @param extra_params 额外参数,object + * @param app 应用名,CMF的应用名 + */ +function uploadOneImage(dialog_title, input_selector, extra_params, app) { + openUploadDialog(dialog_title, function (dialog, files) { + $(input_selector).val(files[0].filepath); + $(input_selector + '-preview').attr('src', files[0].preview_url); + + $(input_selector + '-name').val(files[0].name); + $(input_selector + '-name-text').text(files[0].name); + + }, extra_params, 0, 'image', app); +} + +/** + * 多图上传 + * @param dialog_title 上传对话框标题 + * @param container_selector 图片容器 + * @param item_tpl_wrapper_id 单个图片html模板容器id + * @param extra_params 额外参数,object + * @param app 应用名,CMF 的应用名 + */ +function uploadMultiImage(dialog_title, container_selector, item_tpl_wrapper_id, extra_params, app) { + openUploadDialog(dialog_title, function (dialog, files) { + var tpl = $('#' + item_tpl_wrapper_id).html(); + var html = ''; + $.each(files, function (i, item) { + var itemtpl = tpl; + itemtpl = itemtpl.replace(/\{id\}/g, item.id); + itemtpl = itemtpl.replace(/\{url\}/g, item.url); + itemtpl = itemtpl.replace(/\{preview_url\}/g, item.preview_url); + itemtpl = itemtpl.replace(/\{filepath\}/g, item.filepath); + itemtpl = itemtpl.replace(/\{name\}/g, item.name); + html += itemtpl; + }); + $(container_selector).append(html); + + }, extra_params, 1, 'image', app); +} + +/** + * 多文件上传 + * @param dialog_title 上传对话框标题 + * @param container_selector 图片容器 + * @param item_tpl_wrapper_id 单个图片html模板容器id + * @param filetype 文件类型,image,video,audio,file + * @param extra_params 额外参数,object + * @param app 应用名,CMF 的应用名 + */ +function uploadMultiFile(dialog_title, container_selector, item_tpl_wrapper_id, filetype, extra_params, app) { + filetype = filetype ? filetype : 'file'; + openUploadDialog(dialog_title, function (dialog, files) { + var tpl = $('#' + item_tpl_wrapper_id).html(); + var html = ''; + $.each(files, function (i, item) { + var itemtpl = tpl; + itemtpl = itemtpl.replace(/\{id\}/g, item.id); + itemtpl = itemtpl.replace(/\{url\}/g, item.url); + itemtpl = itemtpl.replace(/\{preview_url\}/g, item.preview_url); + itemtpl = itemtpl.replace(/\{filepath\}/g, item.filepath); + itemtpl = itemtpl.replace(/\{name\}/g, item.name); + html += itemtpl; + }); + $(container_selector).append(html); + + }, extra_params, 1, filetype, app); +} + +/** + * 查看图片对话框 + * @param img 图片地址 + */ +function imagePreviewDialog(img) { + Wind.css('layer'); + + Wind.use("layer", function () { + layer.photos({ + photos: { + "title": "", //相册标题 + "id": 'image_preview', //相册id + "start": 0, //初始显示的图片序号,默认0 + "data": [ //相册包含的图片,数组格式 + { + "alt": "", + "pid": 666, //图片id + "src": img, //原图地址 + "thumb": img //缩略图地址 + } + ] + } //格式见API文档手册页 + , anim: 5, //0-6的选择,指定弹出图片动画类型,默认随机 + shadeClose: true, + // skin: 'layui-layer-nobg', + shade: [0.5, '#000000'], + shadeClose: true, + }) + }); +} + +function artdialogAlert(msg) { + Wind.css('artDialog'); + Wind.use("artDialog", function () { + art.dialog({ + id: new Date().getTime(), + icon: "error", + fixed: true, + lock: true, + background: "#CCCCCC", + opacity: 0, + content: msg, + ok: function () { + return true; + } + }); + }); + +} + +function openIframeLayer(url, title, options) { + + var params = { + type: 2, + title: title, + shadeClose: true, + // skin: 'layui-layer-nobg', + anim: -1, + shade: [0.001, '#000000'], + shadeClose: true, + area: ['95%', '90%'], + move: false, + content: url, + yes: function (index, layero) { + //do something + layer.close(index); //如果设定了yes回调,需进行手工关闭 + } + }; + params = options ? $.extend(params, options) : params; + + Wind.css('layer'); + + Wind.use("layer", function () { + layer.open(params); + }); + +} \ No newline at end of file diff --git a/public/assets/js/animate/animate.css b/public/assets/js/animate/animate.css new file mode 100644 index 0000000..1e79e03 --- /dev/null +++ b/public/assets/js/animate/animate.css @@ -0,0 +1,1579 @@ +@charset "UTF-8"; + +/*! + * animate.css -http://daneden.me/animate + * Version - 3.5.2 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2017 Daniel Eden + */ + +.animated { + animation-duration: 1s; + animation-fill-mode: both; +} + +.animated.infinite { + animation-iteration-count: infinite; +} + +.animated.hinge { + animation-duration: 2s; +} + +.animated.flipOutX, +.animated.flipOutY, +.animated.bounceIn, +.animated.bounceOut { + animation-duration: .75s; +} + +@keyframes bounce { + from, 20%, 53%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transform: translate3d(0,0,0); + } + + 40%, 43% { + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transform: translate3d(0, -30px, 0); + } + + 70% { + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transform: translate3d(0, -15px, 0); + } + + 90% { + transform: translate3d(0,-4px,0); + } +} + +.bounce { + animation-name: bounce; + transform-origin: center bottom; +} + +@keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@keyframes pulse { + from { + transform: scale3d(1, 1, 1); + } + + 50% { + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +.pulse { + animation-name: pulse; +} + +@keyframes rubberBand { + from { + transform: scale3d(1, 1, 1); + } + + 30% { + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + transform: scale3d(.95, 1.05, 1); + } + + 75% { + transform: scale3d(1.05, .95, 1); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + animation-name: rubberBand; +} + +@keyframes shake { + from, to { + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + transform: translate3d(10px, 0, 0); + } +} + +.shake { + animation-name: shake; +} + +@keyframes headShake { + 0% { + transform: translateX(0); + } + + 6.5% { + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + transform: translateX(2px) rotateY(3deg); + } + + 50% { + transform: translateX(0); + } +} + +.headShake { + animation-timing-function: ease-in-out; + animation-name: headShake; +} + +@keyframes swing { + 20% { + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + transform-origin: top center; + animation-name: swing; +} + +@keyframes tada { + from { + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +.tada { + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@keyframes wobble { + from { + transform: none; + } + + 15% { + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + transform: none; + } +} + +.wobble { + animation-name: wobble; +} + +@keyframes jello { + from, 11.1%, to { + transform: none; + } + + 22.2% { + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + animation-name: jello; + transform-origin: center; +} + +@keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + transform: scale3d(.3, .3, .3); + } + + 20% { + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + animation-name: bounceIn; +} + +@keyframes bounceInDown { + from, 60%, 75%, 90%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + transform: translate3d(0, 25px, 0); + } + + 75% { + transform: translate3d(0, -10px, 0); + } + + 90% { + transform: translate3d(0, 5px, 0); + } + + to { + transform: none; + } +} + +.bounceInDown { + animation-name: bounceInDown; +} + +@keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + transform: translate3d(25px, 0, 0); + } + + 75% { + transform: translate3d(-10px, 0, 0); + } + + 90% { + transform: translate3d(5px, 0, 0); + } + + to { + transform: none; + } +} + +.bounceInLeft { + animation-name: bounceInLeft; +} + +@keyframes bounceInRight { + from, 60%, 75%, 90%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + transform: translate3d(-25px, 0, 0); + } + + 75% { + transform: translate3d(10px, 0, 0); + } + + 90% { + transform: translate3d(-5px, 0, 0); + } + + to { + transform: none; + } +} + +.bounceInRight { + animation-name: bounceInRight; +} + +@keyframes bounceInUp { + from, 60%, 75%, 90%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + transform: translate3d(0, -20px, 0); + } + + 75% { + transform: translate3d(0, 10px, 0); + } + + 90% { + transform: translate3d(0, -5px, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + animation-name: bounceInUp; +} + +@keyframes bounceOut { + 20% { + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + transform: scale3d(.3, .3, .3); + } +} + +.bounceOut { + animation-name: bounceOut; +} + +@keyframes bounceOutDown { + 20% { + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + animation-name: bounceOutDown; +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + animation-name: bounceOutLeft; +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + animation-name: bounceOutRight; +} + +@keyframes bounceOutUp { + 20% { + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + animation-name: bounceOutUp; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.fadeIn { + animation-name: fadeIn; +} + +@keyframes fadeInDown { + from { + opacity: 0; + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInDown { + animation-name: fadeInDown; +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInDownBig { + animation-name: fadeInDownBig; +} + +@keyframes fadeInLeft { + from { + opacity: 0; + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInLeft { + animation-name: fadeInLeft; +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInLeftBig { + animation-name: fadeInLeftBig; +} + +@keyframes fadeInRight { + from { + opacity: 0; + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInRight { + animation-name: fadeInRight; +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInRightBig { + animation-name: fadeInRightBig; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInUp { + animation-name: fadeInUp; +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInUpBig { + animation-name: fadeInUpBig; +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + animation-name: fadeOut; +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + animation-name: fadeOutDown; +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + animation-name: fadeOutDownBig; +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + animation-name: fadeOutLeft; +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + animation-name: fadeOutLeftBig; +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + animation-name: fadeOutRight; +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + animation-name: fadeOutRightBig; +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + animation-name: fadeOutUp; +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + animation-name: fadeOutUpBig; +} + +@keyframes flip { + from { + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + animation-timing-function: ease-out; + } + + 40% { + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + animation-timing-function: ease-out; + } + + 50% { + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + animation-timing-function: ease-in; + } + + 80% { + transform: perspective(400px) scale3d(.95, .95, .95); + animation-timing-function: ease-in; + } + + to { + transform: perspective(400px); + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + animation-name: flip; +} + +@keyframes flipInX { + from { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + animation-timing-function: ease-in; + } + + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + animation-name: flipInX; +} + +@keyframes flipInY { + from { + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + animation-timing-function: ease-in; + } + + 60% { + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + animation-name: flipInY; +} + +@keyframes flipOutX { + from { + transform: perspective(400px); + } + + 30% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@keyframes flipOutY { + from { + transform: perspective(400px); + } + + 30% { + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + animation-name: flipOutY; +} + +@keyframes lightSpeedIn { + from { + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + transform: skewX(20deg); + opacity: 1; + } + + 80% { + transform: skewX(-5deg); + opacity: 1; + } + + to { + transform: none; + opacity: 1; + } +} + +.lightSpeedIn { + animation-name: lightSpeedIn; + animation-timing-function: ease-out; +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + animation-name: lightSpeedOut; + animation-timing-function: ease-in; +} + +@keyframes rotateIn { + from { + transform-origin: center; + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + transform-origin: center; + transform: none; + opacity: 1; + } +} + +.rotateIn { + animation-name: rotateIn; +} + +@keyframes rotateInDownLeft { + from { + transform-origin: left bottom; + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + transform-origin: left bottom; + transform: none; + opacity: 1; + } +} + +.rotateInDownLeft { + animation-name: rotateInDownLeft; +} + +@keyframes rotateInDownRight { + from { + transform-origin: right bottom; + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + transform-origin: right bottom; + transform: none; + opacity: 1; + } +} + +.rotateInDownRight { + animation-name: rotateInDownRight; +} + +@keyframes rotateInUpLeft { + from { + transform-origin: left bottom; + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + transform-origin: left bottom; + transform: none; + opacity: 1; + } +} + +.rotateInUpLeft { + animation-name: rotateInUpLeft; +} + +@keyframes rotateInUpRight { + from { + transform-origin: right bottom; + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + transform-origin: right bottom; + transform: none; + opacity: 1; + } +} + +.rotateInUpRight { + animation-name: rotateInUpRight; +} + +@keyframes rotateOut { + from { + transform-origin: center; + opacity: 1; + } + + to { + transform-origin: center; + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + animation-name: rotateOut; +} + +@keyframes rotateOutDownLeft { + from { + transform-origin: left bottom; + opacity: 1; + } + + to { + transform-origin: left bottom; + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + animation-name: rotateOutDownLeft; +} + +@keyframes rotateOutDownRight { + from { + transform-origin: right bottom; + opacity: 1; + } + + to { + transform-origin: right bottom; + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + animation-name: rotateOutDownRight; +} + +@keyframes rotateOutUpLeft { + from { + transform-origin: left bottom; + opacity: 1; + } + + to { + transform-origin: left bottom; + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + animation-name: rotateOutUpLeft; +} + +@keyframes rotateOutUpRight { + from { + transform-origin: right bottom; + opacity: 1; + } + + to { + transform-origin: right bottom; + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + animation-name: rotateOutUpRight; +} + +@keyframes hinge { + 0% { + transform-origin: top left; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + transform: rotate3d(0, 0, 1, 80deg); + transform-origin: top left; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + transform: rotate3d(0, 0, 1, 60deg); + transform-origin: top left; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + animation-name: hinge; +} + +@keyframes jackInTheBox { + from { + opacity: 0; + transform: scale(0.1) rotate(30deg); + transform-origin: center bottom; + } + + 50% { + transform: rotate(-10deg); + } + + 70% { + transform: rotate(3deg); + } + + to { + opacity: 1; + transform: scale(1); + } +} + +.jackInTheBox { + animation-name: jackInTheBox; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@keyframes rollIn { + from { + opacity: 0; + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + transform: none; + } +} + +.rollIn { + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + animation-name: rollOut; +} + +@keyframes zoomIn { + from { + opacity: 0; + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + animation-name: zoomIn; +} + +@keyframes zoomInDown { + from { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInDown { + animation-name: zoomInDown; +} + +@keyframes zoomInLeft { + from { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInLeft { + animation-name: zoomInLeft; +} + +@keyframes zoomInRight { + from { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInRight { + animation-name: zoomInRight; +} + +@keyframes zoomInUp { + from { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInUp { + animation-name: zoomInUp; +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +.zoomOut { + animation-name: zoomOut; +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform-origin: center bottom; + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutDown { + animation-name: zoomOutDown; +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + transform: scale(.1) translate3d(-2000px, 0, 0); + transform-origin: left center; + } +} + +.zoomOutLeft { + animation-name: zoomOutLeft; +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + transform: scale(.1) translate3d(2000px, 0, 0); + transform-origin: right center; + } +} + +.zoomOutRight { + animation-name: zoomOutRight; +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform-origin: center bottom; + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutUp { + animation-name: zoomOutUp; +} + +@keyframes slideInDown { + from { + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + animation-name: slideInDown; +} + +@keyframes slideInLeft { + from { + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + animation-name: slideInLeft; +} + +@keyframes slideInRight { + from { + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + animation-name: slideInRight; +} + +@keyframes slideInUp { + from { + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + animation-name: slideInUp; +} + +@keyframes slideOutDown { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + animation-name: slideOutDown; +} + +@keyframes slideOutLeft { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + animation-name: slideOutLeft; +} + +@keyframes slideOutRight { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + animation-name: slideOutRight; +} + +@keyframes slideOutUp { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + animation-name: slideOutUp; +} diff --git a/public/assets/js/bootstrap-datetimepicker.js b/public/assets/js/bootstrap-datetimepicker.js new file mode 100644 index 0000000..e958e00 --- /dev/null +++ b/public/assets/js/bootstrap-datetimepicker.js @@ -0,0 +1,1770 @@ +/* ========================================================= + * bootstrap-datetimepicker.js + * ========================================================= + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Improvements by Sébastien Malot + * Improvements by Yun Lai + * Project URL : http://www.malot.fr/bootstrap-datetimepicker + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + * ========================================================= */ + +/* + * Improvement by CuGBabyBeaR @ 2013-09-12 + * + * Make it work in bootstrap v3 + */ + +!function ($) { + + function UTCDate() { + return new Date(Date.UTC.apply(Date, arguments)); + } + + function UTCToday() { + var today = new Date(); + return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate(), today.getUTCHours(), today.getUTCMinutes(), today.getUTCSeconds(), 0); + } + + // Picker object + + var Datetimepicker = function (element, options) { + var that = this; + + this.element = $(element); + + // add container for single page application + // when page switch the datetimepicker div will be removed also. + this.container = options.container || 'body'; + + this.language = options.language || this.element.data('date-language') || "en"; + this.language = this.language in dates ? this.language : "en"; + this.isRTL = dates[this.language].rtl || false; + this.formatType = options.formatType || this.element.data('format-type') || 'standard'; + this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || dates[this.language].format || DPGlobal.getDefaultFormat(this.formatType, 'input'), this.formatType); + this.isInline = false; + this.isVisible = false; + this.isInput = this.element.is('input'); + + + this.bootcssVer = this.isInput ? (this.element.is('.form-control') ? 3 : 2) : ( this.bootcssVer = this.element.is('.input-group') ? 3 : 2 ); + + this.component = this.element.is('.date') ? ( this.bootcssVer == 3 ? this.element.find('.input-group-addon .glyphicon-th, .input-group-addon .glyphicon-time, .input-group-addon .glyphicon-calendar').parent() : this.element.find('.add-on .icon-th, .add-on .icon-time, .add-on .icon-calendar').parent()) : false; + this.componentReset = this.element.is('.date') ? ( this.bootcssVer == 3 ? this.element.find('.input-group-addon .glyphicon-remove').parent() : this.element.find('.add-on .icon-remove').parent()) : false; + this.hasInput = this.component && this.element.find('input').length; + if (this.component && this.component.length === 0) { + this.component = false; + } + this.linkField = options.linkField || this.element.data('link-field') || false; + this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || DPGlobal.getDefaultFormat(this.formatType, 'link'), this.formatType); + this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5; + this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right'; + this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false; + this.initialDate = options.initialDate || new Date(); + + this._attachEvents(); + + this.formatViewType = "datetime"; + if ('formatViewType' in options) { + this.formatViewType = options.formatViewType; + } else if ('formatViewType' in this.element.data()) { + this.formatViewType = this.element.data('formatViewType'); + } + + this.minView = 0; + if ('minView' in options) { + this.minView = options.minView; + } else if ('minView' in this.element.data()) { + this.minView = this.element.data('min-view'); + } + this.minView = DPGlobal.convertViewMode(this.minView); + + this.maxView = DPGlobal.modes.length - 1; + if ('maxView' in options) { + this.maxView = options.maxView; + } else if ('maxView' in this.element.data()) { + this.maxView = this.element.data('max-view'); + } + this.maxView = DPGlobal.convertViewMode(this.maxView); + + this.wheelViewModeNavigation = false; + if ('wheelViewModeNavigation' in options) { + this.wheelViewModeNavigation = options.wheelViewModeNavigation; + } else if ('wheelViewModeNavigation' in this.element.data()) { + this.wheelViewModeNavigation = this.element.data('view-mode-wheel-navigation'); + } + + this.wheelViewModeNavigationInverseDirection = false; + + if ('wheelViewModeNavigationInverseDirection' in options) { + this.wheelViewModeNavigationInverseDirection = options.wheelViewModeNavigationInverseDirection; + } else if ('wheelViewModeNavigationInverseDirection' in this.element.data()) { + this.wheelViewModeNavigationInverseDirection = this.element.data('view-mode-wheel-navigation-inverse-dir'); + } + + this.wheelViewModeNavigationDelay = 100; + if ('wheelViewModeNavigationDelay' in options) { + this.wheelViewModeNavigationDelay = options.wheelViewModeNavigationDelay; + } else if ('wheelViewModeNavigationDelay' in this.element.data()) { + this.wheelViewModeNavigationDelay = this.element.data('view-mode-wheel-navigation-delay'); + } + + this.startViewMode = 2; + if ('startView' in options) { + this.startViewMode = options.startView; + } else if ('startView' in this.element.data()) { + this.startViewMode = this.element.data('start-view'); + } + this.startViewMode = DPGlobal.convertViewMode(this.startViewMode); + this.viewMode = this.startViewMode; + + this.viewSelect = this.minView; + if ('viewSelect' in options) { + this.viewSelect = options.viewSelect; + } else if ('viewSelect' in this.element.data()) { + this.viewSelect = this.element.data('view-select'); + } + this.viewSelect = DPGlobal.convertViewMode(this.viewSelect); + + this.forceParse = true; + if ('forceParse' in options) { + this.forceParse = options.forceParse; + } else if ('dateForceParse' in this.element.data()) { + this.forceParse = this.element.data('date-force-parse'); + } + + this.picker = $((this.bootcssVer == 3) ? DPGlobal.templateV3 : DPGlobal.template) + .appendTo(this.isInline ? this.element : this.container) // 'body') + .on({ + click: $.proxy(this.click, this), + mousedown: $.proxy(this.mousedown, this) + }); + + if (this.wheelViewModeNavigation) { + if ($.fn.mousewheel) { + this.picker.on({mousewheel: $.proxy(this.mousewheel, this)}); + } else { + console.log("Mouse Wheel event is not supported. Please include the jQuery Mouse Wheel plugin before enabling this option"); + } + } + + if (this.isInline) { + this.picker.addClass('datetimepicker-inline'); + } else { + this.picker.addClass('datetimepicker-dropdown-' + this.pickerPosition + ' dropdown-menu'); + } + if (this.isRTL) { + this.picker.addClass('datetimepicker-rtl'); + if (this.bootcssVer == 3) { + this.picker.find('.prev span, .next span') + .toggleClass('glyphicon-arrow-left glyphicon-arrow-right'); + } else { + this.picker.find('.prev i, .next i') + .toggleClass('icon-arrow-left icon-arrow-right'); + } + ; + + } + $(document).on('mousedown', function (e) { + // Clicked outside the datetimepicker, hide it + if ($(e.target).closest('.datetimepicker').length === 0) { + that.hide(); + } + }); + + this.autoclose = false; + if ('autoclose' in options) { + this.autoclose = options.autoclose; + } else if ('dateAutoclose' in this.element.data()) { + this.autoclose = this.element.data('date-autoclose'); + } + + this.keyboardNavigation = true; + if ('keyboardNavigation' in options) { + this.keyboardNavigation = options.keyboardNavigation; + } else if ('dateKeyboardNavigation' in this.element.data()) { + this.keyboardNavigation = this.element.data('date-keyboard-navigation'); + } + + this.todayBtn = (options.todayBtn || this.element.data('date-today-btn') || false); + this.todayHighlight = (options.todayHighlight || this.element.data('date-today-highlight') || false); + + this.weekStart = ((options.weekStart || this.element.data('date-weekstart') || dates[this.language].weekStart || 0) % 7); + this.weekEnd = ((this.weekStart + 6) % 7); + this.startDate = -Infinity; + this.endDate = Infinity; + this.daysOfWeekDisabled = []; + this.setStartDate(options.startDate || this.element.data('date-startdate')); + this.setEndDate(options.endDate || this.element.data('date-enddate')); + this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data('date-days-of-week-disabled')); + this.fillDow(); + this.fillMonths(); + this.update(); + this.showMode(); + + if (this.isInline) { + this.show(); + } + }; + + Datetimepicker.prototype = { + constructor: Datetimepicker, + + _events: [], + _attachEvents: function () { + this._detachEvents(); + if (this.isInput) { // single input + this._events = [ + [this.element, { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + else if (this.component && this.hasInput) { // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + if (this.componentReset) { + this._events.push([ + this.componentReset, + {click: $.proxy(this.reset, this)} + ]); + } + } + else if (this.element.is('div')) { // inline datetimepicker + this.isInline = true; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.on(ev); + } + }, + + _detachEvents: function () { + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.off(ev); + } + this._events = []; + }, + + show: function (e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + if (this.forceParse) { + this.update(); + } + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + this.isVisible = true; + this.element.trigger({ + type: 'show', + date: this.date + }); + }, + + hide: function (e) { + if (!this.isVisible) return; + if (this.isInline) return; + this.picker.hide(); + $(window).off('resize', this.place); + this.viewMode = this.startViewMode; + this.showMode(); + if (!this.isInput) { + $(document).off('mousedown', this.hide); + } + + if ( + this.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + this.isVisible = false; + this.element.trigger({ + type: 'hide', + date: this.date + }); + }, + + remove: function () { + this._detachEvents(); + this.picker.remove(); + delete this.picker; + delete this.element.data().datetimepicker; + }, + + getDate: function () { + var d = this.getUTCDate(); + return new Date(d.getTime() + (d.getTimezoneOffset() * 60000)); + }, + + getUTCDate: function () { + return this.date; + }, + + setDate: function (d) { + this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset() * 60000))); + }, + + setUTCDate: function (d) { + if (d >= this.startDate && d <= this.endDate) { + this.date = d; + this.setValue(); + this.viewDate = this.date; + this.fill(); + } else { + this.element.trigger({ + type: 'outOfRange', + date: d, + startDate: this.startDate, + endDate: this.endDate + }); + } + }, + + setFormat: function (format) { + this.format = DPGlobal.parseFormat(format, this.formatType); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element && element.val()) { + this.setValue(); + } + }, + + setValue: function () { + var formatted = this.getFormattedDate(); + if (!this.isInput) { + if (this.component) { + this.element.find('input').val(formatted); + } + this.element.data('date', formatted); + } else { + this.element.val(formatted); + } + if (this.linkField) { + $('#' + this.linkField).val(this.getFormattedDate(this.linkFormat)); + } + }, + + getFormattedDate: function (format) { + if (format == undefined) format = this.format; + return DPGlobal.formatDate(this.date, format, this.language, this.formatType); + }, + + setStartDate: function (startDate) { + this.startDate = startDate || -Infinity; + if (this.startDate !== -Infinity) { + this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language, this.formatType); + } + this.update(); + this.updateNavArrows(); + }, + + setEndDate: function (endDate) { + this.endDate = endDate || Infinity; + if (this.endDate !== Infinity) { + this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language, this.formatType); + } + this.update(); + this.updateNavArrows(); + }, + + setDaysOfWeekDisabled: function (daysOfWeekDisabled) { + this.daysOfWeekDisabled = daysOfWeekDisabled || []; + if (!$.isArray(this.daysOfWeekDisabled)) { + this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/); + } + this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + place: function () { + if (this.isInline) return; + + var index_highest = 0; + $('div').each(function () { + var index_current = parseInt($(this).css("zIndex"), 10); + if (index_current > index_highest) { + index_highest = index_current; + } + }); + var zIndex = index_highest + 10; + + var offset, top, left, containerOffset; + if (this.container instanceof $) { + containerOffset = this.container.offset(); + } else { + containerOffset = $(this.container).offset(); + } + + if (this.component) { + offset = this.component.offset(); + left = offset.left; + if (this.pickerPosition == 'bottom-left' || this.pickerPosition == 'top-left') { + left += this.component.outerWidth() - this.picker.outerWidth(); + } + } else { + offset = this.element.offset(); + left = offset.left; + } + + if(left+220 > document.body.clientWidth){ + left = document.body.clientWidth-220; + } + + if (this.pickerPosition == 'top-left' || this.pickerPosition == 'top-right') { + top = offset.top - this.picker.outerHeight(); + } else { + top = offset.top + this.height; + } + + top = top - containerOffset.top; + left = left - containerOffset.left; + + this.picker.css({ + top: top, + left: left, + zIndex: zIndex + }); + }, + + update: function () { + var date, fromArgs = false; + if (arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) { + date = arguments[0]; + fromArgs = true; + } else { + date = (this.isInput ? this.element.val() : this.element.find('input').val()) || this.element.data('date') || this.initialDate; + if (typeof date == 'string' || date instanceof String) { + date = date.replace(/^\s+|\s+$/g,''); + } + } + + if (!date) { + date = new Date(); + fromArgs = false; + } + + this.date = DPGlobal.parseDate(date, this.format, this.language, this.formatType); + + if (fromArgs) this.setValue(); + + if (this.date < this.startDate) { + this.viewDate = new Date(this.startDate); + } else if (this.date > this.endDate) { + this.viewDate = new Date(this.endDate); + } else { + this.viewDate = new Date(this.date); + } + this.fill(); + }, + + fillDow: function () { + var dowCnt = this.weekStart, + html = ''; + while (dowCnt < this.weekStart + 7) { + html += '' + dates[this.language].daysMin[(dowCnt++) % 7] + ''; + } + html += ''; + this.picker.find('.datetimepicker-days thead').append(html); + }, + + fillMonths: function () { + var html = '', + i = 0; + while (i < 12) { + html += '' + dates[this.language].monthsShort[i++] + ''; + } + this.picker.find('.datetimepicker-months td').html(html); + }, + + fill: function () { + if (this.date == null || this.viewDate == null) { + return; + } + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + dayMonth = d.getUTCDate(), + hours = d.getUTCHours(), + minutes = d.getUTCMinutes(), + startYear = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity, + startMonth = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity, + endYear = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity, + endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity, + currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(), + today = new Date(); + this.picker.find('.datetimepicker-days thead th:eq(1)') + .text(dates[this.language].months[month] + ' ' + year); + if (this.formatViewType == "time") { + var hourConverted = hours % 12 ? hours % 12 : 12; + var hoursDisplay = (hourConverted < 10 ? '0' : '') + hourConverted; + var minutesDisplay = (minutes < 10 ? '0' : '') + minutes; + var meridianDisplay = dates[this.language].meridiem[hours < 12 ? 0 : 1]; + this.picker.find('.datetimepicker-hours thead th:eq(1)') + .text(hoursDisplay + ':' + minutesDisplay + ' ' + (meridianDisplay ? meridianDisplay.toUpperCase() : '')); + this.picker.find('.datetimepicker-minutes thead th:eq(1)') + .text(hoursDisplay + ':' + minutesDisplay + ' ' + (meridianDisplay ? meridianDisplay.toUpperCase() : '')); + } else { + this.picker.find('.datetimepicker-hours thead th:eq(1)') + .text(dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + this.picker.find('.datetimepicker-minutes thead th:eq(1)') + .text(dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + } + this.picker.find('tfoot th.today') + .text(dates[this.language].today) + .toggle(this.todayBtn !== false); + this.updateNavArrows(); + this.fillMonths(); + /*var prevMonth = UTCDate(year, month, 0,0,0,0,0); + prevMonth.setUTCDate(prevMonth.getDate() - (prevMonth.getUTCDay() - this.weekStart + 7)%7);*/ + var prevMonth = UTCDate(year, month - 1, 28, 0, 0, 0, 0), + day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); + prevMonth.setUTCDate(day); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7) % 7); + var nextMonth = new Date(prevMonth); + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var clsName; + while (prevMonth.valueOf() < nextMonth) { + if (prevMonth.getUTCDay() == this.weekStart) { + html.push(''); + } + clsName = ''; + if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) { + clsName += ' old'; + } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() > month)) { + clsName += ' new'; + } + // Compare internal UTC date with local today, not UTC today + if (this.todayHighlight && + prevMonth.getUTCFullYear() == today.getFullYear() && + prevMonth.getUTCMonth() == today.getMonth() && + prevMonth.getUTCDate() == today.getDate()) { + clsName += ' today'; + } + if (prevMonth.valueOf() == currentDate) { + clsName += ' active'; + } + if ((prevMonth.valueOf() + 86400000) <= this.startDate || prevMonth.valueOf() > this.endDate || + $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1) { + clsName += ' disabled'; + } + html.push('' + prevMonth.getUTCDate() + ''); + if (prevMonth.getUTCDay() == this.weekEnd) { + html.push(''); + } + prevMonth.setUTCDate(prevMonth.getUTCDate() + 1); + } + this.picker.find('.datetimepicker-days tbody').empty().append(html.join('')); + + html = []; + var txt = '', meridian = '', meridianOld = ''; + for (var i = 0; i < 24; i++) { + var actual = UTCDate(year, month, dayMonth, i); + clsName = ''; + // We want the previous hour for the startDate + if ((actual.valueOf() + 3600000) <= this.startDate || actual.valueOf() > this.endDate) { + clsName += ' disabled'; + } else if (hours == i) { + clsName += ' active'; + } + if (this.showMeridian && dates[this.language].meridiem.length == 2) { + meridian = (i < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian != meridianOld) { + if (meridianOld != '') { + html.push(''); + } + html.push('

    ' + meridian.toUpperCase() + ''); + } + meridianOld = meridian; + txt = (i % 12 ? i % 12 : 12); + html.push('' + txt + ''); + if (i == 23) { + html.push('
    '); + } + } else { + txt = i + ':00'; + html.push('' + txt + ''); + } + } + this.picker.find('.datetimepicker-hours td').html(html.join('')); + + html = []; + txt = '', meridian = '', meridianOld = ''; + for (var i = 0; i < 60; i += this.minuteStep) { + var actual = UTCDate(year, month, dayMonth, hours, i, 0); + clsName = ''; + if (actual.valueOf() < this.startDate || actual.valueOf() > this.endDate) { + clsName += ' disabled'; + } else if (Math.floor(minutes / this.minuteStep) == Math.floor(i / this.minuteStep)) { + clsName += ' active'; + } + if (this.showMeridian && dates[this.language].meridiem.length == 2) { + meridian = (hours < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian != meridianOld) { + if (meridianOld != '') { + html.push(''); + } + html.push('
    ' + meridian.toUpperCase() + ''); + } + meridianOld = meridian; + txt = (hours % 12 ? hours % 12 : 12); + //html.push(''+txt+''); + html.push('' + txt + ':' + (i < 10 ? '0' + i : i) + ''); + if (i == 59) { + html.push('
    '); + } + } else { + txt = i + ':00'; + //html.push(''+txt+''); + html.push('' + hours + ':' + (i < 10 ? '0' + i : i) + ''); + } + } + this.picker.find('.datetimepicker-minutes td').html(html.join('')); + + var currentYear = this.date.getUTCFullYear(); + var months = this.picker.find('.datetimepicker-months') + .find('th:eq(1)') + .text(year) + .end() + .find('span').removeClass('active'); + if (currentYear == year) { + months.eq(this.date.getUTCMonth()).addClass('active'); + } + if (year < startYear || year > endYear) { + months.addClass('disabled'); + } + if (year == startYear) { + months.slice(0, startMonth).addClass('disabled'); + } + if (year == endYear) { + months.slice(endMonth + 1).addClass('disabled'); + } + + html = ''; + year = parseInt(year / 10, 10) * 10; + var yearCont = this.picker.find('.datetimepicker-years') + .find('th:eq(1)') + .text(year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + for (var i = -1; i < 11; i++) { + html += '' + year + ''; + year += 1; + } + yearCont.html(html); + this.place(); + }, + + updateNavArrows: function () { + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + day = d.getUTCDate(), + hour = d.getUTCHours(); + switch (this.viewMode) { + case 0: + if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate() + && hour <= this.startDate.getUTCHours()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate() + && hour >= this.endDate.getUTCHours()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 1: + if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 2: + if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 3: + case 4: + if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + } + }, + + mousewheel: function (e) { + + e.preventDefault(); + e.stopPropagation(); + + if (this.wheelPause) { + return; + } + + this.wheelPause = true; + + var originalEvent = e.originalEvent; + + var delta = originalEvent.wheelDelta; + + var mode = delta > 0 ? 1 : (delta === 0) ? 0 : -1; + + if (this.wheelViewModeNavigationInverseDirection) { + mode = -mode; + } + + this.showMode(mode); + + setTimeout($.proxy(function () { + + this.wheelPause = false + + }, this), this.wheelViewModeNavigationDelay); + + }, + + click: function (e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(e.target).closest('span, td, th, legend'); + if (target.is('.glyphicon')) { + target = $(target).parent().closest('span, td, th, legend'); + } + if (target.length == 1) { + if (target.is('.disabled')) { + this.element.trigger({ + type: 'outOfRange', + date: this.viewDate, + startDate: this.startDate, + endDate: this.endDate + }); + return; + } + switch (target[0].nodeName.toLowerCase()) { + case 'th': + switch (target[0].className) { + case 'switch': + this.showMode(1); + break; + case 'prev': + case 'next': + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1); + switch (this.viewMode) { + case 0: + this.viewDate = this.moveHour(this.viewDate, dir); + break; + case 1: + this.viewDate = this.moveDate(this.viewDate, dir); + break; + case 2: + this.viewDate = this.moveMonth(this.viewDate, dir); + break; + case 3: + case 4: + this.viewDate = this.moveYear(this.viewDate, dir); + break; + } + this.fill(); + this.element.trigger({ + type: target[0].className + ':' + this.convertViewModeText(this.viewMode), + date: this.viewDate, + startDate: this.startDate, + endDate: this.endDate + }); + break; + case 'today': + var date = new Date(); + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 0); + + // Respect startDate and endDate. + if (date < this.startDate) date = this.startDate; + else if (date > this.endDate) date = this.endDate; + + this.viewMode = this.startViewMode; + this.showMode(0); + this._setDate(date); + this.fill(); + if (this.autoclose) { + this.hide(); + } + break; + } + break; + case 'span': + if (!target.is('.disabled')) { + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + day = this.viewDate.getUTCDate(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + + if (target.is('.month')) { + this.viewDate.setUTCDate(1); + month = target.parent().find('span').index(target); + day = this.viewDate.getUTCDate(); + this.viewDate.setUTCMonth(month); + this.element.trigger({ + type: 'changeMonth', + date: this.viewDate + }); + if (this.viewSelect >= 3) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.year')) { + this.viewDate.setUTCDate(1); + year = parseInt(target.text(), 10) || 0; + this.viewDate.setUTCFullYear(year); + this.element.trigger({ + type: 'changeYear', + date: this.viewDate + }); + if (this.viewSelect >= 4) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.hour')) { + hours = parseInt(target.text(), 10) || 0; + if (target.hasClass('hour_am') || target.hasClass('hour_pm')) { + if (hours == 12 && target.hasClass('hour_am')) { + hours = 0; + } else if (hours != 12 && target.hasClass('hour_pm')) { + hours += 12; + } + } + this.viewDate.setUTCHours(hours); + this.element.trigger({ + type: 'changeHour', + date: this.viewDate + }); + if (this.viewSelect >= 1) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.minute')) { + minutes = parseInt(target.text().substr(target.text().indexOf(':') + 1), 10) || 0; + this.viewDate.setUTCMinutes(minutes); + this.element.trigger({ + type: 'changeMinute', + date: this.viewDate + }); + if (this.viewSelect >= 0) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + if (this.viewMode != 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode == this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + } + break; + case 'td': + if (target.is('.day') && !target.is('.disabled')) { + var day = parseInt(target.text(), 10) || 1; + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + if (target.is('.old')) { + if (month === 0) { + month = 11; + year -= 1; + } else { + month -= 1; + } + } else if (target.is('.new')) { + if (month == 11) { + month = 0; + year += 1; + } else { + month += 1; + } + } + this.viewDate.setUTCFullYear(year); + this.viewDate.setUTCMonth(month, day); + this.element.trigger({ + type: 'changeDay', + date: this.viewDate + }); + if (this.viewSelect >= 2) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode == this.viewMode && this.autoclose) { + this.hide(); + } + break; + } + } + }, + + _setDate: function (date, which) { + if (!which || which == 'date') + this.date = date; + if (!which || which == 'view') + this.viewDate = date; + this.fill(); + this.setValue(); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + if (this.autoclose && (!which || which == 'date')) { + //this.hide(); + } + } + this.element.trigger({ + type: 'changeDate', + date: this.date + }); + }, + + moveMinute: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCMinutes(new_date.getUTCMinutes() + (dir * this.minuteStep)); + return new_date; + }, + + moveHour: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCHours(new_date.getUTCHours() + dir); + return new_date; + }, + + moveDate: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCDate(new_date.getUTCDate() + dir); + return new_date; + }, + + moveMonth: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag == 1) { + test = dir == -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) + ? function () { + return new_date.getUTCMonth() == month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) + : function () { + return new_date.getUTCMonth() != new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + if (new_month < 0 || new_month > 11) + new_month = (new_month + 12) % 12; + } else { + // For magnitudes >1, move one month at a time... + for (var i = 0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function () { + return new_month != new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()) { + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function (date, dir) { + return this.moveMonth(date, dir * 12); + }, + + dateWithinRange: function (date) { + return date >= this.startDate && date <= this.endDate; + }, + + keydown: function (e) { + if (this.picker.is(':not(:visible)')) { + if (e.keyCode == 27) // allow escape to hide and re-show picker + this.show(); + return; + } + var dateChanged = false, + dir, day, month, + newDate, newViewDate; + switch (e.keyCode) { + case 27: // escape + this.hide(); + e.preventDefault(); + break; + case 37: // left + case 39: // right + if (!this.keyboardNavigation) break; + dir = e.keyCode == 37 ? -1 : 1; + viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode == 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode == 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode == 2) { + newDate = this.moveDate(this.date, dir); + newViewDate = this.moveDate(this.viewDate, dir); + } else if (viewMode == 1) { + newDate = this.moveHour(this.date, dir); + newViewDate = this.moveHour(this.viewDate, dir); + } else if (viewMode == 0) { + newDate = this.moveMinute(this.date, dir); + newViewDate = this.moveMinute(this.viewDate, dir); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 38: // up + case 40: // down + if (!this.keyboardNavigation) break; + dir = e.keyCode == 38 ? -1 : 1; + viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode == 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode == 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode == 2) { + newDate = this.moveDate(this.date, dir * 7); + newViewDate = this.moveDate(this.viewDate, dir * 7); + } else if (viewMode == 1) { + if (this.showMeridian) { + newDate = this.moveHour(this.date, dir * 6); + newViewDate = this.moveHour(this.viewDate, dir * 6); + } else { + newDate = this.moveHour(this.date, dir * 4); + newViewDate = this.moveHour(this.viewDate, dir * 4); + } + } else if (viewMode == 0) { + newDate = this.moveMinute(this.date, dir * 4); + newViewDate = this.moveMinute(this.viewDate, dir * 4); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 13: // enter + if (this.viewMode != 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode == this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + e.preventDefault(); + break; + case 9: // tab + this.hide(); + break; + } + if (dateChanged) { + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.date + }); + } + }, + + showMode: function (dir) { + if (dir) { + var newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir)); + if (newViewMode >= this.minView && newViewMode <= this.maxView) { + this.element.trigger({ + type: 'changeMode', + date: this.viewDate, + oldViewMode: this.viewMode, + newViewMode: newViewMode + }); + + this.viewMode = newViewMode; + } + } + /* + vitalets: fixing bug of very special conditions: + jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover. + Method show() does not set display css correctly and datetimepicker is not shown. + Changed to .css('display', 'block') solve the problem. + See https://github.com/vitalets/x-editable/issues/37 + + In jquery 1.7.2+ everything works fine. + */ + //this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); + this.picker.find('>div').hide().filter('.datetimepicker-' + DPGlobal.modes[this.viewMode].clsName).css('display', 'block'); + this.updateNavArrows(); + }, + + reset: function (e) { + this._setDate(null, 'date'); + }, + + convertViewModeText: function (viewMode) { + switch (viewMode) { + case 4: + return 'decade'; + case 3: + return 'year'; + case 2: + return 'month'; + case 1: + return 'day'; + case 0: + return 'hour'; + } + } + }; + + $.fn.datetimepicker = function (option) { + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function () { + var $this = $(this), + data = $this.data('datetimepicker'), + options = typeof option == 'object' && option; + if (!data) { + $this.data('datetimepicker', (data = new Datetimepicker(this, $.extend({}, $.fn.datetimepicker.defaults, options)))); + } + if (typeof option == 'string' && typeof data[option] == 'function') { + internal_return = data[option].apply(data, args); + if (internal_return !== undefined) { + return false; + } + } + }); + if (internal_return !== undefined) + return internal_return; + else + return this; + }; + + $.fn.datetimepicker.defaults = { + }; + $.fn.datetimepicker.Constructor = Datetimepicker; + var dates = $.fn.datetimepicker.dates = { + en: { + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + meridiem: ["am", "pm"], + suffix: ["st", "nd", "rd", "th"], + today: "Today" + } + }; + + var DPGlobal = { + modes: [ + { + clsName: 'minutes', + navFnc: 'Hours', + navStep: 1 + }, + { + clsName: 'hours', + navFnc: 'Date', + navStep: 1 + }, + { + clsName: 'days', + navFnc: 'Month', + navStep: 1 + }, + { + clsName: 'months', + navFnc: 'FullYear', + navStep: 1 + }, + { + clsName: 'years', + navFnc: 'FullYear', + navStep: 10 + } + ], + isLeapYear: function (year) { + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) + }, + getDaysInMonth: function (year, month) { + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] + }, + getDefaultFormat: function (type, field) { + if (type == "standard") { + if (field == 'input') + return 'yyyy-mm-dd hh:ii'; + else + return 'yyyy-mm-dd hh:ii:ss'; + } else if (type == "php") { + if (field == 'input') + return 'Y-m-d H:i'; + else + return 'Y-m-d H:i:s'; + } else { + throw new Error("Invalid format type."); + } + }, + validParts: function (type) { + if (type == "standard") { + return /hh?|HH?|p|P|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g; + } else if (type == "php") { + return /[dDjlNwzFmMnStyYaABgGhHis]/g; + } else { + throw new Error("Invalid format type."); + } + }, + nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\rTZ]+/g, + parseFormat: function (format, type) { + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts(type), '\0').split('\0'), + parts = format.match(this.validParts(type)); + if (!separators || !separators.length || !parts || parts.length == 0) { + throw new Error("Invalid date format."); + } + return {separators: separators, parts: parts}; + }, + parseDate: function (date, format, language, type) { + if (date instanceof Date) { + var dateUTC = new Date(date.valueOf() - date.getTimezoneOffset() * 60000); + dateUTC.setMilliseconds(0); + return dateUTC; + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii:ss', type); + } + if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) { + var part_re = /([-+]\d+)([dmwy])/, + parts = date.match(/([-+]\d+)([dmwy])/g), + part, dir; + date = new Date(); + for (var i = 0; i < parts.length; i++) { + part = part_re.exec(parts[i]); + dir = parseInt(part[1]); + switch (part[2]) { + case 'd': + date.setUTCDate(date.getUTCDate() + dir); + break; + case 'm': + date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir); + break; + case 'w': + date.setUTCDate(date.getUTCDate() + dir * 7); + break; + case 'y': + date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir); + break; + } + } + return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), 0); + } + var parts = date && date.match(this.nonpunctuation) || [], + date = new Date(0, 0, 0, 0, 0, 0, 0), + parsed = {}, + setters_order = ['hh', 'h', 'ii', 'i', 'ss', 's', 'yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'D', 'DD', 'd', 'dd', 'H', 'HH', 'p', 'P'], + setters_map = { + hh: function (d, v) { + return d.setUTCHours(v); + }, + h: function (d, v) { + return d.setUTCHours(v); + }, + HH: function (d, v) { + return d.setUTCHours(v == 12 ? 0 : v); + }, + H: function (d, v) { + return d.setUTCHours(v == 12 ? 0 : v); + }, + ii: function (d, v) { + return d.setUTCMinutes(v); + }, + i: function (d, v) { + return d.setUTCMinutes(v); + }, + ss: function (d, v) { + return d.setUTCSeconds(v); + }, + s: function (d, v) { + return d.setUTCSeconds(v); + }, + yyyy: function (d, v) { + return d.setUTCFullYear(v); + }, + yy: function (d, v) { + return d.setUTCFullYear(2000 + v); + }, + m: function (d, v) { + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() != v) + if (isNaN(d.getUTCMonth())) + return d; + else + d.setUTCDate(d.getUTCDate() - 1); + return d; + }, + d: function (d, v) { + return d.setUTCDate(v); + }, + p: function (d, v) { + return d.setUTCHours(v == 1 ? d.getUTCHours() + 12 : d.getUTCHours()); + } + }, + val, filtered, part; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + setters_map['P'] = setters_map['p']; + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); + if (parts.length == format.parts.length) { + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + val = parseInt(parts[i], 10); + part = format.parts[i]; + if (isNaN(val)) { + switch (part) { + case 'MM': + filtered = $(dates[language].months).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m == p; + }); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m.toLowerCase() == p.toLowerCase(); + }); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + case 'p': + case 'P': + val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem); + break; + } + } + parsed[part] = val; + } + for (var i = 0, s; i < setters_order.length; i++) { + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])) + setters_map[s](date, parsed[s]) + } + } + return date; + }, + formatDate: function (date, format, language, type) { + if (date == null) { + return ''; + } + var val; + if (type == 'standard') { + val = { + // year + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear(), + // month + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + // day + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + p: (dates[language].meridiem.length == 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + // hour + h: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds() + }; + + if (dates[language].meridiem.length == 2) { + val.H = (val.h % 12 == 0 ? 12 : val.h % 12); + } + else { + val.H = val.h; + } + val.HH = (val.H < 10 ? '0' : '') + val.H; + val.P = val.p.toUpperCase(); + val.hh = (val.h < 10 ? '0' : '') + val.h; + val.ii = (val.i < 10 ? '0' : '') + val.i; + val.ss = (val.s < 10 ? '0' : '') + val.s; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + } else if (type == 'php') { + // php format + val = { + // year + y: date.getUTCFullYear().toString().substring(2), + Y: date.getUTCFullYear(), + // month + F: dates[language].months[date.getUTCMonth()], + M: dates[language].monthsShort[date.getUTCMonth()], + n: date.getUTCMonth() + 1, + t: DPGlobal.getDaysInMonth(date.getUTCFullYear(), date.getUTCMonth()), + // day + j: date.getUTCDate(), + l: dates[language].days[date.getUTCDay()], + D: dates[language].daysShort[date.getUTCDay()], + w: date.getUTCDay(), // 0 -> 6 + N: (date.getUTCDay() == 0 ? 7 : date.getUTCDay()), // 1 -> 7 + S: (date.getUTCDate() % 10 <= dates[language].suffix.length ? dates[language].suffix[date.getUTCDate() % 10 - 1] : ''), + // hour + a: (dates[language].meridiem.length == 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + g: (date.getUTCHours() % 12 == 0 ? 12 : date.getUTCHours() % 12), + G: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds() + }; + val.m = (val.n < 10 ? '0' : '') + val.n; + val.d = (val.j < 10 ? '0' : '') + val.j; + val.A = val.a.toString().toUpperCase(); + val.h = (val.g < 10 ? '0' : '') + val.g; + val.H = (val.G < 10 ? '0' : '') + val.G; + val.i = (val.i < 10 ? '0' : '') + val.i; + val.s = (val.s < 10 ? '0' : '') + val.s; + } else { + throw new Error("Invalid format type."); + } + var date = [], + seps = $.extend([], format.separators); + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + if (seps.length) { + date.push(seps.shift()); + } + date.push(val[format.parts[i]]); + } + if (seps.length) { + date.push(seps.shift()); + } + return date.join(''); + }, + convertViewMode: function (viewMode) { + switch (viewMode) { + case 4: + case 'decade': + viewMode = 4; + break; + case 3: + case 'year': + viewMode = 3; + break; + case 2: + case 'month': + viewMode = 2; + break; + case 1: + case 'day': + viewMode = 1; + break; + case 0: + case 'hour': + viewMode = 0; + break; + } + + return viewMode; + }, + headTemplate: '' + + '' + + '' + + '' + + '' + + '' + + '', + headTemplateV3: '' + + '' + + ' ' + + '' + + ' ' + + '' + + '', + contTemplate: '', + footTemplate: '' + }; + DPGlobal.template = '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + '' + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    '; + DPGlobal.templateV3 = '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + '' + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    '; + $.fn.datetimepicker.DPGlobal = DPGlobal; + + /* DATETIMEPICKER NO CONFLICT + * =================== */ + + $.fn.datetimepicker.noConflict = function () { + $.fn.datetimepicker = old; + return this; + }; + + /* DATETIMEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datetimepicker.data-api click.datetimepicker.data-api', + '[data-provide="datetimepicker"]', + function (e) { + var $this = $(this); + if ($this.data('datetimepicker')) return; + e.preventDefault(); + // component click requires us to explicitly show it + $this.datetimepicker('show'); + } + ); + $(function () { + $('[data-provide="datetimepicker-inline"]').datetimepicker(); + }); + +}(window.jQuery); + +/** + * Simplified Chinese translation for bootstrap-datetimepicker + * Yuan Cheung + */ +;(function($){ + $.fn.datetimepicker.dates['zh-CN'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + today: "今日", + suffix: [], + meridiem: ["上午", "下午"], + format: "yyyy-mm-dd" /*控制显示格式*/ + }; +}(jQuery)); diff --git a/public/assets/js/bootstrap-editable.js b/public/assets/js/bootstrap-editable.js new file mode 100644 index 0000000..a255366 --- /dev/null +++ b/public/assets/js/bootstrap-editable.js @@ -0,0 +1,6898 @@ +/*! X-editable - v1.5.3 +* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery +* http://github.com/vitalets/x-editable +* Copyright (c) 2019 Vitaliy Potapov; Licensed MIT */ +/** +Form with single input element, two buttons and two states: normal/loading. +Applied as jQuery method to DIV tag (not to form tag!). This is because form can be in loading state when spinner shown. +Editableform is linked with one of input types, e.g. 'text', 'select' etc. + +@class editableform +@uses text +@uses textarea +**/ +(function ($) { + "use strict"; + + var EditableForm = function (div, options) { + this.options = $.extend({}, $.fn.editableform.defaults, options); + this.$div = $(div); //div, containing form. Not form tag. Not editable-element. + if(!this.options.scope) { + this.options.scope = this; + } + //nothing shown after init + }; + + EditableForm.prototype = { + constructor: EditableForm, + initInput: function() { //called once + //take input from options (as it is created in editable-element) + this.input = this.options.input; + + //set initial value + //todo: may be add check: typeof str === 'string' ? + this.value = this.input.str2value(this.options.value); + + //prerender: get input.$input + this.input.prerender(); + }, + initTemplate: function() { + this.$form = $($.fn.editableform.template); + }, + initButtons: function() { + var $btn = this.$form.find('.editable-buttons'); + $btn.append($.fn.editableform.buttons); + if(this.options.showbuttons === 'bottom') { + $btn.addClass('editable-buttons-bottom'); + } + }, + /** + Renders editableform + + @method render + **/ + render: function() { + //init loader + this.$loading = $($.fn.editableform.loading); + this.$div.empty().append(this.$loading); + + //init form template and buttons + this.initTemplate(); + if(this.options.showbuttons) { + this.initButtons(); + } else { + this.$form.find('.editable-buttons').remove(); + } + + //show loading state + this.showLoading(); + + //flag showing is form now saving value to server. + //It is needed to wait when closing form. + this.isSaving = false; + + /** + Fired when rendering starts + @event rendering + @param {Object} event event object + **/ + this.$div.triggerHandler('rendering'); + + //init input + this.initInput(); + + //append input to form + this.$form.find('div.editable-input').append(this.input.$tpl); + + //append form to container + this.$div.append(this.$form); + + //render input + $.when(this.input.render()) + .then($.proxy(function () { + //setup input to submit automatically when no buttons shown + if(!this.options.showbuttons) { + this.input.autosubmit(); + } + + //attach 'cancel' handler + this.$form.find('.editable-cancel').click($.proxy(this.cancel, this)); + + if(this.input.error) { + this.error(this.input.error); + this.$form.find('.editable-submit').attr('disabled', true); + this.input.$input.attr('disabled', true); + //prevent form from submitting + this.$form.submit(function(e){ e.preventDefault(); }); + } else { + this.error(false); + this.input.$input.removeAttr('disabled'); + this.$form.find('.editable-submit').removeAttr('disabled'); + var value = (this.value === null || this.value === undefined || this.value === '') ? this.options.defaultValue : this.value; + this.input.value2input(value); + //attach submit handler + this.$form.submit($.proxy(this.submit, this)); + } + + /** + Fired when form is rendered + @event rendered + @param {Object} event event object + **/ + this.$div.triggerHandler('rendered'); + + this.showForm(); + + //call postrender method to perform actions required visibility of form + if(this.input.postrender) { + this.input.postrender(); + } + }, this)); + }, + cancel: function() { + /** + Fired when form was cancelled by user + @event cancel + @param {Object} event event object + **/ + this.$div.triggerHandler('cancel'); + }, + showLoading: function() { + var w, h; + if(this.$form) { + //set loading size equal to form + w = this.$form.outerWidth(); + h = this.$form.outerHeight(); + if(w) { + this.$loading.width(w); + } + if(h) { + this.$loading.height(h); + } + this.$form.hide(); + } else { + //stretch loading to fill container width + w = this.$loading.parent().width(); + if(w) { + this.$loading.width(w); + } + } + this.$loading.show(); + }, + + showForm: function(activate) { + this.$loading.hide(); + this.$form.show(); + if(activate !== false) { + this.input.activate(); + } + /** + Fired when form is shown + @event show + @param {Object} event event object + **/ + this.$div.triggerHandler('show'); + }, + + error: function(msg) { + var $group = this.$form.find('.control-group'), + $block = this.$form.find('.editable-error-block'), + lines; + + if(msg === false) { + $group.removeClass($.fn.editableform.errorGroupClass); + $block.removeClass($.fn.editableform.errorBlockClass).empty().hide(); + } else { + //convert newline to
    for more pretty error display + if(msg) { + lines = (''+msg).split('\n'); + for (var i = 0; i < lines.length; i++) { + lines[i] = $('
    ').text(lines[i]).html(); + } + msg = lines.join('
    '); + } + $group.addClass($.fn.editableform.errorGroupClass); + $block.addClass($.fn.editableform.errorBlockClass).html(msg).show(); + } + }, + + submit: function(e) { + e.stopPropagation(); + e.preventDefault(); + + //get new value from input + var newValue = this.input.input2value(); + + //validation: if validate returns string or truthy value - means error + //if returns object like {newValue: '...'} => submitted value is reassigned to it + var error = this.validate(newValue); + if ($.type(error) === 'object' && error.newValue !== undefined) { + newValue = error.newValue; + this.input.value2input(newValue); + if(typeof error.msg === 'string') { + this.error(error.msg); + this.showForm(); + return; + } + } else if (error) { + this.error(error); + this.showForm(); + return; + } + + //if value not changed --> trigger 'nochange' event and return + /*jslint eqeq: true*/ + if (!this.options.savenochange && this.input.value2str(newValue) === this.input.value2str(this.value)) { + /*jslint eqeq: false*/ + /** + Fired when value not changed but form is submitted. Requires savenochange = false. + @event nochange + @param {Object} event event object + **/ + this.$div.triggerHandler('nochange'); + return; + } + + //convert value for submitting to server + var submitValue = this.input.value2submit(newValue); + + this.isSaving = true; + + //sending data to server + $.when(this.save(submitValue)) + .done($.proxy(function(response) { + this.isSaving = false; + + //run success callback + var res = typeof this.options.success === 'function' ? this.options.success.call(this.options.scope, response, newValue) : null; + + //if success callback returns false --> keep form open and do not activate input + if(res === false) { + this.error(false); + this.showForm(false); + return; + } + + //if success callback returns string --> keep form open, show error and activate input + if(typeof res === 'string') { + this.error(res); + this.showForm(); + return; + } + + //if success callback returns object like {newValue: } --> use that value instead of submitted + //it is useful if you want to chnage value in url-function + if(res && typeof res === 'object' && res.hasOwnProperty('newValue')) { + newValue = res.newValue; + } + + //clear error message + this.error(false); + this.value = newValue; + /** + Fired when form is submitted + @event save + @param {Object} event event object + @param {Object} params additional params + @param {mixed} params.newValue raw new value + @param {mixed} params.submitValue submitted value as string + @param {Object} params.response ajax response + + @example + $('#form-div').on('save'), function(e, params){ + if(params.newValue === 'username') {...} + }); + **/ + this.$div.triggerHandler('save', {newValue: newValue, submitValue: submitValue, response: response}); + }, this)) + .fail($.proxy(function(xhr) { + this.isSaving = false; + + var msg; + if(typeof this.options.error === 'function') { + msg = this.options.error.call(this.options.scope, xhr, newValue); + } else { + msg = typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!'; + } + + this.error(msg); + this.showForm(); + }, this)); + }, + + save: function(submitValue) { + //try parse composite pk defined as json string in data-pk + this.options.pk = $.fn.editableutils.tryParseJson(this.options.pk, true); + + var pk = (typeof this.options.pk === 'function') ? this.options.pk.call(this.options.scope) : this.options.pk, + /* + send on server in following cases: + 1. url is function + 2. url is string AND (pk defined OR send option = always) + */ + send = !!(typeof this.options.url === 'function' || (this.options.url && ((this.options.send === 'always') || (this.options.send === 'auto' && pk !== null && pk !== undefined)))), + params; + + if (send) { //send to server + this.showLoading(); + + //standard params + params = { + name: this.options.name || '', + value: submitValue, + pk: pk + }; + + //additional params + if(typeof this.options.params === 'function') { + params = this.options.params.call(this.options.scope, params); + } else { + //try parse json in single quotes (from data-params attribute) + this.options.params = $.fn.editableutils.tryParseJson(this.options.params, true); + $.extend(params, this.options.params); + } + + if(typeof this.options.url === 'function') { //user's function + return this.options.url.call(this.options.scope, params); + } else { + //send ajax to server and return deferred object + return $.ajax($.extend({ + url : this.options.url, + data : params, + type : 'POST' + }, this.options.ajaxOptions)); + } + } + }, + + validate: function (value) { + if (value === undefined) { + value = this.value; + } + if (typeof this.options.validate === 'function') { + return this.options.validate.call(this.options.scope, value); + } + }, + + option: function(key, value) { + if(key in this.options) { + this.options[key] = value; + } + + if(key === 'value') { + this.setValue(value); + } + + //do not pass option to input as it is passed in editable-element + }, + + setValue: function(value, convertStr) { + if(convertStr) { + this.value = this.input.str2value(value); + } else { + this.value = value; + } + + //if form is visible, update input + if(this.$form && this.$form.is(':visible')) { + this.input.value2input(this.value); + } + } + }; + + /* + Initialize editableform. Applied to jQuery object. + + @method $().editableform(options) + @params {Object} options + @example + var $form = $('<div>').editableform({ + type: 'text', + name: 'username', + url: '/post', + value: 'vitaliy' + }); + + //to display form you should call 'render' method + $form.editableform('render'); + */ + $.fn.editableform = function (option) { + var args = arguments; + return this.each(function () { + var $this = $(this), + data = $this.data('editableform'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('editableform', (data = new EditableForm(this, options))); + } + + if (typeof option === 'string') { //call method + data[option].apply(data, Array.prototype.slice.call(args, 1)); + } + }); + }; + + //keep link to constructor to allow inheritance + $.fn.editableform.Constructor = EditableForm; + + //defaults + $.fn.editableform.defaults = { + /* see also defaults for input */ + + /** + Type of input. Can be text|textarea|select|date|checklist + + @property type + @type string + @default 'text' + **/ + type: 'text', + /** + Url for submit, e.g. '/post' + If function - it will be called instead of ajax. Function should return deferred object to run fail/done callbacks. + + @property url + @type string|function + @default null + @example + url: function(params) { + var d = new $.Deferred; + if(params.value === 'abc') { + return d.reject('error message'); //returning error via deferred object + } else { + //async saving data in js model + someModel.asyncSaveMethod({ + ..., + success: function(){ + d.resolve(); + } + }); + return d.promise(); + } + } + **/ + url:null, + /** + Additional params for submit. If defined as object - it is **appended** to original ajax data (pk, name and value). + If defined as function - returned object **overwrites** original ajax data. + @example + params: function(params) { + //originally params contain pk, name and value + params.a = 1; + return params; + } + + @property params + @type object|function + @default null + **/ + params:null, + /** + Name of field. Will be submitted on server. Can be taken from id attribute + + @property name + @type string + @default null + **/ + name: null, + /** + Primary key of editable object (e.g. record id in database). For composite keys use object, e.g. {id: 1, lang: 'en'}. + Can be calculated dynamically via function. + + @property pk + @type string|object|function + @default null + **/ + pk: null, + /** + Initial value. If not defined - will be taken from element's content. + For __select__ type should be defined (as it is ID of shown text). + + @property value + @type string|object + @default null + **/ + value: null, + /** + Value that will be displayed in input if original field value is empty (`null|undefined|''`). + + @property defaultValue + @type string|object + @default null + @since 1.4.6 + **/ + defaultValue: null, + /** + Strategy for sending data on server. Can be `auto|always|never`. + When 'auto' data will be sent on server **only if pk and url defined**, otherwise new value will be stored locally. + + @property send + @type string + @default 'auto' + **/ + send: 'auto', + /** + Function for client-side validation. If returns string - means validation not passed and string showed as error. + Since 1.5.1 you can modify submitted value by returning object from `validate`: + `{newValue: '...'}` or `{newValue: '...', msg: '...'}` + + @property validate + @type function + @default null + @example + validate: function(value) { + if($.trim(value) == '') { + return 'This field is required'; + } + } + **/ + validate: null, + /** + Success callback. Called when value successfully sent on server and **response status = 200**. + Usefull to work with json response. For example, if your backend response can be {success: true} + or `{success: false, msg: "server error"}` you can check it inside this callback. + If it returns **string** - means error occured and string is shown as error message. + If it returns **object like** `{newValue: <something>}` - it overwrites value, submitted by user + (useful when server changes value). + Otherwise newValue simply rendered into element. + + @property success + @type function + @default null + @example + success: function(response, newValue) { + if(!response.success) return response.msg; + } + **/ + success: null, + /** + Error callback. Called when request failed (response status != 200). + Usefull when you want to parse error response and display a custom message. + Must return **string** - the message to be displayed in the error block. + + @property error + @type function + @default null + @since 1.4.4 + @example + error: function(response, newValue) { + if(response.status === 500) { + return 'Service unavailable. Please try later.'; + } else { + return response.responseText; + } + } + **/ + error: null, + /** + Additional options for submit ajax request. + List of values: http://api.jquery.com/jQuery.ajax + + @property ajaxOptions + @type object + @default null + @since 1.1.1 + @example + ajaxOptions: { + type: 'put', + dataType: 'json' + } + **/ + ajaxOptions: null, + /** + Where to show buttons: left(true)|bottom|false + Form without buttons is auto-submitted. + + @property showbuttons + @type boolean|string + @default true + @since 1.1.1 + **/ + showbuttons: true, + /** + Scope for callback methods (success, validate). + If null means editableform instance itself. + + @property scope + @type DOMElement|object + @default null + @since 1.2.0 + @private + **/ + scope: null, + /** + Whether to save or cancel value when it was not changed but form was submitted + + @property savenochange + @type boolean + @default false + @since 1.2.0 + **/ + savenochange: false + }; + + /* + Note: following params could redefined in engine: bootstrap or jqueryui: + Classes 'control-group' and 'editable-error-block' must always present! + */ + $.fn.editableform.template = '
    '+ + '
    ' + + '
    '+ + '
    ' + + '
    ' + + '
    '; + + //loading div + $.fn.editableform.loading = '
    '; + + //buttons + $.fn.editableform.buttons = ''+ + ''; + + //error class attached to control-group + $.fn.editableform.errorGroupClass = null; + + //error class attached to editable-error-block + $.fn.editableform.errorBlockClass = 'editable-error'; + + //engine + $.fn.editableform.engine = 'jquery'; +}(window.jQuery)); + +/** +* EditableForm utilites +*/ +(function ($) { + "use strict"; + + //utils + $.fn.editableutils = { + /** + * classic JS inheritance function + */ + inherit: function (Child, Parent) { + var F = function() { }; + F.prototype = Parent.prototype; + Child.prototype = new F(); + Child.prototype.constructor = Child; + Child.superclass = Parent.prototype; + }, + + + /** + * 设置文字焦点 + * see http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area + */ + setCursorPosition: function(elem, pos) { + // see: https://github.com/vitalets/x-editable/issues/939 + if (elem.setSelectionRange && /text|search|password|url/i.test(elem.type)) { + try { elem.setSelectionRange(pos, pos); } catch (e) {} + + //选中文本 + }else if (elem.type == "tel"){ + var d = elem.value.lastIndexOf("."); + if(!d){ + d = elem.value.length; + } + elem.selectionStart = 0; // 选中开始位置 + elem.selectionEnd = d; + //elem.select(); + } else if (elem.createTextRange) { + var range = elem.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }, + + /** + * function to parse JSON in *single* quotes. (jquery automatically parse only double quotes) + * That allows such code as:
    + * safe = true --> means no exception will be thrown + * for details see http://stackoverflow.com/questions/7410348/how-to-set-json-format-to-html5-data-attributes-in-the-jquery + */ + tryParseJson: function(s, safe) { + if (typeof s === 'string' && s.length && s.match(/^[\{\[].*[\}\]]$/)) { + if (safe) { + try { + /*jslint evil: true*/ + s = (new Function('return ' + s))(); + /*jslint evil: false*/ + } catch (e) {} finally { + return s; + } + } else { + /*jslint evil: true*/ + s = (new Function('return ' + s))(); + /*jslint evil: false*/ + } + } + return s; + }, + + /** + * slice object by specified keys + */ + sliceObj: function(obj, keys, caseSensitive /* default: false */) { + var key, keyLower, newObj = {}; + + if (!$.isArray(keys) || !keys.length) { + return newObj; + } + + for (var i = 0; i < keys.length; i++) { + key = keys[i]; + if (obj.hasOwnProperty(key)) { + newObj[key] = obj[key]; + } + + if(caseSensitive === true) { + continue; + } + + //when getting data-* attributes via $.data() it's converted to lowercase. + //details: http://stackoverflow.com/questions/7602565/using-data-attributes-with-jquery + //workaround is code below. + keyLower = key.toLowerCase(); + if (obj.hasOwnProperty(keyLower)) { + newObj[key] = obj[keyLower]; + } + } + + return newObj; + }, + + /* + exclude complex objects from $.data() before pass to config + */ + getConfigData: function($element) { + var data = {}; + $.each($element[0].dataset, function(k, v) { + if(typeof v !== 'object' || (v && typeof v === 'object' && (v.constructor === Object || v.constructor === Array))) { + data[k] = v; + } + }); + return data; + }, + + /* + returns keys of object + */ + objectKeys: function(o) { + if (Object.keys) { + return Object.keys(o); + } else { + if (o !== Object(o)) { + throw new TypeError('Object.keys called on a non-object'); + } + var k=[], p; + for (p in o) { + if (Object.prototype.hasOwnProperty.call(o,p)) { + k.push(p); + } + } + return k; + } + + }, + + /** + method to escape html. + **/ + escape: function(str) { + return $('
    ').text(str).html(); + }, + + /* + returns array items from sourceData having value property equal or inArray of 'value' + */ + itemsByValue: function(value, sourceData, valueProp) { + if(!sourceData || value === null) { + return []; + } + + if (typeof(valueProp) !== "function") { + var idKey = valueProp || 'value'; + valueProp = function (e) { return e[idKey]; }; + } + + var isValArray = $.isArray(value), + result = [], + that = this; + + $.each(sourceData, function(i, o) { + if(o.children) { + result = result.concat(that.itemsByValue(value, o.children, valueProp)); + } else { + /*jslint eqeq: true*/ + if(isValArray) { + if($.grep(value, function(v){ return v == (o && typeof o === 'object' ? valueProp(o) : o); }).length) { + result.push(o); + } + } else { + var itemValue = (o && (typeof o === 'object')) ? valueProp(o) : o; + if(value == itemValue) { + result.push(o); + } + } + /*jslint eqeq: false*/ + } + }); + + return result; + }, + + /* + Returns input by options: type, mode. + */ + createInput: function(options) { + var TypeConstructor, typeOptions, input, + type = options.type; + + //`date` is some kind of virtual type that is transformed to one of exact types + //depending on mode and core lib + if(type === 'date') { + //inline + if(options.mode === 'inline') { + if($.fn.editabletypes.datefield) { + type = 'datefield'; + } else if($.fn.editabletypes.dateuifield) { + type = 'dateuifield'; + } + //popup + } else { + if($.fn.editabletypes.date) { + type = 'date'; + } else if($.fn.editabletypes.dateui) { + type = 'dateui'; + } + } + + //if type still `date` and not exist in types, replace with `combodate` that is base input + if(type === 'date' && !$.fn.editabletypes.date) { + type = 'combodate'; + } + } + + //`datetime` should be datetimefield in 'inline' mode + if(type === 'datetime' && options.mode === 'inline') { + type = 'datetimefield'; + } + + //change wysihtml5 to textarea for jquery UI and plain versions + if(type === 'wysihtml5' && !$.fn.editabletypes[type]) { + type = 'textarea'; + } + + //create input of specified type. Input will be used for converting value, not in form + if(typeof $.fn.editabletypes[type] === 'function') { + TypeConstructor = $.fn.editabletypes[type]; + typeOptions = this.sliceObj(options, this.objectKeys(TypeConstructor.defaults)); + input = new TypeConstructor(typeOptions); + return input; + } else { + $.error('Unknown type: '+ type); + return false; + } + }, + + //see http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr + supportsTransitions: function () { + var b = document.body || document.documentElement, + s = b.style, + p = 'transition', + v = ['Moz', 'Webkit', 'Khtml', 'O', 'ms']; + + if(typeof s[p] === 'string') { + return true; + } + + // Tests for vendor specific prop + p = p.charAt(0).toUpperCase() + p.substr(1); + for(var i=0; i +This method applied internally in $().editable(). You should subscribe on it's events (save / cancel) to get profit of it.
    +Final realization can be different: bootstrap-popover, jqueryui-tooltip, poshytip, inline-div. It depends on which js file you include.
    +Applied as jQuery method. + +@class editableContainer +@uses editableform +**/ +(function ($) { + "use strict"; + + var Popup = function (element, options) { + this.init(element, options); + }; + + var Inline = function (element, options) { + this.init(element, options); + }; + + //methods + Popup.prototype = { + containerName: null, //method to call container on element + containerDataName: null, //object name in element's .data() + innerCss: null, //tbd in child class + containerClass: 'editable-container editable-popup', //css class applied to container element + defaults: {}, //container itself defaults + + init: function(element, options) { + this.$element = $(element); + //since 1.4.1 container do not use data-* directly as they already merged into options. + this.options = $.extend({}, $.fn.editableContainer.defaults, options); + this.splitOptions(); + + //set scope of form callbacks to element + this.formOptions.scope = this.$element[0]; + + this.initContainer(); + + //flag to hide container, when saving value will finish + this.delayedHide = false; + + //bind 'destroyed' listener to destroy container when element is removed from dom + this.$element.on('destroyed', $.proxy(function(){ + this.destroy(); + }, this)); + + //attach document handler to close containers on click / escape + if(!$(document).data('editable-handlers-attached')) { + //close all on escape + $(document).on('keyup.editable', function (e) { + if (e.which === 27) { + $('.editable-open').editableContainer('hide', 'cancel'); + //todo: return focus on element + } + }); + + //close containers when click outside + //(mousedown could be better than click, it closes everything also on drag drop) + $(document).on('click.editable', function(e) { + var $target = $(e.target), i, + exclude_classes = ['.editable-container', + '.ui-datepicker-header', + '.datepicker', //in inline mode datepicker is rendered into body + '.modal-backdrop', + '.bootstrap-wysihtml5-insert-image-modal', + '.bootstrap-wysihtml5-insert-link-modal' + ]; + + // select2 has extra body click in IE + // see: https://github.com/ivaynberg/select2/issues/1058 + if ($('.select2-drop-mask').is(':visible')) { + return; + } + + //check if element is detached. It occurs when clicking in bootstrap datepicker + if (!$.contains(document.documentElement, e.target)) { + return; + } + + //for some reason FF 20 generates extra event (click) in select2 widget with e.target = document + //we need to filter it via construction below. See https://github.com/vitalets/x-editable/issues/199 + //Possibly related to http://stackoverflow.com/questions/10119793/why-does-firefox-react-differently-from-webkit-and-ie-to-click-event-on-selec + if($target.is(document)) { + return; + } + + //if click inside one of exclude classes --> no nothing + for(i=0; i container changes size before hide. + */ + + //if form already exist - delete previous data + if(this.$form) { + //todo: destroy prev data! + //this.$form.destroy(); + } + + this.$form = $('
    '); + + //insert form into container body + if(this.tip().is(this.innerCss)) { + //for inline container + this.tip().append(this.$form); + } else { + this.tip().find(this.innerCss).append(this.$form); + } + + //render form + this.renderForm(); + }, + + /** + Hides container with form + @method hide() + @param {string} reason Reason caused hiding. Can be save|cancel|onblur|nochange|undefined (=manual) + **/ + hide: function(reason) { + if(!this.tip() || !this.tip().is(':visible') || !this.$element.hasClass('editable-open')) { + return; + } + + //if form is saving value, schedule hide + if(this.$form.data('editableform').isSaving) { + this.delayedHide = {reason: reason}; + return; + } else { + this.delayedHide = false; + } + + this.$element.removeClass('editable-open'); + this.innerHide(); + + /** + Fired when container was hidden. It occurs on both save or cancel. + **Note:** Bootstrap popover has own `hidden` event that now cannot be separated from x-editable's one. + The workaround is to check `arguments.length` that is always `2` for x-editable. + + @event hidden + @param {object} event event object + @param {string} reason Reason caused hiding. Can be save|cancel|onblur|nochange|manual + @example + $('#username').on('hidden', function(e, reason) { + if(reason === 'save' || reason === 'cancel') { + //auto-open next editable + $(this).closest('tr').next().find('.editable').editable('show'); + } + }); + **/ + this.$element.triggerHandler('hidden', reason || 'manual'); + }, + + /* internal show method. To be overwritten in child classes */ + innerShow: function () { + + }, + + /* internal hide method. To be overwritten in child classes */ + innerHide: function () { + + }, + + /** + Toggles container visibility (show / hide) + @method toggle() + @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true. + **/ + toggle: function(closeAll) { + if(this.container() && this.tip() && this.tip().is(':visible')) { + this.hide(); + } else { + this.show(closeAll); + } + }, + + /* + Updates the position of container when content changed. + @method setPosition() + */ + setPosition: function() { + //tbd in child class + }, + + save: function(e, params) { + /** + Fired when new value was submitted. You can use $(this).data('editableContainer') inside handler to access to editableContainer instance + + @event save + @param {Object} event event object + @param {Object} params additional params + @param {mixed} params.newValue submitted value + @param {Object} params.response ajax response + @example + $('#username').on('save', function(e, params) { + //assuming server response: '{success: true}' + var pk = $(this).data('editableContainer').options.pk; + if(params.response && params.response.success) { + alert('value: ' + params.newValue + ' with pk: ' + pk + ' saved!'); + } else { + alert('error!'); + } + }); + **/ + this.$element.triggerHandler('save', params); + + //hide must be after trigger, as saving value may require methods of plugin, applied to input + this.hide('save'); + }, + + /** + Sets new option + + @method option(key, value) + @param {string} key + @param {mixed} value + **/ + option: function(key, value) { + this.options[key] = value; + if(key in this.containerOptions) { + this.containerOptions[key] = value; + this.setContainerOption(key, value); + } else { + this.formOptions[key] = value; + if(this.$form) { + this.$form.editableform('option', key, value); + } + } + }, + + setContainerOption: function(key, value) { + this.call('option', key, value); + }, + + /** + Destroys the container instance + @method destroy() + **/ + destroy: function() { + this.hide(); + this.innerDestroy(); + this.$element.off('destroyed'); + this.$element.removeData('editableContainer'); + }, + + /* to be overwritten in child classes */ + innerDestroy: function() { + + }, + + /* + Closes other containers except one related to passed element. + Other containers can be cancelled or submitted (depends on onblur option) + */ + closeOthers: function(element) { + $('.editable-open').each(function(i, el){ + //do nothing with passed element and it's children + if(el === element || $(el).find(element).length) { + return; + } + + //otherwise cancel or submit all open containers + var $el = $(el), + ec = $el.data('editableContainer'); + + if(!ec) { + return; + } + + if(ec.options.onblur === 'cancel') { + $el.data('editableContainer').hide('onblur'); + } else if(ec.options.onblur === 'submit') { + $el.data('editableContainer').tip().find('form').submit(); + } + }); + + }, + + /** + Activates input of visible container (e.g. set focus) + @method activate() + **/ + activate: function() { + if(this.tip && this.tip().is(':visible') && this.$form) { + this.$form.data('editableform').input.activate(); + } + } + + }; + + /** + jQuery method to initialize editableContainer. + + @method $().editableContainer(options) + @params {Object} options + @example + $('#edit').editableContainer({ + type: 'text', + url: '/post', + pk: 1, + value: 'hello' + }); + **/ + $.fn.editableContainer = function (option) { + var args = arguments; + return this.each(function () { + var $this = $(this), + dataKey = 'editableContainer', + data = $this.data(dataKey), + options = typeof option === 'object' && option, + Constructor = (options.mode === 'inline') ? Inline : Popup; + + if (!data) { + $this.data(dataKey, (data = new Constructor(this, options))); + } + + if (typeof option === 'string') { //call method + data[option].apply(data, Array.prototype.slice.call(args, 1)); + } + }); + }; + + //store constructors + $.fn.editableContainer.Popup = Popup; + $.fn.editableContainer.Inline = Inline; + + //defaults + $.fn.editableContainer.defaults = { + /** + Initial value of form input + + @property value + @type mixed + @default null + @private + **/ + value: null, + /** + Placement of container relative to element. Can be top|right|bottom|left. Not used for inline container. + + @property placement + @type string + @default 'top' + **/ + placement: 'top', + /** + Whether to hide container on save/cancel. + + @property autohide + @type boolean + @default true + @private + **/ + autohide: true, + /** + Action when user clicks outside the container. Can be cancel|submit|ignore. + Setting ignore allows to have several containers open. + + @property onblur + @type string + @default 'cancel' + @since 1.1.1 + **/ + onblur: 'cancel', + + /** + Animation speed (inline mode only) + @property anim + @type string + @default false + **/ + anim: false, + + /** + Mode of editable, can be `popup` or `inline` + + @property mode + @type string + @default 'popup' + @since 1.4.0 + **/ + mode: 'popup' + }; + + /* + * workaround to have 'destroyed' event to destroy popover when element is destroyed + * see http://stackoverflow.com/questions/2200494/jquery-trigger-event-when-an-element-is-removed-from-the-dom + */ + jQuery.event.special.destroyed = { + remove: function(o) { + if (o.handler) { + o.handler(); + } + } + }; + +}(window.jQuery)); + +/** +* Editable Inline +* --------------------- +*/ +(function ($) { + "use strict"; + + //copy prototype from EditableContainer + //extend methods + $.extend($.fn.editableContainer.Inline.prototype, $.fn.editableContainer.Popup.prototype, { + containerName: 'editableform', + innerCss: '.editable-inline', + containerClass: 'editable-container editable-inline', //css class applied to container element + + initContainer: function(){ + //container is element + this.$tip = $(''); + + //convert anim to miliseconds (int) + if(!this.options.anim) { + this.options.anim = 0; + } + }, + + splitOptions: function() { + //all options are passed to form + this.containerOptions = {}; + this.formOptions = this.options; + }, + + tip: function() { + return this.$tip; + }, + + innerShow: function () { + this.$element.hide(); + this.tip().insertAfter(this.$element).show(); + }, + + innerHide: function () { + this.$tip.hide(this.options.anim, $.proxy(function() { + this.$element.show(); + this.innerDestroy(); + }, this)); + }, + + innerDestroy: function() { + if(this.tip()) { + this.tip().empty().remove(); + } + } + }); + +}(window.jQuery)); +/** +Makes editable any HTML element on the page. Applied as jQuery method. + +@class editable +@uses editableContainer +**/ +(function ($) { + "use strict"; + + var Editable = function (element, options) { + this.$element = $(element); + //data-* has more priority over js options: because dynamically created elements may change data-* + this.options = $.extend({}, $.fn.editable.defaults, options, $.fn.editableutils.getConfigData(this.$element)); + if(this.options.selector) { + this.initLive(); + } else { + this.init(); + } + + //check for transition support + if(this.options.highlight && !$.fn.editableutils.supportsTransitions()) { + this.options.highlight = false; + } + }; + + Editable.prototype = { + constructor: Editable, + init: function () { + var isValueByText = false, + doAutotext, finalize; + + //name + this.options.name = this.options.name || this.$element.attr('id'); + + //create input of specified type. Input needed already here to convert value for initial display (e.g. show text by id for select) + //also we set scope option to have access to element inside input specific callbacks (e. g. source as function) + this.options.scope = this.$element[0]; + this.input = $.fn.editableutils.createInput(this.options); + if(!this.input) { + return; + } + + //set value from settings or by element's text + if (this.options.value === undefined || this.options.value === null) { + this.value = this.input.html2value($.trim(this.$element.html())); + isValueByText = true; + } else { + /* + value can be string when received from 'data-value' attribute + for complext objects value can be set as json string in data-value attribute, + e.g. data-value="{city: 'Moscow', street: 'Lenina'}" + */ + this.options.value = $.fn.editableutils.tryParseJson(this.options.value, true); + if(typeof this.options.value === 'string') { + this.value = this.input.str2value(this.options.value); + } else { + this.value = this.options.value; + } + } + + //add 'editable' class to every editable element + this.$element.addClass('editable'); + + //specifically for "textarea" add class .editable-pre-wrapped to keep linebreaks + if(this.input.type === 'textarea') { + this.$element.addClass('editable-pre-wrapped'); + } + + //attach handler activating editable. In disabled mode it just prevent default action (useful for links) + if(this.options.toggle !== 'manual') { + this.$element.addClass('editable-click'); + this.$element.on(this.options.toggle + '.editable', $.proxy(function(e){ + //prevent following link if editable enabled + if(!this.options.disabled) { + e.preventDefault(); + } + + //stop propagation not required because in document click handler it checks event target + //e.stopPropagation(); + + if(this.options.toggle === 'mouseenter') { + //for hover only show container + this.show(); + } else { + //when toggle='click' we should not close all other containers as they will be closed automatically in document click listener + var closeAll = (this.options.toggle !== 'click'); + this.toggle(closeAll); + } + }, this)); + } else { + this.$element.attr('tabindex', -1); //do not stop focus on element when toggled manually + } + + //if display is function it's far more convinient to have autotext = always to render correctly on init + //see https://github.com/vitalets/x-editable-yii/issues/34 + if(typeof this.options.display === 'function') { + this.options.autotext = 'always'; + } + + //check conditions for autotext: + switch(this.options.autotext) { + case 'always': + doAutotext = true; + break; + case 'auto': + //if element text is empty and value is defined and value not generated by text --> run autotext + doAutotext = !$.trim(this.$element.text()).length && this.value !== null && this.value !== undefined && !isValueByText; + break; + default: + doAutotext = false; + } + + //depending on autotext run render() or just finilize init + $.when(doAutotext ? this.render() : true).then($.proxy(function() { + if(this.options.disabled) { + this.disable(); + } else { + this.enable(); + } + /** + Fired when element was initialized by `$().editable()` method. + Please note that you should setup `init` handler **before** applying `editable`. + + @event init + @param {Object} event event object + @param {Object} editable editable instance (as here it cannot accessed via data('editable')) + @since 1.2.0 + @example + $('#username').on('init', function(e, editable) { + alert('initialized ' + editable.options.name); + }); + $('#username').editable(); + **/ + this.$element.triggerHandler('init', this); + }, this)); + }, + + /* + Initializes parent element for live editables + */ + initLive: function() { + //store selector + var selector = this.options.selector; + //modify options for child elements + this.options.selector = false; + this.options.autotext = 'never'; + //listen toggle events + this.$element.on(this.options.toggle + '.editable', selector, $.proxy(function(e){ + var $target = $(e.target).closest(selector); + if(!$target.data('editable')) { + //if delegated element initially empty, we need to clear it's text (that was manually set to `empty` by user) + //see https://github.com/vitalets/x-editable/issues/137 + if($target.hasClass(this.options.emptyclass)) { + $target.empty(); + } + $target.editable(this.options).trigger(e); + } + }, this)); + }, + + /* + Renders value into element's text. + Can call custom display method from options. + Can return deferred object. + @method render() + @param {mixed} response server response (if exist) to pass into display function + */ + render: function(response) { + //do not display anything + if(this.options.display === false) { + return; + } + + //if input has `value2htmlFinal` method, we pass callback in third param to be called when source is loaded + if(this.input.value2htmlFinal) { + return this.input.value2html(this.value, this.$element[0], this.options.display, response); + //if display method defined --> use it + } else if(typeof this.options.display === 'function') { + return this.options.display.call(this.$element[0], this.value, response); + //else use input's original value2html() method + } else { + return this.input.value2html(this.value, this.$element[0]); + } + }, + + /** + Enables editable + @method enable() + **/ + enable: function() { + this.options.disabled = false; + this.$element.removeClass('editable-disabled'); + this.handleEmpty(this.isEmpty); + if(this.options.toggle !== 'manual') { + if(this.$element.attr('tabindex') === '-1') { + this.$element.removeAttr('tabindex'); + } + } + }, + + /** + Disables editable + @method disable() + **/ + disable: function() { + this.options.disabled = true; + this.hide(); + this.$element.addClass('editable-disabled'); + this.handleEmpty(this.isEmpty); + //do not stop focus on this element + this.$element.attr('tabindex', -1); + }, + + /** + Toggles enabled / disabled state of editable element + @method toggleDisabled() + **/ + toggleDisabled: function() { + if(this.options.disabled) { + this.enable(); + } else { + this.disable(); + } + }, + + /** + Sets new option + + @method option(key, value) + @param {string|object} key option name or object with several options + @param {mixed} value option new value + @example + $('.editable').editable('option', 'pk', 2); + **/ + option: function(key, value) { + //set option(s) by object + if(key && typeof key === 'object') { + $.each(key, $.proxy(function(k, v){ + this.option($.trim(k), v); + }, this)); + return; + } + + //set option by string + this.options[key] = value; + + //disabled + if(key === 'disabled') { + return value ? this.disable() : this.enable(); + } + + //value + if(key === 'value') { + this.setValue(value); + } + + //transfer new option to container! + if(this.container) { + this.container.option(key, value); + } + + //pass option to input directly (as it points to the same in form) + if(this.input.option) { + this.input.option(key, value); + } + + }, + + /* + * set emptytext if element is empty + */ + handleEmpty: function (isEmpty) { + //do not handle empty if we do not display anything + if(this.options.display === false) { + return; + } + + /* + isEmpty may be set directly as param of method. + It is required when we enable/disable field and can't rely on content + as node content is text: "Empty" that is not empty %) + */ + if(isEmpty !== undefined) { + this.isEmpty = isEmpty; + } else { + //detect empty + //for some inputs we need more smart check + //e.g. wysihtml5 may have
    ,

    , + if(typeof(this.input.isEmpty) === 'function') { + this.isEmpty = this.input.isEmpty(this.$element); + } else { + this.isEmpty = $.trim(this.$element.html()) === ''; + } + } + + //emptytext shown only for enabled + if(!this.options.disabled) { + if (this.isEmpty) { + this.$element.html(this.options.emptytext); + if(this.options.emptyclass) { + this.$element.addClass(this.options.emptyclass); + } + } else if(this.options.emptyclass) { + this.$element.removeClass(this.options.emptyclass); + } + } else { + //below required if element disable property was changed + if(this.isEmpty) { + this.$element.empty(); + if(this.options.emptyclass) { + this.$element.removeClass(this.options.emptyclass); + } + } + } + }, + + /** + Shows container with form + @method show() + @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true. + **/ + show: function (closeAll) { + if(this.options.disabled) { + return; + } + + //init editableContainer: popover, tooltip, inline, etc.. + if(!this.container) { + var containerOptions = $.extend({}, this.options, { + value: this.value, + input: this.input //pass input to form (as it is already created) + }); + this.$element.editableContainer(containerOptions); + //listen `save` event + this.$element.on("save.internal", $.proxy(this.save, this)); + this.container = this.$element.data('editableContainer'); + } else if(this.container.tip().is(':visible')) { + return; + } + + //show container + this.container.show(closeAll); + }, + + /** + Hides container with form + @method hide() + **/ + hide: function () { + if(this.container) { + this.container.hide(); + } + }, + + /** + Toggles container visibility (show / hide) + @method toggle() + @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true. + **/ + toggle: function(closeAll) { + if(this.container && this.container.tip().is(':visible')) { + this.hide(); + } else { + this.show(closeAll); + } + }, + + /* + * called when form was submitted + */ + save: function(e, params) { + //mark element with unsaved class if needed + if(this.options.unsavedclass) { + /* + Add unsaved css to element if: + - url is not user's function + - value was not sent to server + - params.response === undefined, that means data was not sent + - value changed + */ + var sent = false; + sent = sent || typeof this.options.url === 'function'; + sent = sent || this.options.display === false; + sent = sent || params.response !== undefined; + sent = sent || (this.options.savenochange && this.input.value2str(this.value) !== this.input.value2str(params.newValue)); + + if(sent) { + this.$element.removeClass(this.options.unsavedclass); + } else { + this.$element.addClass(this.options.unsavedclass); + } + } + + //highlight when saving + if(this.options.highlight) { + var $e = this.$element, + bgColor = $e.css('background-color'); + + $e.css('background-color', this.options.highlight); + setTimeout(function(){ + if(bgColor === 'transparent') { + bgColor = ''; + } + $e.css('background-color', bgColor); + $e.addClass('editable-bg-transition'); + setTimeout(function(){ + $e.removeClass('editable-bg-transition'); + }, 1700); + }, 10); + } + + //set new value + this.setValue(params.newValue, false, params.response); + + /** + Fired when new value was submitted. You can use $(this).data('editable') to access to editable instance + + @event save + @param {Object} event event object + @param {Object} params additional params + @param {mixed} params.newValue submitted value + @param {Object} params.response ajax response + @example + $('#username').on('save', function(e, params) { + alert('Saved value: ' + params.newValue); + }); + **/ + //event itself is triggered by editableContainer. Description here is only for documentation + }, + + validate: function () { + if (typeof this.options.validate === 'function') { + return this.options.validate.call(this, this.value); + } + }, + + /** + Sets new value of editable + @method setValue(value, convertStr) + @param {mixed} value new value + @param {boolean} convertStr whether to convert value from string to internal format + **/ + setValue: function(value, convertStr, response) { + if(convertStr) { + this.value = this.input.str2value(value); + } else { + this.value = value; + } + if(this.container) { + this.container.option('value', this.value); + } + $.when(this.render(response)) + .then($.proxy(function() { + this.handleEmpty(); + }, this)); + }, + + /** + Activates input of visible container (e.g. set focus) + @method activate() + **/ + activate: function() { + if(this.container) { + this.container.activate(); + } + }, + + /** + Removes editable feature from element + @method destroy() + **/ + destroy: function() { + this.disable(); + + if(this.container) { + this.container.destroy(); + } + + this.input.destroy(); + + if(this.options.toggle !== 'manual') { + this.$element.removeClass('editable-click'); + this.$element.off(this.options.toggle + '.editable'); + } + + this.$element.off("save.internal"); + + this.$element.removeClass('editable editable-open editable-disabled'); + this.$element.removeData('editable'); + } + }; + + /* EDITABLE PLUGIN DEFINITION + * ======================= */ + + /** + jQuery method to initialize editable element. + + @method $().editable(options) + @params {Object} options + @example + $('#username').editable({ + type: 'text', + url: '/post', + pk: 1 + }); + **/ + $.fn.editable = function (option) { + //special API methods returning non-jquery object + var result = {}, args = arguments, datakey = 'editable'; + switch (option) { + /** + Runs client-side validation for all matched editables + + @method validate() + @returns {Object} validation errors map + @example + $('#username, #fullname').editable('validate'); + // possible result: + { + username: "username is required", + fullname: "fullname should be minimum 3 letters length" + } + **/ + case 'validate': + this.each(function () { + var $this = $(this), data = $this.data(datakey), error; + if (data && (error = data.validate())) { + result[data.options.name] = error; + } + }); + return result; + + /** + Returns current values of editable elements. + Note that it returns an **object** with name-value pairs, not a value itself. It allows to get data from several elements. + If value of some editable is `null` or `undefined` it is excluded from result object. + When param `isSingle` is set to **true** - it is supposed you have single element and will return value of editable instead of object. + + @method getValue() + @param {bool} isSingle whether to return just value of single element + @returns {Object} object of element names and values + @example + $('#username, #fullname').editable('getValue'); + //result: + { + username: "superuser", + fullname: "John" + } + //isSingle = true + $('#username').editable('getValue', true); + //result "superuser" + **/ + case 'getValue': + if(arguments.length === 2 && arguments[1] === true) { //isSingle = true + result = this.eq(0).data(datakey).value; + } else { + this.each(function () { + var $this = $(this), data = $this.data(datakey); + if (data && data.value !== undefined && data.value !== null) { + result[data.options.name] = data.input.value2submit(data.value); + } + }); + } + return result; + + /** + This method collects values from several editable elements and submit them all to server. + Internally it runs client-side validation for all fields and submits only in case of success. + See
    creating new records for details. + Since 1.5.1 `submit` can be applied to single element to send data programmatically. In that case + `url`, `success` and `error` is taken from initial options and you can just call `$('#username').editable('submit')`. + + @method submit(options) + @param {object} options + @param {object} options.url url to submit data + @param {object} options.data additional data to submit + @param {object} options.ajaxOptions additional ajax options + @param {function} options.error(obj) error handler + @param {function} options.success(obj,config) success handler + @returns {Object} jQuery object + **/ + case 'submit': //collects value, validate and submit to server for creating new record + var config = arguments[1] || {}, + $elems = this, + errors = this.editable('validate'); + + // validation ok + if($.isEmptyObject(errors)) { + var ajaxOptions = {}; + + // for single element use url, success etc from options + if($elems.length === 1) { + var editable = $elems.data('editable'); + //standard params + var params = { + name: editable.options.name || '', + value: editable.input.value2submit(editable.value), + pk: (typeof editable.options.pk === 'function') ? + editable.options.pk.call(editable.options.scope) : + editable.options.pk + }; + + //additional params + if(typeof editable.options.params === 'function') { + params = editable.options.params.call(editable.options.scope, params); + } else { + //try parse json in single quotes (from data-params attribute) + editable.options.params = $.fn.editableutils.tryParseJson(editable.options.params, true); + $.extend(params, editable.options.params); + } + + ajaxOptions = { + url: editable.options.url, + data: params, + type: 'POST' + }; + + // use success / error from options + config.success = config.success || editable.options.success; + config.error = config.error || editable.options.error; + + // multiple elements + } else { + var values = this.editable('getValue'); + + ajaxOptions = { + url: config.url, + data: values, + type: 'POST' + }; + } + + // ajax success callabck (response 200 OK) + ajaxOptions.success = typeof config.success === 'function' ? function(response) { + config.success.call($elems, response, config); + } : $.noop; + + // ajax error callabck + ajaxOptions.error = typeof config.error === 'function' ? function() { + config.error.apply($elems, arguments); + } : $.noop; + + // extend ajaxOptions + if(config.ajaxOptions) { + $.extend(ajaxOptions, config.ajaxOptions); + } + + // extra data + if(config.data) { + $.extend(ajaxOptions.data, config.data); + } + + // perform ajax request + $.ajax(ajaxOptions); + } else { //client-side validation error + if(typeof config.error === 'function') { + config.error.call($elems, errors); + } + } + return this; + } + + //return jquery object + return this.each(function () { + var $this = $(this), + data = $this.data(datakey), + options = typeof option === 'object' && option; + + //for delegated targets do not store `editable` object for element + //it's allows several different selectors. + //see: https://github.com/vitalets/x-editable/issues/312 + if(options && options.selector) { + data = new Editable(this, options); + return; + } + + if (!data) { + $this.data(datakey, (data = new Editable(this, options))); + } + + if (typeof option === 'string') { //call method + data[option].apply(data, Array.prototype.slice.call(args, 1)); + } + }); + }; + + + $.fn.editable.defaults = { + /** + Type of input. Can be text|textarea|select|date|checklist and more + + @property type + @type string + @default 'text' + **/ + type: 'text', + /** + Sets disabled state of editable + + @property disabled + @type boolean + @default false + **/ + disabled: false, + /** + How to toggle editable. Can be click|dblclick|mouseenter|manual. + When set to manual you should manually call show/hide methods of editable. + **Note**: if you call show or toggle inside **click** handler of some DOM element, + you need to apply e.stopPropagation() because containers are being closed on any click on document. + + @example + $('#edit-button').click(function(e) { + e.stopPropagation(); + $('#username').editable('toggle'); + }); + + @property toggle + @type string + @default 'click' + **/ + toggle: 'click', + /** + Text shown when element is empty. + + @property emptytext + @type string + @default 'Empty' + **/ + emptytext: 'Empty', + /** + Allows to automatically set element's text based on it's value. Can be auto|always|never. Useful for select and date. + For example, if dropdown list is {1: 'a', 2: 'b'} and element's value set to 1, it's html will be automatically set to 'a'. + auto - text will be automatically set only if element is empty. + always|never - always(never) try to set element's text. + + @property autotext + @type string + @default 'auto' + **/ + autotext: 'auto', + /** + Initial value of input. If not set, taken from element's text. + Note, that if element's text is empty - text is automatically generated from value and can be customized (see `autotext` option). + For example, to display currency sign: + @example + + + + @property value + @type mixed + @default element's text + **/ + value: null, + /** + Callback to perform custom displaying of value in element's text. + If `null`, default input's display used. + If `false`, no displaying methods will be called, element's text will never change. + Runs under element's scope. + _**Parameters:**_ + + * `value` current value to be displayed + * `response` server response (if display called after ajax submit), since 1.4.0 + + For _inputs with source_ (select, checklist) parameters are different: + + * `value` current value to be displayed + * `sourceData` array of items for current input (e.g. dropdown items) + * `response` server response (if display called after ajax submit), since 1.4.0 + + To get currently selected items use `$.fn.editableutils.itemsByValue(value, sourceData)`. + + @property display + @type function|boolean + @default null + @since 1.2.0 + @example + display: function(value, sourceData) { + //display checklist as comma-separated values + var html = [], + checked = $.fn.editableutils.itemsByValue(value, sourceData); + + if(checked.length) { + $.each(checked, function(i, v) { html.push($.fn.editableutils.escape(v.text)); }); + $(this).html(html.join(', ')); + } else { + $(this).empty(); + } + } + **/ + display: null, + /** + Css class applied when editable text is empty. + + @property emptyclass + @type string + @since 1.4.1 + @default editable-empty + **/ + emptyclass: 'editable-empty', + /** + Css class applied when value was stored but not sent to server (`pk` is empty or `send = 'never'`). + You may set it to `null` if you work with editables locally and submit them together. + + @property unsavedclass + @type string + @since 1.4.1 + @default editable-unsaved + **/ + unsavedclass: 'editable-unsaved', + /** + If selector is provided, editable will be delegated to the specified targets. + Usefull for dynamically generated DOM elements. + **Please note**, that delegated targets can't be initialized with `emptytext` and `autotext` options, + as they actually become editable only after first click. + You should manually set class `editable-click` to these elements. + Also, if element originally empty you should add class `editable-empty`, set `data-value=""` and write emptytext into element: + + @property selector + @type string + @since 1.4.1 + @default null + @example +
    + + Empty + + Operator +
    + + + **/ + selector: null, + /** + Color used to highlight element after update. Implemented via CSS3 transition, works in modern browsers. + + @property highlight + @type string|boolean + @since 1.4.5 + @default #FFFF80 + **/ + highlight: '#FFFF80' + }; + +}(window.jQuery)); + +/** +AbstractInput - base class for all editable inputs. +It defines interface to be implemented by any input type. +To create your own input you can inherit from this class. + +@class abstractinput +**/ +(function ($) { + "use strict"; + + //types + $.fn.editabletypes = {}; + + var AbstractInput = function () { }; + + AbstractInput.prototype = { + /** + Initializes input + + @method init() + **/ + init: function(type, options, defaults) { + this.type = type; + this.options = $.extend({}, defaults, options); + }, + + /* + this method called before render to init $tpl that is inserted in DOM + */ + prerender: function() { + this.$tpl = $(this.options.tpl); //whole tpl as jquery object + this.$input = this.$tpl; //control itself, can be changed in render method + this.$clear = null; //clear button + this.error = null; //error message, if input cannot be rendered + }, + + /** + Renders input from tpl. Can return jQuery deferred object. + Can be overwritten in child objects + + @method render() + **/ + render: function() { + + }, + + /** + Sets element's html by value. + + @method value2html(value, element) + @param {mixed} value + @param {DOMElement} element + **/ + value2html: function(value, element) { + $(element)[this.options.escape ? 'text' : 'html']($.trim(value)); + }, + + /** + Converts element's html to value + + @method html2value(html) + @param {string} html + @returns {mixed} + **/ + html2value: function(html) { + return $('
    ').html(html).text(); + }, + + /** + Converts value to string (for internal compare). For submitting to server used value2submit(). + + @method value2str(value) + @param {mixed} value + @returns {string} + **/ + value2str: function(value) { + return String(value); + }, + + /** + Converts string received from server into value. Usually from `data-value` attribute. + + @method str2value(str) + @param {string} str + @returns {mixed} + **/ + str2value: function(str) { + return str; + }, + + /** + Converts value for submitting to server. Result can be string or object. + + @method value2submit(value) + @param {mixed} value + @returns {mixed} + **/ + value2submit: function(value) { + return value; + }, + + /** + Sets value of input. + + @method value2input(value) + @param {mixed} value + **/ + value2input: function(value) { + this.$input.val(value); + }, + + /** + Returns value of input. Value can be object (e.g. datepicker) + + @method input2value() + **/ + input2value: function() { + return this.$input.val(); + }, + + /** + Activates input. For text it sets focus. + + @method activate() + **/ + activate: function() { + if(this.$input.is(':visible')) { + this.$input.focus(); + } + }, + + /** + Creates input. + + @method clear() + **/ + clear: function() { + this.$input.val(null); + }, + + /** + method to escape html. + **/ + escape: function(str) { + return $('
    ').text(str).html(); + }, + + /** + attach handler to automatically submit form when value changed (useful when buttons not shown) + **/ + autosubmit: function() { + + }, + + /** + Additional actions when destroying element + **/ + destroy: function() { + }, + + // -------- helper functions -------- + setClass: function() { + if(this.options.inputclass) { + this.$input.addClass(this.options.inputclass); + } + }, + + setAttr: function(attr) { + if (this.options[attr] !== undefined && this.options[attr] !== null) { + this.$input.attr(attr, this.options[attr]); + } + }, + + option: function(key, value) { + this.options[key] = value; + } + + }; + + AbstractInput.defaults = { + /** + HTML template of input. Normally you should not change it. + + @property tpl + @type string + @default '' + **/ + tpl: '', + /** + CSS class automatically applied to input + + @property inputclass + @type string + @default null + **/ + inputclass: null, + + /** + If `true` - html will be escaped in content of element via $.text() method. + If `false` - html will not be escaped, $.html() used. + When you use own `display` function, this option obviosly has no effect. + + @property escape + @type boolean + @since 1.5.0 + @default true + **/ + escape: true, + + //scope for external methods (e.g. source defined as function) + //for internal use only + scope: null, + + //need to re-declare showbuttons here to get it's value from common config (passed only options existing in defaults) + showbuttons: true + }; + + $.extend($.fn.editabletypes, {abstractinput: AbstractInput}); + +}(window.jQuery)); + +/** +List - abstract class for inputs that have source option loaded from js array or via ajax + +@class list +@extends abstractinput +**/ +(function ($) { + "use strict"; + + var List = function (options) { + + }; + + $.fn.editableutils.inherit(List, $.fn.editabletypes.abstractinput); + + $.extend(List.prototype, { + render: function () { + var deferred = $.Deferred(); + + this.error = null; + this.onSourceReady(function () { + this.renderList(); + deferred.resolve(); + }, function () { + this.error = this.options.sourceError; + deferred.resolve(); + }); + + return deferred.promise(); + }, + + html2value: function (html) { + return null; //can't set value by text + }, + + value2html: function (value, element, display, response) { + var deferred = $.Deferred(), + success = function () { + if(typeof display === 'function') { + //custom display method + display.call(element, value, this.sourceData, response); + } else { + this.value2htmlFinal(value, element); + } + deferred.resolve(); + }; + + //for null value just call success without loading source + if(value === null) { + success.call(this); + } else { + this.onSourceReady(success, function () { deferred.resolve(); }); + } + + return deferred.promise(); + }, + + // ------------- additional functions ------------ + + onSourceReady: function (success, error) { + //run source if it function + var source; + if ($.isFunction(this.options.source)) { + source = this.options.source.call(this.options.scope); + this.sourceData = null; + //note: if function returns the same source as URL - sourceData will be taken from cahce and no extra request performed + } else { + source = this.options.source; + } + + //if allready loaded just call success + if(this.options.sourceCache && $.isArray(this.sourceData)) { + success.call(this); + return; + } + + //try parse json in single quotes (for double quotes jquery does automatically) + try { + source = $.fn.editableutils.tryParseJson(source, false); + } catch (e) { + error.call(this); + return; + } + + //loading from url + if (typeof source === 'string') { + //try to get sourceData from cache + if(this.options.sourceCache) { + var cacheID = source, + cache; + + if (!$(document).data(cacheID)) { + $(document).data(cacheID, {}); + } + cache = $(document).data(cacheID); + + //check for cached data + if (cache.loading === false && cache.sourceData) { //take source from cache + this.sourceData = cache.sourceData; + this.doPrepend(); + success.call(this); + return; + } else if (cache.loading === true) { //cache is loading, put callback in stack to be called later + cache.callbacks.push($.proxy(function () { + this.sourceData = cache.sourceData; + this.doPrepend(); + success.call(this); + }, this)); + + //also collecting error callbacks + cache.err_callbacks.push($.proxy(error, this)); + return; + } else { //no cache yet, activate it + cache.loading = true; + cache.callbacks = []; + cache.err_callbacks = []; + } + } + + //ajaxOptions for source. Can be overwritten bt options.sourceOptions + var ajaxOptions = $.extend({ + url: source, + type: 'get', + cache: false, + dataType: 'json', + success: $.proxy(function (data) { + if(cache) { + cache.loading = false; + } + this.sourceData = this.makeArray(data); + if($.isArray(this.sourceData)) { + if(cache) { + //store result in cache + cache.sourceData = this.sourceData; + //run success callbacks for other fields waiting for this source + $.each(cache.callbacks, function () { this.call(); }); + } + this.doPrepend(); + success.call(this); + } else { + error.call(this); + if(cache) { + //run error callbacks for other fields waiting for this source + $.each(cache.err_callbacks, function () { this.call(); }); + } + } + }, this), + error: $.proxy(function () { + error.call(this); + if(cache) { + cache.loading = false; + //run error callbacks for other fields + $.each(cache.err_callbacks, function () { this.call(); }); + } + }, this) + }, this.options.sourceOptions); + + //loading sourceData from server + $.ajax(ajaxOptions); + + } else { //options as json/array + this.sourceData = this.makeArray(source); + + if($.isArray(this.sourceData)) { + this.doPrepend(); + success.call(this); + } else { + error.call(this); + } + } + }, + + doPrepend: function () { + if(this.options.prepend === null || this.options.prepend === undefined) { + return; + } + + if(!$.isArray(this.prependData)) { + //run prepend if it is function (once) + if ($.isFunction(this.options.prepend)) { + this.options.prepend = this.options.prepend.call(this.options.scope); + } + + //try parse json in single quotes + this.options.prepend = $.fn.editableutils.tryParseJson(this.options.prepend, true); + + //convert prepend from string to object + if (typeof this.options.prepend === 'string') { + this.options.prepend = {'': this.options.prepend}; + } + + this.prependData = this.makeArray(this.options.prepend); + } + + if($.isArray(this.prependData) && $.isArray(this.sourceData)) { + this.sourceData = this.prependData.concat(this.sourceData); + } + }, + + /* + renders input list + */ + renderList: function() { + // this method should be overwritten in child class + }, + + /* + set element's html by value + */ + value2htmlFinal: function(value, element) { + // this method should be overwritten in child class + }, + + /** + * convert data to array suitable for sourceData, e.g. [{value: 1, text: 'abc'}, {...}] + */ + makeArray: function(data) { + var count, obj, result = [], item, iterateItem; + if(!data || typeof data === 'string') { + return null; + } + + if($.isArray(data)) { //array + /* + function to iterate inside item of array if item is object. + Caclulates count of keys in item and store in obj. + */ + iterateItem = function (k, v) { + obj = {value: k, text: v}; + if(count++ >= 2) { + return false;// exit from `each` if item has more than one key. + } + }; + + for(var i = 0; i < data.length; i++) { + item = data[i]; + if(typeof item === 'object') { + count = 0; //count of keys inside item + $.each(item, iterateItem); + //case: [{val1: 'text1'}, {val2: 'text2} ...] + if(count === 1) { + result.push(obj); + //case: [{value: 1, text: 'text1'}, {value: 2, text: 'text2'}, ...] + } else if(count > 1) { + //removed check of existance: item.hasOwnProperty('value') && item.hasOwnProperty('text') + if(item.children) { + item.children = this.makeArray(item.children); + } + result.push(item); + } + } else { + //case: ['text1', 'text2' ...] + result.push({value: item, text: item}); + } + } + } else { //case: {val1: 'text1', val2: 'text2, ...} + $.each(data, function (k, v) { + result.push({value: k, text: v}); + }); + } + return result; + }, + + option: function(key, value) { + this.options[key] = value; + if(key === 'source') { + this.sourceData = null; + } + if(key === 'prepend') { + this.prependData = null; + } + } + + }); + + List.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, { + /** + Source data for list. + If **array** - it should be in format: `[{value: 1, text: "text1"}, {value: 2, text: "text2"}, ...]` + For compability, object format is also supported: `{"1": "text1", "2": "text2" ...}` but it does not guarantee elements order. + + If **string** - considered ajax url to load items. In that case results will be cached for fields with the same source and name. See also `sourceCache` option. + + If **function**, it should return data in format above (since 1.4.0). + + Since 1.4.1 key `children` supported to render OPTGROUP (for **select** input only): + @example + [ + {text: "group1", children: [ + {value: 1, text: "text1"}, + {value: 2, text: "text2"} + ]}, + ... + ] + + + @property source + @type string | array | object | function + @default null + **/ + source: null, + /** + Data automatically prepended to the beginning of dropdown list. + + @property prepend + @type string | array | object | function + @default false + **/ + prepend: false, + /** + Error message when list cannot be loaded (e.g. ajax error) + + @property sourceError + @type string + @default Error when loading list + **/ + sourceError: 'Error when loading list', + /** + if `true` and source is **string url** - results will be cached for fields with the same source. + Usefull for editable column in grid to prevent extra requests. + + @property sourceCache + @type boolean + @default true + @since 1.2.0 + **/ + sourceCache: true, + /** + Additional ajax options to be used in $.ajax() when loading list from server. + Useful to send extra parameters or change request method. + + @property sourceOptions + @type object|function + @default null + @since 1.5.0 + @example + sourceOptions: { + data: {param: 123}, + type: 'post' + } + + **/ + sourceOptions: null + }); + + $.fn.editabletypes.list = List; + +}(window.jQuery)); + +/** +Text input + +@class text +@extends abstractinput +@final +@example +awesome + +**/ +(function ($) { + "use strict"; + + var Text = function (options) { + this.init('text', options, Text.defaults); + }; + + $.fn.editableutils.inherit(Text, $.fn.editabletypes.abstractinput); + + $.extend(Text.prototype, { + render: function() { + this.renderClear(); + this.setClass(); + this.setAttr('placeholder'); + }, + + activate: function() { + if(this.$input.is(':visible')) { + this.$input.focus(); +// if (this.$input.is('input,textarea') && !this.$input.is('[type="checkbox"],[type="range"],[type="number"],[type="email"]')) { + if (this.$input.is('input,textarea') && !this.$input.is('[type="checkbox"],[type="range"]')) { + $.fn.editableutils.setCursorPosition(this.$input.get(0), this.$input.val().length); + } + + if(this.toggleClear) { + this.toggleClear(); + } + } + }, + + //render clear button + renderClear: function() { + if (this.options.clear) { + this.$clear = $(''); + this.$input.after(this.$clear) + .css('padding-right', 24) + .css('height', 25) + .css('width', 300) + .keyup($.proxy(function(e) { + //arrows, enter, tab, etc + if(~$.inArray(e.keyCode, [40,38,9,13,27])) { + return; + } + + clearTimeout(this.t); + var that = this; + this.t = setTimeout(function() { + that.toggleClear(e); + }, 100); + + }, this)) + .parent().css('position', 'relative'); + + this.$clear.click($.proxy(this.clear, this)); + } + }, + + postrender: function() { + /* + //now `clear` is positioned via css + if(this.$clear) { + //can position clear button only here, when form is shown and height can be calculated +// var h = this.$input.outerHeight(true) || 20, + var h = this.$clear.parent().height(), + delta = (h - this.$clear.height()) / 2; + + //this.$clear.css({bottom: delta, right: delta}); + } + */ + }, + + //show / hide clear button + toggleClear: function(e) { + if(!this.$clear) { + return; + } + + var len = this.$input.val().length, + visible = this.$clear.is(':visible'); + + if(len && !visible) { + this.$clear.show(); + } + + if(!len && visible) { + this.$clear.hide(); + } + }, + + clear: function() { + this.$clear.hide(); + this.$input.val('').focus(); + } + }); + + Text.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, { + /** + @property tpl + @default + **/ + tpl: '', + /** + Placeholder attribute of input. Shown when input is empty. + + @property placeholder + @type string + @default null + **/ + placeholder: null, + + /** + Whether to show `clear` button + + @property clear + @type boolean + @default true + **/ + clear: true + }); + + $.fn.editabletypes.text = Text; + +}(window.jQuery)); + +/** +Textarea input + +@class textarea +@extends abstractinput +@final +@example +awesome comment! + +**/ +(function ($) { + "use strict"; + + var Textarea = function (options) { + this.init('textarea', options, Textarea.defaults); + }; + + $.fn.editableutils.inherit(Textarea, $.fn.editabletypes.abstractinput); + + $.extend(Textarea.prototype, { + render: function () { + this.setClass(); + this.setAttr('placeholder'); + this.setAttr('rows'); + + //ctrl + enter + this.$input.keydown(function (e) { + if (e.ctrlKey && e.which === 13) { + $(this).closest('form').submit(); + } + }); + + }, + + //using `white-space: pre-wrap` solves \n <--> BR conversion very elegant! + /* + value2html: function(value, element) { + var html = '', lines; + if(value) { + lines = value.split("\n"); + for (var i = 0; i < lines.length; i++) { + lines[i] = $('
    ').text(lines[i]).html(); + } + html = lines.join('
    '); + } + $(element).html(html); + }, + + html2value: function(html) { + if(!html) { + return ''; + } + + var regex = new RegExp(String.fromCharCode(10), 'g'); + var lines = html.split(//i); + for (var i = 0; i < lines.length; i++) { + var text = $('
    ').html(lines[i]).text(); + + // Remove newline characters (\n) to avoid them being converted by value2html() method + // thus adding extra
    tags + text = text.replace(regex, ''); + + lines[i] = text; + } + return lines.join("\n"); + }, + */ + activate: function() { + $.fn.editabletypes.text.prototype.activate.call(this); + } + }); + + Textarea.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, { + /** + @property tpl + @default + **/ + tpl:'', + /** + @property inputclass + @default input-large + **/ + inputclass: 'input-large', + /** + Placeholder attribute of input. Shown when input is empty. + + @property placeholder + @type string + @default null + **/ + placeholder: null, + /** + Number of rows in textarea + + @property rows + @type integer + @default 7 + **/ + rows: 7 + }); + + $.fn.editabletypes.textarea = Textarea; + +}(window.jQuery)); + +/** +Select (dropdown) + +@class select +@extends list +@final +@example + + +**/ +(function ($) { + "use strict"; + + var Select = function (options) { + this.init('select', options, Select.defaults); + }; + + $.fn.editableutils.inherit(Select, $.fn.editabletypes.list); + + $.extend(Select.prototype, { + renderList: function() { + this.$input.empty(); + var escape = this.options.escape; + + var fillItems = function($el, data) { + var attr; + if($.isArray(data)) { + for(var i=0; i', attr), data[i].children)); + } else { + attr.value = data[i].value; + if(data[i].disabled) { + attr.disabled = true; + } + var $option = $('
  • "].join(""));if(s.data("item",l),r){var c=i('
    '),y=i("
      ");"parent"===d?(c.append(m(y,l.child)),s.append(c)):s.append(m(y,l.child))}e.append(s)}}),e},c=['
      ',"
      "].join("");("contextmenu"===a.trigger||lay.isTopElem(a.elem[0]))&&(e=!0),!e&&a.elem.data(o+"_opened")||(t.elemView=i(c),t.elemView.append(a.content||s()),a.className&&t.elemView.addClass(a.className),a.style&&t.elemView.attr("style",a.style),u.thisId=a.id,t.remove(),r.append(t.elemView),a.elem.data(o+"_opened",!0),t.position(),d.prevElem=t.elemView,d.prevElem.data("prevElem",a.elem),t.elemView.find(".layui-menu").on(l,function(e){layui.stope(e)}),t.elemView.find(".layui-menu li").on("click",function(e){var n=i(this),l=n.data("item")||{},r=l.child&&l.child.length>0;r||"-"===l.type||(t.remove(),"function"==typeof a.click&&a.click(l,n))}),t.elemView.find(V).on("click",function(e){var n=i(this),t=n.parent(),l=t.data("item")||{};"group"===l.type&&a.isAllowSpread&&d.spread(t)}),"mouseenter"===a.trigger&&t.elemView.on("mouseenter",function(){clearTimeout(d.timer)}).on("mouseleave",function(){t.delayRemove()}))},k.prototype.position=function(e){var i=this,n=i.config;lay.position(n.elem[0],i.elemView[0],{position:n.position,e:i.e,clickType:"contextmenu"===n.trigger?"right":null,align:n.align||null})},k.prototype.remove=function(){var e=this,i=(e.config,d.prevElem);i&&(i.data("prevElem")&&i.data("prevElem").data(o+"_opened",!1),i.remove())},k.prototype.delayRemove=function(){var e=this,i=e.config;clearTimeout(d.timer),d.timer=setTimeout(function(){e.remove()},i.delay)},k.prototype.events=function(){var e=this,i=e.config;"hover"===i.trigger&&(i.trigger="mouseenter"),e.prevElem&&e.prevElem.off(i.trigger,e.prevElemCallback),e.prevElem=i.elem,e.prevElemCallback=function(n){clearTimeout(d.timer),e.e=n,e.render(),n.preventDefault(),"function"==typeof i.ready&&i.ready(e.elemView,i.elem,e.e.target)},i.elem.on(i.trigger,e.prevElemCallback),"mouseenter"===i.trigger&&i.elem.on("mouseleave",function(){e.delayRemove()})},d.that={},d.getThis=function(e){var i=d.that[e];return i||t.error(e?r+" instance with ID '"+e+"' not found":"ID argument required"),i},d.spread=function(e){var i=e.children("."+p).find(".layui-icon");e.hasClass(m)?(e.removeClass(m).addClass(c),i.removeClass("layui-icon-down").addClass("layui-icon-up")):(e.removeClass(c).addClass(m),i.removeClass("layui-icon-up").addClass("layui-icon-down"))},!function(){var e=i(window),n=i(document);e.on("resize",function(){if(u.thisId){var e=d.getThis(u.thisId);if(e){if(!e.elemView[0]||!i("."+s)[0])return!1;var n=e.config;"contextmenu"===n.trigger?e.remove():e.position()}}}),n.on(l,function(e){if(u.thisId){var i=d.getThis(u.thisId);if(i){var n=i.config;!lay.isTopElem(n.elem[0])&&"contextmenu"!==n.trigger&&(e.target===n.elem[0]||n.elem.find(e.target)[0]||e.target===i.elemView[0]||i.elemView&&i.elemView.find(e.target)[0])||i.remove()}}});var t=".layui-menu:not(.layui-dropdown-menu) li";n.on("click",t,function(e){var n=i(this),t=n.parents(".layui-menu").eq(0),a=n.hasClass(y)||n.hasClass(f),l=t.attr("lay-filter")||t.attr("id"),o=lay.options(this);n.hasClass(v)||a||(t.find("."+g).removeClass(g),t.find("."+h).removeClass(h),n.addClass(g),n.parents("."+f).addClass(h),layui.event.call(this,r,"click("+l+")",o))}),n.on("click",t+V,function(e){var n=i(this),t=n.parents("."+y+":eq(0)"),a=lay.options(t[0]);"isAllowSpread"in a&&!a.isAllowSpread||d.spread(t)});var a=".layui-menu ."+f;n.on("mouseenter",a,function(n){var t=i(this),a=t.find("."+w);if(a[0]){var l=a[0].getBoundingClientRect();l.right>e.width()&&(a.addClass(C),l=a[0].getBoundingClientRect(),l.left<0&&a.removeClass(C)),l.bottom>e.height()&&a.eq(0).css("margin-top",-(l.bottom-e.height()))}}).on("mouseleave",a,function(e){var n=i(this),t=n.children("."+w);t.removeClass(C),t.css("margin-top",0)})}(),u.reload=function(e,i){var n=d.getThis(e);return n?(n.reload(i),d.call(n)):this},u.render=function(e){var i=new k(e);return d.call(i)},e(r,u)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(t,a){return i.value=t,e.slide("set",t,a||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",p="layui-slider-input-btn",m="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),p=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var p=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var m=t.disabled?"#c2c2c2":t.theme,f='
      '+(t.tips?'
      ':"")+'
      '+(t.range?'
      ':"")+"
      ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
      ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),s.find("."+d).html(l.setTips?l.setTips(u):u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
      f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(m),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(m),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.children("."+p).children("i").each(function(e){i(this).on("click",function(){g=y.children("."+c).children("input").val(),g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});layui.define(["jquery","lay"],function(e){"use strict";var i=layui.jquery,r=layui.lay,o=layui.device(),n=o.mobile?"click":"mousedown",l={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var r=this;return r.config=i.extend({},r.config,e),r},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},t=function(){var e=this,i=e.config;return{config:i}},c="colorpicker",a="layui-show",s="layui-colorpicker",f=".layui-colorpicker-main",d="layui-icon-down",u="layui-icon-close",p="layui-colorpicker-trigger-span",g="layui-colorpicker-trigger-i",v="layui-colorpicker-side",h="layui-colorpicker-side-slider",b="layui-colorpicker-basis",k="layui-colorpicker-alpha-bgcolor",y="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",x="layui-colorpicker-main-input",P=function(e){var i={h:0,s:0,b:0},r=Math.min(e.r,e.g,e.b),o=Math.max(e.r,e.g,e.b),n=o-r;return i.b=o,i.s=0!=o?255*n/o:0,0!=i.s?e.r==o?i.h=(e.g-e.b)/n:e.g==o?i.h=2+(e.b-e.r)/n:i.h=4+(e.r-e.g)/n:i.h=-1,o==r&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},C=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var r={r:e>>16,g:(65280&e)>>8,b:255&e};return P(r)},B=function(e){var i={},r=e.h,o=255*e.s/100,n=255*e.b/100;if(0==o)i.r=i.g=i.b=n;else{var l=n,t=(255-o)*n/255,c=(l-t)*(r%60)/60;360==r&&(r=0),r<60?(i.r=l,i.b=t,i.g=t+c):r<120?(i.g=l,i.b=t,i.r=l-c):r<180?(i.g=l,i.r=t,i.b=t+c):r<240?(i.b=l,i.r=t,i.g=l-c):r<300?(i.b=l,i.g=t,i.r=t+c):r<360?(i.r=l,i.g=t,i.b=l-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},w=function(e){var r=B(e),o=[r.r.toString(16),r.g.toString(16),r.b.toString(16)];return i.each(o,function(e,i){1==i.length&&(o[e]="0"+i)}),o.join("")},D=function(e){var i=/[0-9]{1,3}/g,r=e.match(i)||[];return{r:r[0],g:r[1],b:r[2]}},j=i(window),E=i(document),F=function(e){var r=this;r.index=++l.index,r.config=i.extend({},r.config,l.config,e),r.render()};F.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},F.prototype.render=function(){var e=this,r=e.config,o=i(['
      ',"",'3&&(r.alpha&&"rgb"==r.format||(e="#"+w(P(D(r.color))))),"background: "+e):e}()+'">','',"","","
      "].join("")),n=i(r.elem);r.size&&o.addClass("layui-colorpicker-"+r.size),n.addClass("layui-inline").html(e.elemColorBox=o),e.color=e.elemColorBox.find("."+p)[0].style.background,e.events()},F.prototype.renderPicker=function(){var e=this,r=e.config,o=e.elemColorBox[0],n=e.elemPicker=i(['
      ','
      ','
      ','
      ','
      ','
      ',"
      ",'
      ','
      ',"
      ","
      ",'
      ','
      ','
      ',"
      ","
      ",function(){if(r.predefine){var e=['
      '];return layui.each(r.colors,function(i,r){e.push(['
      ','
      ',"
      "].join(""))}),e.push("
      "),e.join("")}return""}(),'
      ','
      ','',"
      ",'
      ','','',"","
      "].join(""));e.elemColorBox.find("."+p)[0];i(f)[0]&&i(f).data("index")==e.index?e.removePicker(F.thisElemInd):(e.removePicker(F.thisElemInd),i("body").append(n)),F.thisElemInd=e.index,F.thisColor=o.style.background,e.position(),e.pickerEvents()},F.prototype.removePicker=function(e){var r=this;r.config;return i("#layui-colorpicker"+(e||r.index)).remove(),r},F.prototype.position=function(){var e=this,i=e.config;return r.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},F.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+p)),r=e.elemPicker.find("."+x),o=i[0],n=o.style.backgroundColor;if(n){var l=P(D(n)),t=i.attr("lay-type");if(e.select(l.h,l.s,l.b),"torgb"===t&&r.find("input").val(n),"rgba"===t){var c=D(n);if(3==(n.match(/[0-9]{1,3}/g)||[]).length)r.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+y).css("left",280);else{r.find("input").val(n);var a=280*n.slice(n.lastIndexOf(",")+1,n.length-1);e.elemPicker.find("."+y).css("left",a)}e.elemPicker.find("."+k)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),r.find("input").val(""),e.elemPicker.find("."+k)[0].style.background="",e.elemPicker.find("."+y).css("left",280)},F.prototype.side=function(){var e=this,r=e.config,o=e.elemColorBox.find("."+p),n=o.attr("lay-type"),l=e.elemPicker.find("."+v),t=e.elemPicker.find("."+h),c=e.elemPicker.find("."+b),a=e.elemPicker.find("."+m),s=e.elemPicker.find("."+k),f=e.elemPicker.find("."+y),C=t[0].offsetTop/180*360,w=100-(a[0].offsetTop+3)/180*100,E=(a[0].offsetLeft+3)/260*100,F=Math.round(f[0].offsetLeft/280*100)/100,H=e.elemColorBox.find("."+g),M=e.elemPicker.find(".layui-colorpicker-pre").children("div"),Y=function(i,l,t,c){e.select(i,l,t);var a=B({h:i,s:l,b:t});if(H.addClass(d).removeClass(u),o[0].style.background="rgb("+a.r+", "+a.g+", "+a.b+")","torgb"===n&&e.elemPicker.find("."+x).find("input").val("rgb("+a.r+", "+a.g+", "+a.b+")"),"rgba"===n){var p=0;p=280*c,f.css("left",p),e.elemPicker.find("."+x).find("input").val("rgba("+a.r+", "+a.g+", "+a.b+", "+c+")"),o[0].style.background="rgba("+a.r+", "+a.g+", "+a.b+", "+c+")",s[0].style.background="linear-gradient(to right, rgba("+a.r+", "+a.g+", "+a.b+", 0), rgb("+a.r+", "+a.g+", "+a.b+"))"}r.change&&r.change(e.elemPicker.find("."+x).find("input").val())},I=i(['
      '].join("")),L=function(e){i("#LAY-colorpicker-moving")[0]||i("body").append(I),I.on("mousemove",e),I.on("mouseup",function(){I.remove()}).on("mouseleave",function(){I.remove()})};t.on("mousedown",function(e){var i=this.offsetTop,r=e.clientY,o=function(e){var o=i+(e.clientY-r),n=l[0].offsetHeight;o<0&&(o=0),o>n&&(o=n);var t=o/180*360;C=t,Y(t,E,w,F),e.preventDefault()};L(o),e.preventDefault()}),l.on("click",function(e){var r=e.clientY-i(this).offset().top;r<0&&(r=0),r>this.offsetHeight&&(r=this.offsetHeight);var o=r/180*360;C=o,Y(o,E,w,F),e.preventDefault()}),a.on("mousedown",function(e){var i=this.offsetTop,r=this.offsetLeft,o=e.clientY,n=e.clientX,l=function(e){var l=i+(e.clientY-o),t=r+(e.clientX-n),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;l<-3&&(l=-3),l>a&&(l=a),t<-3&&(t=-3),t>s&&(t=s);var f=(t+3)/260*100,d=100-(l+3)/180*100;w=d,E=f,Y(C,f,d,F),e.preventDefault()};layui.stope(e),L(l),e.preventDefault()}),c.on("mousedown",function(e){var r=e.clientY-i(this).offset().top-3+j.scrollTop(),o=e.clientX-i(this).offset().left-3+j.scrollLeft();r<-3&&(r=-3),r>this.offsetHeight-3&&(r=this.offsetHeight-3),o<-3&&(o=-3),o>this.offsetWidth-3&&(o=this.offsetWidth-3);var n=(o+3)/260*100,l=100-(r+3)/180*100;w=l,E=n,Y(C,n,l,F),layui.stope(e),e.preventDefault(),a.trigger(e,"mousedown")}),f.on("mousedown",function(e){var i=this.offsetLeft,r=e.clientX,o=function(e){var o=i+(e.clientX-r),n=s[0].offsetWidth;o<0&&(o=0),o>n&&(o=n);var l=Math.round(o/280*100)/100;F=l,Y(C,E,w,l),e.preventDefault()};L(o),e.preventDefault()}),s.on("click",function(e){var r=e.clientX-i(this).offset().left;r<0&&(r=0),r>this.offsetWidth&&(r=this.offsetWidth);var o=Math.round(r/280*100)/100;F=o,Y(C,E,w,o),e.preventDefault()}),M.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,r=this.style.backgroundColor,o=P(D(r)),n=r.slice(r.lastIndexOf(",")+1,r.length-1);C=o.h,E=o.s,w=o.b,3==(r.match(/[0-9]{1,3}/g)||[]).length&&(n=1),F=n,e=280*n,Y(o.h,o.s,o.b,n)})})},F.prototype.select=function(e,i,r,o){var n=this,l=(n.config,w({h:e,s:100,b:100})),t=w({h:e,s:i,b:r}),c=e/360*180,a=180-r/100*180-3,s=i/100*260-3;n.elemPicker.find("."+h).css("top",c),n.elemPicker.find("."+b)[0].style.background="#"+l,n.elemPicker.find("."+m).css({top:a,left:s}),"change"!==o&&n.elemPicker.find("."+x).find("input").val("#"+t)},F.prototype.pickerEvents=function(){var e=this,r=e.config,o=e.elemColorBox.find("."+p),n=e.elemPicker.find("."+x+" input"),l={clear:function(i){o[0].style.background="",e.elemColorBox.find("."+g).removeClass(d).addClass(u),e.color="",r.done&&r.done(""),e.removePicker()},confirm:function(i,l){var t=n.val(),c=t,a={};if(t.indexOf(",")>-1){if(a=P(D(t)),e.select(a.h,a.s,a.b),o[0].style.background=c="#"+w(a),(t.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===o.attr("lay-type")){var s=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+y).css("left",s),o[0].style.background=t,c=t}}else a=C(t),o[0].style.background=c="#"+w(a),e.elemColorBox.find("."+g).removeClass(u).addClass(d);return"change"===l?(e.select(a.h,a.s,a.b,l),void(r.change&&r.change(c))):(e.color=t,r.done&&r.done(t),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),r=e.attr("colorpicker-events");l[r]&&l[r].call(this,e)}),n.on("keyup",function(e){var r=i(this);l.confirm.call(this,r,13===e.keyCode?null:"change")})},F.prototype.events=function(){var e=this,r=e.config,o=e.elemColorBox.find("."+p);e.elemColorBox.on("click",function(){e.renderPicker(),i(f)[0]&&(e.val(),e.side())}),r.elem[0]&&!e.elemColorBox[0].eventHandler&&(E.on(n,function(r){if(!i(r.target).hasClass(s)&&!i(r.target).parents("."+s)[0]&&!i(r.target).hasClass(f.replace(/\./g,""))&&!i(r.target).parents(f)[0]&&e.elemPicker){if(e.color){var n=P(D(e.color));e.select(n.h,n.s,n.b)}else e.elemColorBox.find("."+g).removeClass(d).addClass(u);o[0].style.background=e.color||"",e.removePicker()}}),j.on("resize",function(){return!(!e.elemPicker||!i(f)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},l.render=function(e){var i=new F(e);return t.call(i)},e(c,l)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",o="layui-this",s="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"],phone:[/^1\d{10}$/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"],url:[/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/,"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"],number:function(e){if(!e||isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u8eab\u4efd\u8bc1\u53f7"]},autocomplete:null}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter="'+e+'"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,i){var l;t(this);if(i.name=(i.name||"").replace(/^\s*|\s*&/,""),i.name){if(/^.*\[\]$/.test(i.name)){var r=i.name.match(/^(.*)\[\]$/g)[0];a[r]=0|a[r],l=i.name.replace(/^(.*)\[\]$/,"$1["+a[r]++ +"]")}/^checkbox|radio$/.test(i.type)&&!i.checked||(n[l||i.name]=i.value)}}),n},u.prototype.render=function(e,i){var n=this,u=n.config,d=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),f={input:function(){var e=d.find("input,textarea");u.autocomplete&&e.attr("autocomplete",u.autocomplete)},select:function(){var e,i="\u8bf7\u9009\u62e9",a="layui-form-select",n="layui-select-title",r="layui-select-none",u="",f=d.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&u&&e.val(u)),e=null},y=function(i,d,f){var y,p=t(this),m=i.find("."+n),g=m.find("input"),k=i.find("dl"),x=k.children("dd"),b=this.selectedIndex;if(!d){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=k.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(s),y=null,x.eq(b).addClass(o).siblings().removeClass(o),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),g.blur(),y=null,e||$(g.val(),function(e){var i=p[0].selectedIndex;e&&(u=t(p[0].options[i]).html(),0===i&&u===g.attr("placeholder")&&(u=""),g.val(u||""))})},T=function(){var e=k.children("dd."+o);if(e[0]){var t=e.position().top,i=k.height(),a=e.height();t>i&&k.scrollTop(t+k.scrollTop()-i+a-5),t<0&&k.scrollTop(t+k.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),k.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){g.focus()}),g.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=k.children("dd."+o);if(k.children("dd."+s)[0]&&"next"===t){var i=k.children("dd:not(."+s+",."+c+")"),n=i.eq(0).index();if(n>=0&&n\u65e0\u5339\u914d\u9879

      '):k.find("."+r).remove()},"keyup"),""===t&&k.find("."+r).remove(),void T())};f&&g.on("keyup",q).on("blur",function(i){var a=p[0].selectedIndex;e=g,u=t(p[0].options[a]).html(),0===a&&u===g.attr("placeholder")&&(u=""),setTimeout(function(){$(g.val(),function(e){u||g.val("")},"blur")},200)}),x.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?g.val(""):(g.val(e.text()),e.addClass(o)),e.siblings().removeClass(o),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),s=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
      ','
      ','','
      ','
      ',function(e){var a=[];return layui.each(e,function(e,n){0!==e||n.value?"optgroup"===n.tagName.toLowerCase()?a.push("
      "+n.label+"
      "):a.push('
      '+t.trim(n.innerHTML)+"
      "):a.push('
      '+t.trim(n.innerHTML||i)+"
      ")}),0===a.length&&a.push('
      \u6ca1\u6709\u9009\u9879
      '),a.join("")}(r.find("*"))+"
      ","
      "].join(""));s[0]&&s.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=d.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),o=(l.attr("lay-text")||"").split("|"),s=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
      ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?o[0]:o[1])||"")+""};return t[r]||t.checkbox}(),"
      "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=d.find("input[type=radio]"),n=function(a){var n=t(this),o="layui-anim-scaleSpring";a.on("click",function(){var s=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+s.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(o).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(o).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),o=r.next("."+e),s=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();o[0]&&o.remove();var u=t(['
      ',''+i[l.checked?0:1]+"","
      "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html()),e}()+"
      ","
      "].join(""));r.after(u),n.call(this,u)})}};return e?f[e]?f[e]():a.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):layui.each(f,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,o="layui-form-danger",s={},c=t(this),u=c.parents(r).eq(0),d=u.find("*[lay-verify]"),h=c.parents("form")[0],y=c.attr("lay-filter");return layui.each(d,function(l,r){var s=t(this),c=s.attr("lay-verify").split("|"),u=s.attr("lay-verType"),d=s.val();if(s.removeClass(o),layui.each(c,function(t,l){var c,f="",h="function"==typeof a[l];if(a[l]){var c=h?f=a[l](d,r):!a[l][0].test(d),y="select"===r.tagName.toLowerCase()||/^checkbox|radio$/.test(r.type);if(f=f||a[l][1],"required"===l&&(f=s.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"!=typeof s.attr("lay-ignore")&&y?s.next():s}(),{tips:1}):"alert"===u?i.alert(f,{title:"\u63d0\u793a",shadeClose:!0}):/\bstring|number\b/.test(typeof f)&&i.msg(f,{icon:5,shift:6}),n.mobile?v.scrollTop(function(){try{return(y?s.next():s).offset().top-15}catch(e){return 0}}()):setTimeout(function(){(y?s.next().find("input"):r).focus()},7),s.addClass(o),e=!0}}),e)return e}),!e&&(s=f.getValue(null,u),layui.event.call(this,l,"submit("+y+")",{elem:this,form:h,field:s}))},f=new u,v=t(document),h=t(window);t(function(){f.render()}),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"\u672a\u547d\u540d",none:"\u65e0\u6570\u636e"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){"array"===layui._typeof(i)&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('
      ');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('
      '+a.text.none+"
      "),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('
      "),h=i(['
      ','
      ','
      ',function(){return t.showLine?l?'':'':''}(),function(){return t.showCheckbox?'':""}(),function(){return t.isJump&&r.href?''+(r.title||r.label||t.text.defaultNodeName)+"":''+(r.title||r.label||t.text.defaultNodeName)+""}(),"
      ",function(){if(!t.edit)return"";var e={add:'',update:'',del:''},i=['
      '];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"
      "):void 0}(),"
      "].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('
      '));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,I=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),I.removeClass(x),I.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var A=e.children("."+v).children("."+s).last();A.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append(''),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(a.title||"")+'" \u5417\uff1f',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)});layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,i=layui.form,n="transfer",l={config:{},index:layui[n]?layui[n].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,n,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['
      ','
      ','","
      ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
        ',"
        "].join("")},v=['
        ',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'
        ','",'","
        ",p({index:1,checkAllName:"layTransferRightCheckAll"}),"
        "].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},x.prototype.reload=function(e){var t=this;t.config=a.extend({},t.config,e),t.render()},x.prototype.render=function(){var e=this,i=e.config,n=e.elem=a(t(v).render({data:i,index:e.index})),l=i.elem=a(i.elem);l[0]&&(i.data=i.data||[],i.value=i.value||[],e.key=i.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=n.find("."+y),e.layBtn=n.find("."+f+" .layui-btn"),e.layBox.css({width:i.width,height:i.height}),e.layData.css({height:function(){return i.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,i=["
      • ",'',"
      • "].join("");a[t].views.push(i),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){i.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,i=t.config;e=e||{},t.layBox.each(function(n){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(n)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":i.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var i=a('

        '+(t||"")+"

        ");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(i)},x.prototype.setValue=function(){var e=this,t=e.config,i=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||i.push(this.value)}),t.value=i,e},x.prototype.parseData=function(e){var t=this,i=t.config,n=[];return layui.each(i.data,function(t,l){l=("function"==typeof i.parseData?i.parseData(l):l)||l,n.push(l=a.extend({},l)),layui.each(i.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),i.data=n,t},x.prototype.getData=function(e){var a=this,t=a.config,i=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),i=t[0].checked,n=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&n.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=i)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var i=a(this),n=i.data("index"),l=e.layBox.eq(n),r=[];if(!i.hasClass(o)){e.layBox.eq(n).each(function(t){var i=a(this),n=i.find("."+y);n.children("li").each(function(){var t=a(this),i=t.find('input[type="checkbox"]'),n=i.data("hide");i[0].checked&&!n&&(i[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(i[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),n)}}),e.laySearch.find("input").on("keyup",function(){var i=this.value,n=a(this).parents("."+h).eq(0).siblings("."+y),l=n.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),n=t[0].title.indexOf(i)!==-1;e[n?"removeClass":"addClass"](c),t.data("hide",!n)}),e.renderCheckBtn();var r=l.length===n.children("li."+c).length;e.noneView(n,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(n,l)});layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=layui.util,r=layui.hint(),c=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,h,e,t)}},s=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(s.that[i]=e,s.config[i]=t),{config:t,reload:function(t,i){e.reload.call(e,t,i)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},u=function(e){var t=s.config[e];return t||r.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},y=function(e,a,l,n){var r=this.config||{};r.escape&&(a=o.escape(a));var c=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("
        "+c+"
        ").text():c},h="table",f=".layui-table",p="layui-hide",v="layui-none",m="layui-table-view",g=".layui-table-tool",b=".layui-table-box",x=".layui-table-init",k=".layui-table-header",C=".layui-table-body",w=".layui-table-main",T=".layui-table-fixed",N=".layui-table-fixed-l",L=".layui-table-fixed-r",_=".layui-table-total",S=".layui-table-page",A=".layui-table-sort",R="layui-table-edit",W="layui-table-hover",z=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
        ','
        ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
        ","
        "].join("")},E=['',"","
        "].join(""),j=['
        ',"{{# if(d.data.toolbar){ }}",'
        ','
        ','
        ',"
        ","{{# } }}",'
        ',"{{# if(d.data.loading){ }}",'
        ','',"
        ","{{# } }}","{{# var left, right; }}",'
        ',z(),"
        ",'
        ',E,"
        ","{{# if(left){ }}",'
        ','
        ',z({fixed:!0}),"
        ",'
        ',E,"
        ","
        ","{{# }; }}","{{# if(right){ }}",'
        ','
        ',z({fixed:"right"}),'
        ',"
        ",'
        ',E,"
        ","
        ","{{# }; }}","
        ","{{# if(d.data.totalRow){ }}",'
        ','','',"
        ","
        ","{{# } }}","{{# if(d.data.page){ }}",'
        ','
        ',"
        ","{{# } }}","","
        "].join(""),F=t(window),I=t(document),H=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};H.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"\u65e0\u6570\u636e"}},H.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=F.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+m),o=e.elem=t(i(j).render({VIEW_CLASS:m,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(g),e.layBox=o.find(b),e.layHeader=o.find(k),e.layMain=o.find(w),e.layBody=o.find(C),e.layFixed=o.find(T),e.layFixLeft=o.find(N),e.layFixRight=o.find(L),e.layTotal=o.find(_),e.layPage=o.find(S),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(k).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},H.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},H.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},H.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
        ','
        ','
        '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},c=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i="string"==typeof t?r[t]:t;i&&c.push('
        ')}),e.layTool.find(".layui-table-tool-self").html(c.join(""))},H.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](p),r.colspan=n,r.hide=n<1;var c=l.data("parentkey");c&&i.setParentCol(e,c)}},H.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},H.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,c){var d=0,s=c.minWidth||t.cellMinWidth;return c?void(c.colGroup||c.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var c=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&c>=-i&&c<=i){var d=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?d(t.prev()):t},s=d(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+c+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},H.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},H.prototype.reload=function(e,i){var a=this;e=e||{},delete a.haveInit,layui.each(e,function(e,t){"array"===layui._typeof(t)&&delete a.config[e]}),a.config=t.extend(i,{},a.config,e),a.render()},H.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+v),l=t('
        '+(e||"Error")+"
        ");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(p),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},H.prototype.page=1,H.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var c=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(c=JSON.stringify(c)),i.loading(),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:c,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+n.statusName+'": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView("\u8bf7\u6c42\u5f02\u5e38\uff0c\u9519\u8bef\u63d0\u793a\uff1a"+t),i.renderForm(),i.setColsWidth(),"function"==typeof a.error&&a.error(e,t)}})}else if("array"===layui._typeof(a.data)){var d={},s=e*a.limit-a.limit;d[n.dataName]=a.data.concat().splice(s,a.limit),d[n.countName]=a.data.length,"object"==typeof a.totalRow&&(d[n.totalRowName]=t.extend({},a.totalRow)),i.renderData(d,e,d[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(d,e,d[n.countName])}},H.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},H.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=e[s.response.totalRowName],f=[],m=[],g=[],b=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],h=[],v=a+s.limit*(n-1)+1;"array"===layui._typeof(l)&&0===l.length||(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var f=r.field||n,m=s.index+"-"+r.key,g=l[f];if(void 0!==g&&null!==g||(g=""),!r.colGroup){var b=['','
        '+function(){var n=t.extend(!0,{LAY_INDEX:v,LAY_COL:r},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return v}return r.toolbar?i(t(r.toolbar).html()||"").render(n):y.call(c,r,g,n)}(),"
        "].join("");o.push(b),r.fixed&&"right"!==r.fixed&&u.push(b),"right"===r.fixed&&h.push(b)}}),f.push(''+o.join("")+""),m.push(''+u.join("")+""),g.push(''+h.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+v).remove(),c.layMain.find("tbody").html(f.join("")),c.layFixLeft.find("tbody").html(m.join("")),c.layFixRight.find("tbody").html(g.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](p),0===u.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(p),r?b():(b(),c.renderTotal(u,h),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page)))))},H.prototype.renderTotal=function(e,a){var l=this,n=l.config,o={};if(n.totalRow){layui.each(e,function(e,t){"array"===layui._typeof(t)&&0===t.length||l.eachCols(function(e,i){var a=i.field||e,l=t[a];i.totalRow&&(o[a]=(o[a]||0)+(parseFloat(l)||0))})}),l.dataTotal={};var r=[];l.eachCols(function(e,c){var d=c.field||e,s=function(){var e,t=c.totalRowText||"",i=parseFloat(o[d]).toFixed(2),n={};return n[d]=i,e=c.totalRow?y.call(l,c,i,n)||t:t,a?a[c.field]||e:e}(),u=['','
        '+function(){var e=c.totalRow||n.totalRow;return"string"==typeof e?i(e).render(t.extend({TOTAL_NUMS:s},c)):s}(),"
        "].join("");c.field&&(l.dataTotal[d]=s),r.push(u)}),l.layTotal.find("tbody").html(""+r.join("")+"")}},H.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},H.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},H.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},H.prototype.sort=function(e,i,a,l){var n,o,c=this,s={},u=c.config,y=u.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&(n=e,c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1}));try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(A);c.layHeader.find("th").find(A).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){r.error("Table modules: sort field '"+n+"' not matched")}c.sortKey={field:n,sort:i},u.autoSort&&("asc"===i?o=layui.sort(f,n):"desc"===i?o=layui.sort(f,n,!0):(o=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=o||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,h,"sort("+y+")",{field:n,type:i})},H.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(x).remove()):(i.layInit=t(['
        ','',"
        "].join("")),i.layBox.append(i.layInit)))},H.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&"array"!==layui._typeof(l[e])&&(l[e][a.checkName]=t)},H.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},H.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},H.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=F.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},H.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},H.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
        ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),c=r-l;e.layFixed.find(C).css("height",i.height()>=c?c:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](p),e.layFixRight.css("right",a-1)},H.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),r={},s=i.layHeader.find("th"),u=".layui-table-cell",f=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),r=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
          ');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),I.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),r){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
        • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var c=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](p),c!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case"LAYTABLE_EXPORT":c.ie?l.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",this,{tips:3}):s({list:function(){return['
        • \u5bfc\u51fa\u5230 Csv \u6587\u4ef6
        • ','
        • \u5bfc\u51fa\u5230 Excel \u6587\u4ef6
        • '].join("")}(),done:function(e,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("\u6253\u5370\u7a97\u53e3","_blank"),y=[""].join(""),v=t(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(y+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,h,"toolbar("+f+")",t.extend({event:r,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||r.resizeStart||(r.allowResize=i.width()-l<=10,o.css("cursor",r.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);r.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var l=t(this);if(r.allowResize){var n=l.data("key");e.preventDefault(),r.resizeStart=!0,r.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();r.rule=e,r.ruleWidth=parseFloat(t),r.minWidth=l.data("minwidth")||a.cellMinWidth})}}),I.on("mousemove",function(t){if(r.resizeStart){if(t.preventDefault(),r.rule){var a=r.ruleWidth+t.clientX-r.offset[0];a');return n[0].value=i.data("content")||l.text(),i.find("."+R)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(u);if(!i.data("off"))if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
          ')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),r=o.children(u);i.tipsIndex=l.tips(['
          ',r.html(),"
          ",''].join(""),r[0],{tips:[3,""],time:-1,anim:-1,maxWidth:c.ios||c.android?300:i.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,h,"tool("+f+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(C).scrollTop(n),l.close(i.tipsIndex)}),F.on("resize",function(){i.resize()})},function(){I.on("click",function(){I.trigger("table.remove.tool.panel")}),I.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':f+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(o){r.error(n+l,"error")}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(o){return r.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},s.that={},s.config={},d.eachCols=function(e,i,a){var l=s.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return"array"===layui._typeof(l)?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.getData=function(e){var t=[],i=d.cache[e]||[];return layui.each(i,function(e,i){"array"!==layui._typeof(i)&&t.push(d.clearCacheKey(i))}),t},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=s.that[e],n=s.config[e]||{},o={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],u=document.createElement("a");return c.ie?r.error("IE_NOT_SUPPORT_EXPORTS"):(u.href="data:"+o+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],n=[],o=[];return layui.each(t,function(t,a){var o=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){o.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,n){if(n.field&&"normal"==n.type&&!n.hide){var r=a[n.field];void 0!==r&&null!==r||(r=""),0==t&&i.push(n.title||""),o.push('"'+y.call(l,n,r,a,"text")+'"')}}),n.push(o.join(","))}),layui.each(a.dataTotal,function(e,t){o.push(t)}),i.join(",")+"\r\n"+n.join("\r\n")+"\r\n"+o.join(",")}()),u.download=(n.title||"table_"+(n.index||""))+"."+i,document.body.appendChild(u),u.click(),void document.body.removeChild(u))},d.resize=function(e){if(e){var t=u(e);if(!t)return;s.that[e].resize()}else layui.each(s.that,function(){ +this.resize()})},d.reload=function(e,t,i){var a=u(e);if(a){var l=s.that[e];return l.reload(t,i),s.call(l)}},d.render=function(e){var t=new H(e);return s.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},t(function(){d.init()}),e(h,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
            ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
          "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):al.length&&(l.value=l.length),parseInt(l.value)!==l.value&&(l.half||(l.value=Math.ceil(l.value)-l.value<.5?Math.ceil(l.value):Math.floor(l.value)));for(var n='
            ",s=1;s<=l.length;s++){var r='
          • ";l.half&&parseInt(l.value)!==l.value&&s==Math.ceil(l.value)?n=n+'
          • ":n+=r}n+="
          "+(l.text?''+l.value+"\u661f":"")+"";var c=l.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),l.span=e.elemTemp.next("span"),l.setText&&l.setText(l.value),c.html(e.elemTemp),c.addClass("layui-inline"),l.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,l=a.config;l.value=e,a.render()},v.prototype.action=function(){var e=this,l=e.config,i=e.elemTemp,n=i.find("i").width();i.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(l.value=t,l.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(l.value=l.value-.5)}l.text&&i.next("span").text(l.value+"\u661f"),l.choose&&l.choose(l.value),l.setText&&l.setText(l.value)}),v.on("mousemove",function(e){if(i.find("i").each(function(){a(this).addClass(o).removeClass(r)}),i.find("i:lt("+t+")").each(function(){a(this).addClass(u).removeClass(f)}),l.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(s).removeClass(u)}}),v.on("mouseleave",function(){i.find("i").each(function(){a(this).addClass(o).removeClass(r)}),i.find("i:lt("+Math.floor(l.value)+")").each(function(){a(this).addClass(u).removeClass(f)}),l.half&&parseInt(l.value)!==l.value&&i.children("li:eq("+Math.floor(l.value)+")").children("i").addClass(s).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},l.render=function(e){var a=new v(e);return i.call(a)},e(n,l)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var m=l(e.elem);if(m[0]){var f=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,y=e.end||"\u6ca1\u6709\u66f4\u591a\u4e86",v=e.scrollElem&&e.scrollElem!==document,d="\u52a0\u8f7d\u66f4\u591a",h=l('");m.find(".layui-flow-more")[0]||m.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(y):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(f.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),!i&&m.width()&&(r=setTimeout(function(){var i=v?e.height():l(window).height(),n=v?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&e.attr("lay-src")){var f=e.attr("lay-src");layui.img(f,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",f).removeAttr("lay-src"),l[0]&&m(l),i++},function(){t.lazyimg.elem.eq(i);e.removeAttr("lay-src")})}},m=function(e,o){var m=a?(o||n).height():l(window).height(),f=n.scrollTop(),u=f+m;if(t.lazyimg.elem=l(r),e)c(e,m);else for(var s=0;su)break}};if(m(),!o){var f;n.on("scroll",function(){var e=l(this);f&&clearTimeout(f),f=setTimeout(function(){m(null,e)},50)}),o=!0}return m},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
          ','
          '+f+"
          ",'
          ','',"
          ","
          "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("\u8bf7\u6682\u65f6\u7528shift+enter"),!1}r.execCommand("formatBlock",!1,"

          ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

          "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"\u4e0a\u4f20\u5931\u8d25")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"\u5e2e\u52a9",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

          "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"\u8d85\u94fe\u63a5",skin:"layui-layer-msg",content:['

            ','
          • ','','
            ','',"
            ","
          • ",'
          • ','','
            ','",'","
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[\u5fae\u7b11]","[\u563b\u563b]","[\u54c8\u54c8]","[\u53ef\u7231]","[\u53ef\u601c]","[\u6316\u9f3b]","[\u5403\u60ca]","[\u5bb3\u7f9e]","[\u6324\u773c]","[\u95ed\u5634]","[\u9119\u89c6]","[\u7231\u4f60]","[\u6cea]","[\u5077\u7b11]","[\u4eb2\u4eb2]","[\u751f\u75c5]","[\u592a\u5f00\u5fc3]","[\u767d\u773c]","[\u53f3\u54fc\u54fc]","[\u5de6\u54fc\u54fc]","[\u5618]","[\u8870]","[\u59d4\u5c48]","[\u5410]","[\u54c8\u6b20]","[\u62b1\u62b1]","[\u6012]","[\u7591\u95ee]","[\u998b\u5634]","[\u62dc\u62dc]","[\u601d\u8003]","[\u6c57]","[\u56f0]","[\u7761]","[\u94b1]","[\u5931\u671b]","[\u9177]","[\u8272]","[\u54fc]","[\u9f13\u638c]","[\u6655]","[\u60b2\u4f24]","[\u6293\u72c2]","[\u9ed1\u7ebf]","[\u9634\u9669]","[\u6012\u9a82]","[\u4e92\u7c89]","[\u5fc3]","[\u4f24\u5fc3]","[\u732a\u5934]","[\u718a\u732b]","[\u5154\u5b50]","[ok]","[\u8036]","[good]","[NO]","[\u8d5e]","[\u6765]","[\u5f31]","[\u8349\u6ce5\u9a6c]","[\u795e\u9a6c]","[\u56e7]","[\u6d6e\u4e91]","[\u7ed9\u529b]","[\u56f4\u89c2]","[\u5a01\u6b66]","[\u5965\u7279\u66fc]","[\u793c\u7269]","[\u949f]","[\u8bdd\u7b52]","[\u8721\u70db]","[\u86cb\u7cd5]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
        • '+e+'
        • ')}),'
            '+t.join("")+"
          "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"\u63d2\u5165\u4ee3\u7801",skin:"layui-layer-msg",content:['
            ','
          • ','','
            ','","
            ","
          • ",'
          • ','','
            ','',"
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},L=new c;t(n,L)});layui.define("jquery",function(a){"use strict";var e=layui.$;a("code",function(a){var l=[];a=a||{},a.elem=e(a.elem||".layui-code"),a.lang="lang"in a?a.lang:"code",a.elem.each(function(){l.push(this)}),layui.each(l.reverse(),function(l,i){var t=e(i),c=t.html();(t.attr("lay-encode")||a.encode)&&(c=c.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),t.html('
          1. '+c.replace(/[\r\t\n]+/g,"
          2. ")+"
          "),t.find(">.layui-code-h3")[0]||t.prepend('

          '+(t.attr("lay-title")||a.title||"</>")+''+(t.attr("lay-lang")||a.lang||"")+"

          ");var n=t.find(">.layui-code-ol");t.addClass("layui-box layui-code-view"),(t.attr("lay-skin")||a.skin)&&t.addClass("layui-code-"+(t.attr("lay-skin")||a.skin)),(n.find("li").length/100|0)>0&&n.css("margin-left",(n.find("li").length/100|0)+"px"),(t.attr("lay-height")||a.height)&&n.css("max-height",t.attr("lay-height")||a.height)})})}).addcss("modules/code.css?v=2","skincodecss"); \ No newline at end of file diff --git a/public/static/component/pear/css/module/button.css b/public/static/component/pear/css/module/button.css new file mode 100644 index 0000000..b675f5c --- /dev/null +++ b/public/static/component/pear/css/module/button.css @@ -0,0 +1,174 @@ +/** Buttom 默认*/ +.pear-btn { + display: inline-block; + line-height: 38px; + white-space: nowrap; + cursor: pointer; + text-align: center; + box-sizing: border-box; + outline: none; + transition: 0.1s; + font-weight: 500; + padding: 0 18px; + height: 38px; + font-size: 14px; + background-color: white; + border: 1px solid #dcdfe6; + border-radius: 2px; +} + +.pear-btn i { + font-size: 13px; +} + +.pear-btn:hover { + opacity: .8; + filter: alpha(opacity=80); + color: #409eff; + border-color: #c6e2ff; + background-color: #ECF5FF; +} + +.pear-btn-danger, +.pear-btn-warming, +.pear-btn-success, +.pear-btn-primary { + height: 37px; + line-height: 37px; + color: #fff !important +} +/** Button 主题 */ +.pear-btn-primary { + background-color: #2D8CF0 !important; + border: #2D8CF0; +} +.pear-btn-danger { + background-color: #f56c6c !important; + border: #f56c6c; +} +.pear-btn-warming { + background-color: #f6ad55 !important; + border: #f6ad55; +} +.pear-btn-success { + background-color: #5FB878 !important; + border: #5FB878; +} + +.pear-btn[round] { + border-radius: 50px; +} + +.pear-btn-primary[plain] { + color: #409eff !important; + background: #ecf5ff 10% !important; + border-color: #b3d8ff !important; +} + +.pear-btn-primary[plain]:hover { + color: #fff !important; + background-color: #2d8cf0!important +} + +.pear-btn-success[plain] { + color: #67c23a !important; + background: #f0f9eb !important; + border-color: #c2e7b0 !important; +} + +.pear-btn-success[plain]:hover { + color: white !important; + background-color: #67c23a !important +} + +.pear-btn-warming[plain] { + color: #e6a23c !important; + background: #fdf6ec !important; + border-color: #f5dab1 !important; +} + +.pear-btn-warming[plain]:hover { + color: white !important; + background-color: #e6a23c !important +} + +.pear-btn-danger[plain] { + color: #f56c6c !important; + background: #fef0f0 !important; + border-color: #fbc4c4 !important; +} + +.pear-btn-danger[plain]:hover { + color: white !important; + background-color: #f56c6c !important +} + +/** Button Group */ +.pear-btn-group { + display: inline-block; + vertical-align: middle; +} + +.pear-btn-group .pear-btn { + float: left; + position: relative; + border-radius: 0px; + margin-left: 1px; + margin-right: 1px; +} + +.pear-btn-md { + height: 34px; + line-height: 34px; + padding: 0 10px; + font-size: 12.5px; +} + +.pear-btn-group .pear-btn:first-child { + border-top-left-radius: 4px !important; + border-bottom-left-radius: 4px !important; +} + +.pear-btn-group .pear-btn:last-child { + border-top-right-radius: 4px !important; + border-bottom-right-radius: 4px !important; +} + +.pear-btn-group .pear-btn[round]:first-child { + border-top-left-radius: 50px !important; + border-bottom-left-radius: 50px !important; +} + +.pear-btn-group .pear-btn[round]:last-child { + border-top-right-radius: 50px !important; + border-bottom-right-radius: 50px !important; +} + +/** Button Size*/ +.pear-btn-sm { + height: 32px; + line-height: 32px; + padding: 0 10px; + font-size: 12px; +} + +.pear-btn-xs { + height: 28px; + line-height: 28px; + padding: 0 8px; + font-size: 12px; +} + +.pear-btn-md { + height: 34px; + line-height: 34px; + padding: 0 10px; + font-size: 12.5px; +} + +.pear-btn-lg { + height: 44px; + line-height: 44px; + padding: 0 25px; + font-size: 16px; +} diff --git a/public/static/component/pear/css/module/card.css b/public/static/component/pear/css/module/card.css new file mode 100644 index 0000000..39b4ed2 --- /dev/null +++ b/public/static/component/pear/css/module/card.css @@ -0,0 +1,93 @@ +.project-list-item { + background-color: #fff; + border-radius: 4px; + cursor: pointer; + transition: all .2s; +} + +.project-list-item:hover { + box-shadow: 2px 0 4px rgba(0, 21, 41, .35); +} + +.project-list-item .project-list-item-cover { + width: 100%; + height: 180px; + display: block; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +.project-list-item-body { + padding: 20px; + border: 1px solid #e8e8e8; +} + +.project-list-item .project-list-item-body>h2 { + font-size: 16px; + color: #333; + margin-bottom: 12px; +} + +.project-list-item .project-list-item-text { + height: 40px; + overflow: hidden; + margin-bottom: 12px; +} + +.project-list-item .project-list-item-desc { + position: relative; +} + +.project-list-item .project-list-item-desc .time { + color: #999; + font-size: 12px; +} + +.project-list-item .project-list-item-desc .ew-head-list { + position: absolute; + right: 0; + top: 0; +} + +.ew-head-list .ew-head-list-item:first-child { + margin-left: 0; +} + +.ew-head-list .ew-head-list-item { + width: 22px; + height: 22px; + border-radius: 50%; + border: 1px solid #fff; + margin-left: -10px; +} + +.ew-head-list .ew-head-list-item { + width: 22px; + height: 22px; + border-radius: 50%; + border: 1px solid #fff; + margin-left: -10px; +} + +.cloud-card-component { + padding: 20px; +} + +.cloud-card-component .layui-table-click { + border-radius: 6px!important; +} + +.ew-table-loading { + padding: 10px 0; + text-align: center; +} +.ew-table-loading > i { + color: #999; + font-size: 30px; +} +.ew-table-loading.ew-loading-float { + position: absolute; + top: 0; + left: 0; + right: 0; +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/code.css b/public/static/component/pear/css/module/code.css new file mode 100644 index 0000000..4bde0d3 --- /dev/null +++ b/public/static/component/pear/css/module/code.css @@ -0,0 +1,9 @@ +.layui-colla-content{ + padding: 0px; +} +.layui-code-view{ + margin: 0px!important; +} +.layui-code-h3{ + display: none!important; +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/cropper.css b/public/static/component/pear/css/module/cropper.css new file mode 100644 index 0000000..2c64042 --- /dev/null +++ b/public/static/component/pear/css/module/cropper.css @@ -0,0 +1,272 @@ +.cropper-container { + position: relative; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none +} + +.cropper-container img { + display: block; + width: 100%; + min-width: 0 !important; + max-width: none !important; + height: 100%; + min-height: 0 !important; + max-height: none !important; + image-orientation: 0deg !important +} + +.cropper-canvas, +.cropper-crop-box, +.cropper-drag-box, +.cropper-modal { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0 +} + +.cropper-drag-box { + background-color: #fff; + filter: alpha(opacity=0); + opacity: 0 +} + +.cropper-modal { + background-color: #000; + filter: alpha(opacity=50); + opacity: .5 +} + +.cropper-view-box { + display: block; + width: 100%; + height: 100%; + overflow: hidden; + outline: #69f solid 1px; + outline-color: rgba(102, 153, 255, .75) +} + +.cropper-dashed { + position: absolute; + display: block; + filter: alpha(opacity=50); + border: 0 dashed #fff; + opacity: .5 +} + +.cropper-dashed.dashed-h { + top: 33.33333333%; + left: 0; + width: 100%; + height: 33.33333333%; + border-top-width: 1px; + border-bottom-width: 1px +} + +.cropper-dashed.dashed-v { + top: 0; + left: 33.33333333%; + width: 33.33333333%; + height: 100%; + border-right-width: 1px; + border-left-width: 1px +} + +.cropper-face, +.cropper-line, +.cropper-point { + position: absolute; + display: block; + width: 100%; + height: 100%; + filter: alpha(opacity=10); + opacity: .1 +} + +.cropper-face { + top: 0; + left: 0; + cursor: move; + background-color: #fff +} + +.cropper-line { + background-color: #69f +} + +.cropper-line.line-e { + top: 0; + right: -3px; + width: 5px; + cursor: e-resize +} + +.cropper-line.line-n { + top: -3px; + left: 0; + height: 5px; + cursor: n-resize +} + +.cropper-line.line-w { + top: 0; + left: -3px; + width: 5px; + cursor: w-resize +} + +.cropper-line.line-s { + bottom: -3px; + left: 0; + height: 5px; + cursor: s-resize +} + +.cropper-point { + width: 5px; + height: 5px; + background-color: #69f; + filter: alpha(opacity=75); + opacity: .75 +} + +.cropper-point.point-e { + top: 50%; + right: -3px; + margin-top: -3px; + cursor: e-resize +} + +.cropper-point.point-n { + top: -3px; + left: 50%; + margin-left: -3px; + cursor: n-resize +} + +.cropper-point.point-w { + top: 50%; + left: -3px; + margin-top: -3px; + cursor: w-resize +} + +.cropper-point.point-s { + bottom: -3px; + left: 50%; + margin-left: -3px; + cursor: s-resize +} + +.cropper-point.point-ne { + top: -3px; + right: -3px; + cursor: ne-resize +} + +.cropper-point.point-nw { + top: -3px; + left: -3px; + cursor: nw-resize +} + +.cropper-point.point-sw { + bottom: -3px; + left: -3px; + cursor: sw-resize +} + +.cropper-point.point-se { + right: -3px; + bottom: -3px; + width: 20px; + height: 20px; + cursor: se-resize; + filter: alpha(opacity=100); + opacity: 1 +} + +.cropper-point.point-se:before { + position: absolute; + right: -50%; + bottom: -50%; + display: block; + width: 200%; + height: 200%; + content: " "; + background-color: #69f; + filter: alpha(opacity=0); + opacity: 0 +} + +@media (min-width:768px) { + .cropper-point.point-se { + width: 15px; + height: 15px + } +} + +@media (min-width:992px) { + .cropper-point.point-se { + width: 10px; + height: 10px + } +} + +@media (min-width:1200px) { + .cropper-point.point-se { + width: 5px; + height: 5px; + filter: alpha(opacity=75); + opacity: .75 + } +} + +.cropper-bg { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC) +} + +.cropper-invisible { + filter: alpha(opacity=0); + opacity: 0 +} + +.cropper-hide { + position: fixed; + top: 0; + left: 0; + z-index: -1; + width: auto !important; + min-width: 0 !important; + max-width: none !important; + height: auto !important; + min-height: 0 !important; + max-height: none !important; + filter: alpha(opacity=0); + opacity: 0 +} + +.cropper-hidden { + display: none !important +} + +.cropper-move { + cursor: move +} + +.cropper-crop { + cursor: crosshair +} + +.cropper-disabled .cropper-canvas, +.cropper-disabled .cropper-face, +.cropper-disabled .cropper-line, +.cropper-disabled .cropper-point { + cursor: not-allowed +} diff --git a/public/static/component/pear/css/module/dtree/dtree.css b/public/static/component/pear/css/module/dtree/dtree.css new file mode 100644 index 0000000..3e5364d --- /dev/null +++ b/public/static/component/pear/css/module/dtree/dtree.css @@ -0,0 +1,112 @@ + +/**************** 主题换肤 ****************/ +/* 默认风格*/ +.dtree-theme-item-this{background-color: #d2d2d2!important;} +.dtree-theme-item:hover{background-color: #eaeceb!important;} +.dtree-theme-item cite{font-size:12px!important;} +.dtree-theme-item:hover cite{color:#fe7786!important;} + +.dtree-theme-dtreefont{font-size: 16px!important;} +.dtree-theme-ficon{color:#000!important;} +.dtree-theme-icon{color:orange!important;} +.dtree-theme-checkbox:hover{color:#fe7786!important;} +.dtree-theme-choose{color:#fe7786!important;} + +/* layui主题风格*/ +.dtree-layui-item-this{background: none!important;} +.dtree-layui-item:hover{background: none!important;} +.dtree-layui-item cite{font-size:14px!important;} +.dtree-layui-item:hover cite{opacity:0.5;filter:Alpha(opacity=50);text-decoration: underline;} + +.dtree-layui-dtreefont{font-size: 18px!important;} +.dtree-layui-ficon{font-size: 18px!important;color:#393D49!important;} +.dtree-layui-icon{color:#666!important;} +.dtree-layui-checkbox:hover{color:#5FB878!important;} +.dtree-layui-choose{color:#5FB878!important;} + +/* laySimple主题风格*/ +.dtree-laySimple-item-this{background-color: #d2d2d2!important;} +.dtree-laySimple-item:hover{background-color: #eaeceb!important;} +.dtree-laySimple-item cite{font-size:12px!important;} +.dtree-laySimple-item:hover cite{color:#01AAED!important;} + +.dtree-laySimple-dtreefont{font-size: 16px!important;} +.dtree-laySimple-ficon{font-size: 14px!important;color:#393D49!important;} +.dtree-laySimple-icon{color:#393D49!important;} +.dtree-laySimple-checkbox:hover{color:#01AAED!important;} +.dtree-laySimple-choose{color:#01AAED!important;} +/**************** 树基础 ****************/ +/* 菜单栏*/ +.dtree-menubar {padding-left: 10px;} +.dtree-menubar .layui-btn-group .layui-btn-sm{height: 20px;line-height: 20px;padding: 0 5px;font-size: 12px;} +.dtree-menubar .layui-btn-group .layui-btn-sm i{font-size: 12px!important;} + +/* 工具栏*/ +.dtree-toolbar{position: absolute;z-index: 940520;padding: 0;background-color: #eceaeb;} +.dtree-toolbar .layui-nav-child{position: static;} +.dtree-toolbar .layui-nav-child dd{cursor: pointer;} +.dtree-toolbar .layui-nav-child dd a i{font-size:16px;display: inline-block;margin: 0px 1px;color:#fe7786;} +.dtree-toolbar .layui-nav-child dd a i:hover{font-weight: bold;} +.dtree-toolbar .layui-nav-bar{display: none!important;} +.dtree-toolbar-tool{padding: 30px;} + +.dtree-toolbar-fixed{position: absolute;right: 5px;top: 2px;font-style: normal;transition: all .3s;-webkit-transition: all .3s;} +/*.dtree-toolbar-fixed a{border:1px solid #fe7786;}*/ +.dtree-toolbar-fixed a i{font-size:14px;display: inline-block;margin: 0px 1px;color:#fe7786;} +.dtree-toolbar-fixed a i:hover{opacity:0.8;filter:Alpha(opacity=80);} + +/* 树基本*/ +.dtree{width:260px;} +.dtree-nav-item{line-height:33px;padding-left:16px;} +.dtree-nav-ul-sid{display: none;} +.dtree-none-text{font-size: 12px;text-align: center;color: gray;} + +/* 树线*/ +.dtree-nav-first-line,.dtree-nav-line,.dtree-nav-last-line{position: relative;} +.dtree-nav-first-line:before{content:"";position: absolute;height: 0;border-left: 1px dotted #c0c4cc;} +.dtree-nav-first-line:after{content:"";position: absolute;height: 0;border-top: 1px dotted #c0c4cc;} + +.dtree-nav-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 100%;border-left: 1px dotted #c0c4cc;} +.dtree-nav-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;} + +.dtree-nav-last-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 17px;border-left: 1px dotted #c0c4cc;} +.dtree-nav-last-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;} + + +/* 图标及复选框*/ +.dtreefont{cursor: pointer;} +.dtreefont-special{margin: 0 4px;} +.dtree-nav-checkbox-div{display: inline-block;} +.dtree-nav-checkbox-div>i{display: inline-block;margin: 0px 1px;} +.dtree-nav-checkbox-div>i:last-child{margin-right: 4px;} +.dtree-nav-checkbox-div>i:hover{opacity:0.8;filter:Alpha(opacity=80);} + +/* 行 文字*/ +.dtree-nav-div{display:block;vertical-align:top;position:relative;} +.dtree-nav-div cite{font-style: normal;cursor: pointer;} +.dtree-nav-div:hover cite{opacity:0.7;filter:Alpha(opacity=70);transition: all .3s;-webkit-transition: all .3s;} + +/* 规则属性*/ +.dtree-nav-show {display: block!important;} +.dtree-nav-hide {display: none!important;} +.dtree-nav-this {} +.dtree-icon-hide {opacity:0;filter:Alpha(opacity=0);} +.dtree-icon-null-open,.dtree-icon-null-close,.dtree-icon-null{margin: 0 2px;} +.dtree-disabled{cursor: not-allowed; color:#c2c2c2!important;} +.dtree-disabled:hover{color:#c2c2c2!important;} +.dtree-nav-div cite.dtree-disabled{font-style: normal; cursor: not-allowed; color:#c2c2c2!important;} +.dtree-nav-div>cite.dtree-disabled:hover{color:#c2c2c2!important;} + + +/** 下拉树属性*/ +.dtree-select{position: absolute;max-height: 500px;height: 350px;overflow: auto;width: 99%;z-index: 123;display: none;border:1px solid silver;top: 42px;} +.dtree-select-show{display: block!important;} + +/* 简单适配*/ +@media screen and (max-width:1700px) and (min-width:1300px){ + .dtree-nav-item {padding-left: 15px;} +} + + + + diff --git a/public/static/component/pear/css/module/dtree/dtree.js b/public/static/component/pear/css/module/dtree/dtree.js new file mode 100644 index 0000000..a05b22a --- /dev/null +++ b/public/static/component/pear/css/module/dtree/dtree.js @@ -0,0 +1,4947 @@ +/** + *@Name dtree 树形组件 + *@Author 智慧的小西瓜 + *@DOCS http://www.wisdomelon.com/DTreeHelper/ + *@License https://www.layui.com/ + *@LASTTIME 2019/10/24 + *@VERSION v2.5.6 + */ +layui.define(['jquery','layer','form'], function(exports) { + var $ = layui.$, + layer = layui.layer, + form = layui.form; + + // 树的公共定义样式汇总 + var LI_NAV_CHILD = "dtree-nav-ul-sid", LI_NAV_ITEM = "dtree-nav-item", + LI_DIV_ITEM = "dtree-nav-div", DTREEFONTSPECIAL="dtreefont-special", NONETITLE="dtree-none-text", + LI_DIV_MENUBAR = "dtree-menubar", + LI_DIV_TOOLBAR = "dtree-toolbar", TOOLBAR_TOOL = "dtree-toolbar-tool", TOOLBAR_TOOL_EM = "dtree-toolbar-fixed", + LI_DIV_CHECKBAR = "dtree-nav-checkbox-div", + LI_CLICK_CHECKBAR = "d-click-checkbar", //绑定点击复选框时需要用到 + LI_DIV_TEXT_CLASS = "t-click", UL_ROOT="dtree", + LI_NAV_FIRST_LINE = "dtree-nav-first-line", LI_NAV_LINE = "dtree-nav-line", LI_NAV_LAST_LINE = "dtree-nav-last-line"; + + + // 树的公共指定 + var NAV_THIS = "dtree-nav-this", //当前节点 + NAV_SHOW = "dtree-nav-show", //显示子节点 + NAV_HIDE = "dtree-nav-hide", //隐藏节点 + NAV_DIS = "dtree-disabled", //禁用节点 + ICON_HIDE = "dtree-icon-hide", //隐藏图标 + $BODY = $("body"), //body选择器 + $WIN = $(window), //window窗口 + $DOC = $(document), //当前文档 + MOD_NAME = "dtree", //模块名称 + VERSION = "v2.5.6", //版本 + OPTIONS = {}, //全局属性配置 + DTrees = {}; //当前被实例化的树的集合 + + // 树的自定义图标 + var DTREEFONT = "dtreefont", //默认使用图标字体 + LI_DIV_CHECKBAR_ON = "dtree-icon-fuxuankuangxuanzhong", //复选框选中图标 + LI_DIV_CHECKBAR_OUT = "dtree-icon-fuxuankuang", //复选框未选中图标 + LI_DIV_CHECKBAR_NOALL = "dtree-icon-fuxuankuang-banxuan", //复选框半选图标 + LI_DIV_MENUBAR_DOWN = "dtree-icon-move-down", //menubar的展开全部的图标 + LI_DIV_MENUBAR_UP = "dtree-icon-move-up", //menubar的收缩全部的图标 + LI_DIV_MENUBAR_REFRESH = "dtree-icon-refresh", //menubar的刷新图标 + LI_DIV_MENUBAR_CHECKALL = "dtree-icon-roundcheckfill", //menubar的全选图标 + LI_DIV_MENUBAR_UNCHECKALL = "dtree-icon-roundclosefill", //menubar的全不选图标 + LI_DIV_MENUBAR_INVERTALL = "dtree-icon-roundcheck", //menubar的反选图标 + LI_DIV_MENUBAR_DELETE = "dtree-icon-delete1", //menubar的删除图标 + LI_DIV_MENUBAR_SEARCH = "dtree-icon-search_list_light", //menubar的搜索图标 + LI_DIV_TOOLBAR_PULLDOWN = "dtree-icon-pulldown", //toolbar的展开图标 + LI_DIV_TOOLBAR_PULLUP = "dtree-icon-pullup", //toolbar的收缩图标 + LI_DIV_TOOLBAR_ADD = "dtree-icon-roundadd", //toolbar的新增图标 + LI_DIV_TOOLBAR_EDIT = "dtree-icon-bianji", //toolbar的编辑图标 + LI_DIV_TOOLBAR_DEL = "dtree-icon-roundclose"; //toolbar的删除图标 + + // 树的非叶子节点图标集合 + var nodeIconArray = { + "-1": {"open": "dtree-icon-null-open", "close": "dtree-icon-null-close"}, //未指定 + "0" : {"open": "dtree-icon-wenjianjiazhankai", "close": "dtree-icon-weibiaoti5"}, //文件夹(二级图标默认样式) + "1" : {"open": "dtree-icon-jian", "close": "dtree-icon-jia"}, //+-图标(一级图标默认样式) + "2" : {"open": "dtree-icon-xiangxia1", "close": "dtree-icon-xiangyou"} //箭头图标 + }; + + // 树的叶子节点图标集合 + var leafIconArray = { + "-1": "dtree-icon-null", //未指定 + "0" : "dtree-icon-weibiaoti5", //文件夹 + "1" : "dtree-icon-yonghu", //人员 + "2" : "dtree-icon-fenzhijigou", //机构 + "3" : "dtree-icon-fenguangbaobiao", //报表 + "4" : "dtree-icon-xinxipilu", //信息 + "5" : "dtree-icon-shuye1", //叶子(二级图标默认样式) + "6" : "dtree-icon-caidan_xunzhang", //勋章 + "7" : "dtree-icon-normal-file", //文件 + "8" : "dtree-icon-dian", //小圆点(一级图标默认样式) + "9" : "dtree-icon-set-sm", //齿轮 + "10" : "dtree-icon-rate" //星星 + }; + + // 树的自定义样式 + var DTREE = "dtree-", //自定义样式前缀 + ITEMTHIS = "-item-this", //自定义样式当前行选中后缀 + ITEM = "-item", //自定义样式当前行后缀 + DFONT = "-dtreefont", //自定义样式图标样式后缀 + FICON = "-ficon", //自定义样式一级图标样式后缀 + ICON = "-icon", //自定义样式二级图标样式后缀 + CBOX = "-checkbox", //自定义样式复选框样式后缀 + CHS = "-choose"; //自定义样式复选框选中样式后缀 + + // 树自定义操作事件名称集合 绑定dtree-click的事件 + var eventName = { + checkNodeClick: "checkNodeClick", //点击复选框 + itemNodeClick: "itemNodeClick" //点击子节点div + }; + + // 树默认toolbar提供的功能集合 绑定dtree-tool的事件 + var defaultTool = { + pulldown: "pulldown", //点击展开当前节点下的全部节点 + pullup: "pullup", //点击收缩当前节点下的全部节点 + addTool: "addToolbar", //点击toolbar新增 + editTool: "editToolbar", //点击toolbar编辑 + delTool: "delToolbar" //点击toolbar删除 + }; + + // 树默认menubar提供的功能集合 绑定dtree-menu的事件 + var defaultMenu = { + moveDown: "moveDown", //menubar展开全部节点 + moveUp: "moveUp", //menubar收缩全部节点 + refresh: "refresh", //menubar刷新树 + checkAll: "checkAll", //menubar全选 + unCheckAll: "unCheckAll", //menubar全不选 + invertAll: "invertAll", //menubar反选 + remove: "remove", //menubar删除选中节点 + searchNode: "searchNode" //menubar查询节点 + }; + + // 树的公共事件 + var event = { + getElemId: function(options){ // 根据传入的参数获取ID + var elem = options.elem || ""; + var obj = options.obj || $(elem); + + if (obj.length == 0) { //页面中未找到绑定id + return ""; + } else { + return $(obj)[0].id; + } + }, + escape: function(html){ + if(typeof html !== 'string') return ''; + return html.replace(entityReg.escape, function(match){return entityMap.escape[match];}); + }, + unescape: function(str){ + if(typeof str !== 'string') return ''; + return str.replace(entityReg.unescape, function(match){return entityMap.unescape[match];}); + }, + cloneObj: function (obj, filter) { //深复制对象方法 + var newObj = {}; + if (obj instanceof Array) { + newObj = []; + } + var str = ""; + if(typeof filter !== 'undefined') {str = filter.join(",");} + for (var key in obj) { + if(str.indexOf(key) == -1){ + var val = obj[key]; + newObj[key] = typeof val === 'object' ? event.cloneObj(val, typeof filter !== undefined ? filter : []): val; + } + + } + return newObj; + }, + trimToDot: function(str){ + return str.replace(/ /g, "."); + } + }; + + // 特殊符号转义 + var keys = Object.keys || function(obj) { + obj = Object(obj); + var arr = []; + for(var a in obj) arr.push(a); + return arr; + }; + var invert = function(obj){ + obj = Object(obj); + var result = {}; + for(var a in obj) result[obj[a]] = a; + return result; + }; + var entityMap = { + escape: { + "&" : "&", + "<" : "<", + ">" : ">", + "'" : "&quo;" + } + }; + entityMap.unescape = invert(entityMap.escape); + var entityReg = { + escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'), + unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g') + }; + + //异步加载接口 + var AjaxHelper = { + request : function(config) { + var data = config.data ? config.data : {}; + var async = (typeof (config.async) === "boolean") ? config.async : true; + $.ajax({ + type : config.type ? config.type : "POST", + headers : config.headers, + url : config.url, + dataType : config.dataType ? config.dataType : "json", + data : data, + async : async, + contentType : config.contentType, + xhrFields: {withCredentials: config.withCredentials}, + success : config.success, + error : function(XMLHttpRequest, textStatus, errorThrown) { + if (typeof (config.error) === "function") { + config.error(XMLHttpRequest, textStatus, errorThrown); + } else { + layer.msg("异步加载失败: " + textStatus,{icon:5, shift:6}); + } + }, + statusCode : { + 404 : function() { + layer.msg('未找到指定请求,请检查访问路径!',{icon:5, shift:6}); + }, + 500 : function() { + layer.msg('系统错误!',{icon:5, shift:6}); + } + }, + complete : function(XMLHttpRequest, textStatus) { + if (typeof (config.complete) === "function") { + config.complete(XMLHttpRequest, textStatus); + } + } + }); + }, + serialize: function(param){ //json序列化 key=value&key1=value1 + var p = "?"; + for (var key in param) { + p += key + "=" + param[key] + "&"; + } + p = p.substring(0, p.length-1); + return p; + } + }; + + // 树类 + var DTree = function(options){ + var _this = this; + /** 默认赋值**/ + this.formatter = { // 数据过滤 + title: false // 文字,默认不开启 + }; + this.response = { // 树返回的json格式 + statusName: "code", //返回标识 + statusCode: 200, //返回码 + message: "message", //返回信息 + rootName: "data", //根节点名称 + treeId: "id", //节点ID + parentId: "parentId", //父节点ID + title: "title", //节点名称 + ficonClass: "ficonClass", //自定义一级图标 + iconClass: "iconClass", //自定义二级图标 + childName: "children", //子节点名称 + last: "last", //是否最后一级节点 +// level: "level", //层级 + spread: "spread", //展开 + disabled: "disabled", //禁用 + hide: "hide", //隐藏 + checkArr: "checkArr", //复选框列表 + checked: "checked", //是否选中 + type: "type", //复选框标记 + basicData: "basicData" //表示用户自定义需要存储在树节点中的数据 + }; + this.defaultRequest = { // 树的默认发起请求参数格式,最后会将value作为参数名称传递 + nodeId: "nodeId", //节点ID + parentId: "parentId", //父节点ID + context: "context", //节点内容 + leaf: "leaf", //是否叶子节点 + level: "level", //层级 + spread: "spread", //节点展开状态 + dataType: "dataType", //节点标记 + checked: "checked", //节点复选框选中状态 + initchecked: "initchecked", //节点复选框初始状态 + basicData: "basicData", //用户自定义的记录节点数据 + recordData: "recordData", //当前data数据(排除basicData和children字段) + }; + this.toolbarFun = { + addTreeNode: function(param, $div) { //添加树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化 + return ; + }, + editTreeNode: function(param, $div) { //编辑树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化 + return ; + }, + editTreeLoad: function(param){ // 编辑树的数据回显,用于打开编辑时,回填数据 + return ; + }, + delTreeNode: function(param, $div){ //删除树后调用的函数,用于用户自定义,如未指定则树不会发生变化 + return ; + }, + loadToolbarBefore: function(buttons, param, $div){ // 右键菜单加载前的函数 + return buttons; + } + }; + this.toolbarStyle = { + title: "节点", + area: ["60%","80%"] + }; + this.menubarFun = { + remove: function(checkbarNodes){ //删除复选框选中节点,需要用户自定义,如未指定则树只是页面上做了修改 + return true; + } + }; + this.menubarTips = { + toolbar: [], + group: [defaultMenu.moveDown, defaultMenu.moveUp, defaultMenu.refresh, defaultMenu.checkAll, defaultMenu.unCheckAll, defaultMenu.invertAll, defaultMenu.remove, defaultMenu.searchNode], + freedom: [] + }; + this.checkbarFun = { + chooseBefore: function($i, node){ // 复选框点击前回调 + return true; + }, + chooseDone: function(checkbarNodesParam) { //复选框点击事件完毕后,返回该树关于复选框操作的全部信息,用于用户自定义,如未指定则树只是页面上做了修改 + return ; + } + }; + this.iframeDefaultRequest = { //iframe的默认参数,目的是与加载树的参数不一样 + nodeId: "nodeId", //节点ID + parentId: "parentId", //父节点ID + context: "context", //节点内容 + leaf: "leaf", //是否叶子节点 + level: "level", //层级 + spread: "spread", //节点展开状态 + dataType: "dataType", //节点标记 + checked: "checked", //节点复选框选中状态 + initchecked: "initchecked", //节点复选框初始状态 + basicData: "basicData", //用户自定义的记录节点数据 + recordData: "recordData", //当前data数据(排除basicData和children字段) + }; + + this.iframeFun = { + iframeDone: function(iframeParam){ //iframe加载完毕后,用于用户自定义事件 + return ; + } + }; + this.style = { //树最终使用的样式集合 + item: "", //每一项div的样式 + itemThis: "", //选中div的样式 + dfont: "", //一级图标的样式 + icon: "", //二级图标的样式 + cbox: "", //复选框的样式 + chs: "" //复选框选中的样式 + }; + this.usefontStyle = { //树最终使用的图标集合 + fnode:{ //一级节点 + node:{ //非叶子节点 + open:"", //节点展开 + close:"" //节点关闭 + }, + leaf:"" //叶子节点 + }, + snode:{ //二级节点 + node:{ //非叶子节点 + open:"", //节点展开 + close:"" //节点关闭 + }, + leaf:"" //叶子节点 + }, + checkbox:{ //复选框 + on:"", //复选框选中 + out:"", //未选中 + noall:"" //半选 + }, + menubar:{ //菜单栏 + movedown:"", //全部展开 + moveup:"", //全部收缩 + refresh:"", //刷新 + checkAll:"", //全选 + unCheckAll:"", //全不选 + invertAll:"", //反选 + remove:"", //删除 + search:"" //搜索 + }, + menubarExt:"", //扩展菜单栏 + toolbar:{ //工具栏 + menubar:{ //依附在菜单栏的工具栏 + movedown:"", //全部展开 + moveup:"", //全部收缩 + refresh:"", //刷新 + checkAll:"", //全选 + unCheckAll:"", //全不选 + invertAll:"", //反选 + remove:"", //删除 + search:"" //搜索 + }, + menubarExt:"", //依附在菜单栏的扩展菜单栏 + pulldown:"", //展开 + pullup:"", //收缩 + add:"", //添加 + edit:"", //编辑 + del:"" //删除 + }, + toolbarExt:"" //扩展工具栏 + } + + /** 数据绑定**/ + this.node = { // 树节点选中时,包含当前节点的全部信息 + nodeId: "", //节点ID + parentId: "", //父节点ID + context: "", //节点内容 + leaf: "", //是否叶子节点 + level: "", //层级 + spread: "", //节点展开状态 + dataType: "", //节点标记 + checked: "", //节点复选框选中状态 + initchecked: "", //节点复选框初始状态 + basicData: "", //用户自定义的记录节点数据 + recordData: "", //当前data数据(排除basicData和children字段) + }; + + this.toolbarMenu = {}; // 工具栏右键菜单绑定的所有元素 + this.checkbarNode = []; // 复选框标记的全部节点数据 + this.errData = []; // 记录在渲染节点时有问题的数据 + this.checkArrLen = 0; //添加节点的时判断复选框个数 + this.temp = []; // 临时变量 + this.bak = ""; // 临时变量 + this.setting(options); + }; + + /******************** 初始参数加载 ********************/ + // 设置基本参数值 + DTree.prototype.setting = function(options) { + this.options = options || {}; + + /** 绑定元素参数(必填,2个参数项必填一个)**/ + this.elem = this.options.elem || OPTIONS.elem || ""; //树绑定的元素ID:#elem + if(typeof this.options.obj === 'undefined'){ + if(this.elem) { + if($(this.elem).length > 0) { + this.obj = $(this.elem); + } + } + } else { + this.obj = this.options.obj || OPTIONS.obj || this.obj; //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到 + this.elem = "#" + this.obj[0].id; + } + + /** 基本参数**/ + this.scroll = this.options.scroll || OPTIONS.scroll || this.elem; //树的上级div容器,让树可以显示滚动条的div容器的ID + this.accordion = (typeof (this.options.accordion) === "boolean") ? this.options.accordion : (typeof (OPTIONS.accordion) === "boolean") ? OPTIONS.accordion : false; //手风琴加载, 默认false + if(this.accordion) { + this.initLevel = 1; //默认展开节点 1节 + } else { + this.initLevel = this.options.initLevel || OPTIONS.initLevel || 2; //默认展开节点 2节 + } + this.type = this.options.type || OPTIONS.type || "load"; //树的加载方式 all,全量树, load,增量树,默认load + this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : (typeof (OPTIONS.cache) === "boolean") ? OPTIONS.cache : true; //数据缓存,默认true + this.record = this.options.record || OPTIONS.record || false; //开启数据记录模式,默认false + this.load = (typeof (this.options.load) === "boolean") ? this.options.load : (typeof (OPTIONS.load) === "boolean") ? OPTIONS.load : true; //开启加载动画,默认true + this.none = this.options.none || OPTIONS.nont || "无数据"; //初始加载无记录时显示文字 + this.tempHeight = this.options.height || OPTIONS.height; //临时转换高度变量 + if(this.tempHeight) { // 设置高度 + if(/^full-\d+$/.test(this.tempHeight)) { + this.fullHeightGap = this.tempHeight.split('-')[1]; + this.height = $WIN.height() - this.fullHeightGap; //设置高度 + } else { + this.fullHeightGap = this.tempHeight; + this.height = this.tempHeight; + } + } else { + this.fullHeightGap = ""; + this.height = ""; + } + this.width = this.options.width || OPTIONS.width || "260"; //宽度 + this.obj.css("width", this.width); + + /** 样式相关参数**/ + this.iconfont = this.options.iconfont || OPTIONS.iconfont || DTREEFONT; //默认图标字体 dtreefont + this.iconfontStyle = this.options.iconfontStyle || OPTIONS.iconfontStyle || {}; //用于自定义树的每个关键部位使用的图标 + this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray || OPTIONS.nodeIconArray) || nodeIconArray; //用户自定义非叶子节点图标集合,node + this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray || OPTIONS.leafIconArray) || leafIconArray; //用户自定义叶子节点图标集合,leaf + this.skin = this.options.skin || OPTIONS.skin || "theme"; // 自定义样式 + if(this.skin == "layui"){ // layui主题 + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : (typeof (OPTIONS.line) === "boolean") ? OPTIONS.line : true; //开启树线,默认开启 + this.ficon = this.options.ficon || OPTIONS.ficon || "7"; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'7' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'1' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; //一级图标中的leaf节点图标 + this.icon = this.options.icon || OPTIONS.icon || "-1"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } else if(this.skin == "laySimple"){ // laySimple主题 + this.line = this.options.line || OPTIONS.line || false; //开启树线,默认不开启 + this.ficon = this.options.ficon || OPTIONS.ficon || ["2","-1"]; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'-1' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "2") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'2' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标 + this.icon = this.options.icon || OPTIONS.icon || "-1"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } else { // 默认主题 或者自定义主题 + this.line = this.options.line || OPTIONS.line || false; //开启树线,默认不开启 + this.ficon = this.options.ficon || OPTIONS.ficon || "8"; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'8' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'1' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标 + this.icon = this.options.icon || OPTIONS.icon || "5"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'5' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'0' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } + + /** 数据加载参数**/ + this.url = this.options.url || OPTIONS.url || ""; //请求地址 + this.async = (typeof (this.options.async) === "boolean") ? this.options.async : (typeof (OPTIONS.async) === "boolean") ? OPTIONS.async : true; //异步同步加载,默认异步加载 + this.headers = this.options.headers || OPTIONS.headers || {}; //ajax header属性 + this.method = this.options.method || OPTIONS.method || "post"; //请求类型 + this.dataType = this.options.dataType || OPTIONS.dataType || "json"; //参数类型 + this.contentType = this.options.contentType || OPTIONS.contentType || "application/x-www-form-urlencoded"; //发送信息至服务器时内容编码类型 + this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest || OPTIONS.defaultRequest) || this.defaultRequest; //默认请求参数 + this.filterRequest = this.options.filterRequest || OPTIONS.filterRequest || []; //过滤请求参数 + this.request = this.options.request || OPTIONS.request || {}; //用户自定义请求参数 + this.response = $.extend(this.response, this.options.response || OPTIONS.response) || this.response; //返回json格式 + this.data = this.options.data || OPTIONS.data || null; //初始化指定该参数,则不会访问异步接口 + this.dataFormat = this.options.dataFormat || OPTIONS.dataFormat || "levelRelationship"; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认 + this.dataStyle = this.options.dataStyle || OPTIONS.dataStyle || "defaultStyle"; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格 + this.errDataShow = this.options.errDataShow || OPTIONS.errDataShow || false; //是否在递归数据出现错误后,显示错误信息,默认false + this.withCredentials = this.options.withCredentials || OPTIONS.withCredentials || false; //是否允许跨域请求,默认false + this.success = this.options.success || OPTIONS.success || function(data, obj){}; //树加载完毕后执行解析树之前的回调 + this.done = this.options.done || OPTIONS.done || function(data, obj){}; //树加载完毕后的回调 + this.formatter = $.extend(this.formatter, this.options.formatter || OPTIONS.formatter) || this.formatter; //数据过滤 + this.error = this.options.error || OPTIONS.error || function(XMLHttpRequest, textStatus, errorThrown){}; // 异步加载异常回调 + this.complete = this.options.complete || OPTIONS.complete || function(XMLHttpRequest, textStatus){}; // 异步加载完成回调 + + /** 复选框参数**/ + this.checkbar = this.options.checkbar || OPTIONS.checkbar || false; //是否开启复选框模式 + this.checkbarLoad = this.options.checkbarLoad || OPTIONS.checkbarLoad || "node"; //复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点 + this.checkbarType = this.options.checkbarType || OPTIONS.checkbarType || "all"; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all + this.checkbarData = this.options.checkbarData || OPTIONS.checkbarData || "choose"; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all记录全部数据,halfChoose记录选中和半选中的数据,默认choose + this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun || OPTIONS.checkbarFun) || this.checkbarFun; //checkbar事件加载 + + /** 菜单栏参数**/ + this.menubar = this.options.menubar || OPTIONS.menubar || false; //是否打开菜单栏 + this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips || OPTIONS.menubarTips) || this.menubarTips; //菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由 + this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun || OPTIONS.menubarFun) || this.menubarFun; //menubar事件加载 + + /** 工具栏参数**/ + this.toolbar = this.options.toolbar || OPTIONS.toolbar || false; //是否开启可编辑模式 + this.toolbarWay = this.options.toolbarWay || OPTIONS.toolbarWay || "contextmenu"; //工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧 + this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle || OPTIONS.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小 + this.toolbarLoad = this.options.toolbarLoad || OPTIONS.toolbarLoad || "node"; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级 + this.toolbarShow = this.options.toolbarShow || OPTIONS.toolbarShow || ["add","edit","delete"]; //toolbar三个按钮自定义加载 + this.toolbarBtn = this.options.toolbarBtn || OPTIONS.toolbarBtn || null; //toolbar增删改中内容的自定义加载 + this.toolbarExt = this.options.toolbarExt || OPTIONS.toolbarExt || []; //toolbar按钮扩展 + this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun || OPTIONS.toolbarFun) || this.toolbarFun; //toolbar事件加载 + + /** iframe模式参数**/ + this.useIframe = this.options.useIframe || OPTIONS.useIframe || false; //是否加载iframe 默认false, + this.iframeElem = this.options.iframeElem || OPTIONS.iframeElem || ""; //iframe的ID + this.iframeUrl = this.options.iframeUrl || OPTIONS.iframeUrl || ""; //树关联的iframe地址 + this.iframeLoad = this.options.iframeLoad || OPTIONS.iframeLoad || "leaf"; //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级 + this.iframeDefaultRequest = $.extend(this.iframeDefaultRequest, this.options.iframeDefaultRequest || OPTIONS.iframeDefaultRequest) || this.iframeDefaultRequest; //iframe的默认传递参数 + this.iframeRequest = $.extend(this.iframeRequest, this.options.iframeRequest) || $.extend(this.iframeRequest, OPTIONS.iframeRequest) || this.iframeRequest; //iframe的自定义参数 + this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || $.extend(this.iframeFun, OPTIONS.iframeFun) || this.iframeFun; //iframe事件加载 + + /** 下拉树模式参数**/ + this.select = this.options.select || false; + if(this.select) { + // 重置下拉树 + this.selectSetting(); + } + + /** 调用确认最终主题方法*/ + this.ensureTheme(); + }; + + // 设置基本参数值 + DTree.prototype.reloadSetting = function(options) { + this.options = $.extend(this.options, options) || this.options; + + /** 绑定元素参数**/ + this.elem = this.options.elem || this.elem; //树绑定的元素ID:#elem + if(typeof this.options.obj === 'undefined'){ + if(this.elem) { + if($(this.elem).length > 0) { + this.obj = $(this.elem); + } + } + } else { + this.obj = this.options.obj || this.obj; //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到 + this.elem = "#" + this.obj[0].id; + } + + /** 基本参数**/ + this.scroll = this.options.scroll || this.scroll; //树的上级div容器,让树可以显示滚动条的div容器 + this.accordion = (typeof (this.options.accordion) === "boolean") ? this.options.accordion : this.accordion; //开启手风琴加载 + if(this.accordion) { + this.initLevel = 1; //默认展开节点 1节 + } else { + this.initLevel = this.options.initLevel || this.initLevel; //默认展开节点 2节 + } + this.type = this.options.type || this.type; //树的加载方式 all,全量树, load,增量树,默认load + this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : this.cache; //开启数据缓存 + this.record = (typeof (this.options.record) === "boolean") ? this.options.record : this.record; //开启数据记录模式 + this.load = (typeof (this.options.load) === "boolean") ? this.options.load : this.load; //开启加载动画 + this.none = this.options.none || this.none; //初始节点加载无数据时显示文字 + this.tempHeight = this.options.height || this.height; //临时转换高度变量 + if(this.tempHeight) { //设置高度 + if(/^full-\d+$/.test(this.tempHeight)) { + this.fullHeightGap = this.tempHeight.split('-')[1]; + this.height = $WIN.height() - this.fullHeightGap; + } else { + this.fullHeightGap = this.tempHeight; + this.height = this.tempHeight; + } + } + this.width = this.options.width || this.width; //宽度 + this.obj.css("width", this.width); + + /** 样式相关参数**/ + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : this.line; //开启树线,默认不开启 + this.iconfont = this.options.iconfont || this.iconfont; //默认图标字体 dtreefont + this.iconfontStyle = this.options.iconfontStyle || this.iconfontStyle; //用于自定义树的每个关键部位使用的图标 + this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray) || this.nodeIconArray; //用户自定义非叶子节点图标集合,node + this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray) || this.leafIconArray; //用户自定义叶子节点图标集合,leaf + this.skin = this.options.skin || this.skin; //自定义样式 + if(this.skin == "layui"){ //layui主题 + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : true; //开启树线,默认开启 + this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'7' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'1' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; //一级图标中的leaf节点图标 + this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } else if(this.skin == "laySimple"){ //laySimple主题 + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; //开启树线,默认不开启 + this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'-1' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "2") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'2' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1];//一级图标中的leaf节点图标 + this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } else { // 默认主题 或者自定义主题 + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; //开启树线,默认不开启 + this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'8' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'1' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标 + this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'5' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'0' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } + + /** 数据加载参数**/ + this.url = this.options.url || this.url; //请求地址 + this.async = (typeof (this.options.async) === "boolean") ? this.options.async : this.async; //异步同步加载,默认异步加载 + this.headers = this.options.headers || this.headers; //ajax header属性 + this.method = this.options.method || this.method; //请求类型 + this.dataType = this.options.dataType || this.dataType; //参数类型 + this.contentType = this.options.contentType || this.contentType; //发送信息至服务器时内容编码类型 + this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest) || this.defaultRequest; //默认请求参数 + this.filterRequest = this.options.filterRequest || this.filterRequest; //过滤请求参数 + this.request = this.options.request || this.request; //用户自定义请求参数 + this.response = $.extend(this.response, this.options.response) || this.response; //返回json格式 + this.data = this.options.data || this.data; //初始化指定该参数,则不会访问异步接口 + this.dataFormat = this.options.dataFormat || this.dataFormat; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认 + this.dataStyle = this.options.dataStyle || this.dataStyle; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格 + this.errDataShow = (typeof (this.options.errDataShow) === "boolean") ? this.options.errDataShow : this.errDataShow; //是否在使用list模式递归数据出现错误时,显示错误信息 + this.withCredentials = (typeof (this.options.withCredentials) === "boolean") ? this.options.withCredentials : this.withCredentials; //是否允许跨域请求 + this.success = this.options.success || this.success; //树加载完毕后执行解析树之前的回调 + this.done = this.options.done || this.done; //树加载完毕后的回调 + this.formatter = $.extend(this.formatter, this.options.formatter)|| this.formatter; //数据过滤 + this.error = this.options.error || this.error; //异步加载异常回调 + this.complete = this.options.complete || this.complete; //异步加载完成回调 + + /** 复选框参数**/ + this.checkbar = this.options.checkbar || this.checkbar; //是否开启复选框模式 + this.checkbarLoad = this.options.checkbarLoad || this.checkbarLoad; //复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点 + this.checkbarType = this.options.checkbarType || this.checkbarType; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all + this.checkbarData = this.options.checkbarData || this.checkbarData; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all记录全部数据,halfChoose记录选中和半选中的数据,默认choose + this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun)|| this.checkbarFun; //checkbar事件加载 + + /** 菜单栏参数**/ + this.menubar = this.options.menubar || this.menubar; //是否打开菜单栏 + this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips) || this.menubarTips; //菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由 + this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun) || this.menubarFun; //menubar事件加载 + + /** 工具栏参数**/ + this.toolbar = this.options.toolbar || this.toolbar; //是否开启工具栏 + this.toolbarWay = this.options.toolbarWay || this.toolbarWay; //工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧 + this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小 + this.toolbarLoad = this.options.toolbarLoad || this.toolbarLoad; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级 + this.toolbarShow = this.options.toolbarShow || this.toolbarShow; //toolbar三个按钮 + this.toolbarBtn = this.options.toolbarBtn || this.toolbarBtn; //toolbar增删改中内容的自定义加载 + this.toolbarExt = this.options.toolbarExt || this.toolbarExt; //toolbar按钮扩展 + this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun) || this.toolbarFun; //toolbar事件加载 + + /** iframe模式参数**/ + this.useIframe = this.options.useIframe || this.useIframe;//是否加载iframe 默认false + this.iframeElem = this.options.iframeElem || this.iframeElem; //iframe的ID + this.iframeUrl = this.options.iframeUrl || this.iframeUrl; //树关联的iframe地址 + this.iframeLoad = this.options.iframeLoad || this.iframeLoad; //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级 + this.iframeDefaultRequest = $.extend(this.iframeDefaultRequest, this.options.iframeDefaultRequest) || this.iframeDefaultRequest; //iframe的默认传递参数 + this.iframeRequest = $.extend(this.iframeRequest, this.options.iframeRequest) || this.iframeRequest; //iframe的自定义参数 + this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载 + + /** 下拉树模式参数**/ + if(this.select) { + // 重置下拉树 + this.reloadSelectSetting(); + } + + /** 调用确认最终主题方法*/ + this.ensureTheme(); + + }; + + // 设置下拉树的基本参数值 + DTree.prototype.selectSetting = function() { + /** select模式参数*/ + this.select = true; //配置成select模式 + + this.selectInitVal = this.obj.attr("data-value") || this.options.selectInitVal || ""; //输入框的值 + this.selectTreeDiv = this.obj[0].id + "_tree_div"; // 上级DIV节点 + this.selectCardDiv = this.obj[0].id + "_select_card_div"; // 上级layui卡片节点 + this.selectDiv = this.obj[0].id + "_select_div"; // 模拟的select节点 + this.selectTipsName = this.obj[0].id + "_select_input"; // select的提示输入框名称 + this.selectTips = this.options.selectTips || "请选择"; // 输入框的提示语 + this.selectInputName = this.options.selectInputName || {nodeId: this.obj[0].id + "_select_nodeId"}; // select表单中的元素 + + // 调取下拉树的特殊处理页面元素标识 + this.renderSelectDom(); + } + + // 重新设置下拉树的基本参数值 + DTree.prototype.reloadSelectSetting = function() { + + this.selectInitVal = this.obj.attr("data-value") || this.options.selectInitVal || this.selectInitVal; //输入框的值 + this.selectTips = this.options.selectTips || this.selectTips; // 输入框的提示语 + this.selectInputName = $.extend(this.selectInputName, this.options.selectInputName) || this.selectInputName; // select表单中的元素 + + // 调取下拉树的特殊处理页面元素标识 + this.reloadSelectDom(); + } + + /******************** 下拉树设置区域 ********************/ + // 渲染下拉树的Dom结构 + DTree.prototype.renderSelectDom = function() { + var _this = this; + var rootId = _this.obj[0].id; + + // 设置自定义表单隐藏域 + var selectInputName = _this.selectInputName; + var selectInput = []; + for(var key in selectInputName) { + selectInput.push(''); + } + + // 设置html + var prevHtml = ['
          ', + '
          ', selectInput.join(""), + '', + '', + '
          '].join(''); + + _this.obj.before(prevHtml); + + _this.obj.wrap('
          ').wrap('
          ').wrap('
          '); + + } + + // 重新渲染下拉树的Dom结构 + DTree.prototype.reloadSelectDom = function() { + var _this = this; + var rootId = _this.obj[0].id; + + // 设置自定义表单隐藏域 + var selectInputName = _this.selectInputName; + var selectInput = []; + for(var key in selectInputName) { + selectInput.push(''); + } + + $("div[dtree-id='"+rootId+"'][dtree-select='"+_this.selectDiv+"']").find("div.layui-select-title").html(""); + + // 设置html + var prevHtml = [selectInput.join(""), + '', + ''].join(''); + + $("div[dtree-id='"+rootId+"'][dtree-select='"+_this.selectDiv+"']").find("div.layui-select-title").html(prevHtml); + + } + + // 设置输入框的值 + DTree.prototype.selectVal = function(param) { + var _this = this; + var rootId = _this.obj[0].id; + var selectInputName = _this.selectInputName; + var selectTipsNameValue = ""; + var selectValues = {}; + + // 如果开启了复选框,则此方法用来取值 + if(_this.checkbar) { + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "']").each(function(){ + var name = $(this).attr("name"); + var val = $(this).val(); + selectValues[name] = val; + }); + } else { + if(typeof param === 'undefined') { // 不传,则为当前树中记录的ID + param = _this.getNowParam(); + } + if(typeof param === 'string') { // 传递ID,则查询树节点ID对应的值 + param = _this.getParam(param); + } + + selectTipsNameValue = param["context"]; + for(var key in selectInputName) { + selectValues[selectInputName[key]] = param[key]; + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+selectInputName[key]+"']").val(param[key] || ""); + } + + if(param["nodeId"] && !param["context"]) { + selectTipsNameValue = _this.getParam(param["nodeId"]); + } + + // 返显提示输入框值 + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+_this.selectTipsName+"']").val(selectTipsNameValue || ""); + + } + + + // 返回隐藏域中的值 + return selectValues; + } + + // 设置复选框模式中的下拉树的值 + DTree.prototype.selectCheckboxVal = function() { + var _this = this; + var rootId = _this.obj[0].id; + var selectInputName = _this.selectInputName; + + // 获取全部复选框选中节点 + var param = _this.getCheckbarJsonArrParam(); + + selectTipsNameValue = param["context"]; + var selectValues = {}; + for(var key in selectInputName) { + var value = param[key].join(","); + selectValues[selectInputName[key]] = value; + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+selectInputName[key]+"']").val(value); + } + + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+_this.selectTipsName+"']").val(selectTipsNameValue); + + // 返回隐藏域中的值 + return selectValues; + } + + // 重置下拉树的值 + DTree.prototype.selectResetVal = function() { + var _this = this; + var rootId = _this.obj[0].id; + // 表单清空 + $("input[dtree-id='"+rootId+"']").val(""); + // 节点重置 + _this.cancelNavThis(); + if(_this.checkbar) { + // 复选框重置 + _this.cancelCheckedNode(); + } + } + + + /******************** 字体及图标区域 ********************/ + // 确认最终主题 + DTree.prototype.ensureTheme = function(){ + var _this = this; + + // 确认style + this.style.item = DTREE + this.skin + ITEM; + this.style.itemThis = DTREE + this.skin + ITEMTHIS; + this.style.dfont = DTREE + this.skin + DFONT; + this.style.ficon = DTREE + this.skin + FICON; + this.style.icon = DTREE + this.skin + ICON; + this.style.cbox = DTREE + this.skin + CBOX; + this.style.chs = DTREE + this.skin + CHS; + + // 确认usefontStyle + var iconfont = this.iconfont; + var iconfonts = []; + if(typeof iconfont === 'string') { + iconfonts.push(iconfont); + } else { + iconfonts = iconfont; + } + + var iconfontStyle = this.iconfontStyle; + var iconfontStyles = []; + if(iconfontStyle.length == undefined) { + iconfontStyles.push(iconfontStyle); + } else { + iconfontStyles = iconfontStyle; + } + + for(var i=0; i 0) { + $lis.each(function(){ + _this.showLineLi($(this)); + }); + } else { + _this.obj.find("li[data-id]").each(function(){ + _this.showLineLi($(this)); + }); + } + } + } + + // 真正显示树线的方法 + DTree.prototype.showLineLi = function($li){ + var _this = this; + var $div = $li.children("div"), + $nextLi = $li.next("li"), + $ul = $li.parent("ul"); + if($ul[0].id == _this.obj[0].id) { + // 根节点下的节点 + $li.removeClass(LI_NAV_LINE); + $li.removeClass(LI_NAV_LAST_LINE); + $li.addClass(LI_NAV_FIRST_LINE); + } else { + // 非根节点下的节点 + var $pnextLi = $ul.parent("li").next("li"); + if($pnextLi.length == 0) { + if($nextLi.length == 0){ + $li.removeClass(LI_NAV_LINE); + $li.removeClass(LI_NAV_FIRST_LINE); + $li.addClass(LI_NAV_LAST_LINE); + } else { + $li.removeClass(LI_NAV_FIRST_LINE); + $li.removeClass(LI_NAV_LAST_LINE); + $li.addClass(LI_NAV_LINE); + } + }else { + var $pnextdiv = $pnextLi.children("div"); + if($nextLi.length == 0 && $div.children("cite").attr("data-leaf") == "leaf" && $pnextdiv.children("cite").attr("data-leaf") == "leaf") { + $li.removeClass(LI_NAV_FIRST_LINE); + $li.removeClass(LI_NAV_LINE); + $li.addClass(LI_NAV_LAST_LINE); + } else { + $li.removeClass(LI_NAV_FIRST_LINE); + $li.removeClass(LI_NAV_LAST_LINE); + $li.addClass(LI_NAV_LINE); + } + } + } + } + + /******************** 初始化数据区域 ********************/ + // 设置高度 + DTree.prototype.autoHeight = function(){ + var _this = this; + var height = _this.height; + if(height != "") { + if(_this.elem == _this.scroll){ + _this.obj.parent().css("height", height + "px"); + } else { + var $toolbarDiv = _this.obj.closest(_this.scroll); + $toolbarDiv.css("height", height + "px"); + } + } + }; + + // 重载树 + DTree.prototype.reload = function(options){ + var _this = this; + _this.reloadSetting(options); + _this.init(); + }; + + // 初始化树 + DTree.prototype.init = function(){ + var _this = this; + if (typeof _this !== "object") { + //_this.obj.html(_this.getNoneDom().errText("树组件未成功加载,请检查配置")); + layer.msg("树组件未成功加载,请检查配置", {icon:5}); + return ; + } + + // 设置组件高度 + _this.autoHeight(); + + if(_this.data) { + if(typeof _this.data.length === 'undefined'){ + //_this.obj.html(_this.getNoneDom().errText("数据解析异常,data数据格式不正确")); + layer.msg("数据解析异常,data数据格式不正确", {icon:5}); + return ; + } + + if(_this.data.length == 0) { + _this.obj.html(_this.getNoneDom().text()); + return ; + } + + //先将ul中的元素清空 + _this.obj.html(""); + + setTimeout(function () { + // 加载完毕后执行树解析前的回调 + _this.success(_this.data, _this.obj); + + // 第一次解析树 + if (_this.dataFormat == 'list'){ + //1.识别根节点ul中的data-id标签,判断顶级父节点 + var pid = _this.obj.attr("data-id"); + //2.构建一个存放节点的树组 + var rootListData = _this.queryListTreeByPid(pid, _this.data); + _this.loadListTree(rootListData, _this.data, 1); + } else { + _this.loadTree(_this.data, 1); + } + + // 显示树线 + _this.showLine(); + + // 这种情况下需要一开始就将toolbar显示在页面上 + if(_this.toolbar && _this.toolbarWay != 'contextmenu') { + _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); + } + + // 判断是否存在错误数据,并是否打印错误数据 + _this.msgErrData(); + + // 设置复选框的初始值 + if(_this.select){ + _this.selectVal(_this.selectInitVal); + } + + // 保存树副本 + _this.bak = _this.obj.html(); + + // 加载完毕后的回调 + _this.done(_this.data, _this.obj); + }, 100); + } else { + if (!_this.url) { + //_this.obj.html(_this.getNoneDom().errText("数据请求异常,url参数未指定")); + layer.msg("数据请求异常,url参数未指定", {icon:5}); + return ; + } + + //先将ul中的元素清空 + _this.obj.html(""); + + var index = _this.load ? layer.load(1) : ""; + + AjaxHelper.request({ + async: _this.async, + headers: _this.headers, + type: _this.method, + url: _this.url, + dataType: _this.dataType, + contentType: _this.contentType, + withCredentials: _this.withCredentials, + data: _this.getFilterRequestParam(_this.getRequestParam()), + success: function(result) { + if (typeof result === 'string') { + result = $.parseJSON(result); + } + + // 加载完毕后执行树解析前的回调 + _this.success(result, _this.obj); + + var code = ""; + if (_this.dataStyle == 'layuiStyle'){ + code = result[_this.response.statusName]; + } else { + code = result.status[_this.response.statusName]; + } + + if (code == _this.response.statusCode) { + var d = result[_this.response.rootName]; + + if(typeof d.length === 'undefined'){ + _this.obj.html(_this.getNoneDom().errText("数据解析异常,url回调后的数据格式不正确")); + //layer.msg("数据解析异常,url回调后的数据格式不正确", {icon:5}); + return ; + } + + if(d.length == 0) { + _this.obj.html(_this.getNoneDom().text()); + return ; + } + + // 第一次解析树 + if (_this.dataFormat == 'list'){ + //1.识别根节点ul中的data-id标签,判断顶级父节点 + var pid = _this.obj.attr("data-id"); + //2.构建一个存放节点的树组 + var rootListData = _this.queryListTreeByPid(pid, d); + _this.loadListTree(rootListData, d, 1); + } else { + _this.loadTree(d, 1); + } + + // 显示树线 + _this.showLine(); + + // 这种情况下需要一开始就将toolbar显示在页面上 + if(_this.toolbar && _this.toolbarWay != 'contextmenu') { + _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); + } + + // 判断是否存在错误数据,并是否打印错误数据 + _this.msgErrData(); + + // 设置复选框的初始值 + if(_this.select){ + _this.selectVal(_this.selectInitVal); + } + + // 保存树副本 + _this.bak = _this.obj.html(); + + // 加载完毕后的回调 + _this.done(result, _this.obj); + } else { + // 如果打印不出任何信息说明是在这里,用了错误的数据格式, 或返回码不正确 + if (_this.dataStyle == 'layuiStyle'){ + _this.obj.html(_this.getNoneDom().errText(result[_this.response.message])); + _this.error(null, code, result[_this.response.message]); + //layer.msg(result[_this.response.message], {icon:2}); + } else { + _this.obj.html(_this.getNoneDom().errText(result.status[_this.response.message])); + _this.error(null, code, result.status[_this.response.message]); + //layer.msg(result.status[_this.response.message], {icon:2}); + } + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown){// 异步加载异常回调 + _this.obj.html(_this.getNoneDom().errText(textStatus + ": " + errorThrown)); + _this.error(XMLHttpRequest, textStatus, errorThrown); + }, + complete: function(XMLHttpRequest, textStatus){// 异步加载完成回调 + if(_this.load){layer.close(index);} + _this.complete(XMLHttpRequest, textStatus); + } + }); + } + }; + + // 加载子节点 + DTree.prototype.getChild = function($div, data) { + var _this = this, $ul = $div.next("ul"); + + _this.setNodeParam($div); + + if(typeof data !== 'undefined') { + if(typeof data.length === 'undefined'){ + //_this.obj.html(_this.getNoneDom().errText("数据解析异常,data数据格式不正确")); + layer.msg("数据解析异常,data数据格式不正确", {icon:5}); + return ; + } + + //先将ul中的元素清空 + $ul.html(""); + + // 解析树 + if (_this.dataFormat == 'list'){ + var pid = _this.node.nodeId; + var level = parseInt(_this.node.level)+1; + + var listData = _this.queryListTreeByPid(pid, data); + _this.loadListTree(listData, _this.data, level); + } else { + _this.loadTree(data, level); + } + + // 显示树线 + _this.showLine(); + + // 这种情况下需要一开始就将toolbar显示在页面上 + if(_this.toolbar && _this.toolbarWay != 'contextmenu') { + _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); + } + + // 判断是否存在错误数据,并是否打印错误数据 + _this.msgErrData(); + + // 保存树副本 + _this.bak = _this.obj.html(); + + } else { + if (!_this.url) { + //_this.obj.html(_this.getNoneDom().errText("数据请求异常,url参数未指定")); + layer.msg("数据请求异常,url参数未指定", {icon:5}); + return ; + } + + $ul.html(""); + var index = _this.load ? layer.load(1) : ""; + AjaxHelper.request({ + async: _this.async, + headers: _this.headers, + type: _this.method, + url: _this.url, + dataType: _this.dataType, + withCredentials: _this.withCredentials, + data: _this.getFilterRequestParam(_this.getRequestParam()), + success: function(result) { + if (typeof result === 'string') { + result = $.parseJSON(result); + } + var code = ""; + if (_this.dataStyle == 'layuiStyle'){ + code = result[_this.response.statusName]; + } else { + code = result.status[_this.response.statusName]; + } + + if (code == _this.response.statusCode) { + // 解析树 + var pid = _this.node.nodeId; + var level = parseInt(_this.node.level)+1; + if (_this.dataFormat == 'list'){ + var pListData = _this.queryListTreeByPid(pid, result[_this.response.rootName]); + _this.loadListTree(pListData, result[_this.response.rootName], level, $ul); + } else { + _this.loadTree(result[_this.response.rootName], level, $ul); + } + + // 显示树线 + _this.showLine(); + + // 这种情况下需要一开始就将toolbar显示在页面上 + if(_this.toolbar && _this.toolbarWay != 'contextmenu') { + _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); + } + + // 判断是否存在错误数据,并是否打印错误数据 + _this.msgErrData(); + + $ul.addClass(NAV_SHOW); + + // 保存树副本 + _this.bak = _this.obj.html(); + } else { + if (_this.dataStyle == 'layuiStyle'){ + _this.obj.html(_this.getNoneDom().errText(result[_this.response.message])); + _this.error(null, code, result[_this.response.message]); + //layer.msg(result[_this.response.message], {icon:2}); + } else { + _this.obj.html(_this.getNoneDom().errText(result.status[_this.response.message])); + _this.error(null, code, result.status[_this.response.message]); + //layer.msg(result.status[_this.response.message], {icon:2}); + } + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown){// 异步加载异常回调 + _this.obj.html(_this.getNoneDom().errText(textStatus + ": " + errorThrown)); + _this.error(XMLHttpRequest, textStatus, errorThrown); + }, + complete: function(XMLHttpRequest, textStatus){// 异步加载完成回调 + if(_this.load){layer.close(index);} + _this.complete(XMLHttpRequest, textStatus); + } + }); + } + }; + + // 初始化树或者拼接树 + DTree.prototype.loadListTree = function(pListData, listData, level, $ul){ + var _this = this; + $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点 + if (pListData.length > 0){ + for (var i = 0; i < pListData.length; i++) { + // 1.获取已知节点的全部数据 + var data = pListData[i]; + if(typeof data !== "object") continue; + var parseData = _this.parseData(data); + var childListData = _this.queryListTreeByPid(parseData.treeId(), listData); // 根据已知数据的id判断该条数据是否还有子数据 + + // 3. 页面元素加载数据 + $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(childListData.length), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), ($ul.hasClass(UL_ROOT) ? "root" : "item"))); + // 4.有子数据的元素加载子节点 + if(childListData.length > 0){ + var cLevel = parseInt(level)+1; + _this.loadListTree(childListData, listData, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']")); + } + } + } + }; + + // 根据父ID查找list数据中匹配的元素 + DTree.prototype.queryListTreeByPid = function(pid, listData){ + var _this = this; + var rootListData = []; + if (listData) { + for (var i = 0; i < listData.length; i++) { + var data = listData[i]; + if(typeof data !== "object") continue; + if(pid == "null" || pid == null){ + if(data[_this.response.parentId] == null) { rootListData.push(data); } + } else { + if (data[_this.response.parentId] == pid){ + if (data[_this.response.treeId] == pid){ + _this.errData.push(data); + } else { + rootListData.push(data); + } + } + } + } + } + return rootListData; + }; + + // 初始化树或者拼接树 + DTree.prototype.loadTree = function(root, level, $ul){ + var _this = this; + if (root) { + $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点 + for (var i = 0; i < root.length; i++) { // 遍历跟节点或追加的跟节点 + var data = root[i]; + if(typeof data !== "object") continue; + if(data[_this.response.treeId] == data[_this.response.parentId]) { _this.errData.push(data); } + var parseData = _this.parseData(data); + var children = parseData.children(); + $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(children.length), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), ($ul.hasClass(UL_ROOT) ? "root" : "item"))); + if (children.length != 0) { + var cLevel = parseInt(level)+1; + _this.loadTree(children, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']")); + } + } + } + }; + + // 判断在数据加载时是否存在错误数据,并是否打印错误数据 + DTree.prototype.msgErrData = function() { + var _this = this; + if(_this.errData.length > 0 && _this.errDataShow) { + var title = ""; + for(var i=0; i<_this.errData.length; i++) { + var edata = _this.errData[i]; + title += "数据:【"+edata[_this.response.title]+"】中节点id和上级id值一致! \n"; + } + layer.msg(title, {icon:2,time:5000}); + } + // 显示之后,将错误数据制空 + _this.errData = []; + }; + + // 解析data数据 + DTree.prototype.parseData = function(data) { + var _this = this; + + return { + treeId: function(){ + return data[_this.response.treeId]; + }, + parentId: function(){ + return data[_this.response.parentId]; + }, + fmtTitle: function(){ + if(typeof _this.formatter.title === 'function'){ + var ftitle = _this.formatter.title(data); + var tt = data[_this.response.title]; + tt = (ftitle == "" || ftitle == undefined || ftitle == null) ? tt : ftitle; + return tt || ""; + } + return data[_this.response.title]; + }, + title: function(){ + return data[_this.response.title]; + }, + level: function(){ + return data[_this.response.level] || ""; + }, + ficonClass: function(){ + return data[_this.response.ficonClass] || ""; + }, + iconClass: function(){ + return data[_this.response.iconClass] || ""; + }, + last: function(len){ + return ((len == 0) ? + ((typeof (data[_this.response.last]) === "boolean") ? data[_this.response.last] : true) : + ((typeof (data[_this.response.last]) === "boolean") ? data[_this.response.last] : false)); + }, + spread: function(level){ + return ((level < _this.initLevel) ? + ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : true) : + ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : false)); + }, + disabled: function(){ + return (typeof (data[_this.response.disabled]) === "boolean") ? data[_this.response.disabled] : false; + }, + hide: function(){ + return (typeof (data[_this.response.hide]) === "boolean") ? data[_this.response.hide] : false; + }, + checkArr: function(){ + var checkArr = []; + var checkArrData = data[_this.response.checkArr]; + if(typeof checkArrData === 'string'){ + if(checkArrData.indexOf("{") > -1 && checkArrData.indexOf("}") > -1){ + checkArrData = JSON.parse(checkArrData); + } else { + checkArrData = {"type":"0","checked":checkArrData}; + } + } + if(typeof checkArrData === 'object'){ + if(typeof checkArrData.length === 'undefined'){ + checkArr.push(checkArrData); + } else { + checkArr = checkArrData; + } + } + + if(checkArr.length > 0 && checkArr.length > _this.checkArrLen){ + _this.checkArrLen = checkArr.length; // 获取复选框个数 + } + return checkArr; + + }, + children: function(){ + return data[_this.response.childName] || []; + }, + basicData: function(){ + return event.escape(JSON.stringify(data[_this.response.basicData])) || JSON.stringify({}); + }, + recordData: function(){ + var recordData = _this.record ? event.cloneObj(data, [_this.response.treeId, + _this.response.parentId, + _this.response.title, + _this.response.iconClass, + _this.response.childName, + _this.response.last, + _this.response.spread, + _this.response.disabled, + _this.response.hide, + _this.response.checkArr, + _this.response.checked, + _this.response.type, + _this.response.basicData]) : {}; + + return event.escape(JSON.stringify(recordData)); + }, + data: function(){ + return data; + } + } + + }; + + //当无节点数据时显示dom + DTree.prototype.getNoneDom = function(){ + var _this = this, + rootId = _this.obj[0].id, + noneTitle = _this.none; + + return { + text: function(){ + return "
          "+noneTitle+"
          "; + }, + errText: function(errInfo){ + return "
          "+errInfo+"
          "; + } + } + }; + + //新增节点的dom值 + DTree.prototype.getDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide) { + var _this = this, + rootId = _this.obj[0].id, + toolbar = _this.toolbar, + checkbar = _this.checkbar; + + return { + fnode: function() { // + - 图标 + // 获取图标的变量 + var fnodeIcon = _this.fnodeIcon, + fleafIcon = _this.fleafIcon; + + var fleafIconLeaf = _this.usefontStyle.fnode.leaf, + fnodeIconOpen = _this.usefontStyle.fnode.node.open, + fnodeIconClose = _this.usefontStyle.fnode.node.close; + + if(ficonClass){ + var iconfont = _this.iconfont; + if(typeof iconfont === 'string') { + fleafIconLeaf = iconfont + " " + ficonClass; + fnodeIconOpen = iconfont + " " + ficonClass; + fnodeIconClose = iconfont + " " + ficonClass; + } else { + fleafIconLeaf = iconfont[0] + " " + ficonClass; + fnodeIconOpen = iconfont[0] + " " + ficonClass; + fnodeIconClose = iconfont[0] + " " + ficonClass; + } + } + + if(fnodeIcon != "-1" && fleafIcon != "-1"){ // 都加载 + return last ? "" : + (spread ? "" : ""); + } + + if(fnodeIcon != "-1" && fleafIcon == "-1"){ // 加载node 隐藏leaf + return last ? "" : + (spread ? "" : ""); + } + + if(fnodeIcon == "-1" && fleafIcon != "-1"){ // 隐藏node 加载leaf + return last ? "" : + (spread ? "" : ""); + } + + if(fnodeIcon == "-1" && fleafIcon == "-1"){ // 都隐藏 + return last ? "" : + (spread ? "" : ""); + } + }, + node: function() { // 二级图标样式 + // 获取图标的变量 + var nodeIcon = _this.nodeIcon, + leafIcon = _this.leafIcon; + + var sleafIconLeaf = _this.usefontStyle.snode.leaf, + snodeIconOpen = _this.usefontStyle.snode.node.open, + snodeIconClose = _this.usefontStyle.snode.node.close; + if(iconClass){ + var iconfont = _this.iconfont; + if(typeof iconfont === 'string') { + sleafIconLeaf = iconfont + " " + iconClass; + snodeIconOpen = iconfont + " " + iconClass; + snodeIconClose = iconfont + " " + iconClass; + } else { + sleafIconLeaf = iconfont[0] + " " + iconClass; + snodeIconOpen = iconfont[0] + " " + iconClass; + snodeIconClose = iconfont[0] + " " + iconClass; + } + } + + if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载 + return last ? "" : + (spread ? "" : ""); + } + + if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf + return last ? "" : + (spread ? "" : ""); + } + + if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf + return last ? "" : + (spread ? "" : ""); + } + + if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 + return last ? "" : + (spread ? "" : ""); + } + }, + checkbox: function() { // 复选框 + var flag = false; + if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}} + + if(flag){ + var result = "
          "; + if(checkArr && checkArr.length > 0){ + + for (var i = 0; i < checkArr.length; i++) { + var checkData = checkArr[i]; + var checked = checkData.checked; + var CHOOSE_CLASS = _this.usefontStyle.checkbox.out; + if (checked == "2") { //半选择 + CHOOSE_CLASS = _this.usefontStyle.checkbox.noall + " " + _this.style.chs; + } else if (checked == "1") { //选择 + CHOOSE_CLASS = _this.usefontStyle.checkbox.on + " " + _this.style.chs; + } else { //未选择或者无值 + CHOOSE_CLASS = _this.usefontStyle.checkbox.out; + } + var disClass = ""; + if(disabled){disClass = NAV_DIS;} + result += ""; + } + } + result += "
          "; + return result; + } + + return ""; + }, + text: function() { // 文字显示 + var disClass = ""; + if(disabled){disClass = NAV_DIS;} + return ""+fmtTitle+""; + }, + ul: function() { //子节点ul + return last ? "
            " : + (spread ? "
              " : "
                "); + } + }; + }; + + //替换节点的dom值,或指定值 + DTree.prototype.replaceDom = function($div, treeId, last, spread, disabled, hide) { + var _this = this, + rootId = _this.obj[0].id, + toolbar = _this.toolbar, + checkbar = _this.checkbar; + + return { + fnode: function(ficonClass) { // + - 图标 + var fnode = ""; + + // 获取图标的变量 + var fnodeIcon = _this.fnodeIcon, + fleafIcon = _this.fleafIcon; + + var fleafIconLeaf = _this.usefontStyle.fnode.leaf, + fnodeIconOpen = _this.usefontStyle.fnode.node.open, + fnodeIconClose = _this.usefontStyle.fnode.node.close; + + if(ficonClass){ + var iconfont = _this.iconfont; + if(typeof iconfont === 'string') { + fleafIconLeaf = iconfont + " " + ficonClass; + fnodeIconOpen = iconfont + " " + ficonClass; + fnodeIconClose = iconfont + " " + ficonClass; + } else { + fleafIconLeaf = iconfont[0] + " " + ficonClass; + fnodeIconOpen = iconfont[0] + " " + ficonClass; + fnodeIconClose = iconfont[0] + " " + ficonClass; + } + } + + if(fnodeIcon != "-1" && leafIcon != "-1"){ // 都加载 + fnode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf + fnode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf + fnode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 + fnode = last ? "" : + (spread ? "" : ""); + } + if(fnode != ""){_this.getNodeDom($div).fnode().replaceWith($(fnode));} + }, + node: function(iconClass) { // 二级图标样式 + var snode = ""; + + // 获取图标的变量 + var nodeIcon = _this.nodeIcon, + leafIcon = _this.leafIcon; + + var sleafIconLeaf = _this.usefontStyle.snode.leaf, + snodeIconOpen = _this.usefontStyle.snode.node.open, + snodeIconClose = _this.usefontStyle.snode.node.close; + if(iconClass){ + var iconfont = _this.iconfont; + if(typeof iconfont === 'string') { + sleafIconLeaf = iconfont + " " + iconClass; + snodeIconOpen = iconfont + " " + iconClass; + snodeIconClose = iconfont + " " + iconClass; + } else { + sleafIconLeaf = iconfont[0] + " " + iconClass; + snodeIconOpen = iconfont[0] + " " + iconClass; + snodeIconClose = iconfont[0] + " " + iconClass; + } + } + + if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载 + snode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf + snode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf + snode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 + snode = last ? "" : + (spread ? "" : ""); + } + if(snode != ""){_this.getNodeDom($div).snode().replaceWith($(snode));} + }, + checkbox: function(checkArr) { // 复选框 + var flag = false; + if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}} + + if(flag){ + var result = "
                "; + if(checkArr && checkArr.length > 0){ + + for (var i = 0; i < checkArr.length; i++) { + var checkData = checkArr[i]; + var checked = checkData.checked; + var CHOOSE_CLASS = _this.usefontStyle.checkbox.out; + if (checked == "2") { //半选择 + CHOOSE_CLASS = _this.usefontStyle.checkbox.noall + " " + _this.style.chs; + } else if (checked == "1") { //选择 + CHOOSE_CLASS = _this.usefontStyle.checkbox.on + " " + _this.style.chs; + } else { //未选择或者无值 + CHOOSE_CLASS = _this.usefontStyle.checkbox.out; + } + var disClass = ""; + if(disabled){disClass = NAV_DIS;} + result += ""; + } + } + result += "
                "; + _this.getNodeDom($div).snode().next("div").replaceWith($(result)); + } + }, + text: function(title) { // 文字显示 + var disClass = ""; + if(disabled){disClass = NAV_DIS;} + var cite = ""+title+"" + _this.getNodeDom($div).cite().replaceWith($(cite)); + }, + ul: function() { //子节点ul + var ul = last ? "
                  " : + (spread ? "
                    " : "
                      "); + _this.getNodeDom($div).nextUl().replaceWith($(ul)); + }, + div: function(){ + $div.attr("data-id", treeId); + }, + basicData: function(basicData){ + basicData = (basicData == "{}") ? "" : basicData; + $div.attr("data-basic", basicData); + }, + recordData: function(recordData){ + recordData = (recordData == "{}") ? "" : recordData; + $div.attr("data-record", recordData); + }, + p_li: function(pId){ + var $li = $div.parent("li"); + $li.attr("data-id", treeId); + if(pId) { + $li.attr("data-pid", pId); + } + return $li; + } + }; + + }; + + // 获取拼接好的li + DTree.prototype.getLiItemDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide, basicData, recordData, flag) { + var _this = this, + rootId = _this.obj[0].id; + + var dom = _this.getDom(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide); + basicData = (basicData == "{}") ? "" : basicData; + recordData = (recordData == "{}") ? "" : recordData; + var div = "
                      " + + div , + dom.fnode(), + dom.node(), + dom.checkbox(), + dom.text(), + "
                      ", dom.ul(), ""].join(""); + + return li; + }; + + // 初始化节点,用于数据回显 + DTree.prototype.dataInit = function(chooseId){ + var _this = this; + var $div = _this.obj.find("div[data-id='"+chooseId+"']"); + _this.getNodeDom($div).parentLi().find("."+NAV_THIS).removeClass(NAV_THIS); + _this.getNodeDom($div).parentLi().find("."+_this.style.itemThis).removeClass(_this.style.itemThis); + $div.addClass(NAV_THIS); + $div.addClass(_this.style.itemThis); + _this.setNodeParam($div); + // 将该节点的父节点全部展开 + var $li_parents = $div.parents("."+LI_NAV_ITEM); + $li_parents.children("ul").addClass(NAV_SHOW); + $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).addClass(_this.usefontStyle.fnode.node.open); + $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).removeClass(_this.usefontStyle.fnode.node.close); + $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).addClass(_this.usefontStyle.snode.node.open); + $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).removeClass(_this.usefontStyle.snode.node.close); + return _this.getNowParam(); + }; + + // 基于备份的Html数据回滚 + DTree.prototype.rollbackHtml = function(chooseId){ + var _this = this; + if(_this.bak) { + _this.obj.html(_this.bak); + // 取消全部选中状态 + _this.cancelNavThis(); + if(_this.checkbar) { + _this.cancelCheckedNode(); + _this.chooseDataInit(chooseId); + } else { + _this.dataInit(chooseId); + } + + _this.bak = _this.obj.html(); + } + }; + + + /******************** 基础事件区域 ********************/ + // 数据格式化 + DTree.prototype.escape = function(html){ + return event.escape(html); + }; + + // 格式化数据转回正常数据 + DTree.prototype.unescape = function(str){ + return event.unescape(str); + }; + + // 取消选中div + DTree.prototype.cancelNavThis = function(){ + var _this = this; + _this.obj.find("div[data-id]").parent().find("."+NAV_THIS).removeClass(NAV_THIS); + _this.obj.find("div[data-id]").parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis); + } + + // 选中div + DTree.prototype.navThis = function(id){ + var _this = this; + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + if($div != null) { + _this.cancelNavThis(); + $div.addClass(NAV_THIS); + $div.addClass(_this.style.itemThis); + } + } + + // 手风琴模式操作其他节点 + DTree.prototype.accordionUL = function($ul) { + var _this = this; + if(_this.accordion) { + $ul.closest("li[data-index]").siblings("li[data-index]").children("ul[data-id]").removeClass(NAV_SHOW); + var $divs = $ul.closest("li[data-index]").siblings("li[data-index]").children("ul[data-id]").prev("div"); + if($divs.length && $divs.length > 0) { + for (var i=0; i<$divs.length; i++) { + var $div = $($divs[i]); + var $i_spread = _this.getNodeDom($div).fnode(), + $i_node = _this.getNodeDom($div).snode(); + if($i_spread.attr("data-spread") != 'last'){ + _this.operateIcon($i_spread, $i_node).close(); + } + } + } + + } + }; + + // 展开或隐藏节点 作用点: div + DTree.prototype.clickSpread = function($div) { + var _this = this; + var $i_spread = _this.getNodeDom($div).fnode(), + $i_node = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_spread.attr("data-spread"), + $ul = $div.next("ul"); + + if ($ul.length > 0) { + if (spread == "close") { + if (_this.type=="load") { //增加加载 + if (_this.cache) { //开启缓存 + if ($ul.html()) { + $ul.addClass(NAV_SHOW); + _this.accordionUL($ul); + } else { //加载节点 + _this.getChild($div); + _this.accordionUL($ul); + } + }else { //每次取新的数据 + $ul.html(""); + _this.getChild($div); + _this.accordionUL($ul); + } + } else { // 全量加载 + $ul.addClass(NAV_SHOW); + _this.accordionUL($ul); + } + _this.operateIcon($i_spread, $i_node).open(); + } else if (spread == "open") { + $ul.removeClass(NAV_SHOW); + _this.operateIcon($i_spread, $i_node).close(); + } + } + }; + + // 设置节点为disabled + DTree.prototype.setDisabledNodes = function(disabledIds){ + var _this = this; + var disabledId = disabledIds.split(","); + for (var i=0; i 0) { + _this.getChild($div, data); + } else { + var parseData = _this.parseData(data); + + if(parseData.treeId()){ + var level = parseInt($div.parent("li").attr("data-index"))+1; + $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(0), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), "item")); + + // 建造完毕后,选中该DIV + $thisDiv = $ul.find("div[data-id='"+parseData.treeId()+"']"); + _this.setNodeParam($thisDiv); + + _this.showLine($ul.find("li")); + } else { + layer.msg("添加失败,节点ID为undefined!",{icon:5}); + // 重新赋值 + _this.setNodeParam($div); + } + } + } else { + _this.getChild($div); + } + } + + // 局部刷新树--编辑当前节点选中节点时 + DTree.prototype.partialRefreshEdit = function($div, data){ + var _this = this; + $ul = $div.next("ul"), + $p_li = $div.parent("li"); + + if(data) { + if(typeof data === 'object') { + var parseData = _this.parseData(data); + + if(parseData.treeId()){ + var replaceDom = _this.replaceDom($div, parseData.treeId(), parseData.last(0), parseData.spread(), parseData.disabled(), parseData.hide()); + replaceDom.div(); + replaceDom.node(parseData.iconClass()); + replaceDom.checkbox(parseData.checkArr()); + replaceDom.text(parseData.title()); + replaceDom.ul(); + replaceDom.basicData(parseData.basicData()); + replaceDom.recordData(parseData.recordData()); + + var parentId = parseData.parentId(); + var oldParentId = $p_li.attr("data-pid"); + if(parentId && parentId != oldParentId) { + // 变更了父节点 + $p_li = replaceDom.p_li(parentId); + + // 根据parentId找到下挂节点的ul + var $goto_div = _this.getNodeDom(parentId).div(), + $goto_ul = _this.getNodeDom(parentId).nextUl(); + // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式 + if($goto_ul.children("li").length == 0){ + var $icon_i = $goto_div.find("i[data-spread]"); + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).openWithLeaf(); + $goto_ul.addClass(NAV_SHOW); + } + $goto_ul.append($p_li); + } else { + replaceDom.p_li(); + } + _this.setNodeParam($div); + } else { + layer.msg("编辑失败,节点ID为undefined!",{icon:5}); + // 重新赋值 + _this.setNodeParam($div); + } + } else { + _this.getNodeDom($div).cite().html(data); + } + } + } + + // 局部刷新树--当前节点选中被删除时 + DTree.prototype.partialRefreshDel = function($div){ + var _this = this; + $p_li = $div.parent("li"); + $p_ul = _this.getNodeDom($div).parentUl(); + $p_div = _this.getNodeDom($div).parentDiv(); + + $p_li.remove(); + _this.showLine($p_ul.find("li")); + // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式 + if($p_ul.children("li").length == 0){ + var $icon_i = $p_div.find("i[data-spread]"); + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).closeWithLeaf(); + } + _this.initNodeParam(); + } + + /******************** 复选框区域 ********************/ + // 初始化复选框的值 + DTree.prototype.chooseDataInit = function(chooseIds){ + var _this = this; + var chooseId = chooseIds.split(","); + for (var i=0; i."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).noCheck(); + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length; + if (flag == 0) { + //把父级去掉选中 + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($item_i).noCheck(); + } + } + } else { + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).check(); + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + //把父级选中 + _this.checkStatus($item_i).check(); + } + } + }; + + //实现复选框点击, no-all 子集选中父级半选中,子集全选父级选中 + DTree.prototype.checkAllOrNoallOrNot = function($i) { + var _this = this; + //$i 当前点击的checkbox + var $div = $i.closest("."+LI_DIV_ITEM), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).noCheck(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).noCheck(); + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length; + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + if (flag == 0) { + //把父级去掉选中 + _this.checkStatus($item_i).noCheck(); + } else { + //把父级半选 + _this.checkStatus($item_i).noallCheck(); + } + } + } else { //当前复选框为未选中状态,点击后变为选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).check(); + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length; + var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length; + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + if (flag1 != flag2) { + // 父级复选框半选 + _this.checkStatus($item_i).noallCheck(); + } else { + // 父级复选框全选 + _this.checkStatus($item_i).check(); + } + } + } + }; + + //实现复选框点击,p-casc:父级选中子集全选,子集无法改变父级选中状态 + DTree.prototype.checkAllOrPcascOrNot = function($i) { + var _this = this; + //$i 当前点击的checkbox + var $div = $i.closest("."+LI_DIV_ITEM), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).noCheck(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).noCheck(); + + } else { //当前复选框为未选中状态,点击后变为选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).check(); + } + }; + + //实现复选框点击,self:各自选中互不影响 + DTree.prototype.checkOrNot = function($i) { + var _this = this; + //$i 当前点击的checkbox + var $div = $i.closest("."+LI_DIV_ITEM), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).noCheck(); + } else { //当前复选框为未选中状态,点击后变为选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + } + }; + + //实现复选框点击,only:只能选中1个复选框 + DTree.prototype.checkOnly = function($i) { + var _this = this; + //$i 当前点击的checkbox + var $div = $i.closest("."+LI_DIV_ITEM), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + var checked = $i.attr("data-checked"); + // 将全部节点全部设为未选中状态 + var $all_i = _this.obj.find("i[data-checked]"); + _this.checkStatus($all_i).noCheck(); + + if (checked != "1") { //当前复选框为未选中状态,点击后变为选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + } + }; + + //实现复选框点击 + DTree.prototype.changeCheck = function($i) { + var _this = this; + var temp = _this.temp; + if(typeof $i === 'undefined') { + $i = temp[0]; + } + // 复选框选中事件 + if (_this.checkbarType == "all") { + _this.checkAllOrNot($i); + } else if(_this.checkbarType == "no-all") { + _this.checkAllOrNoallOrNot($i); + } else if(_this.checkbarType == "p-casc") { + _this.checkAllOrPcascOrNot($i); + } else if(_this.checkbarType == "self") { + _this.checkOrNot($i); + } else if(_this.checkbarType == "only") { + _this.checkOnly($i); + } else { + _this.checkAllOrNot($i); + } + + if(_this.select) { + // 设置复选框模式中的下拉树的值 + _this.selectCheckboxVal(); + } + + // 获取复选框选中节点的内容 + var checkbarNodes = _this.setAndGetCheckbarNodesParam(true); + + // 用户自定义想做的事情 + _this.checkbarFun.chooseDone(checkbarNodes); + layui.event.call(this, MOD_NAME, "chooseDone("+$(_this.obj)[0].id+")", {"checkbarParams": checkbarNodes}); + _this.temp = []; + }; + + //复选框半选状态初始化设置 + DTree.prototype.initNoAllCheck = function(){ + var _this = this; + //1.获取所有选中节点 + var $is = _this.obj.find("i[data-checked='1']"); + if($is.length > 0){ + for ( var key = 0; key < $is.length; key++) { + var $i = $($is[key]), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length; + var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length; + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + if (flag1 != flag2) { + // 父级复选框半选 + _this.checkStatus($item_i).noallCheck(); + } else { + // 父级复选框全选 + _this.checkStatus($item_i).check(); + } + } + } + } + }; + + //复选框选中状态初始化设置 + DTree.prototype.initAllCheck = function(){ + var _this = this; + //1.获取所有选中节点 + var $is = _this.obj.find("i[data-checked='1']"); + if($is.length > 0){ + for ( var key = 0; key < $is.length; key++) { + var $i = $($is[key]), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + // 父级复选框全选 + _this.checkStatus($item_i).check(); + } + } + } + }; + + // 设置复选框选中/未选中/半选 _this.checkStatus($i).check(); _this.checkStatus($i).noCheck(); _this.checkStatus($i).noallCheck(); + DTree.prototype.checkStatus = function($i) { + var _this = this; + return { + check: function(){ + $i.removeClass(_this.usefontStyle.checkbox.out); + $i.removeClass(_this.usefontStyle.checkbox.noall); + $i.addClass(_this.usefontStyle.checkbox.on); + $i.addClass(_this.style.chs); + $i.attr("data-checked","1"); + }, + noCheck: function(){ + $i.removeClass(_this.usefontStyle.checkbox.noall); + $i.removeClass(_this.usefontStyle.checkbox.on); + $i.removeClass(_this.style.chs); + $i.addClass(_this.usefontStyle.checkbox.out); + $i.attr("data-checked","0"); + }, + noallCheck: function(){ + $i.removeClass(_this.usefontStyle.checkbox.out); + $i.removeClass(_this.usefontStyle.checkbox.on); + $i.addClass(_this.usefontStyle.checkbox.noall); + $i.addClass(_this.style.chs); + $i.attr("data-checked","2"); + } + } + }; + + // 设置树的复选框操作值的全部参数,并获取 + DTree.prototype.setAndGetCheckbarNodesParam = function(requestParamFlag) { + var _this = this; + //操作前先清空 + _this.checkbarNode = []; + // 选择所有复选框节点 + if (_this.checkbarData == "change"){ //记录变更数据 + _this.obj.find("i[data-par][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if ($i.attr("data-checked") != $i.attr("data-initchecked")) { + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + } + }); + } else if (_this.checkbarData == "all"){ //记录全部数据 + _this.obj.find("i[data-par][data-checked][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + }); + } else if (_this.checkbarData == "choose"){ //记录选中数据 + _this.obj.find("i[data-par][data-checked='1'][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + }); + } else if (_this.checkbarData == "halfChoose"){ //记录选中和半选数据 + _this.obj.find("i[data-par][data-checked='1'][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + }); + _this.obj.find("i[data-par][data-checked='2'][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + }); + } + return _this.checkbarNode; + }; + + // 获取树的复选框操作值的全部参数 + DTree.prototype.getCheckbarNodesParam = function() { + var _this = this; + return _this.setAndGetCheckbarNodesParam(true); + }; + + // 获取树的一个复选框的参数 + DTree.prototype.getCheckbarNodeParam = function($div, $i){ + var _this = this; + var temp_node = {}; + temp_node.nodeId = $div.attr("data-id"); + temp_node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid"); + temp_node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text(); + temp_node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false; + temp_node.level = _this.getNodeDom($div).parentLi().attr("data-index"); + temp_node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false; + + var basicData = $div.attr("data-basic"); + if(basicData) { + basicData = JSON.parse(event.unescape(basicData)); + } + temp_node.basicData = basicData; + var recordData = $div.attr("data-record"); + if(recordData) { + recordData = JSON.parse(event.unescape(recordData)); + } + temp_node.recordData = recordData; + + temp_node.dataType = $i.attr("data-type"); + temp_node.checked = $i.attr("data-checked"); + temp_node.initchecked = $i.attr("data-initchecked"); + return temp_node; + }; + + // 获取基于返回参数的树的复选框参数 + DTree.prototype.getCheckbarJsonArrParam = function(){ + var _this = this; + var checkbarJsonArr = { + nodeId: [], //节点ID + parentId: [], //父节点ID + context: [], //节点内容 + leaf: [], //是否叶子节点 + level: [], //层级 + spread: [], //节点展开状态 + dataType: [], //节点标记 + checked: [], //节点复选框选中状态 + initchecked: [], //节点复选框初始状态 + basicData: [], //用户自定义的记录节点数据 + recordData: [], //当前data数据(排除basicData和children字段) + }; + // 获取全部复选框选中节点 + var params = _this.setAndGetCheckbarNodesParam(false); + if(params && params.length > 0) { + for(var i=0; i 0) { _this.checkStatus($i).check(); } + } + + //取消全部复选框选中 + DTree.prototype.cancelCheckedNode = function(nodeId){ + var _this = this; + var $i = _this.obj.find("i[data-par][data-checked!='0']"); + if($i.length > 0) { _this.checkStatus($i).noCheck(); } + } + + //反选复选框 + DTree.prototype.invertCheckedNode = function(nodeId){ + var _this = this; + if(_this.obj.find("i[data-par]").length > 0) { + var b = false; + _this.obj.find("i[data-par]").each(function(){ + var $i = $(this); + if($i.attr("data-checked") == '2'){ + b = true; + }else if($i.attr("data-checked") == '0') { + _this.checkStatus($i).check(); + }else if($i.attr("data-checked") == '1') { + _this.checkStatus($i).noCheck(); + } + }); + + if(b) { + _this.initNoAllCheck(); + } else { + _this.initAllCheck(); + } + } + } + + //删除选中节点 + DTree.prototype.removeCheckedNode = function(nodeId){ + var _this = this; + var len = _this.obj.find("i[data-par][data-checked='1']").length; + if(len == 0){ + layer.msg("请至少选中一个节点",{icon:2}); + }else{ + //操作前先清空 + _this.checkbarNode = []; + // 选择所有复选框节点 + var i_node = {}; + _this.obj.find("i[data-par][data-checked='1']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + }); + + layer.confirm('确定要删除选中节点?', {icon: 3, title:'删除选中节点'}, function(index1){ + var flag = _this.menubarFun.remove(_this.checkbarNode); + if(flag){ + _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).next("ul").remove(); + _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).remove(); + _this.checkbarNode=[]; + } + + layer.close(index1); + }); + } + } + + /******************** 工具栏及菜单栏区域 ********************/ + // 初始化菜单栏和工具栏的div + DTree.prototype.initTreePlus = function(){ + var _this = this; + // 初始化菜单栏和工具栏的div + _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).remove(); + _this.toolbarMenu = {}; + if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0) _this.obj.before("
                      "); + if(_this.toolbar){ + if(_this.toolbarWay == "contextmenu") { + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).remove(); + _this.obj.before("
                      "); + } + } + + }; + + // 开启工具栏和菜单栏 + DTree.prototype.openTreePlus = function(){ + var _this = this; + // 先对工具栏做处理,因为菜单栏可能会与工具栏产生关联。 + var ggMenu = []; + if(_this.toolbar) _this.getToolbarDom(); + + if(_this.menubar) { + var menubarTips = _this.menubarTips, + mtbar = menubarTips.toolbar, + group = menubarTips.group, + freedom = menubarTips.freedom; + if(mtbar && mtbar.length > 0){ + // 菜单栏吸附工具栏上 + for(var i=0; i 0){ + // 菜单栏吸附在上方的按钮组div中 + for(var i=0; i"; + break; + case defaultMenu.moveUp: + gg = ""; + break; + case defaultMenu.refresh: + gg = ""; + break; + case defaultMenu.checkAll: + gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : ""; + break; + case defaultMenu.unCheckAll: + gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : ""; + break; + case defaultMenu.invertAll: + gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : ""; + break; + case defaultMenu.remove: + gg = (_this.checkbar) ? "" : ""; + break; + case defaultMenu.searchNode: + gg = ""; + break; + } + return gg; + }; + + // 获取扩展菜单栏 + DTree.prototype.getExtMenubarDom = function(menu){ + var _this = this; + return ""; + }; + + // 获取依附在工具栏的菜单栏 + DTree.prototype.getMenubarToolDom = function(menu){ + var _this = this; + var rootId = _this.obj[0].id; + switch (menu) { + case defaultMenu.moveDown: + _this.toolbarMenu[defaultMenu.moveDown] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.moveDown, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.movedown, "展开全部"); + break; + case defaultMenu.moveUp: + _this.toolbarMenu[defaultMenu.moveUp] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.moveUp, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.moveup, "收缩全部"); + break; + case defaultMenu.refresh: + _this.toolbarMenu[defaultMenu.refresh] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.refresh, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.refresh, "刷新"); + break; + case defaultMenu.checkAll: + if(_this.checkbar && _this.checkbarType != 'only') + _this.toolbarMenu[defaultMenu.checkAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.checkAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.checkAll, "全选节点"); + break; + case defaultMenu.unCheckAll: + if(_this.checkbar && _this.checkbarType != 'only') + _this.toolbarMenu[defaultMenu.unCheckAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.unCheckAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.unCheckAll, "全不选节点"); + break; + case defaultMenu.invertAll: + if(_this.checkbar && _this.checkbarType != 'only') + _this.toolbarMenu[defaultMenu.invertAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.invertAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.invertAll, "反选节点"); + break; + case defaultMenu.remove: + if(_this.checkbar) + _this.toolbarMenu[defaultMenu.remove] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.remove, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.remove, "删除选中"); + break; + case defaultMenu.searchNode: + _this.toolbarMenu[defaultMenu.searchNode] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.searchNode, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.searchNode, "查询"); + break; + } + }; + + // 获取依附在工具栏的扩展菜单栏 + DTree.prototype.getExtMenubarToolDom = function(menu){ + var _this = this; + _this.toolbarMenu[menu.menubarId] = _this.setToolbarDom().setMenuToolbarOption(menu.menubarId, menu.title, _this.usefontStyle.toolbar.menubarExt+" "+menu.icon, ""); + }; + + // menubar内置方法 + DTree.prototype.menubarMethod = function(){ + var _this = this; + return { + openAllNode: function(obj){ // 展开所有节点 + var $ulNode = obj || _this.obj.children("li").children("ul"); + // 遍历所有ul子节点 + for (var i = 0; i < $ulNode.length; i++) { + // 获取当前节点的信息 + var $ul = $($ulNode[i]), + $div = $ul.prev("div"), + $i_spread = _this.getNodeDom($div).fnode(), + $i_node = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_spread.attr("data-spread"), + leaf = $cite.attr("data-leaf"); + + if (leaf == "leaf") { continue; } // 说明是叶子了,则继续循环下一个 + + if (spread == "open") { + // 说明该节点已经展开了,则进行子节点循环 + } else { + if (_this.type=="load") { //是否全量加载 + if (_this.cache) { //是否开启缓存 + if ($ul.html()) { + $ul.addClass(NAV_SHOW); + } else { //加载节点 + _this.getChild($div); + } + }else { //每次取新的数据 + $ul.html(""); + _this.getChild($div); + } + } else { // 全量加载 + $ul.addClass(NAV_SHOW); + } + _this.operateIcon($i_spread, $i_node).open(); + + } + var $childUl = $ul.children("li").children("ul"); + _this.menubarMethod().openAllNode($childUl); + } + }, + closeAllNode: function(){ //收缩所有节点 + _this.obj.find("."+LI_NAV_CHILD).each(function(){ + // 获取当前节点的信息 + var $ul = $(this), + $div = $ul.prev("div"), + $i_spread = _this.getNodeDom($div).fnode(), + $i_node = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_spread.attr("data-spread"), + leaf = $cite.attr("data-leaf"); + + $ul.removeClass(NAV_SHOW); + _this.operateIcon($i_spread, $i_node).close(); + }); + }, + refreshTree: function(){// 刷新树 + _this.refreshTree(); + }, + checkAll: function(){ // 全选节点 + _this.checkAllNode(); + }, + unCheckAll: function(){ // 全不选节点 + _this.cancelCheckedNode(); + }, + invertAll: function(){ // 反选节点 + _this.invertCheckedNode(); + }, + remove: function(){// 删除选中节点 + _this.removeCheckedNode(); + }, + searchNode: function(){//模糊查询该值,展开该值节点 + layer.prompt({ + formType: 0, + value: "", + title: '查询节点' + }, function(value, index1, elem){ + if (value) { + var flag = _this.searchNode(value); + if (!flag) { + layer.msg("该名称节点不存在!", {icon:5}); + } + } else { + layer.msg("未指定查询节点名称", {icon:5}); + } + layer.close(index1); + }); + }, + extMethod: function(menuId, $div, flag){ + if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0 && flag == "group"){ + for(var i=0; i<_this.menubarTips.group.length; i++){ + var ext = _this.menubarTips.group[i]; + if (menuId == ext.menubarId){ + ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div)); + break; + } + } + } + if(_this.menubar && _this.menubarTips.toolbar && _this.menubarTips.toolbar.length > 0 && flag == "toolbar"){ + for(var i=0; i<_this.menubarTips.toolbar.length; i++){ + var ext = _this.menubarTips.toolbar[i]; + if (menuId == ext.menubarId){ + ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div)); + break; + } + } + } + if(_this.menubar && _this.menubarTips.freedom && _this.menubarTips.freedom.length > 0 && flag == "freedom"){ + for(var i=0; i<_this.menubarTips.freedom.length; i++){ + var ext = _this.menubarTips.freedom[i]; + if (menuId == ext.menubarId){ + ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div)); + break; + } + } + } + } + }; + }; + + // menubar监听方法 + DTree.prototype.menubarListener = function(menuId, flag){ + var _this = this; + var $div = _this.getNodeDom().nowDiv(); + switch (menuId) { + case defaultMenu.moveDown: // 展开全部节点 + _this.menubarMethod().openAllNode(); + break; + case defaultMenu.moveUp: // 收缩全部节点 + _this.menubarMethod().closeAllNode(); + break; + case defaultMenu.refresh: + _this.menubarMethod().refreshTree(); // 刷新树 + break; + case defaultMenu.checkAll: + _this.menubarMethod().checkAll(); + break; + case defaultMenu.unCheckAll: + _this.menubarMethod().unCheckAll(); + break; + case defaultMenu.invertAll: + _this.menubarMethod().invertAll(); + break; + case defaultMenu.remove: + _this.menubarMethod().remove(); + break; + case defaultMenu.searchNode: + _this.menubarMethod().searchNode(); + break; + default: + _this.menubarMethod().extMethod(menuId, $div, flag); + break; + } + }; + + //模糊查询该值,展开该值节点 + DTree.prototype.searchNode = function(value){ + var _this = this; + var b = false; + var $lis = []; + _this.obj.find("cite[data-leaf]").each(function(){ + var $nthis = $(this); + var html = $nthis.html(); + if(html.indexOf(value) > -1){ + if($nthis.attr("data-leaf") == "leaf") { + // 叶子节点提供包含父节点的所有信息 + var title = ""; + $nthis.parents("li").each(function(){ + title = "-" + $(this).find("cite[data-leaf]").html() + title; + }); + title = title.substring(1, title.length); + $nthis.attr("title", title); + } + // 保存当前cite所在的li及父li中包含该值,则只保留父的 + var i = 0; + $nthis.parents("li").each(function(){ + var html2 = $(this).find("cite[data-leaf]").html(); + if(html2.indexOf(value) > -1){ + i++; + } + if(i >= 2){ + return true; + } + }); + if (i < 2){ + $lis.push($nthis.closest("li").prop("outerHTML")); + } + } + }); + if($lis.length > 0) { + b = true; + // 1.将树节点清空 + _this.obj.html(""); + // 2.遍历所有cite节点,展开当前cite节点 + for(var i=0; i<$lis.length; i++){ + _this.obj.append($lis[i]); + } + } + return b; + }; + + + /******************** 工具栏区域 ********************/ + // 获取工具栏 + DTree.prototype.getToolbarDom = function(){ + var _this = this; + var toolbarShow = _this.toolbarShow, + toolbarExt = _this.toolbarExt, + toolbarWay = _this.toolbarWay; + + if(toolbarShow.length > 0){ + for(var i=0; i 0){ + for(var i=0; i "+other +title+"

                      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�uKd1}pcEE;0d`-iD! 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%0DB^1rv@=JJfv%_(punEwntTEAghh9TVv6*Rz%ha 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�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

                      "; + } else if(toolbarWay == "fixed" || toolbarWay == "follow") { + return ""; + } + }, + setMenuToolbarOption: function(menubarId, title, classId, other){ + var rootId = _this.obj[0].id; + if(toolbarWay == "contextmenu") { + return "
                       "+other +title+"
                      "; + } else if(toolbarWay == "fixed" || toolbarWay == "follow") { + return ""; + } + }, + setToolbarPlace: function(toolbarMenu){ + if(toolbarWay == "contextmenu") { + if(toolbarMenu){ + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').html(""); + for(var key in toolbarMenu){ + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').append(toolbarMenu[key]); + } + } + } else if(toolbarWay == "fixed" || toolbarWay == "follow") { + _this.obj.find("cite[data-leaf][dtree-disabled='false']").each(function(){ + var $cite = $(this); + _this.dynamicToolbarDom($cite); + }); + } + } + } + }; + + // 在节点后动态绑定fixed和follow条件的工具栏 + DTree.prototype.dynamicToolbarDom = function($cite){ + var _this = this; + var toolbarWay = _this.toolbarWay; + if($cite.next("em."+TOOLBAR_TOOL_EM).length == 0) { + var $div = $cite.parent("div"); + var param = _this.getRequestParam(_this.getTempNodeParam($div)); + var toolbarMenus = _this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), param, $div); + var hideCls = (toolbarWay == "follow") ? NAV_HIDE : ""; + var em = [""]; + if(toolbarMenus){ + for(var key in toolbarMenus){ + em.push(toolbarMenus[key]); + } + } + em.push(""); + $cite.after(em.join('')); + } + } + + // 隐藏toolbar + DTree.prototype.toolbarHide = function() { + var _this = this; + if(_this.toolbar && _this.toolbarWay == "contextmenu") { + var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id); + $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); + } + } + + // toolbar内置方法 + DTree.prototype.toolbarMethod = function(){ + var _this = this; + return { + pulldown: function(obj){ // 展开当前点击节点的下面全部节点 + if(!obj) return; + var $ulNode = obj; + // 遍历所有ul子节点 + for (var i = 0; i < $ulNode.length; i++) { + // 获取当前节点的信息 + var $ul = $($ulNode[i]), + $div = $ul.prev("div"), + $i_spread = _this.getNodeDom($div).fnode(), + $i_node = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_spread.attr("data-spread"), + leaf = $cite.attr("data-leaf"); + + if (leaf == "leaf") { continue; } // 说明是叶子了,则继续循环下一个 + + if (spread == "open") { + // 说明该节点已经展开了,则进行子节点循环 + } else { + if (_this.type=="load") { //是否全量加载 + if (_this.cache) { //是否开启缓存 + if ($ul.html()) { + $ul.addClass(NAV_SHOW); + } else { //加载节点 + _this.getChild($div); + } + }else { //每次取新的数据 + $ul.html(""); + _this.getChild($div); + } + } else { // 全量加载 + $ul.addClass(NAV_SHOW); + } + _this.operateIcon($i_spread, $i_node).open(); + + } + var $childUl = $ul.children("li").children("ul"); + _this.toolbarMethod().pulldown($childUl); + } + }, + pullup: function($li){ // 收缩当前点击节点的下面全部节点 + $li.find("."+LI_NAV_CHILD).each(function(){ + // 获取当前节点的信息 + var $ul = $(this), + $div = $ul.prev("div"), + $i_spread = _this.getNodeDom($div).fnode(), + $i_node = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_spread.attr("data-spread"), + leaf = $cite.attr("data-leaf"); + + $ul.removeClass(NAV_SHOW); + _this.operateIcon($i_spread, $i_node).close(); + }); + } + } + }; + + // toolbar监听方法 + DTree.prototype.toolbarListener = function(tool, $div) { + var _this = this; + var $cite = $div.children("cite[data-leaf]"), + $ul = $div.next("ul"), + $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点 + $p_ul = $p_li.parent("ul"), //当前选中节点的顶级li节点的父级ul + $p_div = $p_ul.prev("div"), //当前选中节点的顶级li节点的父级ul的前一个div + title = $cite.html(); + switch (tool) { + case defaultTool.pulldown: + _this.toolbarMethod().pulldown($ul); + break; + case defaultTool.pullup: + _this.toolbarMethod().pullup($p_li); + break; + case defaultTool.addTool: + var content = _this.loadToolBar(title, defaultTool.addTool); + + layer.open({ + title: "新增"+_this.toolbarStyle.title, + type: 1, + area: _this.toolbarStyle.area, + content: content, + success: function(layero, index){ + form.render(); + form.on("submit(dtree_addNode_form)",function(data){ + var data = data.field; + var parentId = $div.attr("data-id"), + id = $div.attr("data-id")+"_node_"+$ul[0].childNodes.length, + leaf = true, + checked = "0", + level = parseInt($p_li.attr("data-index"))+1; + + // 创建子节点的DOM,添加子节点 + var checkArr = []; + if (_this.checkArrLen > 0) { + for (var i = 0; i < _this.checkArrLen; i++) { + checkArr.push({"type":i,"checked":"0"}); + } + } + + $ul.append(_this.getLiItemDom(id, parentId, data.addNodeName, data.addNodeName, true, "", "", checkArr, level, false, false, false, "", "", "item")); + // 先将li节点隐藏 + $ul.find("li[data-id='"+id+"']").hide(); + // 重新赋值 + var $addDiv = $ul.find("div[data-id='"+id+"']"); + node = _this.getNodeParam($addDiv); + + //获取组装后的requestNode,组合参数 + var requestNode = _this.getRequestParam(node); + requestNode = $.extend(requestNode, data); + + _this.temp = [id, $ul, $div, level]; + // 用户自定义想做的事情 + _this.toolbarFun.addTreeNode(requestNode, $div); + + layer.close(index); + return false; + }); + } + }); + break; + case defaultTool.editTool: + var content = _this.loadToolBar(title, defaultTool.editTool); + + layer.open({ + title: "编辑"+_this.toolbarStyle.title, + type: 1, + area: _this.toolbarStyle.area, + content: content, + success: function(layero, index){ + _this.toolbarFun.editTreeLoad(_this.getRequestParam(_this.getNodeParam($div))); + form.render(); + form.on("submit(dtree_editNode_form)",function(data){ + var data = data.field; + $cite.html(data.editNodeName); + node = _this.getNodeParam($div); + var requestNode = _this.getRequestParam(node); + requestNode = $.extend(requestNode, data); + _this.temp = [$cite, $div, title, $p_div]; + _this.toolbarFun.editTreeNode(requestNode, $div); + + layer.close(index); + }); + } + }); + break; + case defaultTool.delTool: + layer.confirm('确定要删除该'+_this.toolbarStyle.title+'?', {icon: 3, title:'删除'+_this.toolbarStyle.title}, function(index){ + var node = _this.getNodeParam($div); + _this.temp = [$p_li, $p_div]; + _this.toolbarFun.delTreeNode(_this.getRequestParam(_this.getNodeParam($div)), $div); + + layer.close(index); + }); + break; + default: + if(_this.toolbarExt.length > 0){ + for(var i=0; i<_this.toolbarExt.length; i++){ + var ext = _this.toolbarExt[i]; + if (tool == ext.toolbarId){ + ext.handler(_this.getRequestParam(_this.getNodeParam($div)), $div); + break; + } + } + } + break; + } + } + + + // 加载toolBar中的内容 + DTree.prototype.loadToolBar = function(title, name){ + var _this = this; + var toolbarShow = _this.toolbarShow; + var nodeBarContents = _this.toolbarBtn; + + var html = ""; + switch (name) { + case defaultTool.addTool: + var addNodeBarDef = [{"label": "当前选中", "name": "nodeTitle", "type": "text", "value": title, "defElem": "nowChoose", "readonly": true}, + {"label": "新增"+_this.toolbarStyle.title, "name": "addNodeName", "type": "text", "value": "", "defElem": "nowChange", "verify": "required"}, + {"type": "submit", "value": "确认添加", "defElem": "btn", "filter": "dtree_addNode_form"}]; + + //2. 用户自定义的节点内容 + var addNodeBar = ['
                      ']; + + if(nodeBarContents != null && nodeBarContents.length > 0){ + if(nodeBarContents[0] != null && nodeBarContents[0] != undefined && nodeBarContents[0].length > 0){ + var addNodeBarContents = nodeBarContents[0]; + // 1. 检查是否包含了now、newly、btn这三个默认项,将其他元素依次排列,将特殊元素至于栈顶 + for(var i=0; i', '
                      ']; + // 3.遍历生成按钮 + for(var j=0; j
                      '); + addNodeBar.push(addBtn.join('')); + addNodeBar.push('
                      '); + html = addNodeBar.join(''); + break; + + case defaultTool.editTool: + var editNodeBarDef = [{"label": "当前选中", "name": "nodeTitle", "type": "text", "value": title, "defElem": "nowChoose", "readonly": true}, + {"label": "编辑"+_this.toolbarStyle.title, "name": "editNodeName", "type": "text", "value": "", "defElem": "nowChange", "verify": "required"}, + {"type": "submit", "value": "确认编辑", "defElem": "btn", "filter": "dtree_editNode_form"}]; + + var editNodeBar = ['
                      ']; + //2. 用户自定义的节点内容 + if(nodeBarContents != null && nodeBarContents.length > 0){ + + if(nodeBarContents[1] != null && nodeBarContents[1] != undefined && nodeBarContents[1].length > 0){ + var editNodeBarContents = nodeBarContents[1]; + // 1. 检查是否包含了now、newly、btn这三个默认项,将其他元素依次排列,将特殊元素至于栈顶 + for(var i=0; i', '
                      ']; + // 3.遍历生成按钮 + for(var j=0; j
                      '); + editNodeBar.push(editBtn.join('')); + editNodeBar.push('
                      '); + html = editNodeBar.join(''); + break; + } + return html; + }; + + // 获取toolbar详细的标签信息 + DTree.prototype.loadToolBarDetail = function(nodeBarContents){ + var _this = this; + var readonly = (typeof (nodeBarContents.readonly) === "boolean") ? nodeBarContents.readonly : false; + var disabled = (typeof (nodeBarContents.disabled) === "boolean") ? nodeBarContents.disabled : false; + var id = nodeBarContents.id ? nodeBarContents.id : ""; + var name = nodeBarContents.name ? nodeBarContents.name : ""; + var val = nodeBarContents.value ? nodeBarContents.value : ""; + var verify = nodeBarContents.verify ? nodeBarContents.verify : ""; + var placeholder = nodeBarContents.placeholder ? nodeBarContents.placeholder : val; + return{ + text: function(){ + return ['
                      ', + '', + '
                      ', + '', + '
                      ', + '
                      '].join(''); + }, + textarea: function(){ + return ['
                      ', + '', + '
                      ', + '', + '
                      ', + '
                      '].join(''); + }, + hidden: function(){ + return [''].join(''); + }, + select: function(){ + var optionsData = (typeof nodeBarContents.optionsData === 'object') ? nodeBarContents.optionsData : nodeBarContents.optionsData(); + var options = ""; + for(var key in optionsData){ + if(val == optionsData[key]){ + options += ""; + } else { + options += ""; + } + } + return ['
                      ', + '', + '
                      ', + '', '
                      ', '
                      '].join(''); + }, + submit: function(){ + var filter = nodeBarContents.filter; + return [''].join(''); + }, + button: function(){ + return [''].join(''); + }, + reset: function(){ + return [''].join(''); + } + } + }; + + // 新增节点后改变节点内容 + DTree.prototype.changeTreeNodeAdd = function(returnID){ + var _this = this; + var temp = _this.temp; + var id = temp[0], $ul = temp[1], $div = temp[2], level = temp[3]; + var flag = false; + if(returnID){ + var $thisDiv = _this.obj.find("[data-id='"+id+"']"); + if(typeof returnID === "object"){ + // 如果是JSON格式数据,则将当前DIV删除,重新建造DIV + $thisDiv.remove(); + var parseData = _this.parseData(returnID); + + if(parseData.treeId()){ + $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(0), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), "item")); + + // 建造完毕后,选中该DIV + $thisDiv = $ul.find("div[data-id='"+parseData.treeId()+"']"); + _this.setNodeParam($thisDiv) + } else { + layer.msg("添加失败,节点ID为undefined!",{icon:5}); + // 将li节点删除 + $ul.find("li[data-id='"+id+"']").remove(); + // 重新赋值 + _this.setNodeParam($div); + // 临时变量制空 + _this.temp = []; + return ; + } + }else if(returnID == 'refresh'){ + // 如果是设置为refresh参数,则向后台发送请求,获取新增节点下的真实参数,局部刷新树。 + flag = true; + } else if(typeof returnID === "string" || typeof returnID === 'number' || returnID == true){ + $thisDiv.attr("data-id", returnID); + // 将li节点展示 + $ul.find("li[data-id='"+returnID+"']").show(); + _this.setNodeParam($thisDiv) + } + + // 判断当前点击的节点是否是最后一级节点,如果是,则需要修改节点的样式 + var $icon_i = $div.find("i[data-spread]"); + if ($icon_i.eq(0).attr("data-spread") == "last") { + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).openWithLeaf(); + } else { //如果不是,也要修改节点样式 + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).open(); + } + $ul.addClass(NAV_SHOW); //展开UL + _this.accordionUL($ul); + if(flag) { + _this.getChild($div); + } else { + // _this.showLine(); + _this.showLine($ul.find("li")); + // 这种情况下需要在新增节点后对节点新增工具栏 + if(_this.toolbar && _this.toolbarWay != 'contextmenu') { + _this.dynamicToolbarDom($thisDiv.find("cite[data-leaf]")); + } + } + + } else { + // 将li节点删除 + $ul.find("li[data-id='"+id+"']").remove(); + // 重新赋值 + _this.setNodeParam($div); + } + + _this.temp = []; // 临时变量制空 + + }; + + // 编辑页打开后显示编辑页内容 + DTree.prototype.changeTreeNodeDone = function(param){ + var _this = this; + form.val('dtree_editNode_form', param); + form.render(); + }; + + // 修改节点后改变节点内容 + DTree.prototype.changeTreeNodeEdit = function(returnID){ + var _this = this; + var temp = _this.temp; + var $cite = temp[0], $div = temp[1], title = temp[2], $p_div = temp[3]; + var flag = false; + if(returnID){ + if(typeof returnID === "object"){ + var parseData = _this.parseData(data); + + if(parseData.treeId()){ + var replaceDom = _this.replaceDom($div, parseData.treeId(), parseData.last(0), parseData.spread(), parseData.disabled(), parseData.hide()); + replaceDom.node(parseData.iconClass()); + replaceDom.checkbox(parseData.checkArr()); + replaceDom.text(parseData.title()); + replaceDom.ul(); + replaceDom.basicData(parseData.basicData()); + replaceDom.recordData(parseData.recordData()); + _this.setNodeParam($div); + } else { + layer.msg("编辑失败,节点ID为undefined!",{icon:5}); + // 重新赋值 + _this.setNodeParam($div); + } + } + } else { + $cite.html(title); + _this.getNodeParam($div); + } + + _this.temp = []; // 临时变量制空 + }; + + // 删除节点后改变节点内容 + DTree.prototype.changeTreeNodeDel = function(flag){ + var _this = this; + var temp = _this.temp; + var $p_li = temp[0], + $p_ul = $p_li.parent("ul"), + $p_div = temp[1]; + + if(flag){ + $p_li.remove(); + _this.showLine($p_ul.find("li")); + // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式 + if($p_ul.children("li").length == 0){ + var $icon_i = $p_div.find("i[data-spread]"); + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).closeWithLeaf(); + } + _this.initNodeParam(); + } + + _this.temp = []; // 临时变量制空 + }; + + /******************** iframe区域 ********************/ + // 加载iframe + DTree.prototype.loadIframe = function($div, iframeParam) { + var _this = this; + var $cite = _this.getNodeDom($div).cite(); + if (!_this.useIframe) { // 启用iframe + return false; + } + var iframeElem = _this.iframeElem, + iframeUrl = _this.iframeUrl, + iframeLoad = _this.iframeLoad; + + var flag = iframeLoad == "leaf" ? (($cite.attr("data-leaf") == "leaf") ? true : false) : true; + + if (flag) { + if ($(iframeElem).length > 0) { //iframe存在 + if (!iframeUrl) { + layer.msg("数据请求异常,iframeUrl参数未指定", {icon:5}); + return false; + } + var param = AjaxHelper.serialize(iframeParam); + if(iframeUrl.indexOf("?")> -1){ + param = "&"+param.substring(1, param.length); + } + var url = iframeUrl + param; + $(iframeElem).attr("src", url); + } else { + layer.msg("iframe绑定异常,请确认页面中是否有iframe页对应的容器", {icon:5}); + return false; + } + } + return flag; + }; + + // 获取传递出去的参数,根据iframe.iframeDefaultRequest、iframe.iframeRequest和node拼出发出请求的参数 + DTree.prototype.getIframeRequestParam = function(nodes){ + var _this = this; + var request = _this.iframeRequest, + defaultRequestNames = _this.iframeDefaultRequest, + node = nodes || _this.node, + requestParam = {}; + + // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值 + for ( var key in request) { + requestParam[key] = request[key]; + } + for ( var key in defaultRequestNames) { + var paramName = defaultRequestNames[key]; + var paramValue = node[key]; + if(typeof paramValue === "boolean"){ + requestParam[paramName] = paramValue; + }else { + if(paramValue){ + requestParam[paramName] = paramValue; + } + } + } + + // 解决传递中文的乱码问题 + var reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/; //正则匹配中文 + for(var key in requestParam){ + if(reg.test(requestParam[key])) { + var str = requestParam[key]; + requestParam[key] = encodeURI(encodeURI(str)); + } + } + + return requestParam; + }; + + /******************** 数据回调区域 ********************/ + // 根据具体的id获取基于当前id的div以及对应的其他dom元素 + DTree.prototype.getNodeDom = function(id){ + var _this = this; + // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + return { + div: function(){ // 获取当前div + return $div; + }, + fnode: function(){ // 获取一级图标元素 + return ($div == null) ? null : $div.find("i[data-spread]").eq(0); + }, + snode: function(){ // 获取二级图标元素 + return ($div == null) ? null : $div.find("i[data-spread]").eq(1); + }, + checkbox: function(){ // 获取复选框元素 + return ($div == null) ? null : $div.find("i[data-par]"); + }, + cite: function(){ // 获取cite元素 + return ($div == null) ? null : $div.find("cite[data-leaf]"); + }, + nextUl: function(){ // 获取相邻的ul元素 + return ($div == null) ? null : $div.next("ul"); + }, + parentLi: function(){ // 获取父级li元素 + return ($div == null) ? null : $div.parent("li"); + }, + parentUl: function(){ // 获取基于当前$div的上级$ul + return ($div == null) ? null : $div.parent("li").parent("ul"); + }, + parentDiv: function(){ // 获取基于当前$div的上级$div + return ($div == null) ? null : $div.parent("li").parent("ul").prev("div"); + }, + nowDiv: function(){ // 获取当前选中节点,没有则返回null + return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS); + }, + nowOrRootDiv: function(){ // 获取当前选中节点,没有则返回根节点下的第一个div + return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? _this.obj.children("li").eq(0).children("div").eq(0) : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS); + }, + nowOrRootUl: function(){ // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下 + return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? _this.obj : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).next("ul"); + } + } + }; + + // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下 + DTree.prototype.getNowNodeUl = function() { + var _this = this; + return _this.getNodeDom().nowOrRootUl(); + }; + + // 获取当前选中节点 或第一个根节点。 + DTree.prototype.getNowNode = function() { + var _this = this; + return _this.getNodeDom().nowOrRootDiv(); + }; + + // 获取当前选中节点 无则返回null。 + DTree.prototype.getNowNodeOrNull = function() { + var _this = this; + return _this.getNodeDom().nowDiv(); + }; + + // 获取指定节点。 + DTree.prototype.getNode = function(id) { + var _this = this; + return _this.getNodeDom(id).div(); + }; + + // 设置当前选中节点的全部参数 + DTree.prototype.setNodeParam = function($div) { + var _this = this; + _this.node.nodeId = $div.attr("data-id"); + _this.node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid"); + _this.node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text(); + _this.node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false; + _this.node.level = _this.getNodeDom($div).parentLi().attr("data-index"); + _this.node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false; + + var basicData = $div.attr("data-basic"); + if(basicData) { + basicData = JSON.parse(event.unescape(basicData)); + } + _this.node.basicData = basicData; + + var recordData = $div.attr("data-record"); + if(recordData) { + recordData = JSON.parse(event.unescape(recordData)); + } + _this.node.recordData = recordData; + + if (_this.getNodeDom($div).checkbox()) { + var dataTypes = "", checkeds = "", initcheckeds = ""; + _this.getNodeDom($div).checkbox().each(function(){ + dataTypes += $(this).attr("data-type") + ","; + checkeds += $(this).attr("data-checked") + ","; + initcheckeds += $(this).attr("data-initchecked") + ","; + }); + dataTypes = dataTypes.substring(0, dataTypes.length-1); + checkeds = checkeds.substring(0, checkeds.length-1); + initcheckeds = initcheckeds.substring(0, initcheckeds.length-1); + + _this.node.dataType = dataTypes; + _this.node.checked = checkeds; + _this.node.initchecked = initcheckeds; + } + }; + + // 获取当前选中节点的全部参数 + DTree.prototype.getNodeParam = function($div) { + var _this = this; + if ($div) { + _this.setNodeParam($div); + } else { + if(_this.obj.find("div[data-id]").parent().find("."+NAV_THIS).length == 0){ + _this.initNodeParam(); + } + } + return this.node; + }; + + // 获取一个临时的node参数 + DTree.prototype.getTempNodeParam = function($div) { + var _this = this; + var temp_node = {}; + temp_node.nodeId = $div.attr("data-id"); + temp_node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid"); + temp_node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text(); + temp_node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false; + temp_node.level = _this.getNodeDom($div).parentLi().attr("data-index"); + temp_node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false; + + var basicData = $div.attr("data-basic"); + if(basicData) { + basicData = JSON.parse(event.unescape(basicData)); + } + temp_node.basicData = basicData; + var recordData = $div.attr("data-record"); + if(recordData) { + recordData = JSON.parse(event.unescape(recordData)); + } + temp_node.recordData = recordData; + + if (_this.getNodeDom($div).checkbox()) { + var dataTypes = "", checkeds = "", initcheckeds = ""; + _this.getNodeDom($div).checkbox().each(function(){ + dataTypes += $(this).attr("data-type") + ","; + checkeds += $(this).attr("data-checked") + ","; + initcheckeds += $(this).attr("data-initchecked") + ","; + }); + dataTypes = dataTypes.substring(0, dataTypes.length-1); + checkeds = checkeds.substring(0, checkeds.length-1); + initcheckeds = initcheckeds.substring(0, initcheckeds.length-1); + + temp_node.dataType = dataTypes; + temp_node.checked = checkeds; + temp_node.initchecked = initcheckeds; + } + return temp_node; + }; + + // 重置参数 + DTree.prototype.initNodeParam = function(){ + var _this = this; + _this.node.nodeId = ""; + _this.node.parentId = ""; + _this.node.context = ""; + _this.node.leaf = ""; + _this.node.level = ""; + _this.node.spread = ""; + _this.node.dataType = ""; + _this.node.checked = ""; + _this.node.initchecked = ""; + _this.node.basicData = ""; + _this.node.recordData = ""; + + if(_this.select) { + _this.selectResetVal(); + } + }; + + // 获取传递出去的参数,根据defaultRequest、request和node拼出发出请求的参数 + DTree.prototype.getRequestParam = function(nodes){ + var _this = this; + var request = _this.request, + defaultRequestNames = _this.defaultRequest, + node = nodes || _this.node, + requestParam = {}; + + // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值 + for ( var key in request) { + requestParam[key] = request[key]; + } + for ( var key in defaultRequestNames) { + var paramName = defaultRequestNames[key]; + var paramValue = node[key]; + if(typeof paramValue === "boolean"){ + requestParam[paramName] = paramValue; + }else { + if(paramValue){ + requestParam[paramName] = paramValue; + } + } + + } + return requestParam; + }; + + // 获取filterParam过滤后的requestParam + DTree.prototype.getFilterRequestParam = function(requestParam){ + var _this = this; + var filterRequest = _this.filterRequest; + return event.cloneObj(requestParam, filterRequest); + }; + + // 获取当前选中值 + DTree.prototype.getNowParam = function(){ + var _this = this; + + return _this.getRequestParam(_this.getNodeParam()); + }; + + // 获取指定节点选中值 + DTree.prototype.getParam = function(id){ + var _this = this; + + // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + if($div != null){ return _this.callbackData().node(_this.getTempNodeParam($div)); } else { return {}; } + }; + + // 获取参数的上级节点 + DTree.prototype.getParentParam = function(id){ + var _this = this; + // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + if($div != null){ return _this.callbackData().parentNode($div); } else { return {}; } + }; + + // 获取参数的全部上级节点 + DTree.prototype.getAllParentParam = function(id){ + var _this = this; + // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + var arr = []; + if($div != null){ + var level = _this.getTempNodeParam($div).level; + for(var i=1; i 0){ + $childDivs.each(function(){ + var $cDiv = $(this); + childNode.push(_this.getRequestParam(_this.getTempNodeParam($cDiv))); + }); + } + return childNode; + }, + parentNode: function($div){ // 获取上级节点值 + var pId = _this.getNodeDom($div).parentLi().attr("data-pid"); + var $pdiv = _this.obj.find("div[data-id='"+pId+"']"); + if($pdiv.length > 0) {return _this.getRequestParam(_this.getTempNodeParam($pdiv));} else {return {};} + + } + } + }; + + /******************** 事件回调区域 ********************/ + // 绑定浏览器事件 + DTree.prototype.bindBrowserEvent = function(){ + var _this = this; + var rootId = _this.obj[0].id; + + // 绑定文件夹展开/收缩的图标的点击事件,点击时给当前节点的div添加选中class + _this.obj.on("click", "i[data-spread]", function(event) { + event.stopPropagation(); + var $i = $(this), + $div = $i.parent("div"), + node = _this.getNodeParam($div); + + _this.toolbarHide(); + _this.navThis($div); + _this.clickSpread($div); // 展开或隐藏节点 + + // 树状态改变后,用户自定义想做的事情 + layui.event.call(this, MOD_NAME, "changeTree("+$(_this.obj)[0].id+")", { + dom: _this.callbackData().dom($i), + param: _this.callbackData().node(node), + show: _this.callbackData().dom($i).attr("data-spread") == "open" ? true : false + }); + }); + + // 绑定所有子节点div的单击事件,点击时触发加载iframe或用户自定义想做的事情 + _this.obj.on("click", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event) { + event.stopPropagation(); + var $div = $(this), + $cite = $div.find("cite"), + node = _this.getNodeParam($div); + _this.toolbarHide(); + _this.navThis($div); + + if(_this.select) { + _this.selectVal(node.nodeId); + $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").click(); + } + + if (_this.useIframe) { + var iframeParam = _this.getFilterRequestParam(_this.getIframeRequestParam(node)); + var flag = _this.loadIframe($div, iframeParam); // 加载iframe + if (flag) { + // iframe加载完毕后,用户自定义想做的事情 + _this.iframeFun.iframeDone(iframeParam); + + layui.event.call(this, MOD_NAME, "iframeDone("+$(_this.obj)[0].id+")", { + "iframeParam": iframeParam, + dom: _this.callbackData().dom($div) + }); + } + } else { + // 单击事件执行完毕后,用户自定义想做的事情 + layui.event.call(this, MOD_NAME, "node("+$(_this.obj)[0].id+")", { + param: _this.callbackData().node(node), + childParams: _this.callbackData().childNode($div), + parentParam: _this.callbackData().parentNode($div), + dom: _this.callbackData().dom($div) + }); + } + }); + + // 绑定所有子节点div的双击事件,暴露on给用户自定义 + _this.obj.on("dblclick", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event) { + event.stopPropagation(); + var $div = $(this), + $cite = $div.find("cite"), + node = _this.getNodeParam($div); + _this.toolbarHide(); + _this.navThis($div); + + if(_this.select) { + _this.selectVal(node.nodeId); + $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").click(); + } + + // 双击事件执行完毕后,用户自定义想做的事情 + layui.event.call(this, MOD_NAME, "nodedblclick("+$(_this.obj)[0].id+")", { + param: _this.callbackData().node(node), + childParams: _this.callbackData().childNode($div), + parentParam: _this.callbackData().parentNode($div), + dom: _this.callbackData().dom($div) + }); + }); + + if(_this.checkbar) { + // 绑定cheboxbar的节点复选框 + _this.obj.on("click", "i[dtree-click='"+eventName.checkNodeClick+"'][dtree-disabled='false']", function(event) { + _this.toolbarHide(); + var $i = $(this), + $div = $i.closest("div[dtree-click='"+eventName.itemNodeClick+"']"), + node = _this.getNodeParam($div); + // 复选框选中前的回调 + var flag = _this.checkbarFun.chooseBefore($i, _this.getRequestParam(node)); + _this.temp = [$i]; + if(flag){_this.changeCheck();} + + event.stopPropagation(); + }); + } + + if(_this.menubar) { + // 绑定menubar的点击事件 + _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).on("click", "button[d-menu]", function(event) { + event.stopPropagation(); + _this.toolbarHide(); + _this.menubarListener($(this).attr("d-menu"), "group"); + }); + + // 绑定menubar的点击事件 + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[d-menu]", function(event) { + event.stopPropagation(); + _this.toolbarHide(); + _this.menubarListener($(this).attr("d-menu"), "toolbar"); + }); + + // 绑定menubar的点击按钮事件 + _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").on("click", function(event) { + event.stopPropagation(); + _this.toolbarHide(); + _this.menubarListener($(this).attr("dtree-menu"), "freedom"); + }); + } + + if(_this.toolbar) { + if(_this.toolbarWay == "contextmenu") { + //绑定所有子节点div的右键点击事件,用于显示toolbar + _this.obj.on("contextmenu", "div[dtree-click='"+eventName.itemNodeClick+"'][d-contextmenu='true'][dtree-disabled='false']", function(e){ + var $div = $(this), + node = _this.getNodeParam($div); + + _this.toolbarHide(); + // toolbar加载前执行的方法,执行完毕之后创建按钮 + _this.setToolbarDom().setToolbarPlace(_this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), _this.getRequestParam(node), $div)); + + var e = e || window.event, + mx = e.pageX - $div.offset().left +45 , + my = $div.offset().top - _this.obj.closest(_this.scroll).offset().top +15; + + _this.navThis($div); + var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id); + $toolBarDiv.find(".layui-nav-child").addClass('layui-anim-fadein layui-show'); + $toolBarDiv.css({'left':mx+'px','top':my+'px'}); + + e.stopPropagation(); + return false; + }); + + // 绑定装载树的上层出现滚动条的容器,让toolbar隐藏 + _this.obj.closest(_this.scroll).scroll(function() { + _this.toolbarHide(); + }); + + // 绑定toolbar的点击事件 + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[dtree-tool]", function(event) { + event.stopPropagation(); + var $div = _this.getNodeDom().nowOrRootDiv(), + node = _this.getNodeParam($div); + _this.toolbarHide(); + var tool = $(this).attr("dtree-tool"); + _this.toolbarListener(tool, $div); + }); + } else if(_this.toolbarWay == "fixed") { + // 绑定toolbar的点击事件 + _this.obj.on("click", "a[dtree-tool]", function(event) { + event.stopPropagation(); + var $a = $(this), + $cite = $a.parent("em."+TOOLBAR_TOOL_EM).prev("cite"), //当前选中节点的text + $div = $cite.parent("div"), + node = _this.getNodeParam($div); + var tool = $a.attr("dtree-tool"); + + _this.toolbarHide(); + _this.navThis($div); + _this.toolbarListener(tool, $div); + }); + } else if(_this.toolbarWay == "follow") { + //绑定所有子节点div的mouseover mouseout事件,用于显示或隐藏toolbar + _this.obj.on("mouseover mouseout", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event){ + var $div = $(this), + $toolBarEm = $div.children("em."+TOOLBAR_TOOL_EM); + if(event.type == "mouseover"){ + $toolBarEm.removeClass(NAV_HIDE); + event.stopPropagation(); + } else if(event.type == "mouseout"){ + $toolBarEm.addClass(NAV_HIDE); + event.stopPropagation(); + } + }); + + // 绑定toolbar的点击事件 + _this.obj.on("click", "a[dtree-tool]", function(event) { + event.stopPropagation(); + var $a = $(this), + $cite = $a.parent("em."+TOOLBAR_TOOL_EM).prev("cite"), //当前选中节点的text + $div = $cite.parent("div"), + node = _this.getNodeParam($div); + var tool = $a.attr("dtree-tool"); + + _this.toolbarHide(); + _this.navThis($div); + _this.toolbarListener(tool, $div); + }); + } + } + + if(_this.select) { + // 绑定select的点击事件 + $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").on("click", function(event){ + event.stopPropagation(); + $(this).toggleClass("layui-form-selected"); + $("div[dtree-id='" + rootId + "'][dtree-card='"+_this.selectCardDiv+"']").toggleClass("dtree-select-show layui-anim layui-anim-upbit"); + + // 下拉树面板开闭状态改变后,用户自定义想做的事情 + layui.event.call(this, MOD_NAME, "changeSelect("+$(_this.obj)[0].id+")", { + show: $(this).hasClass("layui-form-selected"), + param: _this.selectVal() + }); + }); + + } + }; + + // 绑定body的单击,让本页面所有的toolbar隐藏 + $BODY.on("click", function(event){ + $("div."+LI_DIV_TOOLBAR).find(".layui-show").removeClass('layui-anim-fadein layui-show'); + // $("div[dtree-id][dtree-select]").removeClass("layui-form-selected"); + // $("div[dtree-id][dtree-card]").removeClass("dtree-select-show layui-anim layui-anim-upbit"); + + }); + + // 解绑浏览器事件 + DTree.prototype.unbindBrowserEvent = function(){ + var _this = this; + + // 本身事件解绑 + _this.obj.unbind(); + // 菜单栏解绑 + if(_this.menubar){ + _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).unbind(); + if(_this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").length > 0){ + _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").unbind(); + } + } + + // 工具栏解绑 + if(_this.toolbar){ + if(_this.toolbarWay == "contextmenu") { + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).unbind(); + if(_this.obj.closest(_this.scroll).length > 0){ + _this.obj.closest(_this.scroll).unbind(); + } + } + } + + // 下拉树解绑 + if(_this.select) { + // 解绑select的点击事件 + $("div[dtree-id='" + _this.obj[0].id + "'][dtree-select='"+_this.selectDiv+"']").removeClass("layui-form-selected"); + $("div[dtree-id='" + _this.obj[0].id + "'][dtree-card='"+_this.selectCardDiv+"']").removeClass("dtree-select-show layui-anim layui-anim-upbit"); + $("div[dtree-id='" + _this.obj[0].id + "'][dtree-select='"+_this.selectDiv+"']").unbind(); + } + }; + + + /** 外部访问 **/ + var dtree = { + set: function(options){ //设置全局属性 + if(typeof options !== 'undefined') { + $.extend(OPTIONS, options); + } + }, + render: function(options){ // 初始化树 + var dTree = null; + var id = event.getElemId(options); + if(id == "") { + layer.msg("页面中未找到绑定id", {icon:5}); + } else { + dTree = DTrees[id]; + if(typeof dTree === 'object'){ + dTree.unbindBrowserEvent(); + } + // 创建树 + dTree = new DTree(options); + // 添加到树数组中去 + DTrees[id] = dTree; + dTree.initTreePlus(); + dTree.openTreePlus(); + dTree.init(); + dTree.bindBrowserEvent(); + } + + return dTree; + }, + renderSelect: function(options){ // 初始化下拉树 + var dTree = null; + var id = event.getElemId(options); + if(id == "") { + layer.msg("页面中未找到绑定id", {icon:5}); + } else { + dTree = DTrees[id]; + if(typeof dTree === 'object'){ + dTree.unbindBrowserEvent(); + } + // 创建下拉树 + dTree = new DTree(options); + dTree.selectSetting(); + // 添加到树数组中去 + DTrees[id] = dTree; + dTree.initTreePlus(); + dTree.openTreePlus(); + dTree.init(); + dTree.bindBrowserEvent(); + } + + return dTree; + }, + reload: function(dTree, options){ // 重新加载树 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + dTree.reloadSetting(options); + dTree.initTreePlus(); + dTree.openTreePlus(); + dTree.initNodeParam(); + dTree.init(); + dTree.unbindBrowserEvent(); + dTree.bindBrowserEvent(); + }, + on: function(events, callback) { // 绑定事件 + if(events.indexOf("'") > 0){ + events = events.replace(/'/g,""); + } + if(events.indexOf('"') > 0) { + events = events.replace(/"/g,""); + } + return layui.onevent.call(this, MOD_NAME, events, callback); + }, + click: function(dTree, id) { // 模拟单击事件 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + $("div[dtree-click='"+eventName.itemNodeClick+"'][dtree-id='"+dTree.obj[0].id+"'][data-id='"+id+"']").click(); + }, + getNowParam: function(dTree){ // 获取当前选中值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getNowParam(); // 获取当前选中值 + }, + getParam: function(dTree, id){ // 获取指定节点值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getParam(id); // 获取指定节点值 + }, + getParentParam: function(dTree, id){ // 获取参数的上级节点 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getParentParam(id); + }, + getAllParentParam: function(dTree, id){ // 获取参数的全部上级节点 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getAllParentParam(id); + }, + getChildParam: function(dTree, id){ // 获取参数的全部下级节点 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getChildParam(id); + }, + getCheckbarNodesParam: function(dTree){ // 获取复选框选中值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return {}; + } + return dTree.getCheckbarNodesParam(); // 获取复选框选中值 + }, + dataInit: function(dTree, chooseId){ // 初始化选中树,针对数据反选 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + if(chooseId){ + return dTree.dataInit(chooseId); + } + }, + chooseDataInit: function(dTree, chooseIds){ // 初始化复选框选中,针对数据反选 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + if(chooseIds){ + return dTree.chooseDataInit(chooseIds); + } + }, + changeCheckbarNodes: function(dTree){ //判断复选框是否发生变更 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.changeCheckbarNodes(); + }, + initNoAllCheck: function(dTree) { //复选框半选状态初始化设置 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.initNoAllCheck(); + }, + initAllCheck: function(dTree){ // 复选框选中状态初始化设置 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.initAllCheck(); + }, + selectVal: function(dTree, param){ // select模式设置输入框选中值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.selectVal(param); // select模式设置输入框选中值 + }, + escape: function(html){ // 字符串格式化 + return event.escape(html); + }, + unescape: function(str){ // 字符串反格式化 + return event.unescape(str); + }, + version: function(){ //获取版本号 + return VERSION; + } + }; + + exports('dtree', dtree); +}); \ No newline at end of file diff --git a/public/static/component/pear/css/module/dtree/font/dtreefont.css b/public/static/component/pear/css/module/dtree/font/dtreefont.css new file mode 100644 index 0000000..df7af65 --- /dev/null +++ b/public/static/component/pear/css/module/dtree/font/dtreefont.css @@ -0,0 +1,229 @@ +@font-face { + font-family: 'dtreefont'; + src: url('dtreefont.eot?x3m8fp'); + src: url('dtreefont.eot?x3m8fp#iefix') format('embedded-opentype'), + url('dtreefont.ttf?x3m8fp') format('truetype'), + url('dtreefont.woff?x3m8fp') format('woff'), + url('dtreefont.svg?x3m8fp#dtreefont') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="dtree-icon-"], [class*=" dtree-icon-"] { + /* use !important to prevent issues with browser extensions that change font */ + font-family: 'dtreefont' !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; +} + +.dtree-icon-xiangxia1:before { + content: "\e771"; +} +.dtree-icon-normal-file:before { + content: "\e60c"; +} +.dtree-icon-xiangyou:before { + content: "\e78f"; +} +.dtree-icon-ok-circle:before { + content: "\1005"; +} +.dtree-icon-close1:before { + content: "\1006"; +} +.dtree-icon-close-fill:before { + content: "\1007"; +} +.dtree-icon-jian1:before { + content: "\e600"; +} +.dtree-icon-jia1:before { + content: "\e601"; +} +.dtree-icon-bianji:before { + content: "\e602"; +} +.dtree-icon-yonghu:before { + content: "\e603"; +} +.dtree-icon-shijian:before { + content: "\e606"; +} +.dtree-icon-fuxuankuang-banxuan:before { + content: "\e607"; +} +.dtree-icon-star:before { + content: "\e608"; +} +.dtree-icon-wenjianjiazhankai:before { + content: "\e60e"; +} +.dtree-icon-xiangmuxiaoxi:before { + content: "\e60f"; +} +.dtree-icon-search2:before { + content: "\e615"; +} +.dtree-icon-weibiaoti5:before { + content: "\e618"; +} +.dtree-icon-layim-theme:before { + content: "\e61b"; +} +.dtree-icon-shuye1:before { + content: "\e61e"; +} +.dtree-icon-add-circle:before { + content: "\e61f"; +} +.dtree-icon-xinxipilu:before { + content: "\e620"; +} +.dtree-icon-set-sm:before { + content: "\e621"; +} +.dtree-icon-about:before { + content: "\e623"; +} +.dtree-icon-chart-screen:before { + content: "\e62a"; +} +.dtree-icon-delete1:before { + content: "\e640"; +} +.dtree-icon-share3:before { + content: "\e641"; +} +.dtree-icon-youjian:before { + content: "\e642"; +} +.dtree-icon-check:before { + content: "\e645"; +} +.dtree-icon-close:before { + content: "\e646"; +} +.dtree-icon-favorfill:before { + content: "\e64b"; +} +.dtree-icon-favor:before { + content: "\e64c"; +} +.dtree-icon-fuxuankuangxuanzhong:before { + content: "\e652"; +} +.dtree-icon-fenguangbaobiao:before { + content: "\e655"; +} +.dtree-icon-jian:before { + content: "\e656"; +} +.dtree-icon-jia:before { + content: "\e657"; +} +.dtree-icon-fenzhijigou:before { + content: "\e658"; +} +.dtree-icon-roundcheckfill:before { + content: "\e659"; +} +.dtree-icon-roundcheck:before { + content: "\e65a"; +} +.dtree-icon-roundclosefill:before { + content: "\e65b"; +} +.dtree-icon-roundclose:before { + content: "\e65c"; +} +.dtree-icon-roundrightfill:before { + content: "\e65d"; +} +.dtree-icon-roundright:before { + content: "\e65e"; +} +.dtree-icon-like:before { + content: "\e66c"; +} +.dtree-icon-samefill:before { + content: "\e671"; +} +.dtree-icon-same:before { + content: "\e672"; +} +.dtree-icon-evaluate:before { + content: "\e674"; +} +.dtree-icon-circle1:before { + content: "\e687"; +} +.dtree-icon-radio:before { + content: "\e688"; +} +.dtree-icon-caidan_xunzhang:before { + content: "\e68e"; +} +.dtree-icon-pulldown:before { + content: "\e6a0"; +} +.dtree-icon-pullup:before { + content: "\e6a1"; +} +.dtree-icon-refresh:before { + content: "\e6a4"; +} +.dtree-icon-qrcode1:before { + content: "\e6b0"; +} +.dtree-icon-profile1:before { + content: "\e6b7"; +} +.dtree-icon-home1:before { + content: "\e6b8"; +} +.dtree-icon-homefill:before { + content: "\e6bb"; +} +.dtree-icon-roundaddfill:before { + content: "\e6d8"; +} +.dtree-icon-roundadd:before { + content: "\e6d9"; +} +.dtree-icon-fuxuankuang:before { + content: "\e6f2"; +} +.dtree-icon-wefill:before { + content: "\e6f5"; +} +.dtree-icon-sort:before { + content: "\e701"; +} +.dtree-icon-repair:before { + content: "\e738"; +} +.dtree-icon-shujudaping:before { + content: "\e742"; +} +.dtree-icon-dian:before { + content: "\e7a5"; +} +.dtree-icon-search_list_light:before { + content: "\e807"; +} +.dtree-icon-round_list_light:before { + content: "\e82b"; +} +.dtree-icon-star-fill:before { + content: "\e832"; +} +.dtree-icon-rate:before { + content: "\e833"; +} +.dtree-icon-move-up:before { + content: "\ea47"; +} +.dtree-icon-move-down:before { + content: "\ea48"; +} diff --git a/public/static/component/pear/css/module/dtree/font/dtreefont.eot b/public/static/component/pear/css/module/dtree/font/dtreefont.eot new file mode 100644 index 0000000000000000000000000000000000000000..68bf5f2f2dd33daa67373cca102f8ad764d84c22 GIT binary patch literal 19508 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 + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/component/pear/css/module/dtree/font/dtreefont.ttf b/public/static/component/pear/css/module/dtree/font/dtreefont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..78bacd13a0a16b55e6b3be536b35e34e147a396a GIT binary patch literal 19344 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 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/css/module/dtree/font/icons.json b/public/static/component/pear/css/module/dtree/font/icons.json new file mode 100644 index 0000000..fca4788 --- /dev/null +++ b/public/static/component/pear/css/module/dtree/font/icons.json @@ -0,0 +1,283 @@ +{ + "data": [{ + "cls": "dtree-icon-xiangxia1", + "uncode": "e771" + }, + { + "cls": "dtree-icon-xiangyou", + "uncode": "e78f" + }, + { + "cls": "dtree-icon-jian", + "uncode": "e656" + }, + { + "cls": "dtree-icon-jia", + "uncode": "e657" + }, + { + "cls": "dtree-icon-weibiaoti5", + "uncode": "e618" + }, + { + "cls": "dtree-icon-wenjianjiazhankai", + "uncode": "e60e" + }, + { + "cls": "dtree-icon-dian", + "uncode": "e7a5" + }, + { + "cls": "dtree-icon-yonghu", + "uncode": "e603" + }, + { + "cls": "dtree-icon-fenzhijigou", + "uncode": "e658" + }, + { + "cls": "dtree-icon-fenguangbaobiao", + "uncode": "e655" + }, + { + "cls": "dtree-icon-xinxipilu", + "uncode": "e620" + }, + { + "cls": "dtree-icon-shuye1", + "uncode": "e61e" + }, + { + "cls": "dtree-icon-caidan_xunzhang", + "uncode": "e68e" + }, + { + "cls": "dtree-icon-normal-file", + "uncode": "e60c" + }, + { + "cls": "dtree-icon-roundclose", + "uncode": "e65c" + }, + { + "cls": "dtree-icon-bianji", + "uncode": "e602" + }, + { + "cls": "dtree-icon-roundadd", + "uncode": "e6d9" + }, + { + "cls": "dtree-icon-fuxuankuangxuanzhong", + "uncode": "e652" + }, + { + "cls": "dtree-icon-fuxuankuang", + "uncode": "e6f2" + }, + { + "cls": "dtree-icon-fuxuankuang-banxuan", + "uncode": "e607" + }, + { + "cls": "dtree-icon-search_list_light", + "uncode": "e807" + }, + { + "cls": "dtree-icon-move-up", + "uncode": "ea47" + }, + { + "cls": "dtree-icon-move-down", + "uncode": "ea48" + }, + { + "cls": "dtree-icon-delete1", + "uncode": "e640" + }, + { + "cls": "dtree-icon-refresh", + "uncode": "e6a4" + }, + { + "cls": "dtree-icon-roundcheckfill", + "uncode": "e659" + }, + { + "cls": "dtree-icon-roundclosefill", + "uncode": "e65b" + }, + { + "cls": "dtree-icon-roundcheck", + "uncode": "e65a" + }, + { + "cls": "dtree-icon-pulldown", + "uncode": "e6a0" + }, + { + "cls": "dtree-icon-pullup", + "uncode": "e6a1" + }, + { + "cls": "dtree-icon-set-sm", + "uncode": "e621" + }, + { + "cls": "dtree-icon-rate", + "uncode": "e833" + }, + { + "cls": "dtree-icon-jian1", + "uncode": "e600" + }, + { + "cls": "dtree-icon-jia1", + "uncode": "e601" + }, + { + "cls": "dtree-icon-shijian", + "uncode": "e606" + }, + { + "cls": "dtree-icon-check", + "uncode": "e645" + }, + { + "cls": "dtree-icon-close", + "uncode": "e646" + }, + { + "cls": "dtree-icon-favorfill", + "uncode": "e64b" + }, + { + "cls": "dtree-icon-favor", + "uncode": "e64c" + }, + { + "cls": "dtree-icon-roundrightfill", + "uncode": "e65d" + }, + { + "cls": "dtree-icon-roundright", + "uncode": "e65e" + }, + { + "cls": "dtree-icon-samefill", + "uncode": "e671" + }, + { + "cls": "dtree-icon-same", + "uncode": "e672" + }, + { + "cls": "dtree-icon-qrcode1", + "uncode": "e6b0" + }, + { + "cls": "dtree-icon-profile1", + "uncode": "e6b7" + }, + { + "cls": "dtree-icon-home1", + "uncode": "e6b8" + }, + { + "cls": "dtree-icon-homefill", + "uncode": "e6bb" + }, + { + "cls": "dtree-icon-roundaddfill", + "uncode": "e6d8" + }, + { + "cls": "dtree-icon-wefill", + "uncode": "e6f5" + }, + { + "cls": "dtree-icon-sort", + "uncode": "e701" + }, + { + "cls": "dtree-icon-round_list_light", + "uncode": "e82b" + }, + { + "cls": "dtree-icon-search2", + "uncode": "e615" + }, + { + "cls": "dtree-icon-close1", + "uncode": "1006" + }, + { + "cls": "dtree-icon-close-fill", + "uncode": "1007" + }, + { + "cls": "dtree-icon-chart-screen", + "uncode": "e62a" + }, + { + "cls": "dtree-icon-star", + "uncode": "e608" + }, + { + "cls": "dtree-icon-ok-circle", + "uncode": "1005" + }, + { + "cls": "dtree-icon-add-circle", + "uncode": "e61f" + }, + { + "cls": "dtree-icon-about", + "uncode": "e623" + }, + { + "cls": "dtree-icon-circle1", + "uncode": "e687" + }, + { + "cls": "dtree-icon-radio", + "uncode": "e688" + }, + { + "cls": "dtree-icon-star-fill", + "uncode": "e832" + }, + { + "cls": "dtree-icon-shujudaping", + "uncode": "e742" + }, + { + "cls": "dtree-icon-share3", + "uncode": "e641" + }, + { + "cls": "dtree-icon-youjian", + "uncode": "e642" + }, + { + "cls": "dtree-icon-repair", + "uncode": "e738" + }, + { + "cls": "dtree-icon-evaluate", + "uncode": "e674" + }, + { + "cls": "dtree-icon-like", + "uncode": "e66c" + }, + { + "cls": "dtree-icon-layim-theme", + "uncode": "e61b" + }, + { + "cls": "dtree-icon-xiangmuxiaoxi", + "uncode": "e60f" + } + ] +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/form.css b/public/static/component/pear/css/module/form.css new file mode 100644 index 0000000..3a36bd8 --- /dev/null +++ b/public/static/component/pear/css/module/form.css @@ -0,0 +1,63 @@ +.layui-card-body .layui-form{ + margin-top: 15px; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #ccc; +} +.layui-input:hover, +.layui-textarea:hover, +.layui-input:focus, +.layui-textarea:focus { + border-color: #eee; +} +.layui-input:focus, +.layui-textarea:focus { + border-color: #5FB878!important; +} + +.layui-input[success] { + box-shadow: 0px 0px 3px 1px #5FB878 !important; + border: #5FB878 1px solid!important; +} + +.layui-input[failure] { + box-shadow: 0px 0px 3px 1px #F56C6C; + border: #F56C6C 1px solid; +} + +.layui-input, +.layui-select, +.layui-textarea { + border-radius: 4px; + border-color: #eee; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +.layui-form-select dl::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +.layui-form-select dl::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +.layui-form-select dl::-webkit-scrollbar-track { + background: white; + border-radius: 3px; +} + +.layui-form-select dl::-webkit-scrollbar-thumb { + background: #E6E6E6; + border-radius: 3px; +} + +.layui-form-select dl::-webkit-scrollbar-thumb:hover { + background: #E6E6E6; +} + +.layui-form-select dl::-webkit-scrollbar-corner { + background: #f6f6f6; +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/frame.css b/public/static/component/pear/css/module/frame.css new file mode 100644 index 0000000..85bdaf5 --- /dev/null +++ b/public/static/component/pear/css/module/frame.css @@ -0,0 +1,158 @@ +.pear-frame { + width: 100%; + height: 100%; + position: relative; + overflow: hidden; +} + +.pear-frame .dot { + width: 5px; + height: 24px; + background-color: #5FB878; + margin-top: 8px; + margin-left: 15px; + border-radius: 2px; + display: inline-block; +} + +.pear-frame .title { + position: absolute; + margin-top: 0px; + margin-left: 12px; + color: dimgray; + display: inline-block; + letter-spacing: 2px; +} + +.pear-frame .pear-frame-title { + height: 40px; + line-height: 40px; + background-color: white; + border: whitesmoke 1px solid; +} + +.pear-frame .pear-frame-content { + width: 100%; + height: calc(100% - 45px) !important; +} + +.pear-frame-loading { + position: absolute; + display: none; + width: 100%; + height: calc(100% - 45px) !important; + top: 42px; + z-index: 19; + background-color: #fff +} + +.pear-frame-loading.close { + animation: close 1s; + -webkit-animation: close 1s; + animation-fill-mode: forwards; +} + +.ball-loader { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%) +} + +.ball-loader>span, +.signal-loader>span { + background-color: #4aca85; + display: inline-block +} + +.ball-loader>span:nth-child(1), +.ball-loader.sm>span:nth-child(1), +.signal-loader>span:nth-child(1), +.signal-loader.sm>span:nth-child(1) { + -webkit-animation-delay: 0s; + animation-delay: 0s +} + +.ball-loader>span:nth-child(2), +.ball-loader.sm>span:nth-child(2), +.signal-loader>span:nth-child(2), +.signal-loader.sm>span:nth-child(2) { + -webkit-animation-delay: .1s; + animation-delay: .1s +} + +.ball-loader>span:nth-child(3), +.ball-loader.sm>span:nth-child(3), +.signal-loader>span:nth-child(3), +.signal-loader.sm>span:nth-child(3) { + -webkit-animation-delay: .15s; + animation-delay: .15s +} + +.ball-loader>span:nth-child(4), +.ball-loader.sm>span:nth-child(4), +.signal-loader>span:nth-child(4), +.signal-loader.sm>span:nth-child(4) { + -webkit-animation-delay: .2s; + animation-delay: .2s +} + +.ball-loader>span { + width: 20px; + height: 20px; + margin: 0 3px; + border-radius: 50%; + transform: scale(0); + -ms-transform: scale(0); + -webkit-transform: scale(0); + animation: ball-load 1s ease-in-out infinite; + -webkit-animation: 1s ball-load ease-in-out infinite +} + +@-webkit-keyframes ball-load { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } + + 100% { + transform: scale(0); + -webkit-transform: scale(0) + } +} + +@keyframes ball-load { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } + + 100% { + transform: scale(0); + -webkit-transform: scale(0) + } +} + +@-webkit-keyframes close { + 0% { + opacity: 1; + /*display: block;*/ + } + + 100% { + opacity: 0; + /*display: none;*/ + } +} diff --git a/public/static/component/pear/css/module/iconPicker.css b/public/static/component/pear/css/module/iconPicker.css new file mode 100644 index 0000000..4b01696 --- /dev/null +++ b/public/static/component/pear/css/module/iconPicker.css @@ -0,0 +1,3 @@ +.layui-iconpicker .layui-anim{ + width: 300px!important; +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/label.css b/public/static/component/pear/css/module/label.css new file mode 100644 index 0000000..e69de29 diff --git a/public/static/component/pear/css/module/layer.css b/public/static/component/pear/css/module/layer.css new file mode 100644 index 0000000..afb8e4b --- /dev/null +++ b/public/static/component/pear/css/module/layer.css @@ -0,0 +1,4 @@ +.layui-layer-msg{ + border-color: transparent!important; + box-shadow: 2px 0 6px rgb(0 21 41 / 0.05)!important; +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/layout.css b/public/static/component/pear/css/module/layout.css new file mode 100644 index 0000000..beceeea --- /dev/null +++ b/public/static/component/pear/css/module/layout.css @@ -0,0 +1,1040 @@ +.pear-container { + margin: 10px; + background-color: whitesmoke; +} + +body::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +body::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +body::-webkit-scrollbar-track { + background: white; + border-radius: 2px; +} + +body::-webkit-scrollbar-thumb { + background: #E6E6E6; + border-radius: 2px; +} + +body::-webkit-scrollbar-thumb:hover { + background: #E6E6E6; +} + +body::-webkit-scrollbar-corner { + background: #f6f6f6; +} + +.mainBox::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +.mainBox::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +.mainBox::-webkit-scrollbar-track { + background: white; + border-radius: 2px; +} + +.mainBox::-webkit-scrollbar-thumb { + background: #E6E6E6; + border-radius: 2px; +} + +.mainBox::-webkit-scrollbar-thumb:hover { + background: #E6E6E6; +} + +.mainBox::-webkit-scrollbar-corner { + background: #f6f6f6; +} + +.mainBox { + width: 100%; + position: absolute; + top: 0px; + left: 0px; + bottom: 50px; + overflow: auto; +} + +.bottom { + width: 100%; + position: absolute; + bottom: 0px; + left: 0px; + height: 50px; + line-height: 50px; + background-color: #F8F8F8; + border-top: 1px solid #eee; +} + +.button-container { + position: absolute; + right: 15px; +} + +.main-container { + margin: 15px; +} + +.main-container .layui-form-item { + margin-bottom: 15px !important; + margin-top: 10px !important; +} + +.pear-row::before, +.pear-row::after { + content: ""; + display: table; + clear: both; +} + +.pear-col { + float: left; + min-height: 1px; +} + +.pear-row * { + box-sizing: border-box +} + +.pear-col-md1 { + width: 4.16%; +} + +.pear-col-md2 { + width: 8.33%; +} + +.pear-col-md3 { + width: 12.5%; +} + +.pear-col-md4 { + width: 16.66%; +} + +.pear-col-md5 { + width: 20.83%; +} + +.pear-col-md6 { + width: 25%; +} + +.pear-col-md7 { + width: 29.16%; +} + +.pear-col-md8 { + width: 33.33%; +} + +.pear-col-md9 { + width: 37.5%; +} + +.pear-col-md10 { + width: 41.66%; +} + +.pear-col-md11 { + width: 45.83%; +} + +.pear-col-md12 { + width: 50%; +} + +.pear-col-md13 { + width: 54.16%; +} + +.pear-col-md14 { + width: 58.33%; +} + +.pear-col-md15 { + width: 62.5%; +} + +.pear-col-md16 { + width: 66.66%; +} + +.pear-col-md17 { + width: 70.83%; +} + +.pear-col-md18 { + width: 75%; +} + +.pear-col-md19 { + width: 79.16%; +} + +.pear-col-md20 { + width: 83.33%; +} + +.pear-col-md21 { + width: 87.5%; +} + +.pear-col-md22 { + width: 91.66%; +} + +.pear-col-md23 { + width: 95.83%; +} + +.pear-col-md24 { + width: 100%; +} + +@media all and (min-width:993px) and (max-width:1199px) { + + .pear-col-md-offset1 { + margin-left: 4.16%; + } + + .pear-col-md-offset2 { + margin-left: 8.33%; + } + + .pear-col-md-offset3 { + margin-left: 12.5%; + } + + .pear-col-md-offset4 { + margin-left: 16.66%; + } + + .pear-col-md-offset5 { + margin-left: 20.83%; + } + + .pear-col-md-offset6 { + margin-left: 25%; + } + + .pear-col-md-offset7 { + margin-left: 29.16%; + } + + .pear-col-md-offset8 { + margin-left: 33.33%; + } + + .pear-col-md-offset9 { + margin-left: 37.5%; + } + + .pear-col-md-offset10 { + margin-left: 41.66%; + } + + .pear-col-md-offset11 { + margin-left: 45.83%; + } + + .pear-col-md-offset12 { + margin-left: 50%; + } + + .pear-col-md-offset13 { + margin-left: 54.16%; + } + + .pear-col-md-offset14 { + margin-left: 58.33%; + } + + .pear-col-md-offset15 { + margin-left: 62.5%; + } + + .pear-col-md-offset16 { + margin-left: 66.66%; + } + + .pear-col-md-offset17 { + margin-left: 70.83%; + } + + .pear-col-md-offset18 { + margin-left: 75%; + } + + .pear-col-md-offset19 { + margin-left: 79.16%; + } + + .pear-col-md-offset20 { + margin-left: 83.33%; + } + + .pear-col-md-offset21 { + margin-left: 87.5%; + } + + .pear-col-md-offset22 { + margin-left: 91.66%; + } + + .pear-col-md-offset23 { + margin-left: 95.83%; + } + + .pear-col-md-offset24 { + margin-left: 100%; + } +} + + +@media all and (max-width:768px) { + .pear-col-xs1 { + width: 4.16%; + } + + .pear-col-xs2 { + width: 8.33%; + } + + .pear-col-xs3 { + width: 12.5%; + } + + .pear-col-xs4 { + width: 16.66%; + } + + .pear-col-xs5 { + width: 20.83%; + } + + .pear-col-xs6 { + width: 25%; + } + + .pear-col-xs7 { + width: 29.16%; + } + + .pear-col-xs8 { + width: 33.33%; + } + + .pear-col-xs9 { + width: 37.5%; + } + + .pear-col-xs10 { + width: 41.66%; + } + + .pear-col-xs11 { + width: 45.83%; + } + + .pear-col-xs12 { + width: 50%; + } + + .pear-col-xs13 { + width: 54.16%; + } + + .pear-col-xs14 { + width: 58.33%; + } + + .pear-col-xs15 { + width: 62.5%; + } + + .pear-col-xs16 { + width: 66.66%; + } + + .pear-col-xs17 { + width: 70.83%; + } + + .pear-col-xs18 { + width: 75%; + } + + .pear-col-xs19 { + width: 79.16%; + } + + .pear-col-xs20 { + width: 83.33%; + } + + .pear-col-xs21 { + width: 87.5%; + } + + .pear-col-xs22 { + width: 91.66%; + } + + .pear-col-xs23 { + width: 95.83%; + } + + .pear-col-xs24 { + width: 100%; + } + + .pear-col-xs-offset1 { + margin-left: 4.16%; + } + + .pear-col-xs-offset2 { + margin-left: 8.33%; + } + + .pear-col-xs-offset3 { + margin-left: 12.5%; + } + + .pear-col-xs-offset4 { + margin-left: 16.66%; + } + + .pear-col-xs-offset5 { + margin-left: 20.83%; + } + + .pear-col-xs-offset6 { + margin-left: 25%; + } + + .pear-col-xs-offset7 { + margin-left: 29.16%; + } + + .pear-col-xs-offset8 { + margin-left: 33.33%; + } + + .pear-col-xs-offset9 { + margin-left: 37.5%; + } + + .pear-col-xs-offset10 { + margin-left: 41.66%; + } + + .pear-col-xs-offset11 { + margin-left: 45.83%; + } + + .pear-col-xs-offset12 { + margin-left: 50%; + } + + .pear-col-xs-offset13 { + margin-left: 54.16%; + } + + .pear-col-xs-offset14 { + margin-left: 58.33%; + } + + .pear-col-xs-offset15 { + margin-left: 62.5%; + } + + .pear-col-xs-offset16 { + margin-left: 66.66%; + } + + .pear-col-xs-offset17 { + margin-left: 70.83%; + } + + .pear-col-xs-offset18 { + margin-left: 75%; + } + + .pear-col-xs-offset19 { + margin-left: 79.16%; + } + + .pear-col-xs-offset20 { + margin-left: 83.33%; + } + + .pear-col-xs-offset21 { + margin-left: 87.5%; + } + + .pear-col-xs-offset22 { + margin-left: 91.66%; + } + + .pear-col-xs-offset23 { + margin-left: 95.83%; + } + + .pear-col-xs-offset24 { + margin-left: 100%; + } +} + +@media all and (min-width:768px) and (max-width:992px) { + .pear-col-sm1 { + width: 4.16%; + } + + .pear-col-sm2 { + width: 8.33%; + } + + .pear-col-sm3 { + width: 12.5%; + } + + .pear-col-sm4 { + width: 16.66%; + } + + .pear-col-sm5 { + width: 20.83%; + } + + .pear-col-sm6 { + width: 25%; + } + + .pear-col-sm7 { + width: 29.16%; + } + + .pear-col-sm8 { + width: 33.33%; + } + + .pear-col-sm9 { + width: 37.5%; + } + + .pear-col-sm10 { + width: 41.66%; + } + + .pear-col-sm11 { + width: 45.83%; + } + + .pear-col-sm12 { + width: 50%; + } + + .pear-col-sm13 { + width: 54.16%; + } + + .pear-col-sm14 { + width: 58.33%; + } + + .pear-col-sm15 { + width: 62.5%; + } + + .pear-col-sm16 { + width: 66.66%; + } + + .pear-col-sm17 { + width: 70.83%; + } + + .pear-col-sm18 { + width: 75%; + } + + .pear-col-sm19 { + width: 79.16%; + } + + .pear-col-sm20 { + width: 83.33%; + } + + .pear-col-sm21 { + width: 87.5%; + } + + .pear-col-sm22 { + width: 91.66%; + } + + .pear-col-sm23 { + width: 95.83%; + } + + .pear-col-sm24 { + width: 100%; + } + + .pear-col-sm-offset1 { + margin-left: 4.16%; + } + + .pear-col-sm-offset2 { + margin-left: 8.33%; + } + + .pear-col-sm-offset3 { + margin-left: 12.5%; + } + + .pear-col-sm-offset4 { + margin-left: 16.66%; + } + + .pear-col-sm-offset5 { + margin-left: 20.83%; + } + + .pear-col-sm-offset6 { + margin-left: 25%; + } + + .pear-col-sm-offset7 { + margin-left: 29.16%; + } + + .pear-col-sm-offset8 { + margin-left: 33.33%; + } + + .pear-col-sm-offset9 { + margin-left: 37.5%; + } + + .pear-col-sm-offset10 { + margin-left: 41.66%; + } + + .pear-col-sm-offset11 { + margin-left: 45.83%; + } + + .pear-col-sm-offset12 { + margin-left: 50%; + } + + .pear-col-sm-offset13 { + margin-left: 54.16%; + } + + .pear-col-sm-offset14 { + margin-left: 58.33%; + } + + .pear-col-sm-offset15 { + margin-left: 62.5%; + } + + .pear-col-sm-offset16 { + margin-left: 66.66%; + } + + .pear-col-sm-offset17 { + margin-left: 70.83%; + } + + .pear-col-sm-offset18 { + margin-left: 75%; + } + + .pear-col-sm-offset19 { + margin-left: 79.16%; + } + + .pear-col-sm-offset20 { + margin-left: 83.33%; + } + + .pear-col-sm-offset21 { + margin-left: 87.5%; + } + + .pear-col-sm-offset22 { + margin-left: 91.66%; + } + + .pear-col-sm-offset23 { + margin-left: 95.83%; + } + + .pear-col-sm-offset24 { + margin-left: 100%; + } +} + +@media all and (min-width:1200px) { + .pear-col-lg1 { + width: 4.16%; + } + + .pear-col-lg2 { + width: 8.33%; + } + + .pear-col-lg3 { + width: 12.5%; + } + + .pear-col-lg4 { + width: 16.66%; + } + + .pear-col-lg5 { + width: 20.83%; + } + + .pear-col-lg6 { + width: 25%; + } + + .pear-col-lg7 { + width: 29.16%; + } + + .pear-col-lg8 { + width: 33.33%; + } + + .pear-col-lg9 { + width: 37.5%; + } + + .pear-col-lg10 { + width: 41.66%; + } + + .pear-col-lg11 { + width: 45.83%; + } + + .pear-col-lg12 { + width: 50%; + } + + .pear-col-lg13 { + width: 54.16%; + } + + .pear-col-lg14 { + width: 58.33%; + } + + .pear-col-lg15 { + width: 62.5%; + } + + .pear-col-lg16 { + width: 66.66%; + } + + .pear-col-lg17 { + width: 70.83%; + } + + .pear-col-lg18 { + width: 75%; + } + + .pear-col-lg19 { + width: 79.16%; + } + + .pear-col-lg20 { + width: 83.33%; + } + + .pear-col-lg21 { + width: 87.5%; + } + + .pear-col-lg22 { + width: 91.66%; + } + + .pear-col-lg23 { + width: 95.83%; + } + + .pear-col-lg24 { + width: 100%; + } + + .pear-col-lg-offset1 { + margin-left: 4.16%; + } + + .pear-col-lg-offset2 { + margin-left: 8.33%; + } + + .pear-col-lg-offset3 { + margin-left: 12.5%; + } + + .pear-col-lg-offset4 { + margin-left: 16.66%; + } + + .pear-col-lg-offset5 { + margin-left: 20.83%; + } + + .pear-col-lg-offset6 { + margin-left: 25%; + } + + .pear-col-lg-offset7 { + margin-left: 29.16%; + } + + .pear-col-lg-offset8 { + margin-left: 33.33%; + } + + .pear-col-lg-offset9 { + margin-left: 37.5%; + } + + .pear-col-lg-offset10 { + margin-left: 41.66%; + } + + .pear-col-lg-offset11 { + margin-left: 45.83%; + } + + .pear-col-lg-offset12 { + margin-left: 50%; + } + + .pear-col-lg-offset13 { + margin-left: 54.16%; + } + + .pear-col-lg-offset14 { + margin-left: 58.33%; + } + + .pear-col-lg-offset15 { + margin-left: 62.5%; + } + + .pear-col-lg-offset16 { + margin-left: 66.66%; + } + + .pear-col-lg-offset17 { + margin-left: 70.83%; + } + + .pear-col-lg-offset18 { + margin-left: 75%; + } + + .pear-col-lg-offset19 { + margin-left: 79.16%; + } + + .pear-col-lg-offset20 { + margin-left: 83.33%; + } + + .pear-col-lg-offset21 { + margin-left: 87.5%; + } + + .pear-col-lg-offset22 { + margin-left: 91.66%; + } + + .pear-col-lg-offset23 { + margin-left: 95.83%; + } + + .pear-col-lg-offset24 { + margin-left: 100%; + } +} + +.pear-col-space1 { + margin: -.5px +} + +.pear-col-space1>* { + padding: .5px +} + +.pear-col-space2 { + margin: -1px +} + +.pear-col-space2>* { + padding: 1px +} + +.pear-col-space4 { + margin: -2px +} + +.pear-col-space4>* { + padding: 2px +} + +.pear-col-space5 { + margin: -2.5px +} + +.pear-col-space5>* { + padding: 2.5px +} + +.pear-col-space6 { + margin: -3px +} + +.pear-col-space6>* { + padding: 3px +} + +.pear-col-space8 { + margin: -4px +} + +.pear-col-space8>* { + padding: 4px +} + +.pear-col-space10 { + margin: -5px +} + +.pear-col-space10>* { + padding: 5px +} + +.pear-col-space12 { + margin: -6px +} + +.pear-col-space12>* { + padding: 6px +} + +.pear-col-space14 { + margin: -7px +} + +.pear-col-space14>* { + padding: 7px +} + +.pear-col-space15 { + margin: -7.5px +} + +.pear-col-space15>* { + padding: 7.5px +} + +.pear-col-space16 { + margin: -8px +} + +.pear-col-space16>* { + padding: 8px +} + +.pear-col-space18 { + margin: -9px +} + +.pear-col-space18>* { + padding: 9px +} + +.pear-col-space20 { + margin: -10px +} + +.pear-col-space20>* { + padding: 10px +} + +.pear-col-space22 { + margin: -11px +} + +.pear-col-space22>* { + padding: 11px +} + +.pear-col-space24 { + margin: -12px +} + +.pear-col-space24>* { + padding: 12px +} + +.pear-col-space25 { + margin: -12.5px +} + +.pear-col-space25>* { + padding: 12.5px +} + +.pear-col-space26 { + margin: -13px +} + +.pear-col-space26>* { + padding: 13px +} + +.pear-col-space28 { + margin: -14px +} + +.pear-col-space28>* { + padding: 14px +} + +.pear-col-space30 { + margin: -15px +} + +.pear-col-space30>* { + padding: 15px +} diff --git a/public/static/component/pear/css/module/link.css b/public/static/component/pear/css/module/link.css new file mode 100644 index 0000000..380351c --- /dev/null +++ b/public/static/component/pear/css/module/link.css @@ -0,0 +1,20 @@ +.pear-link{ + font-size: 15px!important; +} + +.pear-link.pear-link-primary{ + color : #5FB878 ; +} + +.pear-link.pear-link-success{ + color : #5FB878 ; +} + +.pear-link .pear-link-warming{ + + +} + +.pear-link .pear-link-danger{ + +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/loading.css b/public/static/component/pear/css/module/loading.css new file mode 100644 index 0000000..4abb57d --- /dev/null +++ b/public/static/component/pear/css/module/loading.css @@ -0,0 +1,987 @@ +/*! +* Notiflix ('https://www.notiflix.com') +* Version: 2.0.0 +* Author: Furkan MT ('https://github.com/furcan') +* Copyright 2020 Notiflix, MIT Licence ('https://opensource.org/licenses/MIT') +*/ + +/* Notiflix: Notify wrap on */ +[id^=NotiflixNotifyWrap] { +position: fixed; +z-index:4001; +opacity:1; +right: 10px; +top: 10px; +width: 280px; +max-width:96%; +box-sizing:border-box; +background: transparent;} + +[id^=NotiflixNotifyWrap] * { +box-sizing:border-box;} +/* Notiflix: Notify wrap off */ + +/* Notiflix: Notify content on */ +[id^=NotiflixNotifyWrap] > div { +-webkit-user-select: none; +-moz-user-select: none; +-ms-user-select: none; +user-select: none; +font-family: 'Quicksand', sans-serif; +width:100%; +display: inline-block; +position:relative; +margin:0 0 10px; +border-radius:5px; +background: #1e1e1e; +color: #fff; +padding: 10px 12px; +font-size: 14px; +line-height: 1.4;} + +[id^=NotiflixNotifyWrap] > div:last-child { +margin:0;} + +[id^=NotiflixNotifyWrap] > div.with-callback { +cursor:pointer;} + +[id^=NotiflixNotifyWrap] *::selection { +background:inherit;} + +[id^=NotiflixNotifyWrap] > div.with-icon { +padding: 8px;} + +[id^=NotiflixNotifyWrap] > div.click-to-close { +cursor: pointer;} + +[id^=NotiflixNotifyWrap] > div.with-close-button { +padding: 10px 30px 10px 12px;} +[id^=NotiflixNotifyWrap] > div.with-icon.with-close-button { +padding: 6px 30px 6px 6px;} + +[id^=NotiflixNotifyWrap] > div > span.the-message { +font-weight: 500; +font-family:inherit !important; +word-break: break-all; +word-break: break-word;} + +[id^=NotiflixNotifyWrap] > div > span.notify-close-button { +cursor:pointer; +transition:all .2s ease-in-out; +position: absolute; +right: 8px; +top: 0; +bottom:0; +margin:auto; +color:inherit; +width: 16px; +height: 16px;} +[id^=NotiflixNotifyWrap] > div > span.notify-close-button:hover { +transform:rotate(90deg);} +[id^=NotiflixNotifyWrap] > div > span.notify-close-button > svg { +position: absolute; +width: 16px; +height: 16px; +right: 0; +top: 0;} +/* Notiflix: Notify content off */ + +/* Notiflix: Notify icon on */ +[id^=NotiflixNotifyWrap] > div > .nmi { +position: absolute; +width: 40px; +height: 40px; +font-size: 30px; +line-height: 40px; +text-align: center; +left: 8px; +top: 0; +bottom: 0; +margin: auto; +border-radius: inherit;} + +[id^=NotiflixNotifyWrap] > div > .wfa.shadow { +color: inherit; +background: rgba(0, 0, 0, 0.15); +box-shadow: inset 0 0 34px rgba(0, 0, 0, 0.2); +text-shadow: 0 0 10px rgba(0, 0, 0, 0.3);} + +[id^=NotiflixNotifyWrap] > div > span.with-icon { +position: relative; +float: left; +width: calc(100% - 40px); +margin:0 0 0 40px; +padding:0 0 0 10px; +box-sizing: border-box;} +/* Notiflix: Notify icon off */ + +/* Notiflix: Notify rtl on */ +[id^=NotiflixNotifyWrap] > div.rtl-on > .nmi { +left:auto; +right:8px;} + +[id^=NotiflixNotifyWrap] > div.rtl-on > span.with-icon { +padding:0 10px 0 0; +margin:0 40px 0 0;} + +[id^=NotiflixNotifyWrap] > div.rtl-on > span.notify-close-button { +right: auto; +left: 8px;} + +[id^=NotiflixNotifyWrap] > div.with-icon.with-close-button.rtl-on { +padding: 6px 6px 6px 30px;} + +[id^=NotiflixNotifyWrap] > div.with-close-button.rtl-on { +padding: 10px 12px 10px 30px;} +/* Notiflix: Notify rtl off */ + +/* Notiflix: Notify animation => fade on */ +[id^=NotiflixNotifyOverlay].with-animation, +[id^=NotiflixNotifyWrap] > div.with-animation.nx-fade { +animation: notify-animation-fade .3s ease-in-out 0s normal; +-webkit-animation: notify-animation-fade .3s ease-in-out 0s normal;} + +@keyframes notify-animation-fade { +0% {opacity:0;} +100% {opacity:1;} +} + +@-webkit-keyframes notify-animation-fade { +0% {opacity:0;} +100% {opacity:1;} +} +/* Notiflix: Notify animation => fade off */ + +/* Notiflix: Notify animation => zoom on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-zoom { +animation: notify-animation-zoom .3s ease-in-out 0s normal; +-webkit-animation: notify-animation-zoom .3s ease-in-out 0s normal;} + +@keyframes notify-animation-zoom { +0% {transform:scale(0);} +50% {transform:scale(1.05);} +100% {transform:scale(1);} +} + +@-webkit-keyframes notify-animation-zoom { +0% {transform:scale(0);} +50% {transform:scale(1.05);} +100% {transform:scale(1);} +} +/* Notiflix: Notify animation => zoom off */ + +/* Notiflix: Notify animation => from right on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-from-right { +animation: notify-animation-from-right .3s ease-in-out 0s normal; +-webkit-animation: notify-animation-from-right .3s ease-in-out 0s normal;} + +@keyframes notify-animation-from-right { +0% {right:-300px; opacity:0;} +50% {right:8px; opacity:1;} +100% {right:0px; opacity:1;} +} + +@-webkit-keyframes notify-animation-from-right { +0% {right:-300px; opacity:0;} +50% {right:8px; opacity:1;} +100% {right:0px; opacity:1;} +} +/* Notiflix: Notify animation => from right off */ + +/* Notiflix: Notify animation => from left on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-from-left { +animation: notify-animation-from-left .3s ease-in-out 0s normal; +-webkit-animation: notify-animation-from-left .3s ease-in-out 0s normal;} + +@keyframes notify-animation-from-left { +0% {left:-300px; opacity:0;} +50% {left:8px; opacity:1;} +100% {left:0px; opacity:1;} +} + +@-webkit-keyframes notify-animation-from-left { +0% {left:-300px; opacity:0;} +50% {left:8px; opacity:1;} +100% {left:0px; opacity:1;} +} +/* Notiflix: Notify animation => from left off */ + +/* Notiflix: Notify animation => from top on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-from-top { +animation: notify-animation-from-top .3s ease-in-out 0s normal; +-webkit-animation: notify-animation-from-top .3s ease-in-out 0s normal;} + +@keyframes notify-animation-from-top { +0% {top:-50px; opacity:0;} +50% {top:8px; opacity:1;} +100% {top:0px; opacity:1;} +} + +@-webkit-keyframes notify-animation-from-top { +0% {top:-50px; opacity:0;} +50% {top:8px; opacity:1;} +100% {top:0px; opacity:1;} +} +/* Notiflix: Notify animation => from top off */ + +/* Notiflix: Notify animation => from bottom on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-from-bottom { +animation: notify-animation-from-bottom .3s ease-in-out 0s normal; +-webkit-animation: notify-animation-from-bottom .3s ease-in-out 0s normal;} + +@keyframes notify-animation-from-bottom { +0% {bottom:-50px; opacity:0;} +50% {bottom:8px; opacity:1;} +100% {bottom:0px; opacity:1;} +} + +@-webkit-keyframes notify-animation-from-bottom { +0% {bottom:-50px; opacity:0;} +50% {bottom:8px; opacity:1;} +100% {bottom:0px; opacity:1;} +} +/* Notiflix: Notify animation => from bottom off */ + +/* Notiflix: Notify animation remove => fade on */ +[id^=NotiflixNotifyOverlay].with-animation.remove, +[id^=NotiflixNotifyWrap] > div.with-animation.nx-fade.remove { +opacity:0; +animation: notify-remove-fade .3s ease-in-out 0s normal; +-webkit-animation: notify-remove-fade .3s ease-in-out 0s normal;} + +@keyframes notify-remove-fade { +0% {opacity:1;} +100% {opacity:0;} +} + +@-webkit-keyframes notify-remove-fade { +0% {opacity:1;} +100% {opacity:0;} +} +/* Notiflix: Notify animation remove => fade off */ + +/* Notiflix: Notify animation remove => zoom on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-zoom.remove { +transform:scale(0); +animation: notify-remove-zoom .3s ease-in-out 0s normal; +-webkit-animation: notify-remove-zoom .3s ease-in-out 0s normal;} + +@keyframes notify-remove-zoom { +0% {transform:scale(1);} +50% {transform:scale(1.05);} +100% {transform:scale(0);} +} + +@-webkit-keyframes notify-remove-zoom { +0% {transform:scale(1);} +50% {transform:scale(1.05);} +100% {transform:scale(0);} +} +/* Notiflix: Notify animation remove => zoom off */ + +/* Notiflix: Notify animation remove => from top on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-from-top.remove { +opacity:0; +animation: notify-remove-to-top .3s ease-in-out 0s normal; +-webkit-animation: notify-remove-to-top .3s ease-in-out 0s normal;} + +@keyframes notify-remove-to-top { +0% {top:0px; opacity:1;} +50% {top:8px; opacity:1;} +100% {top:-50px; opacity:0;} +} + +@-webkit-keyframes notify-remove-to-top { +0% {top:0px; opacity:1;} +50% {top:8px; opacity:1;} +100% {top:-50px; opacity:0;} +} +/* Notiflix: Notify animation remove => from top off */ + +/* Notiflix: Notify animation remove => from right on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-from-right.remove { +opacity:0; +animation: notify-remove-to-right .3s ease-in-out 0s normal; +-webkit-animation: notify-remove-to-right .3s ease-in-out 0s normal;} + +@keyframes notify-remove-to-right { +0% {right:0px; opacity:1;} +50% {right:8px; opacity:1;} +100% {right:-300px; opacity:0;} +} + +@-webkit-keyframes notify-remove-to-right { +0% {right:0px; opacity:1;} +50% {right:8px; opacity:1;} +100% {right:-300px; opacity:0;} +} +/* Notiflix: Notify animation remove => from right off */ + +/* Notiflix: Notify animation remove => from bottom on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-from-bottom.remove { +opacity:0; +animation: notify-remove-to-bottom .3s ease-in-out 0s normal; +-webkit-animation: notify-remove-to-bottom .3s ease-in-out 0s normal;} + +@keyframes notify-remove-to-bottom { +0% {bottom:0px; opacity:1;} +50% {bottom:8px; opacity:1;} +100% {bottom:-50px; opacity:0;} +} + +@-webkit-keyframes notify-remove-to-bottom { +0% {bottom:0px; opacity:1;} +50% {bottom:8px; opacity:1;} +100% {bottom:-50px; opacity:0;} +} +/* Notiflix: Notify animation remove => from bottom off */ + +/* Notiflix: Notify animation remove => from left on */ +[id^=NotiflixNotifyWrap] > div.with-animation.nx-from-left.remove { +opacity:0; +animation: notify-remove-to-left .3s ease-in-out 0s normal; +-webkit-animation: notify-remove-to-left .3s ease-in-out 0s normal;} + +@keyframes notify-remove-to-left { +0% {left:0px; opacity:1;} +50% {left:8px; opacity:1;} +100% {left:-300px; opacity:0;} +} + +@-webkit-keyframes notify-remove-to-left { +0% {left:0px; opacity:1;} +50% {left:8px; opacity:1;} +100% {left:-300px; opacity:0;} +} +/* Notiflix: Notify animation remove => from left off */ + + +/* Notiflix: Report wrap on */ +[id^=NotiflixReportWrap] { +position: fixed; +z-index:4002; +width: 320px; +max-width:96%; +box-sizing:border-box; +font-family: "Quicksand", sans-serif; +left: 0; +right: 0; +top: 20px; +color:#1e1e1e; +border-radius: 25px; +background: transparent; +margin: auto;} + +[id^=NotiflixReportWrap] * { +box-sizing:border-box;} +/* Notiflix: Report wrap off */ + +/* Notiflix: Report content on */ +[id^=NotiflixReportWrap] > div[class*="-overlay"] { +width:100%; +height:100%; +left:0; +top:0; +background: rgba(255, 255, 255, .5); +position:fixed; +z-index:0;} + +[id^=NotiflixReportWrap] > div[class*="-content"] { +width:100%; +float:left; +border-radius: inherit; +padding:10px; +filter: drop-shadow(0 0 5px rgba(0,0,0,.1)); +border: 1px solid rgba(0,0,0,.03); +background: #f8f8f8; +position:relative; +z-index:1;} + +[id^=NotiflixReportWrap] > div[class*="-content"] > div[class$="-icon"] { +-webkit-user-select: none; +-moz-user-select: none; +-ms-user-select: none; +user-select: none; +width:110px; +height:110px; +display:block; +margin:6px auto 12px;} + +[id^=NotiflixReportWrap] > div[class*="-content"] > div[class$="-icon"] svg { +min-width:100%; +max-width:100%; +height:auto;} + +[id^=NotiflixReportWrap] > * > h5 { +word-break: break-all; +word-break: break-word; +font-family:inherit !important; +font-size:16px; +font-weight:500; +line-height: 1.4; +margin: 0 0 10px; +padding: 0 0 10px; +border-bottom: 1px solid rgba(0, 0, 0, 0.1); +float: left; +width: 100%; +text-align: center;} + +[id^=NotiflixReportWrap] > * > p { +word-break: break-all; +word-break: break-word; +font-family:inherit !important; +font-size:13px; +line-height: 1.4; +float: left; +width: 100%; +padding:0 10px; +margin: 0 0 10px;} + +[id^=NotiflixReportWrap] a#NXReportButton { +word-break: break-all; +word-break: break-word; +-webkit-user-select: none; +-moz-user-select: none; +-ms-user-select: none; +user-select: none; +font-family:inherit !important; +transition:all .25s ease-in-out; +cursor:pointer; +float: right; +padding: 7px 17px; +background: #32c682; +font-size:14px; +line-height: 1.4; +font-weight: 500; +border-radius: inherit !important; +color: #fff;} + +[id^=NotiflixReportWrap] a#NXReportButton:hover { +box-shadow:inset 0 -60px 5px -5px rgba(0, 0, 0, 0.25);} + +[id^=NotiflixReportWrap].rtl-on a#NXReportButton { +float:left;} +/* Notiflix: Report content off */ + +/* Notiflix: Report overlay animation => fade on */ +[id^=NotiflixReportWrap] > div[class*="-overlay"].with-animation { +animation: report-overlay-animation .3s ease-in-out 0s normal; +-webkit-animation: report-overlay-animation .3s ease-in-out 0s normal;} + +@keyframes report-overlay-animation { +0% {opacity:0;} +100% {opacity:1;} +} + +@-webkit-keyframes report-overlay-animation { +0% {opacity:0;} +100% {opacity:1;} +} +/* Notiflix: Report overlay animation => fade off */ + +/* Notiflix: Report content animation => fade on */ +[id^=NotiflixReportWrap] > div[class*="-content"].with-animation.nx-fade { +animation: report-animation-fade .3s ease-in-out 0s normal; +-webkit-animation: report-animation-fade .3s ease-in-out 0s normal;} + +@keyframes report-animation-fade { +0% {opacity:0;} +100% {opacity:1;} +} + +@-webkit-keyframes report-animation-fade { +0% {opacity:0;} +100% {opacity:1;} +} +/* Notiflix: Report content animation => fade off */ + +/* Notiflix: Report content animation => zoom on */ +[id^=NotiflixReportWrap] > div[class*="-content"].with-animation.nx-zoom { +animation: report-animation-zoom .3s ease-in-out 0s normal; +-webkit-animation: report-animation-zoom .3s ease-in-out 0s normal;} + +@keyframes report-animation-zoom { +0% {opacity:0; transform:scale(0.5);} +50% {opacity:1; transform:scale(1.05);} +100% {opacity:1; transform:scale(1);} +} + +@-webkit-keyframes report-animation-zoom { +0% {opacity:0; transform:scale(0.5);} +50% {opacity:1; transform:scale(1.05);} +100% {opacity:1; transform:scale(1);} +} +/* Notiflix: Report content animation => zoom off */ + +/* Notiflix: Report overlay animation remove => fade on */ +[id^=NotiflixReportWrap].remove > div[class*="-overlay"].with-animation { +opacity:0; +animation: report-overlay-animation-remove .3s ease-in-out 0s normal; +-webkit-animation: report-overlay-animation-remove .3s ease-in-out 0s normal;} + +@keyframes report-overlay-animation-remove { +0% {opacity:1;} +100% {opacity:0;} +} + +@-webkit-keyframes report-overlay-animation-remove { +0% {opacity:1;} +100% {opacity:0;} +} +/* Notiflix: Report overlay animation remove => fade off */ + +/* Notiflix: Report content animation remove => fade on */ +[id^=NotiflixReportWrap].remove > div[class*="-content"].with-animation.nx-fade { +opacity:0; +animation: report-animation-fade-remove .3s ease-in-out 0s normal; +-webkit-animation: report-animation-fade-remove .3s ease-in-out 0s normal;} + +@keyframes report-animation-fade-remove { +0% {opacity:1;} +100% {opacity:0;} +} + +@-webkit-keyframes report-animation-fade-remove { +0% {opacity:1;} +100% {opacity:0;} +} +/* Notiflix: Report content animation remove => fade off */ + +/* Notiflix: Report content animation remove => zoom on */ +[id^=NotiflixReportWrap].remove > div[class*="-content"].with-animation.nx-zoom { +opacity:0; +animation: report-animation-zoom-remove .3s ease-in-out 0s normal; +-webkit-animation: report-animation-zoom-remove .3s ease-in-out 0s normal;} + +@keyframes report-animation-zoom-remove { +0% {opacity:1; transform:scale(1);} +50% {opacity:0.5; transform:scale(1.05);} +100% {opacity:0; transform:scale(0);} +} + +@-webkit-keyframes report-animation-zoom-remove { +0% {opacity:1; transform:scale(1);} +50% {opacity:0.5; transform:scale(1.05);} +100% {opacity:0; transform:scale(0);} +} +/* Notiflix: Report content animation remove => zoom off */ + + +/* Notiflix: Confirm wrap on */ +[id^=NotiflixConfirmWrap] { +position: fixed; +z-index: 4003; +width: 300px; +max-width:98%; +left: 10px; +right: 10px; +top: 10px; +margin:auto; +text-align: center; +box-sizing:border-box; +background:transparent; +font-family: "Quicksand", sans-serif;} + +[id^=NotiflixConfirmWrap] * { +box-sizing:border-box;} +/* Notiflix: Confirm wrap off */ + +/* Notiflix: Confirm content on */ +[id^=NotiflixConfirmWrap] > div[class*="-overlay"] { +width:100%; +height:100%; +left:0; +top:0; +background: rgba(255, 255, 255, .5); +position:fixed; +z-index:0;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] { +width:100%; +float:left; +border-radius: 25px; +padding:10px; +margin:0; +filter: drop-shadow(0 0 5px rgba(0,0,0,.1)); +background: #f8f8f8; +color:#1e1e1e; +position:relative; +z-index:1;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-head"] { +float:left; +width:100%;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-head"] > h5 { +float:left; +width:100%; +margin:0; +padding:0 0 10px; +border-bottom:1px solid rgba(0,0,0,0.1); +color: #32c682; +font-family:inherit !important; +font-size:16px; +line-height:1.4; +font-weight:500;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-head"] > p { +font-family:inherit !important; +margin: 15px 0 20px; +padding: 0 10px; +float:left; +width:100%; +font-size: 14px; +line-height: 1.4; +color: inherit;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-buttons"] { +-webkit-user-select: none; +-moz-user-select: none; +-ms-user-select: none; +user-select: none; +border-radius:inherit; +float:left; +width:100%;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-buttons"] > a { +cursor:pointer; +font-family:inherit !important; +transition:all .25s ease-in-out; +float: left; +width: 48%; +padding: 9px 5px; +border-radius:inherit !important; +font-weight: 500; +font-size: 15px; +line-height: 1.4; +color:#f8f8f8;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-buttons"] > a.confirm-button-ok { +margin:0 2% 0 0; +background:#32c682;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-buttons"] > a.confirm-button-cancel { +margin:0 0 0 2%; +background:#a9a9a9;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-buttons"] > a.full { +margin:0; +width:100%;} + +[id^=NotiflixConfirmWrap] > div[class*="-content"] > div[class*="-buttons"] > a:hover { +box-shadow:inset 0 -60px 5px -5px rgba(0, 0, 0, 0.25);} +/* Notiflix: Confirm content off */ + +/* Notiflix: Confirm rtl on */ +[id^=NotiflixConfirmWrap].rtl-on > div[class*="-content"] > div[class*="-buttons"], +[id^=NotiflixConfirmWrap].rtl-on > div[class*="-content"] > div[class*="-buttons"] > a { +transform:rotateY(180deg);} +/* Notiflix: Confirm rtl off */ + +/* Notiflix: Confirm overlay animation => fade on */ +[id^=NotiflixConfirmWrap] > div[class*="-overlay"].with-animation { +animation: confirm-overlay-animation .3s ease-in-out 0s normal; +-webkit-animation: confirm-overlay-animation .3s ease-in-out 0s normal;} + +@keyframes confirm-overlay-animation { +0% {opacity:0;} +100% {opacity:1;} +} + +@-webkit-keyframes confirm-overlay-animation { +0% {opacity:0;} +100% {opacity:1;} +} +/* Notiflix: Confirm overlay animation => fade off */ + +/* Notiflix: Confirm overlay animation remove => fade on */ +[id^=NotiflixConfirmWrap].remove > div[class*="-overlay"].with-animation { +opacity:0; +animation: confirm-overlay-animation-remove .3s ease-in-out 0s normal; +-webkit-animation: confirm-overlay-animation-remove .3s ease-in-out 0s normal;} + +@keyframes confirm-overlay-animation-remove { +0% {opacity:1;} +100% {opacity:0;} +} + +@-webkit-keyframes confirm-overlay-animation-remove { +0% {opacity:1;} +100% {opacity:0;} +} +/* Notiflix: Confirm overlay animation remove => fade off */ + +/* Notiflix: Confirm content animation => fade on */ +[id^=NotiflixConfirmWrap].with-animation.nx-fade > div[class*="-content"] { +animation: confirm-animation-fade .3s ease-in-out 0s normal; +-webkit-animation: confirm-animation-fade .3s ease-in-out 0s normal;} + +@keyframes confirm-animation-fade { +0% {opacity:0;} +100% {opacity:1;} +} + +@-webkit-keyframes confirm-animation-fade { +0% {opacity:0;} +100% {opacity:1;} +} +/* Notiflix: Confirm content animation => fade off */ + +/* Notiflix: Confirm content animation => zoom on */ +[id^=NotiflixConfirmWrap].with-animation.nx-zoom > div[class*="-content"] { +animation: confirm-animation-zoom .3s ease-in-out 0s normal; +-webkit-animation: confirm-animation-zoom .3s ease-in-out 0s normal;} + +@keyframes confirm-animation-zoom { +0% {opacity:0; transform:scale(0.5);} +50% {opacity:1; transform:scale(1.05);} +100% {opacity:1; transform:scale(1);} +} + +@-webkit-keyframes confirm-animation-zoom { +0% {opacity:0; transform:scale(0.5);} +50% {opacity:1; transform:scale(1.05);} +100% {opacity:1; transform:scale(1);} +} +/* Notiflix: Confirm content animation => zoom off */ + +/* Notiflix: Confirm content animation remove => fade on */ +[id^=NotiflixConfirmWrap].with-animation.nx-fade.remove > div[class*="-content"] { +opacity:0; +animation: confirm-animation-fade-remove .3s ease-in-out 0s normal; +-webkit-animation: confirm-animation-fade-remove .3s ease-in-out 0s normal;} + +@keyframes confirm-animation-fade-remove { +0% {opacity:1;} +100% {opacity:0;} +} + +@-webkit-keyframes confirm-animation-fade-remove { +0% {opacity:1;} +100% {opacity:0;} +} +/* Notiflix: Confirm content animation remove => fade off */ + +/* Notiflix: Confirm content animation remove => zoom on */ +[id^=NotiflixConfirmWrap].with-animation.nx-zoom.remove > div[class*="-content"] { +opacity:0; +animation: confirm-animation-zoom-remove .3s ease-in-out 0s normal; +-webkit-animation: confirm-animation-zoom-remove .3s ease-in-out 0s normal;} + +@keyframes confirm-animation-zoom-remove { +0% {opacity:1; transform:scale(1);} +50% {opacity:0.5; transform:scale(1.05);} +100% {opacity:0; transform:scale(0);} +} + +@-webkit-keyframes confirm-animation-zoom-remove { +0% {opacity:1; transform:scale(1);} +50% {opacity:0.5; transform:scale(1.05);} +100% {opacity:0; transform:scale(0);} +} +/* Notiflix: Confirm content animation remove => zoom off */ + + +/* Notiflix: Loading wrap on */ +[id^=NotiflixLoadingWrap] { +-webkit-user-select: none; +-moz-user-select: none; +-ms-user-select: none; +user-select: none; +position: fixed; +z-index: 4000; +width: 100%; +height: 100%; +left: 0; +top: 0; +right:0; +bottom:0; +margin:auto; +text-align: center; +box-sizing:border-box; +background: white!important; +font-family: "Quicksand", sans-serif;} + +[id^=NotiflixLoadingWrap] * { +box-sizing:border-box;} + +[id^=NotiflixLoadingWrap].click-to-close { +cursor:pointer;} +/* Notiflix: Loading wrap off */ + +/* Notiflix: Loading content on */ +[id^=NotiflixLoadingWrap] > div[class*="-icon"] { +width:60px; +height:60px; +position:fixed; +background-color: white!important; +transition:top .2s ease-in-out; +left: 0; +top: 0; +right:0; +bottom:0; +margin:auto;} + +[id^=NotiflixLoadingWrap] > div[class*="-icon"] img, +[id^=NotiflixLoadingWrap] > div[class*="-icon"] svg { +max-width:unset; +max-height:unset; +width: 100%; +height: 100%; +position:absolute; +left: 0; +top: 0;} + +[id^=NotiflixLoadingWrap] > div[class*="-icon"].with-message { +top:-42px;} + +[id^=NotiflixLoadingWrap] > p { +position: fixed; +left: 0; +right: 0; +top: 42px; +bottom: 0; +margin: auto; +font-family: inherit !important; +font-weight: 500; +line-height: 1.4; +padding: 0 10px; +width: 100%; +font-size:15px; +height: 18px;} +/* Notiflix: Loading content off */ + +/* Notiflix: Loading animation => fade on */ +[id^=NotiflixLoadingWrap].with-animation { +animation: loading-animation-fade .3s ease-in-out 0s normal; +-webkit-animation: loading-animation-fade .3s ease-in-out 0s normal;} + +@keyframes loading-animation-fade { +0% {opacity:0;} +100% {opacity:1;} +} + +@-webkit-keyframes loading-animation-fade { +0% {opacity:0;} +100% {opacity:1;} +} +/* Notiflix: Loading animation => fade off */ + +/* Notiflix: Loading animation remove => fade on */ +[id^=NotiflixLoadingWrap].with-animation.remove { +opacity:0; +animation: loading-animation-fade-remove .3s ease-in-out 0s normal; +-webkit-animation: loading-animation-fade-remove .3s ease-in-out 0s normal;} + +@keyframes loading-animation-fade-remove { +0% {opacity:1;} +100% {opacity:0;} +} + +@-webkit-keyframes loading-animation-fade-remove { +0% {opacity:1;} +100% {opacity:0;} +} +/* Notiflix: Loading animation remove => fade off */ + +/* Notiflix: Loading animation new message => fade on */ +[id^=NotiflixLoadingWrap] > p.new { +animation: loading-new-message-fade .3s ease-in-out 0s normal; +-webkit-animation: loading-new-message-fade .3s ease-in-out 0s normal;} + +@keyframes loading-new-message-fade { +0% {opacity:0;} +100% {opacity:1;} +} + +@-webkit-keyframes loading-new-message-fade { +0% {opacity:0;} +100% {opacity:1;} +} +/* Notiflix: Loading animation new message => fade off */ + + +/* Notiflix: Block wrap on */ +[id^=NotiflixBlockWrap] { +-webkit-user-select: none; +-moz-user-select: none; +-ms-user-select: none; +user-select: none; +box-sizing: border-box; +position: absolute; +z-index: 1000; +font-family: "Quicksand", sans-serif; +background: rgba(255, 255, 255, 0.9); +text-align: center; +animation-duration: 400ms; +width: 100%; +height: 100%; +left: 0; +top: 0; +border-radius: inherit;} + +[id^=NotiflixBlockWrap] * { +box-sizing: border-box;} +/* Notiflix: Block wrap off */ + +/* Notiflix: Block content on */ +[id^=NotiflixBlockWrap] > span[class*="-icon"] { +width: 45px; +height: 45px; +position: absolute; +left: 0; +top: 0; +right: 0; +bottom: 0; +margin: auto;} + +[id^=NotiflixBlockWrap] > span[class*="-message"] { +position: absolute; +left: 0; +right: 0; +top: 50px; +bottom: 0; +margin: auto; +font-family: inherit !important; +font-weight: 500; +font-size: 14px; +line-height: 1.4; +padding: 0 10px; +width: 100%; +height: 20px; +overflow: hidden;} +/* Notiflix: Block content off */ + +/* Notiflix: Block animation => fade on */ +[id^=NotiflixBlockWrap].with-animation { +animation: block-animation-fade .3s ease-in-out 0s normal; +-webkit-animation: block-animation-fade .3s ease-in-out 0s normal;} + +@keyframes block-animation-fade { +0% {opacity: 0;} +100% {opacity: 1;} +} + +@-webkit-keyframes block-animation-fade { +0% {opacity: 0;} +100% {opacity: 1;} +} +/* Notiflix: Block animation => fade off */ + +/* Notiflix: Block animation remove => fade on */ +[id^=NotiflixBlockWrap].with-animation.remove { +opacity: 0; +animation: block-animation-fade-remove .3s ease-in-out 0s normal; +-webkit-animation: block-animation-fade-remove .3s ease-in-out 0s normal;} + +@keyframes block-animation-fade-remove { +0% {opacity: 1;} +100% {opacity: 0;} +} + +@-webkit-keyframes block-animation-fade-remove { +0% {opacity: 1;} +100% {opacity: 0;} +} +/* Notiflix: Block animation remove => fade off */ + diff --git a/public/static/component/pear/css/module/menu.css b/public/static/component/pear/css/module/menu.css new file mode 100644 index 0000000..96e4638 --- /dev/null +++ b/public/static/component/pear/css/module/menu.css @@ -0,0 +1,246 @@ +.pear-nav-tree { + width: 230px; + border-radius: 0px; + background-color: #28333E; +} + +.pear-nav-tree .layui-nav-item>a { + height: 56px; + line-height: 56px; + padding-top: 0px; + padding-bottom: 0px; +} + +.pear-nav-tree .layui-nav-item dd a { + height: 48px; + line-height: 48px; +} + +.pear-nav-tree .layui-nav-item>a .layui-nav-more { + padding: 0px; +} + +.pear-side-scroll::-webkit-scrollbar { + width: 0px; + height: 0px; +} +.pear-side-scroll{ + width: 230px; +} + +.pear-nav-tree .layui-nav-child { + padding-top: 5px; + padding-bottom: 5px; +} + +.pear-nav-tree .layui-nav-child dd.layui-this, +.layui-nav-tree .layui-nav-child dd.layui-this a, +.layui-nav-tree .layui-this, +.layui-nav-tree .layui-this>a, +.layui-nav-tree .layui-this>a:hover { + background-color: #5FB878; +} + +.pear-nav-tree .toast { + font-size: 14px; + margin: 5px; + margin-right: 8px; + text-align: center; + height: 40px; + line-height: 40px; + color: lightgray; +} + + +.pear-nav-tree .layui-nav-item a i { + margin-right: 12px; +} + +.pear-nav-tree .layui-nav-item a span { + letter-spacing: 2px; + font-size: 13.5px; +} + +.pear-nav-tree .layui-nav-item a:hover { + background-color: transparent; +} + +.pear-nav-tree .layui-nav-more { + margin-right: 5px; +} + +.pear-nav-tree .layui-nav-bar { + display: none; +} + + + +/** 实 现 菜 单 隐 藏 */ +.pear-nav-mini { + overflow: hidden; +} + +.pear-nav-mini .layui-nav-item a span { + display: none; +} + +.pear-nav-mini .layui-nav-child { + display: none; +} + +.pear-nav-mini .layui-nav-more { + display: none !important; +} + +.pear-nav-control.pc a { + font-weight: 500; + font-size: 14px; +} + +.pear-nav-control.pc li{ + display: inline-block; +} + +.pear-nav-control.pc .layui-nav-bar { + top: 0px !important; +} + +.pear-nav-control.pc .layui-this * { + background-color: whitesmoke; +} +.pear-nav-control.pc *{ + color: darkslategray!important; +} +.pear-nav-control.pc .layui-nav-bar{ + display: none!important; +} + +.pear-nav-control .layui-nav-child{ + border: 1px solid whitesmoke; + border-radius: 6px; + width: 150px; +} + +/** 隐 藏 后 子 级 悬 浮 菜 单 */ +.pear-nav-tree .layui-nav-hover { + border-radius: 4px; + overflow: hidden; + background-color: #28333E; + display: block; + position: fixed; + min-width: 130px; + margin-left: 62px; + padding-top: 4px !important; + padding-bottom: 4px !important; + box-shadow: 0px 0px 3px lightgray; +} +.pear-nav-tree .layui-nav-hover a span { + display: inline-block !important; +} +.pear-nav-tree .layui-nav-hover a i { + display: none; +} +.pear-nav-tree .layui-nav-child dd a span { + margin-left: 30px !important; +} +.pear-nav-tree .layui-nav-child dd a i { + display: none; +} +.pear-nav-tree .layui-nav-hover dd a span { + margin-left: 0px !important; +} +/** 亮 样 式*/ + +/** 亮 样 式*/ + +.dark-theme .layui-nav-tree{ + background-color: #28333E!important; +} + +.light-theme{ + background-color: white!important; +} + +.light-theme .pear-nav-tree, +.light-theme .pear-nav-tree .layui-nav-child{ + background-color: white!important; +} + +.light-theme .pear-nav-tree a, +.light-theme .pear-nav-tree .layui-nav-more{ + color: dimgray!important; + border-top-color: dimgray; +} + +.light-theme .pear-nav-tree .layui-nav-itemed>a>.layui-nav-more{ + border-top-color: white!important; + border-bottom-color: dimgray!important; +} + +.light-theme .pear-nav-tree .layui-nav-child{ + padding-top: 0px; + padding-bottom: 0px; +} + +.light-theme .pear-nav-tree .layui-this a, +.light-theme .pear-nav-tree .layui-this{ + color: white!important; + background-color: #5FB878!important; + +} + +.light-theme .pear-nav-tree .layui-this a:hover{ + background-color: #5FB878!important; + +} + +.light-theme .pear-nav-tree .layui-nav-bar{ + display: none; + +} + +/** 下 拉 图 标 */ +.pear-nav-tree.arrow .layui-nav-more { + font-family: layui-icon !important; + font-size: 10px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow: hidden; + width: auto; + height: auto; + line-height: normal; + border: none; + top: 23px; + margin-right: 2px !important; + margin: 0; + padding: 0; + display: inline-block; + transition: all .2s; + -webkit-transition: all .2s; +} + +.pear-nav-tree.arrow .layui-nav-child .layui-nav-more { + top: 17px; +} + +.pear-nav-tree.arrow .layui-nav-more:before { + content: "\e61a"; +} + +.pear-nav-tree.arrow .layui-nav-itemed>a>.layui-nav-more { + transform: rotate(180deg); + -ms-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -o-transform: rotate(180deg); + width: 12px; + text-align: center; +} + +.pear-nav-tree.arrow .layui-nav-itemed>a>.layui-nav-more:before { + content: '\e61a'; + background-color: transparent; + display: inline-block; + vertical-align: middle; +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/message.css b/public/static/component/pear/css/module/message.css new file mode 100644 index 0000000..eefe70e --- /dev/null +++ b/public/static/component/pear/css/module/message.css @@ -0,0 +1,42 @@ +.pear-notice .layui-this { + color: #5FB878 !important; + font-weight: 500; +} + +.pear-notice li { + border-right: 1px solid whitesmoke; +} + +.pear-notice * { + color: dimgray !important; +} + +.pear-notice{ + width: 285px!important; +} + +.pear-notice span{ + margin-left: 20px; + font-size: 13px; +} + +.pear-notice img{ + margin-left: 8px; + width: 33px!important; + height: 33px!important; + border-radius: 50px; +} + +.pear-notice-item{ + height: 45px!important; + line-height: 45px!important; +} + +/** 滚动条样式 */ +.pear-notice *::-webkit-scrollbar{width:0px;height:0px;} +.pear-notice *::-webkit-scrollbar-track{background: white;border-radius:2px;} +.pear-notice *::-webkit-scrollbar-thumb{background: #E6E6E6;border-radius:2px;} +.pear-notice *::-webkit-scrollbar-thumb:hover{background: #E6E6E6;} +.pear-notice *::-webkit-scrollbar-corner{background: #f6f6f6;} + + diff --git a/public/static/component/pear/css/module/notice.css b/public/static/component/pear/css/module/notice.css new file mode 100644 index 0000000..65c9fea --- /dev/null +++ b/public/static/component/pear/css/module/notice.css @@ -0,0 +1,228 @@ +.toast-title { + font-weight: bold; +} +.toast-message { + -ms-word-wrap: break-word; + word-wrap: break-word; +} +.toast-message a, +.toast-message label { + color: #FFFFFF; +} +.toast-message a:hover { + color: #CCCCCC; + text-decoration: none; +} +.toast-close-button { + position: relative; + right: -0.3em; + top: -0.3em; + float: right; + font-size: 20px; + font-weight: bold; + color: #FFFFFF; + -webkit-text-shadow: 0 1px 0 #ffffff; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.8; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + filter: alpha(opacity=80); + line-height: 1; +} +.toast-close-button:hover, +.toast-close-button:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); + filter: alpha(opacity=40); +} +.rtl .toast-close-button { + left: -0.3em; + float: left; + right: 0.3em; +} +/*Additional properties for button version + iOS requires the button element instead of an anchor tag. + If you want the anchor version, it requires `href="#"`.*/ +button.toast-close-button { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.toast-top-center { + top: 0; + right: 0; + width: 100%; +} +.toast-bottom-center { + bottom: 0; + right: 0; + width: 100%; +} +.toast-top-full-width { + top: 0; + right: 0; + width: 100%; +} +.toast-bottom-full-width { + bottom: 0; + right: 0; + width: 100%; +} +.toast-top-left { + top: 12px; + left: 12px; +} +.toast-top-right { + top: 12px; + right: 12px; +} +.toast-bottom-right { + right: 12px; + bottom: 12px; +} +.toast-bottom-left { + bottom: 12px; + left: 12px; +} +#toast-container { + position: fixed; + z-index: 999999; + pointer-events: none; + /*overrides*/ +} +#toast-container * { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +#toast-container > div { + position: relative; + pointer-events: auto; + overflow: hidden; + margin: 0 0 6px; + padding: 15px 15px 15px 50px; + width: 300px; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; + background-position: 15px center; + background-repeat: no-repeat; + -moz-box-shadow: 0 0 12px #999999; + -webkit-box-shadow: 0 0 12px #999999; + box-shadow: 0 0 12px #999999; + color: #FFFFFF; + opacity: 0.8; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + filter: alpha(opacity=80); +} +#toast-container > div.rtl { + direction: rtl; + padding: 15px 50px 15px 15px; + background-position: right 15px center; +} +#toast-container > div:hover { + -moz-box-shadow: 0 0 12px #000000; + -webkit-box-shadow: 0 0 12px #000000; + box-shadow: 0 0 12px #000000; + opacity: 1; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + filter: alpha(opacity=100); + cursor: pointer; +} +#toast-container > .toast-info { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important; +} +#toast-container > .toast-error { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important; +} +#toast-container > .toast-success { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important; +} +#toast-container > .toast-warning { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important; +} +#toast-container.toast-top-center > div, +#toast-container.toast-bottom-center > div { + width: 300px; + margin-left: auto; + margin-right: auto; +} +#toast-container.toast-top-full-width > div, +#toast-container.toast-bottom-full-width > div { + width: 96%; + margin-left: auto; + margin-right: auto; +} +.toast { + background-color: #030303; +} +.toast-success { + background-color: #51A351; +} +.toast-error { + background-color: #BD362F; +} +.toast-info { + background-color: #2F96B4; +} +.toast-warning { + background-color: #F89406; +} +.toast-progress { + position: absolute; + left: 0; + bottom: 0; + height: 4px; + background-color: #000000; + opacity: 0.4; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); + filter: alpha(opacity=40); +} +/*Responsive Design*/ +@media all and (max-width: 240px) { + #toast-container > div { + padding: 8px 8px 8px 50px; + width: 11em; + } + #toast-container > div.rtl { + padding: 8px 50px 8px 8px; + } + #toast-container .toast-close-button { + right: -0.2em; + top: -0.2em; + } + #toast-container .rtl .toast-close-button { + left: -0.2em; + right: 0.2em; + } +} +@media all and (min-width: 241px) and (max-width: 480px) { + #toast-container > div { + padding: 8px 8px 8px 50px; + width: 18em; + } + #toast-container > div.rtl { + padding: 8px 50px 8px 8px; + } + #toast-container .toast-close-button { + right: -0.2em; + top: -0.2em; + } + #toast-container .rtl .toast-close-button { + left: -0.2em; + right: 0.2em; + } +} +@media all and (min-width: 481px) and (max-width: 768px) { + #toast-container > div { + padding: 15px 15px 15px 50px; + width: 25em; + } + #toast-container > div.rtl { + padding: 15px 50px 15px 15px; + } +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/select.css b/public/static/component/pear/css/module/select.css new file mode 100644 index 0000000..d301327 --- /dev/null +++ b/public/static/component/pear/css/module/select.css @@ -0,0 +1,827 @@ +/* formSelects多选css */ +select[xm-select] { + display: none !important; +} + +.xm-select-parent * { + margin: 0; + padding: 0; + font-family: "Helvetica Neue", Helvetica, "PingFang SC", 微软雅黑, Tahoma, Arial, sans-serif; + box-sizing: initial; +} + +.xm-select-parent { + text-align: left; +} + +.xm-select-parent select { + display: none; +} + +.xm-select-parent .xm-select-title { + position: relative; + min-height: 36px; +} + +.xm-select-parent .xm-input { + cursor: pointer; + border-radius: 2px; + border-width: 1px; + border-style: solid; + border-color: #E6E6E6; + display: block; + width: 100%; + box-sizing: border-box; + background-color: #FFF; + height: 36px; + line-height: 1.3; + padding-left: 10px; + outline: 0 +} + +.xm-select-parent .xm-select-sj { + display: inline-block; + width: 0; + height: 0; + border-style: dashed; + border-color: transparent; + overflow: hidden; + position: absolute; + right: 10px; + top: 50%; + margin-top: -3px; + cursor: pointer; + border-width: 6px; + border-top-color: #C2C2C2; + border-top-style: solid; + transition: all .3s; + -webkit-transition: all .3s +} + +.xm-select-parent .xm-form-selected .xm-select-sj { + margin-top: -9px; + transform: rotate(180deg) +} + +.xm-select-parent .xm-form-select dl { + display: none; + position: absolute; + left: 0; + top: 42px; + padding: 5px 0; + z-index: 999; + min-width: 100%; + border: 1px solid #d2d2d2; + max-height: 300px; + overflow-y: auto; + background-color: #fff; + border-radius: 2px; + box-shadow: 0 2px 4px rgba(0, 0, 0, .12); + box-sizing: border-box; + animation-fill-mode: both; + -webkit-animation-name: layui-upbit; + animation-name: layui-upbit; + -webkit-animation-duration: .3s; + animation-duration: .3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both +} + +@-webkit-keyframes layui-upbit { + from { + -webkit-transform: translate3d(0, 30px, 0); + opacity: .3 + } + + to { + -webkit-transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes layui-upbit { + from { + transform: translate3d(0, 30px, 0); + opacity: .3 + } + + to { + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +.xm-select-parent .xm-form-selected dl { + display: block +} + +.xm-select-parent .xm-form-select dl dd, +.xm-select-parent .xm-form-select dl dt { + padding: 0 10px; + line-height: 36px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.xm-select-parent .xm-form-select dl dd { + cursor: pointer; + height: 36px; +} + +.xm-select-parent .xm-form-select dl dd:hover { + background-color: #f2f2f2 +} + +.xm-select-parent .xm-form-select dl dt { + font-size: 12px; + color: #999 +} + +.layui-select-disabled .xm-dis-disabled { + border-color: #eee !important +} + +.xm-select-parent .xm-form-select dl .xm-select-tips { + padding-left: 10px !important; + color: #999; + font-size: 14px +} + +.xm-unselect { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none +} + +.xm-form-checkbox { + position: relative; + display: block; + vertical-align: middle; + cursor: pointer; + font-size: 0; + -webkit-transition: .1s linear; + transition: .1s linear; + box-sizing: border-box; + height: auto !important; + line-height: normal !important; + border: none !important; + margin-right: 0; + padding-right: 0; + background: 0 0; +} + +.xm-form-checkbox>i { + color: #FFF; + font-size: 16px; + width: 16px; + height: 16px; + position: absolute; + top: 9px; + border: 1px solid #5FB878; + border-radius: 3px; + z-index: 2; +} + +.xm-form-checkbox:hover>i { + border-color: #5FB878; +} + +.xm-form-checkbox>span { + display: block; + position: relative; + padding: 0 15px 0 30px; + height: 100%; + font-size: 14px; + border-radius: 2px 0 0 2px; + background-color: #d2d2d2; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + background: 0 0; + color: #666; + line-height: 36px; +} + +.xm-select-parent dl { + width: 100%; +} + +.xm-select-parent dl dd { + position: relative; +} + +.xm-select-parent dl dd>i:not(.icon-sousuo) { + position: absolute; + right: 10px; + top: 0; + color: #AAAAAA; +} + +.xm-select-parent dl dd.xm-select-this div i { + border: none; + color: #5FB878; + font-size: 18px; +} + +.xm-select-parent dl dd.xm-select-this div i:after { + content: '\e613'; +} + +.xm-select-parent dl dd.xm-dis-disabled div i { + border-color: #C2C2C2; +} + +.xm-select-parent dl dd.xm-dis-disabled.xm-select-this div i { + color: #C2C2C2; +} + +.xm-select-radio div.xm-form-checkbox>i { + border-radius: 20px; +} + +.xm-select-parent dl.xm-select-radio dd.xm-select-this div i:after { + content: '\e62b'; +} + +.xm-dis-disabled, +.xm-dis-disabled:hover { + cursor: not-allowed !important +} + +.xm-form-select dl dd.xm-dis-disabled { + background-color: #fff !important +} + +.xm-form-select dl dd.xm-dis-disabled span { + color: #C2C2C2 +} + +.xm-form-select dl dd.xm-dis-disabled .xm-icon-yes { + border-color: #C2C2C2 +} + +.xm-select-parent { + position: relative; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none +} + +.xm-select-parent .xm-select { + line-height: normal; + height: auto; + padding: 4px 10px 1px 10px; + overflow: hidden; + min-height: 36px; + left: 0; + z-index: 99; + position: absolute; + background: 0 0; + padding-right: 20px +} + +.xm-select-parent .xm-select:hover { + border-color: #C0C4CC +} + +.xm-select-parent .xm-select .xm-select-label { + display: inline-block; + margin: 0; + vertical-align: middle +} + +.xm-select-parent .xm-select-title div.xm-select-label>span { + position: relative; + padding: 2px 5px; + background-color: #5FB878; + border-radius: 2px; + color: #FFF; + display: inline-block; + line-height: 18px; + height: 18px; + margin: 2px 5px 2px 0; + cursor: initial; + user-select: none; + font-size: 14px; + padding-right: 25px; + -webkit-user-select: none; +} + +.xm-select-parent .xm-select-title div.xm-select-label>span i { + position: absolute; + margin-left: 8px; + font-size: 12px; + cursor: pointer; + line-height: 20px; +} + +.xm-select-parent .xm-select .xm-select-input { + border: none; + height: 28px; + background-color: transparent; + padding: 0; + vertical-align: middle; + display: inline-block; + width: 50px +} + +.xm-select-parent .xm-select--suffix input { + border: none +} + +.xm-form-selected .xm-select, +.xm-form-selected .xm-select:hover { + border-color: #67c23a !important +} + +.xm-select--suffix+div { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0 +} + +.xm-select-dis .xm-select--suffix+div { + z-index: 100; + cursor: no-drop !important; + opacity: .2; + background-color: #FFF; +} + +.xm-select-disabled, +.xm-select-disabled:hover { + color: #d2d2d2 !important; + cursor: not-allowed !important; + background-color: #fff +} + +.xm-select-none { + display: none; + margin: 5px 0; + text-align: center; +} + +.xm-select-none:hover { + background-color: #FFF !important +} + +.xm-select-empty { + display: block +} + +.xm-span-hide { + display: none !important; +} + +.layui-form-pane .xm-select, +.layui-form-pane .xm-select:hover { + border: none !important; + top: 0px +} + +.layui-form-pane .xm-select-title { + border: 1px solid #e6e6e6 !important +} + +.xm-select-hide { + display: none !important; +} + +div[xm-hg] .xm-select-label { + white-space: nowrap; + overflow: hidden; + position: absolute; + right: 30px; + left: 0; + padding-left: 10px; +} + +/* 颜色相关 */ +div[xm-select-skin] .xm-select-title div.xm-select-label>span { + border: 1px solid #67c23a +} + +div[xm-select-skin] .xm-select-title div.xm-select-label>span i:hover { + opacity: .8; + filter: alpha(opacity=80); + cursor: pointer +} + +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span { + background-color: #F0F2F5; + color: #909399; + border: 1px solid #F0F2F5 +} + +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i { + color: #C0C4CC +} + +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i:before { + content: '\e60b'; + font-size: 16px; + margin-left: -3px; +} + +div[xm-select-skin=default] dl dd:not(.xm-dis-disabled) i { + border-color: #5FB878 +} + +div[xm-select-skin=default] dl dd.xm-select-this:not(.xm-dis-disabled) i { + color: #5FB878 +} + +div[xm-select-skin=default].xm-form-selected .xm-select, +div[xm-select-skin=default].xm-form-selected .xm-select:hover { + border-color: #C0C4CC!important +} + +div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span { + background-color: #5FB878!important + color: #FFF; + border: 1px solid #5FB878!important +} + +div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i { + background-color: #5FB878!important + color: #FFF +} + +div[xm-select-skin=primary] dl dd:not(.xm-dis-disabled) i { + border-color: #5FB878!important +} + +div[xm-select-skin=primary] dl dd.xm-select-this:not(.xm-dis-disabled) i { + color: #5FB878!important +} + +div[xm-select-skin=primary].xm-form-selected .xm-select, +div[xm-select-skin=primary].xm-form-selected .xm-select:hover { + border-color: #5FB878!important +} + +div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span { + background-color: #2D8CF0!important; + color: #FFF; + border: 1px solid #2D8CF0!important; +} + +div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i { + background-color: #2D8CF0!important; + color: #FFF +} + +div[xm-select-skin=normal] dl dd:not(.xm-dis-disabled) i { + border-color: #2D8CF0!important; +} + +div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i { + color:#2D8CF0 !important; +} + +div[xm-select-skin=normal].xm-form-selected .xm-select, +div[xm-select-skin=normal].xm-form-selected .xm-select:hover { + border-color:#2D8CF0!important; +} + +div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span { + background-color: #e6a23c!important; + color: #FFF; + border: 1px solid #e6a23c!important; +} + +div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span i { + background-color: #e6a23c!important; + color: #FFF +} + +div[xm-select-skin=warm] dl dd:not(.xm-dis-disabled) i { + border-color:#e6a23c!important +} + +div[xm-select-skin=warm] dl dd.xm-select-this:not(.xm-dis-disabled) i { + color:#e6a23c!important +} + +div[xm-select-skin=warm].xm-form-selected .xm-select, +div[xm-select-skin=warm].xm-form-selected .xm-select:hover { + border-color: #e6a23c!important +} + +div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span { + background-color: #f56c6c!important; + color: #FFF; + border: 1px solid #f56c6c!important; +} + +div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i { + background-color:#f56c6c!important + color: #FFF +} + +div[xm-select-skin=danger] dl dd:not(.xm-dis-disabled) i { + border-color: #f56c6c!important +} + +div[xm-select-skin=danger] dl dd.xm-select-this:not(.xm-dis-disabled) i { + color: #f56c6c!important +} + +div[xm-select-skin=danger].xm-form-selected .xm-select, +div[xm-select-skin=danger].xm-form-selected .xm-select:hover { + border-color: #f56c6c!important +} + + +/* 多选联动 */ +.xm-select-parent .layui-form-danger+.xm-select-title .xm-select { + border-color: #f56c6c!important +} + +.xm-select-linkage li { + padding: 10px 0px; + cursor: pointer; +} + +.xm-select-linkage li span { + padding-left: 20px; + padding-right: 30px; + display: inline-block; + height: 20px; + overflow: hidden; + text-overflow: ellipsis; +} + +.xm-select-linkage li.xm-select-this span { + border-left: 5px solid #009688; + color: #009688; + padding-left: 15px; +} + +.xm-select-linkage-group { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: auto; +} + +.xm-select-linkage-group li:hover { + border-left: 1px solid #009688; +} + +.xm-select-linkage-group li:hover span { + padding-left: 19px; +} + +.xm-select-linkage-group li.xm-select-this:hover span { + padding-left: 15px; + border-left-width: 4px; +} + +.xm-select-linkage-group:nth-child(4n+1) { + background-color: #EFEFEF; + left: 0; +} + +.xm-select-linkage-group:nth-child(4n+1) li.xm-select-active { + background-color: #F5F5F5; +} + +.xm-select-linkage-group:nth-child(4n+2) { + background-color: #F5F5F5; + left: 100px; +} + +.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active { + background-color: #FAFAFA; +} + +.xm-select-linkage-group:nth-child(4n+3) { + background-color: #FAFAFA; + left: 200px; +} + +.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active { + background-color: #FFFFFF; +} + +.xm-select-linkage-group:nth-child(4n+4) { + background-color: #FFFFFF; + left: 300px; +} + +.xm-select-linkage-group:nth-child(4n+4) li.xm-select-active { + background-color: #EFEFEF; +} + +.xm-select-linkage li { + list-style: none; +} + +.xm-select-linkage-hide { + display: none; +} + +.xm-select-linkage-show { + display: block; +} + +div[xm-select-skin='default'] .xm-select-linkage li.xm-select-this span { + border-left-color: #5FB878; + color: #5FB878; +} + +div[xm-select-skin='default'] .xm-select-linkage-group li:hover { + border-left-color: #5FB878; +} + +div[xm-select-skin='primary'] .xm-select-linkage li.xm-select-this span { + border-left-color: #1E9FFF; + color: #1E9FFF; +} + +div[xm-select-skin='primary'] .xm-select-linkage-group li:hover { + border-left-color: #1E9FFF; +} + +div[xm-select-skin='normal'] .xm-select-linkage li.xm-select-this span { + border-left-color: #1E9FFF; + color: #1E9FFF; +} + +div[xm-select-skin='normal'] .xm-select-linkage-group li:hover { + border-left-color: #1E9FFF; +} + +div[xm-select-skin='warm'] .xm-select-linkage li.xm-select-this span { + border-left-color: #FFB800; + color: #FFB800; +} + +div[xm-select-skin='warm'] .xm-select-linkage-group li:hover { + border-left-color: #FFB800; +} + +div[xm-select-skin='danger'] .xm-select-linkage li.xm-select-this span { + border-left-color: #FF5722; + color: #FF5722; +} + +div[xm-select-skin='danger'] .xm-select-linkage-group li:hover { + border-left-color: #FF5722; +} + + +/* 快捷操作 */ +.xm-select-tips[style]:hover { + background-color: #FFF !important; +} + +.xm-select-parent dd>.xm-cz { + position: absolute; + top: 0px; + right: 10px; +} + +.xm-select-parent dd>.xm-cz-group { + margin-right: 30px; + border-right: 2px solid #ddd; + height: 16px; + margin-top: 10px; + line-height: 16px; + overflow: hidden; +} + +.xm-select-parent dd>.xm-cz-group .xm-cz { + display: inline-block; + margin-right: 30px; +} + +.xm-select-parent dd>.xm-cz-group .xm-cz i { + margin-right: 10px; +} + +.xm-select-parent dd>.xm-cz-group[show='name'] .xm-cz i { + display: none; +} + +.xm-select-parent dd>.xm-cz-group[show='icon'] .xm-cz span { + display: none; +} + +.xm-select-parent dd .xm-cz:hover { + color: #009688; +} + +div[xm-select-skin='default'] dd .xm-cz:hover { + color: #C0C4CC; +} + +div[xm-select-skin='primary'] dd .xm-cz:hover { + color: #009688; +} + +div[xm-select-skin='normal'] dd .xm-cz:hover { + color: #1E9FFF; +} + +div[xm-select-skin='warm'] dd .xm-cz:hover { + color: #FFB800; +} + +div[xm-select-skin='danger'] dd .xm-cz:hover { + color: #FF5722; +} + +.xm-select-tips .xm-input { + border: none; + border-bottom: 1px solid #E6E6E6; + padding-left: 27px; +} + +.xm-select-tips .icon-sousuo { + position: absolute; +} + +.xm-select-tips.xm-dl-input { + display: none; +} + +div[xm-select-search-type="1"] .xm-select-tips.xm-dl-input { + display: block; +} + +div[xm-select-search-type="1"] .xm-select .xm-select-input { + display: none !important; +} + +@font-face { + font-family: "xm-iconfont"; + src: url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.eot?t=1534240067831'); + /* IE9*/ + src: url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.eot?t=1534240067831#iefix') format('embedded-opentype'), + /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAsYAAsAAAAAEQwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8ukovY21hcAAAAYAAAACrAAACPBtV6wxnbHlmAAACLAAABnEAAAmMovtEvWhlYWQAAAigAAAAMQAAADYSctBCaGhlYQAACNQAAAAgAAAAJAgBA69obXR4AAAI9AAAABsAAAAwMCX//WxvY2EAAAkQAAAAGgAAABoN8gwubWF4cAAACSwAAAAeAAAAIAEiAM9uYW1lAAAJTAAAAUUAAAJtPlT+fXBvc3QAAAqUAAAAhAAAALJ1LunfeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWacwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMbwwZ27438AQw9zMcAQozAiSAwDk4AxmeJzlks0JwzAMhZ8bN/1xD4GU0h2Se26BbJMJOkkn6KmTPbJF8mT5UGg3qMRn0EPIRs8A9gAq0YsIhDcCLF5SQ9YrnLMe8VB9RSMlMjCxYcueIyfOy7CuAFHU7lP9iqApt5L3ksBJbzlgZ9PVkXDUvbWa6x8T/i0u+XyWKtmmHW0NDI55yeRok2DjaKdg65jX7Bzzm71jXnN08vzJkQvg7Ng/WAYH9Qb3wzM/AHicjVVvbFzFEd/Zfbv7/vn9uXf33vl8Pt/dO99BHOzEZ9/DKTImRS0KjUoLDUFCjtpCMGkT1D9qldQmhkiUSv2G1BBB1VYqilGREOIDViWEGzttqkpI/cAXqyL5gFRALVIF+VCJe9fZd+fEpR/o6d3s7G9mZ2dmZ3aJIKR3h0ZYmVgkIjGZJV8mDxECtenOTDOu1UU+hJoD+TCqzcNMk2V8O5OCbDVRPgZhEt4JCNTZ/4HA3+DfuWIxl8pcFFErG3K7oD7fvev8UaMUmEu259lrRjBsfs6cLhYbRfzSbSjGRVAkfQYihUXsyPkHTVyyZDNmXzSHg3Tl+aPKxpJFqbWGdtLl8w8iYDxuDTQIx7yc1YCdIx7Jk3HSwbwQwGBcyMKZVtG0ZCuJxjFJBb+foMSfhJaPOSr4FYgwSwqIx2MHJALtAdBi/7xcSMJL+fxmmBS2guD61tZm96X02mgcj0J1NAaIR9UMmhXIV24FuLUC71+r1AEmK1AYrQHUK/Tly/m8MrOZz2+FSf7jzc3NK9XR9F2lVq+gmRp0r+HK9B+VJmR263Rgd7ALwR/FOFfx/FeJS0YxQh9drakgMJhaBVizkwgqWxLD6eQ0Qo8f7p44fJziSH9x+PjLZUO+/jZ9+K35X37ljn/Rv+yW4Ziuf2nl4PfS5/LrP47OHTsFJULYjf369UZAEBmSqEOSJmG4Me6LeznA0BFkcDoJlGynVzmH2vY21DhPr25v9DjvbfTp2TXG1s5mlK0q4S7lT++6obbRox/s6CHF2LMEsHvoFfSFQIKnKQMZJVFCD6WH0p0PVvvcRx8uph8eUks0jOFNtskOkpDsJ18k9+NqVRg3qqMCSSerjyRuYUi1/vFH7YIqikGVcD+ehFl/pqPSPKZ6DG6mHisljFhBFvU/PoRkSNd/JHO6Ja5JOXcfwIGJbm/igBq/hn8Kfb57YbYUxyX4cwkLKH1u4gD9GVSL6USxCjjCO2p8VdcvH9XRYIQWqUblu3pR/v2BvXMAc3tTmJiDAQ895B9NL0C9BFdKqqRKczDX/Whg7O1irVbcqZ8/sbfYBOZwihC+6wSDzszUf+dF7rRO1O+fKaDO+nXOr6+vf8L5J44Qe4UvnlyRntwrxMoKzpFdeRJBNb9dGyiur1+nE59R+uwi9M1G395jb9KP0bcK2YM9nJB5cojcS75OFskxclzdc+pW699z8iYbtf14BGKf77ruZNyXKC0e50OEBI+V/Aug5Dex/9WjJfipuqnS00gfybjXbNe1f762tXmRPp3Bdl/l6g5JXyqXR0bK8J3PR+jvwYs8/GBnTM+kr8FX4ZknwC16XtG9iH9QfNn1vDHPe2GAj3ieV3XdF2+IPdeteh62Ra+HfQrsKWKSBtlHSOBgM7KkKQBLWnZoq1mVwotCLRGhOtSkMzMuqq2ml3SqUehdnZtynbtPLB88/Dy9dDrYVzoy/MTT6Svnlpd/AHueon5wpnGsEae/PZm+d3Jp6SSUTy7R3xw4f9/B5RN3O+5t3VNncjm6Cnt+uLx8DpedGj4yvD84HceNxTcG6ku4VPmZ9n6nNdj95BHyB3IJKxBPsKm6rpn4QopmqzlFm1MwqdxO5rPGnIc7aSfCGg1Vqyo6nUlQhnh7WiFhXzgGhVC4qjPRki9xdGCc4zXeSWb9BG1ktlqz2Q5Y7S2sIJfivkpVKCCDpyCWdbQzECj76qMVqvyJ/LxyI2rTv1bTC25lSM9xAUJ4Lc+U0wXTsKXDmaA8tHX+hvDt4Wa9IHLcMUBz9VwpL4xi2aGasAPPKNUbbmD/2jAtk0uXY4eJx8zRgj9iAnVNt5X+BL5vlHTOaiOmG7g6+7ZBNUOaefNXuJF3u25RjVvBLeW8E4wV7ZJBpbAXXGnqrwgupWVTAKqZjq5HbW44fMguNJhgwmw8oOk8GCqE8F3GhLB0uS/UDVt4lgjtqGxK/rpwuaDAqKHZNuWmJjVKuWUxbpg2B9DtoRdN3TKF9B0hw4p41C5i3CI9w4civP3aQLlmLMK3wpJpaI7BvmlhPtH3nPWCKQAdE2hK9zyuUeAm921qCA2kvqY8N1yDMq4beJlG+4XQqHDCQnqPlJIyyN579S4tIGcRv/82BbFfK9SgnVHkZzMeaSQjqR5/fP5XF2Chh+sW0g0gn27snqXv3/bsszsfJbCAIiTdjRTVCBL6jV0K5D8H/8xVAAAAeJxjYGRgYADi16c/vIvnt/nKwM3CAALXZxxzhtH///23YVFhbgZyORiYQKIAm34OJQAAAHicY2BkYGBu+N/AEMOi/P/f//8sKgxAERTAAwCmuAa3eJxjYWBgYAFhRiiNFf//z6L8/x+IDQAkCQRQAAAAAAAAjAEAATgBfgGaAiACbgMMA2AEhATGAAB4nGNgZGBg4GE4DMQgwATEXEDIwPAfzGcAAB2tAfIAAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nG2L3QqCQBCFZ9RWU7sOfAeh8IFi3N10EHYUG1p8+gSjqz44F+cPEjgo4T81Jphihic0mGOBZyyxwhovUCxKIe4ylthRuDqV+I22UcLQ6+QH4ubWdZZkU3m4o/0tUqtSvT33TPLits12fzc+zhRcvoquo0o281OLhcMw7Q+AD8sULE0=') format('woff'), + url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.ttf?t=1534240067831') format('truetype'), + /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.svg?t=1534240067831#iconfont') format('svg'); + /* iOS 4.1- */ +} + +.xm-iconfont { + font-family: "xm-iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-quanxuan:before { + content: "\e62c"; +} + +.icon-caidan:before { + content: "\e610"; +} + +.icon-fanxuan:before { + content: "\e837"; +} + +.icon-pifu:before { + content: "\e668"; +} + +.icon-qingkong:before { + content: "\e63e"; +} + +.icon-sousuo:before { + content: "\e600"; +} + +.icon-danx:before { + content: "\e62b"; +} + +.icon-duox:before { + content: "\e613"; +} + +.icon-close:before { + content: "\e601"; +} + +.icon-expand:before { + content: "\e641"; +} + +.xm-select-parent .xm-form-select dl{ + position: relative; + top: 5px!important; +} diff --git a/public/static/component/pear/css/module/step.css b/public/static/component/pear/css/module/step.css new file mode 100644 index 0000000..6394662 --- /dev/null +++ b/public/static/component/pear/css/module/step.css @@ -0,0 +1,88 @@ +.lay-step { + font-size: 0; + margin: 0 auto; + max-width: 100%; + width: 60%; + padding-left: 15%; + +} + +.step-item { + display: inline-block; + line-height: 35px; + position: relative; + font-size: 15px; + vertical-align: top; +} + +.step-item-tail { + width: 100%; + padding: 0 10px; + position: absolute; + left: 0; + top: 13px; +} + +.step-item-tail i { + display: inline-block; + width: 100%; + height: 3px; + margin-top: 4px; + vertical-align: top; + background: #5FB878; + position: relative; +} + +.step-item-tail .step-item-tail-done { + background: #5FB878; + height: 3px; + margin-top: 4px; +} + +.step-item-head { + position: relative; + display: inline-block; + height: 35px; + width: 35px; + text-align: center; + vertical-align: top; + color: #5FB878; + border: 3px solid #5FB878; + border-radius: 50%; + background: #ffffff; +} + +.step-item-head.step-item-head-active { + background: #5FB878; + color: #ffffff; +} + +.step-item-main { + display: block; + position: relative; + margin-left: -50%; + margin-right: 50%; + padding-left: 26px; + text-align: center; +} + +.step-item-main-title { + font-weight: bolder; + color: #555555; +} + +.step-item-main-desc { + color: #aaaaaa; +} + +.step-item-main-time { + color: #aaaaaa; +} + +.lay-step + [carousel-item]:before { + display: none; +} + +.lay-step + [carousel-item] > * { + background-color: transparent; +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/tab.css b/public/static/component/pear/css/module/tab.css new file mode 100644 index 0000000..3d5f5c5 --- /dev/null +++ b/public/static/component/pear/css/module/tab.css @@ -0,0 +1,309 @@ +.pear-tab { + margin: 0px; + overflow: hidden; + height: 100% !important; +} + +.pear-tab .layui-tab-content { + height: calc(100% - 42px) !important; +} + +.pear-tab .layui-tab-content .layui-tab-item { + height: 100%; +} + +.pear-tab-menu{ + box-shadow: 0 2px 8px #f0f1f2!important; + border: 1px solid whitesmoke!important; + border-radius: 4px!important; +} + +.pear-tab-menu .item{ + height: 20px; + padding-left: 18px; + padding-top: 7px; + padding-bottom: 7px; + color: #333; + font-size: 13.5px; + line-height: 20px; + cursor:pointer; +} +.pear-tab-menu .item:hover{ + background: #36b368; + color: white; +} + +.pear-tab .layui-tab-content { + padding: 0px; +} + +.pear-tab .layui-tab-title { + border: none; + border: 1px solid whitesmoke; + background-color: white; +} + +.pear-tab .layui-tab-title li { + border-right: 1px solid whitesmoke; + color: dimgray; + font-size: 13.5px; + line-height: 43px; +} + +.pear-tab .layui-tab-title .layui-tab-bar { + display: none; +} + +.pear-tab .layui-tab-title .layui-this:after { + display: none; +} + +.pear-tab .layui-tab-title .pear-tab-active { + display: inline-block; + background-color: lightgray; + width: 8px; + height: 8px; + border-radius: 30px; + margin-right: 12px; +} + +.pear-tab .layui-tab-title .layui-this .pear-tab-active { + background-color: #5FB878; +} + +.pear-tab .layui-tab-title .layui-tab-close:hover { + background-color: white; + line-height: 19px; + color: gray; +} + +.pear-tab .layui-tab-title .disable-close+.layui-tab-close { + display: none; +} + +.pear-tab .layui-tab-title .able-close+.layui-tab-close { + display: inline-block; +} + +.pear-tab .layui-tab-close{ + font-size: 13px; +} + +.pear-tab .layui-tab-control>li { + position: absolute; + top: 0px; + height: 40px; + line-height: 40px; + width: 40px; + text-align: center; + background-color: white; + border-top: whitesmoke 1px solid; + border-bottom: whitesmoke 1px solid; +} + +.pear-tab .layui-tab-prev { + left: 0px; + border-right: whitesmoke 1px solid; +} + +.pear-tab .layui-tab-next { + right: 40px; + border-left: 1px solid whitesmoke; +} + +.pear-tab .layui-tab-tool { + right: 0px; + border-left: 1px solid whitesmoke; +} + +.pear-tab .layui-tab-control .layui-tab-tool, +.pear-tab .layui-tab-control .layui-tab-prev, +.pear-tab .layui-tab-control .layui-tab-next { + display: none; +} + +.pear-tab.layui-tab-roll .layui-tab-control .layui-tab-prev, +.pear-tab.layui-tab-roll .layui-tab-control .layui-tab-next { + display: block; +} + +.pear-tab.layui-tab-roll .layui-tab-control .layui-tab-next { + right: 0px; + border-right: 1px solid whitesmoke; +} + +.pear-tab.layui-tab-roll .layui-tab-title { + padding-left: 40px; + padding-right: 40px; +} + +.pear-tab.layui-tab-tool .layui-tab-control .layui-tab-tool { + display: block; +} + +.pear-tab.layui-tab-tool .layui-tab-title { + padding-left: 0px; + padding-right: 40px; +} + +.pear-tab.layui-tab-rollTool .layui-tab-title { + padding-left: 40px; + padding-right: 80px; +} + +.pear-tab.layui-tab-rollTool .layui-tab-control .layui-tab-prev, +.pear-tab.layui-tab-rollTool .layui-tab-control .layui-tab-next, +.pear-tab.layui-tab-rollTool .layui-tab-control .layui-tab-tool { + display: block; +} + +.pear-tab .layui-tab-tool .layui-nav { + position: absolute; + height: 43px !important; + top: 0; + width: 100%; + height: 100%; + padding: 0; + background: 0 0; +} + +.pear-tab .layui-tab-tool .layui-nav-item { + height: 40px; +} + +.pear-tab .layui-tab-tool .layui-nav-bar { + display: none; +} + +.pear-tab .layui-tab-tool .layui-nav-child { + left: auto; + top: 45px; + right: 3px; + width: 120px; + border: 1px solid whitesmoke; +} + +.pear-tab .layui-tab-tool .layui-this a { + background-color: #009688; +} + +.pear-tab-loading { + position: absolute; + display: none; + width: 100%; + height: calc(100% - 42px); + top: 42px; + z-index: 19; + background-color: #fff +} + +.pear-tab-loading.close { + animation: close 1s; + -webkit-animation: close 1s; + animation-fill-mode: forwards; +} + +.ball-loader { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%) +} + +.ball-loader>span, +.signal-loader>span { + background-color: #4aca85 !important; + display: inline-block +} + +.ball-loader>span:nth-child(1), +.ball-loader.sm>span:nth-child(1), +.signal-loader>span:nth-child(1), +.signal-loader.sm>span:nth-child(1) { + -webkit-animation-delay: 0s; + animation-delay: 0s +} + +.ball-loader>span:nth-child(2), +.ball-loader.sm>span:nth-child(2), +.signal-loader>span:nth-child(2), +.signal-loader.sm>span:nth-child(2) { + -webkit-animation-delay: .1s; + animation-delay: .1s +} + +.ball-loader>span:nth-child(3), +.ball-loader.sm>span:nth-child(3), +.signal-loader>span:nth-child(3), +.signal-loader.sm>span:nth-child(3) { + -webkit-animation-delay: .15s; + animation-delay: .15s +} + +.ball-loader>span:nth-child(4), +.ball-loader.sm>span:nth-child(4), +.signal-loader>span:nth-child(4), +.signal-loader.sm>span:nth-child(4) { + -webkit-animation-delay: .2s; + animation-delay: .2s +} + +.ball-loader>span { + width: 20px; + height: 20px; + margin: 0 3px; + border-radius: 50%; + transform: scale(0); + -ms-transform: scale(0); + -webkit-transform: scale(0); + animation: ball-load 1s ease-in-out infinite; + -webkit-animation: 1s ball-load ease-in-out infinite +} + +@-webkit-keyframes ball-load { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } + + 100% { + transform: scale(0); + -webkit-transform: scale(0) + } +} + +@keyframes ball-load { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } + + 100% { + transform: scale(0); + -webkit-transform: scale(0) + } +} + +@-webkit-keyframes close { + 0% { + opacity: 1; + /*display: block;*/ + } + + 100% { + opacity: 0; + /*display: none;*/ + } +} diff --git a/public/static/component/pear/css/module/table.css b/public/static/component/pear/css/module/table.css new file mode 100644 index 0000000..330871d --- /dev/null +++ b/public/static/component/pear/css/module/table.css @@ -0,0 +1,96 @@ +.layui-table-tool-panel { + margin-top: 10px !important; +} + +.layui-table-tool { + background-color: white !important; + border-bottom: none !important; + padding-bottom: 10px !important; +} + +.layui-table-header, +.layui-table-header th { + background-color: white !important; +} + +.layui-table-view { + border: none !important; +} + +.layui-table-cell { + height: 34px !important; + line-height: 34px !important; +} + +.layui-table .layui-laypage .layui-laypage-curr .layui-laypage-em { + border-radius: 50px !important; + background-color: #5FB878 !important; +} + +.layui-table-view .layui-table{ + width: 100%; +} + +.layui-table tr { + height: 34px !important; + line-height: 34px !important; +} + +.layui-table-cell { + padding-top: 1px !important; +} + +.layui-table-box * { + font-size: 13px !important; +} + +.layui-table-page .layui-laypage input { + width: 40px; + height: 26.5px!important; +} + +.layui-table-box button { + font-size: 15px !important; +} + +.layui-table-page { + height: 45px !important; + padding-top: 10px !important; +} + +.layui-table-tool .layui-inline { + border-radius: 3px !important; + width: 30px !important; + height: 30px !important; + line-height: 20px !important; +} + +.layui-table-view .layui-table[lay-skin=line] { + border: none !important; +} +.layui-table-body::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +.layui-table-body::-webkit-scrollbar { + width: 6px; + height: 6px; +} +.layui-table-body::-webkit-scrollbar-track { + background: white; + border-radius: 2px; +} + +.layui-table-body::-webkit-scrollbar-thumb { + background: #E6E6E6; + border-radius: 2px; +} + +.layui-table-body::-webkit-scrollbar-thumb:hover { + background: #E6E6E6; +} + +.layui-table-body::-webkit-scrollbar-corner { + background: #f6f6f6; +} diff --git a/public/static/component/pear/css/module/tag.css b/public/static/component/pear/css/module/tag.css new file mode 100644 index 0000000..7c244bc --- /dev/null +++ b/public/static/component/pear/css/module/tag.css @@ -0,0 +1,85 @@ +.input-new-tag { + width: 90px; +} + +.input-new-tag input { + height: 100%!important; + border: none; + padding-left: 0px; +} + +.tag .layui-btn .tag-close:hover { + border-radius: 2px; + color: #fff; +} + +.tag .layui-btn .tag-close { + margin-left: 8px; + transition: all .2s; + -webkit-transition: all .2s; +} +.tag-item { + background-color: #5FB878; + color: white; + border: none; +} + +.tag-item:hover { + + color: white; + +} +.tag-item-normal { + background-color: #5FB878; + color: white; + border: none; +} + +.tag-item-warm { + background-color: #f6ad55; + color: white; + border: none; +} + +.tag-item-danger { + background-color: #f56c6c; + color: white; + border: none; +} + +.tag-item-dark { + background-color: #525252; + color: white; + border: none; +} + +.tag-item-primary { + background-color: white !important; + color: dimgray; + border: 1px solid dimgray; +} + +.tag-item-normal:hover { + + color: white !important; +} + +.tag-item-warm:hover { + + color: white; +} + +.tag-item-danger:hover { + + color: white; +} + +.tag-item-dark:hover { + + color: white; +} + +.tag-item-primary:hover { + color: dimgray; + border: 1px solid dimgray; +} \ No newline at end of file diff --git a/public/static/component/pear/css/module/topBar.css b/public/static/component/pear/css/module/topBar.css new file mode 100644 index 0000000..c3d5bec --- /dev/null +++ b/public/static/component/pear/css/module/topBar.css @@ -0,0 +1,5 @@ +.layui-fixbar li { + border-radius: 4px; + background-color: #5FB878; + color: white; +} diff --git a/public/static/component/pear/css/module/treetable.css b/public/static/component/pear/css/module/treetable.css new file mode 100644 index 0000000..da849b8 --- /dev/null +++ b/public/static/component/pear/css/module/treetable.css @@ -0,0 +1,25 @@ +.treeTable-icon i:last-child{ + display: none!important; +} + +.treeTable-empty{ + margin-left: -3px; +} +.treeTable-empty { + width: 20px; + display: inline-block; +} + +.treeTable-icon { + cursor: pointer; +} + +.treeTable-icon .layui-icon-triangle-d:before { + content: "\e623"; +} + +.treeTable-icon.open .layui-icon-triangle-d:before { + content: "\e625"; + background-color: transparent; +} + diff --git a/public/static/component/pear/css/module/uploads.css b/public/static/component/pear/css/module/uploads.css new file mode 100644 index 0000000..563450e --- /dev/null +++ b/public/static/component/pear/css/module/uploads.css @@ -0,0 +1,39 @@ +button.upload-image { + margin: 4px 5px; + vertical-align: top +} + +div.upload-image { + display: inline-block; + position: relative; + overflow: hidden +} + +div.upload-image span { + background-image: url('/static/admin/images/x.png'); + position: absolute; + right: 0; + height: 16px; + width: 16px; + cursor: pointer +} + +img.upload-image { + max-width: 380px; + max-height: 50px +} + +img.show-image { + max-height: 25px +} + +img.show-big-image { + width: 100%; + height: 100% +} + +img.photo { + max-width: 100%; + height: 100%; + cursor: pointer; +} \ No newline at end of file diff --git a/public/static/component/pear/css/pear.css b/public/static/component/pear/css/pear.css new file mode 100644 index 0000000..82e1b56 --- /dev/null +++ b/public/static/component/pear/css/pear.css @@ -0,0 +1,27 @@ +@import url("../../layui/css/layui.css"); +@import url("../font/iconfont.css"); + +@import url("module/dtree/font/dtreefont.css"); +@import url("module/dtree/dtree.css"); +@import url("module/iconPicker.css"); +@import url("module/treetable.css"); +@import url("module/message.css"); +@import url("module/cropper.css"); +@import url("module/loading.css"); +@import url("module/topBar.css"); +@import url("module/select.css"); +@import url("module/layout.css"); +@import url("module/notice.css"); +@import url("module/button.css"); +@import url("module/table.css"); +@import url("module/frame.css"); +@import url("module/layer.css"); +@import url("module/menu.css"); +@import url("module/form.css"); +@import url("module/link.css"); +@import url("module/code.css"); +@import url("module/step.css"); +@import url("module/card.css"); +@import url("module/tab.css"); +@import url("module/tag.css"); +@import url("module/uploads.css"); \ No newline at end of file diff --git a/public/static/component/pear/font/iconfont.css b/public/static/component/pear/font/iconfont.css new file mode 100644 index 0000000..5f6eb5f --- /dev/null +++ b/public/static/component/pear/font/iconfont.css @@ -0,0 +1,579 @@ +@font-face { + font-family: "pear-icon"; /* Project id 2654996 */ + src: url('iconfont.woff2?t=1625555217253') format('woff2'), + url('iconfont.woff?t=1625555217253') format('woff'), + url('iconfont.ttf?t=1625555217253') format('truetype'); +} + +.pear-icon { + font-family: "pear-icon" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.pear-icon-load:before { + content: "\e6f0"; +} + +.pear-icon-download:before { + content: "\e68d"; +} + +.pear-icon-electronics:before { + content: "\e68e"; +} + +.pear-icon-drag:before { + content: "\e68f"; +} + +.pear-icon-elipsis:before { + content: "\e690"; +} + +.pear-icon-export:before { + content: "\e691"; +} + +.pear-icon-explain:before { + content: "\e692"; +} + +.pear-icon-edit:before { + content: "\e693"; +} + +.pear-icon-eye-close:before { + content: "\e694"; +} + +.pear-icon-email:before { + content: "\e695"; +} + +.pear-icon-error:before { + content: "\e696"; +} + +.pear-icon-favorite:before { + content: "\e697"; +} + +.pear-icon-file-common:before { + content: "\e698"; +} + +.pear-icon-file-delete:before { + content: "\e699"; +} + +.pear-icon-file-add:before { + content: "\e69a"; +} + +.pear-icon-film:before { + content: "\e69b"; +} + +.pear-icon-fabulous:before { + content: "\e69c"; +} + +.pear-icon-file:before { + content: "\e69d"; +} + +.pear-icon-folder-close:before { + content: "\e69e"; +} + +.pear-icon-filter:before { + content: "\e69f"; +} + +.pear-icon-good:before { + content: "\e6a0"; +} + +.pear-icon-hide:before { + content: "\e6a1"; +} + +.pear-icon-home:before { + content: "\e6a2"; +} + +.pear-icon-history:before { + content: "\e6a3"; +} + +.pear-icon-file-open:before { + content: "\e6a4"; +} + +.pear-icon-forward:before { + content: "\e6a5"; +} + +.pear-icon-import:before { + content: "\e6a6"; +} + +.pear-icon-image-text:before { + content: "\e6a7"; +} + +.pear-icon-keyboard-26:before { + content: "\e6a8"; +} + +.pear-icon-keyboard-9:before { + content: "\e6a9"; +} + +.pear-icon-link:before { + content: "\e6aa"; +} + +.pear-icon-layout:before { + content: "\e6ab"; +} + +.pear-icon-fullscreen-shrink:before { + content: "\e6ac"; +} + +.pear-icon-layers:before { + content: "\e6ad"; +} + +.pear-icon-lock:before { + content: "\e6ae"; +} + +.pear-icon-fullscreen-expand:before { + content: "\e6af"; +} + +.pear-icon-map:before { + content: "\e6b0"; +} + +.pear-icon-meh:before { + content: "\e6b1"; +} + +.pear-icon-menu:before { + content: "\e6b2"; +} + +.pear-icon-loading:before { + content: "\e6b3"; +} + +.pear-icon-help:before { + content: "\e6b4"; +} + +.pear-icon-minus-circle:before { + content: "\e6b5"; +} + +.pear-icon-modular:before { + content: "\e6b6"; +} + +.pear-icon-notification:before { + content: "\e6b7"; +} + +.pear-icon-mic:before { + content: "\e6b8"; +} + +.pear-icon-more:before { + content: "\e6b9"; +} + +.pear-icon-pad:before { + content: "\e6ba"; +} + +.pear-icon-operation:before { + content: "\e6bb"; +} + +.pear-icon-play:before { + content: "\e6bc"; +} + +.pear-icon-print:before { + content: "\e6bd"; +} + +.pear-icon-mobile-phone:before { + content: "\e6be"; +} + +.pear-icon-minus:before { + content: "\e6bf"; +} + +.pear-icon-navigation:before { + content: "\e6c0"; +} + +.pear-icon-pdf:before { + content: "\e6c1"; +} + +.pear-icon-prompt:before { + content: "\e6c2"; +} + +.pear-icon-move:before { + content: "\e6c3"; +} + +.pear-icon-refresh:before { + content: "\e6c4"; +} + +.pear-icon-run-up:before { + content: "\e6c5"; +} + +.pear-icon-picture:before { + content: "\e6c6"; +} + +.pear-icon-run-in:before { + content: "\e6c7"; +} + +.pear-icon-pin:before { + content: "\e6c8"; +} + +.pear-icon-save:before { + content: "\e6c9"; +} + +.pear-icon-search:before { + content: "\e6ca"; +} + +.pear-icon-share:before { + content: "\e6cb"; +} + +.pear-icon-scanning:before { + content: "\e6cc"; +} + +.pear-icon-security:before { + content: "\e6cd"; +} + +.pear-icon-sign-out:before { + content: "\e6ce"; +} + +.pear-icon-select:before { + content: "\e6cf"; +} + +.pear-icon-stop:before { + content: "\e6d0"; +} + +.pear-icon-success:before { + content: "\e6d1"; +} + +.pear-icon-smile:before { + content: "\e6d2"; +} + +.pear-icon-switch:before { + content: "\e6d3"; +} + +.pear-icon-setting:before { + content: "\e6d4"; +} + +.pear-icon-survey:before { + content: "\e6d5"; +} + +.pear-icon-task:before { + content: "\e6d6"; +} + +.pear-icon-skip:before { + content: "\e6d7"; +} + +.pear-icon-text:before { + content: "\e6d8"; +} + +.pear-icon-time:before { + content: "\e6d9"; +} + +.pear-icon-telephone-out:before { + content: "\e6da"; +} + +.pear-icon-toggle-left:before { + content: "\e6db"; +} + +.pear-icon-toggle-right:before { + content: "\e6dc"; +} + +.pear-icon-telephone:before { + content: "\e6dd"; +} + +.pear-icon-top:before { + content: "\e6de"; +} + +.pear-icon-unlock:before { + content: "\e6df"; +} + +.pear-icon-user:before { + content: "\e6e0"; +} + +.pear-icon-upload:before { + content: "\e6e1"; +} + +.pear-icon-work:before { + content: "\e6e2"; +} + +.pear-icon-training:before { + content: "\e6e3"; +} + +.pear-icon-warning:before { + content: "\e6e4"; +} + +.pear-icon-zoom-in:before { + content: "\e6e5"; +} + +.pear-icon-zoom-out:before { + content: "\e6e6"; +} + +.pear-icon-add-bold:before { + content: "\e6e7"; +} + +.pear-icon-arrow-left-bold:before { + content: "\e6e8"; +} + +.pear-icon-arrow-up-bold:before { + content: "\e6e9"; +} + +.pear-icon-close-bold:before { + content: "\e6ea"; +} + +.pear-icon-arrow-down-bold:before { + content: "\e6eb"; +} + +.pear-icon-minus-bold:before { + content: "\e6ec"; +} + +.pear-icon-arrow-right-bold:before { + content: "\e6ed"; +} + +.pear-icon-select-bold:before { + content: "\e6ee"; +} + +.pear-icon-3column:before { + content: "\e663"; +} + +.pear-icon-column-4:before { + content: "\e664"; +} + +.pear-icon-add:before { + content: "\e665"; +} + +.pear-icon-add-circle:before { + content: "\e666"; +} + +.pear-icon-adjust:before { + content: "\e667"; +} + +.pear-icon-arrow-up-circle:before { + content: "\e668"; +} + +.pear-icon-arrow-right-circle:before { + content: "\e669"; +} + +.pear-icon-arrow-down:before { + content: "\e66a"; +} + +.pear-icon-ashbin:before { + content: "\e66b"; +} + +.pear-icon-arrow-right:before { + content: "\e66c"; +} + +.pear-icon-browse:before { + content: "\e66d"; +} + +.pear-icon-bottom:before { + content: "\e66e"; +} + +.pear-icon-back:before { + content: "\e66f"; +} + +.pear-icon-bad:before { + content: "\e670"; +} + +.pear-icon-arrow-double-left:before { + content: "\e671"; +} + +.pear-icon-arrow-left-circle:before { + content: "\e672"; +} + +.pear-icon-arrow-double-right:before { + content: "\e673"; +} + +.pear-icon-caps-lock:before { + content: "\e674"; +} + +.pear-icon-camera:before { + content: "\e675"; +} + +.pear-icon-chart-bar:before { + content: "\e676"; +} + +.pear-icon-attachment:before { + content: "\e677"; +} + +.pear-icon-code:before { + content: "\e678"; +} + +.pear-icon-close:before { + content: "\e679"; +} + +.pear-icon-check-item:before { + content: "\e67a"; +} + +.pear-icon-calendar:before { + content: "\e67b"; +} + +.pear-icon-comment:before { + content: "\e67c"; +} + +.pear-icon-column-vertical:before { + content: "\e67d"; +} + +.pear-icon-column-horizontal:before { + content: "\e67e"; +} + +.pear-icon-complete:before { + content: "\e67f"; +} + +.pear-icon-chart-pie:before { + content: "\e680"; +} + +.pear-icon-cry:before { + content: "\e681"; +} + +.pear-icon-customer-service:before { + content: "\e682"; +} + +.pear-icon-delete:before { + content: "\e683"; +} + +.pear-icon-direction-down:before { + content: "\e684"; +} + +.pear-icon-copy:before { + content: "\e685"; +} + +.pear-icon-cut:before { + content: "\e686"; +} + +.pear-icon-data-view:before { + content: "\e687"; +} + +.pear-icon-direction-down-circle:before { + content: "\e688"; +} + +.pear-icon-direction-right:before { + content: "\e689"; +} + +.pear-icon-direction-up:before { + content: "\e68a"; +} + +.pear-icon-discount:before { + content: "\e68b"; +} + +.pear-icon-direction-left:before { + content: "\e68c"; +} + diff --git a/public/static/component/pear/font/iconfont.js b/public/static/component/pear/font/iconfont.js new file mode 100644 index 0000000..4cc2abd --- /dev/null +++ b/public/static/component/pear/font/iconfont.js @@ -0,0 +1 @@ +!function(c){var h,l,o,a,s,p,t='',v=(v=document.getElementsByTagName("script"))[v.length-1].getAttribute("data-injectcss");if(v&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function i(){s||(s=!0,o())}h=function(){var c,h,l;(l=document.createElement("div")).innerHTML=t,t=null,(h=l.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",c=h,(l=document.body).firstChild?(h=l.firstChild).parentNode.insertBefore(c,h):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(l=function(){document.removeEventListener("DOMContentLoaded",l,!1),h()},document.addEventListener("DOMContentLoaded",l,!1)):document.attachEvent&&(o=h,a=c.document,s=!1,(p=function(){try{a.documentElement.doScroll("left")}catch(c){return void setTimeout(p,50)}i()})(),a.onreadystatechange=function(){"complete"==a.readyState&&(a.onreadystatechange=null,i())})}(window); \ No newline at end of file diff --git a/public/static/component/pear/font/iconfont.json b/public/static/component/pear/font/iconfont.json new file mode 100644 index 0000000..cb96655 --- /dev/null +++ b/public/static/component/pear/font/iconfont.json @@ -0,0 +1,996 @@ +{ + "id": "2654996", + "name": "pear-admin-layui", + "font_family": "pear-icon", + "css_prefix_text": "pear-icon-", + "description": "", + "glyphs": [ + { + "icon_id": "22697089", + "name": "加载", + "font_class": "load", + "unicode": "e6f0", + "unicode_decimal": 59120 + }, + { + "icon_id": "15838464", + "name": "download", + "font_class": "download", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "15838465", + "name": "electronics", + "font_class": "electronics", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "15838466", + "name": "drag", + "font_class": "drag", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "15838467", + "name": "elipsis", + "font_class": "elipsis", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "15838468", + "name": "export", + "font_class": "export", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "15838469", + "name": "explain", + "font_class": "explain", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "15838470", + "name": "edit", + "font_class": "edit", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "15838471", + "name": "eye-close", + "font_class": "eye-close", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "15838472", + "name": "email", + "font_class": "email", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "15838473", + "name": "error", + "font_class": "error", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "15838474", + "name": "favorite", + "font_class": "favorite", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "15838475", + "name": "file-common", + "font_class": "file-common", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "15838476", + "name": "file-delete", + "font_class": "file-delete", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "15838477", + "name": "file-add", + "font_class": "file-add", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "15838478", + "name": "film", + "font_class": "film", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "15838479", + "name": "fabulous", + "font_class": "fabulous", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "15838480", + "name": "file", + "font_class": "file", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "15838481", + "name": "folder-close", + "font_class": "folder-close", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "15838482", + "name": "filter", + "font_class": "filter", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "15838483", + "name": "good", + "font_class": "good", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "15838484", + "name": "hide", + "font_class": "hide", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "15838485", + "name": "home", + "font_class": "home", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "15838486", + "name": "history", + "font_class": "history", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "15838487", + "name": "file-open", + "font_class": "file-open", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "15838488", + "name": "forward", + "font_class": "forward", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "15838489", + "name": "import", + "font_class": "import", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "15838490", + "name": "image-text", + "font_class": "image-text", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "15838491", + "name": "keyboard-26", + "font_class": "keyboard-26", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "15838492", + "name": "keyboard-9", + "font_class": "keyboard-9", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "15838493", + "name": "link", + "font_class": "link", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "15838494", + "name": "layout", + "font_class": "layout", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "15838495", + "name": "fullscreen-shrink", + "font_class": "fullscreen-shrink", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "15838496", + "name": "layers", + "font_class": "layers", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "15838497", + "name": "lock", + "font_class": "lock", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "15838498", + "name": "fullscreen-expand", + "font_class": "fullscreen-expand", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "15838499", + "name": "map", + "font_class": "map", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "15838500", + "name": "meh", + "font_class": "meh", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "15838501", + "name": "menu", + "font_class": "menu", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "15838502", + "name": "loading", + "font_class": "loading", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "15838503", + "name": "help", + "font_class": "help", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "15838504", + "name": "minus-circle", + "font_class": "minus-circle", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "15838505", + "name": "modular", + "font_class": "modular", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "15838506", + "name": "notification", + "font_class": "notification", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "15838507", + "name": "mic", + "font_class": "mic", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "15838508", + "name": "more", + "font_class": "more", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "15838509", + "name": "pad", + "font_class": "pad", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "15838510", + "name": "operation", + "font_class": "operation", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "15838511", + "name": "play", + "font_class": "play", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "15838512", + "name": "print", + "font_class": "print", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "15838513", + "name": "mobile-phone", + "font_class": "mobile-phone", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "15838514", + "name": "minus", + "font_class": "minus", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "15838515", + "name": "navigation", + "font_class": "navigation", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "15838516", + "name": "pdf", + "font_class": "pdf", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "15838517", + "name": "prompt", + "font_class": "prompt", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "15838518", + "name": "move", + "font_class": "move", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "15838519", + "name": "refresh", + "font_class": "refresh", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "15838520", + "name": "run-up", + "font_class": "run-up", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "15838521", + "name": "picture", + "font_class": "picture", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "15838522", + "name": "run-in", + "font_class": "run-in", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "15838523", + "name": "pin", + "font_class": "pin", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "15838524", + "name": "save", + "font_class": "save", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "15838525", + "name": "search", + "font_class": "search", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "15838526", + "name": "share", + "font_class": "share", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "15838527", + "name": "scanning", + "font_class": "scanning", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "15838528", + "name": "security", + "font_class": "security", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "15838529", + "name": "sign-out", + "font_class": "sign-out", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "15838530", + "name": "select", + "font_class": "select", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "15838531", + "name": "stop", + "font_class": "stop", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "15838532", + "name": "success", + "font_class": "success", + "unicode": "e6d1", + "unicode_decimal": 59089 + }, + { + "icon_id": "15838533", + "name": "smile", + "font_class": "smile", + "unicode": "e6d2", + "unicode_decimal": 59090 + }, + { + "icon_id": "15838534", + "name": "switch", + "font_class": "switch", + "unicode": "e6d3", + "unicode_decimal": 59091 + }, + { + "icon_id": "15838535", + "name": "setting", + "font_class": "setting", + "unicode": "e6d4", + "unicode_decimal": 59092 + }, + { + "icon_id": "15838536", + "name": "survey", + "font_class": "survey", + "unicode": "e6d5", + "unicode_decimal": 59093 + }, + { + "icon_id": "15838537", + "name": "task", + "font_class": "task", + "unicode": "e6d6", + "unicode_decimal": 59094 + }, + { + "icon_id": "15838538", + "name": "skip", + "font_class": "skip", + "unicode": "e6d7", + "unicode_decimal": 59095 + }, + { + "icon_id": "15838539", + "name": "text", + "font_class": "text", + "unicode": "e6d8", + "unicode_decimal": 59096 + }, + { + "icon_id": "15838540", + "name": "time", + "font_class": "time", + "unicode": "e6d9", + "unicode_decimal": 59097 + }, + { + "icon_id": "15838541", + "name": "telephone-out", + "font_class": "telephone-out", + "unicode": "e6da", + "unicode_decimal": 59098 + }, + { + "icon_id": "15838542", + "name": "toggle-left", + "font_class": "toggle-left", + "unicode": "e6db", + "unicode_decimal": 59099 + }, + { + "icon_id": "15838543", + "name": "toggle-right", + "font_class": "toggle-right", + "unicode": "e6dc", + "unicode_decimal": 59100 + }, + { + "icon_id": "15838544", + "name": "telephone", + "font_class": "telephone", + "unicode": "e6dd", + "unicode_decimal": 59101 + }, + { + "icon_id": "15838545", + "name": "top", + "font_class": "top", + "unicode": "e6de", + "unicode_decimal": 59102 + }, + { + "icon_id": "15838546", + "name": "unlock", + "font_class": "unlock", + "unicode": "e6df", + "unicode_decimal": 59103 + }, + { + "icon_id": "15838547", + "name": "user", + "font_class": "user", + "unicode": "e6e0", + "unicode_decimal": 59104 + }, + { + "icon_id": "15838548", + "name": "upload", + "font_class": "upload", + "unicode": "e6e1", + "unicode_decimal": 59105 + }, + { + "icon_id": "15838549", + "name": "work", + "font_class": "work", + "unicode": "e6e2", + "unicode_decimal": 59106 + }, + { + "icon_id": "15838550", + "name": "training", + "font_class": "training", + "unicode": "e6e3", + "unicode_decimal": 59107 + }, + { + "icon_id": "15838551", + "name": "warning", + "font_class": "warning", + "unicode": "e6e4", + "unicode_decimal": 59108 + }, + { + "icon_id": "15838552", + "name": "zoom-in", + "font_class": "zoom-in", + "unicode": "e6e5", + "unicode_decimal": 59109 + }, + { + "icon_id": "15838554", + "name": "zoom-out", + "font_class": "zoom-out", + "unicode": "e6e6", + "unicode_decimal": 59110 + }, + { + "icon_id": "15838560", + "name": "add-bold", + "font_class": "add-bold", + "unicode": "e6e7", + "unicode_decimal": 59111 + }, + { + "icon_id": "15838561", + "name": "arrow-left-bold", + "font_class": "arrow-left-bold", + "unicode": "e6e8", + "unicode_decimal": 59112 + }, + { + "icon_id": "15838562", + "name": "arrow-up-bold", + "font_class": "arrow-up-bold", + "unicode": "e6e9", + "unicode_decimal": 59113 + }, + { + "icon_id": "15838563", + "name": "close-bold", + "font_class": "close-bold", + "unicode": "e6ea", + "unicode_decimal": 59114 + }, + { + "icon_id": "15838564", + "name": "arrow-down-bold", + "font_class": "arrow-down-bold", + "unicode": "e6eb", + "unicode_decimal": 59115 + }, + { + "icon_id": "15838565", + "name": "minus-bold", + "font_class": "minus-bold", + "unicode": "e6ec", + "unicode_decimal": 59116 + }, + { + "icon_id": "15838566", + "name": "arrow-right-bold", + "font_class": "arrow-right-bold", + "unicode": "e6ed", + "unicode_decimal": 59117 + }, + { + "icon_id": "15838567", + "name": "select-bold", + "font_class": "select-bold", + "unicode": "e6ee", + "unicode_decimal": 59118 + }, + { + "icon_id": "15838406", + "name": "column-3", + "font_class": "3column", + "unicode": "e663", + "unicode_decimal": 58979 + }, + { + "icon_id": "15838423", + "name": "column-4", + "font_class": "column-4", + "unicode": "e664", + "unicode_decimal": 58980 + }, + { + "icon_id": "15838424", + "name": "add", + "font_class": "add", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "15838425", + "name": "add-circle", + "font_class": "add-circle", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "15838426", + "name": "adjust", + "font_class": "adjust", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "15838427", + "name": "arrow-up-circle", + "font_class": "arrow-up-circle", + "unicode": "e668", + "unicode_decimal": 58984 + }, + { + "icon_id": "15838428", + "name": "arrow-right-circle", + "font_class": "arrow-right-circle", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "15838429", + "name": "arrow-down", + "font_class": "arrow-down", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "15838430", + "name": "ashbin", + "font_class": "ashbin", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "15838431", + "name": "arrow-right", + "font_class": "arrow-right", + "unicode": "e66c", + "unicode_decimal": 58988 + }, + { + "icon_id": "15838432", + "name": "browse", + "font_class": "browse", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "15838433", + "name": "bottom", + "font_class": "bottom", + "unicode": "e66e", + "unicode_decimal": 58990 + }, + { + "icon_id": "15838434", + "name": "back", + "font_class": "back", + "unicode": "e66f", + "unicode_decimal": 58991 + }, + { + "icon_id": "15838435", + "name": "bad", + "font_class": "bad", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "15838436", + "name": "arrow-double-left", + "font_class": "arrow-double-left", + "unicode": "e671", + "unicode_decimal": 58993 + }, + { + "icon_id": "15838437", + "name": "arrow-left-circle", + "font_class": "arrow-left-circle", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "15838438", + "name": "arrow-double-right", + "font_class": "arrow-double-right", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "15838439", + "name": "caps-lock", + "font_class": "caps-lock", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "15838440", + "name": "camera", + "font_class": "camera", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "15838441", + "name": "chart-bar", + "font_class": "chart-bar", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "15838442", + "name": "attachment", + "font_class": "attachment", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "15838443", + "name": "code", + "font_class": "code", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "15838444", + "name": "close", + "font_class": "close", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "15838445", + "name": "check-item", + "font_class": "check-item", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "15838446", + "name": "calendar", + "font_class": "calendar", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "15838447", + "name": "comment", + "font_class": "comment", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "15838448", + "name": "column-vertical", + "font_class": "column-vertical", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "15838449", + "name": "column-horizontal", + "font_class": "column-horizontal", + "unicode": "e67e", + "unicode_decimal": 59006 + }, + { + "icon_id": "15838450", + "name": "complete", + "font_class": "complete", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "15838451", + "name": "chart-pie", + "font_class": "chart-pie", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "15838452", + "name": "cry", + "font_class": "cry", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "15838453", + "name": "customer-service", + "font_class": "customer-service", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "15838454", + "name": "delete", + "font_class": "delete", + "unicode": "e683", + "unicode_decimal": 59011 + }, + { + "icon_id": "15838455", + "name": "direction-down", + "font_class": "direction-down", + "unicode": "e684", + "unicode_decimal": 59012 + }, + { + "icon_id": "15838456", + "name": "copy", + "font_class": "copy", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "15838457", + "name": "cut", + "font_class": "cut", + "unicode": "e686", + "unicode_decimal": 59014 + }, + { + "icon_id": "15838458", + "name": "data-view", + "font_class": "data-view", + "unicode": "e687", + "unicode_decimal": 59015 + }, + { + "icon_id": "15838459", + "name": "direction-down-circle", + "font_class": "direction-down-circle", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "15838460", + "name": "direction-right", + "font_class": "direction-right", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "15838461", + "name": "direction-up", + "font_class": "direction-up", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "15838462", + "name": "discount", + "font_class": "discount", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "15838463", + "name": "direction-left", + "font_class": "direction-left", + "unicode": "e68c", + "unicode_decimal": 59020 + } + ] +} diff --git a/public/static/component/pear/font/iconfont.ttf b/public/static/component/pear/font/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f40ab3acea096b8096b94762a26da9c9ca1baf99 GIT binary patch literal 33116 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 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/font/iconfont.woff b/public/static/component/pear/font/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..869e1a06606fb68a0e13c408d75919a343cc06f7 GIT binary patch literal 16624 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 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/font/iconfont.woff2 b/public/static/component/pear/font/iconfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4a3ea5e4eda162e70b54ba932a3950a45297c374 GIT binary patch literal 13564 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%0Dgn} z0$c1s0jtes`1JU-jDHCTEn-dkdKjL<{<3~Q1p!a~QU7fy2=hbGr-aKdJ+oSDL#_l7 z6yAxHXDCZx7@tQ)3fJFe#kVH786mKSApJe@Ds z+x_u;y+7Z&X}f+HCx|eij0>r>aa`|FcDzbRQ8m+bM#wT zbYwledJag2BI-|Hmn$P=P?!oKC3Eyk+RGn3 zb8n{QmLw;T3Vj#)8U-<{a59+_m@Eax%uQMD`F%U7Kw}d54U!zU=54)j3p;p+f4UaB z9~@ooPgl5ElL?+;YEKRWBYjhrl@cnG03oEna&Lnt6&#vDZb5@Z3_5RU?+1|@+-&(1BF zA)cNU%7l=CQjl@{jsWRfyRB~!#VhA>z_^B``^&W8Q96^KsM)>_nlw0X~iy`l>E%@cmIz?`gJ88uLA?*(? CFI#&6 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/admin.js b/public/static/component/pear/module/admin.js new file mode 100644 index 0000000..774a6df --- /dev/null +++ b/public/static/component/pear/module/admin.js @@ -0,0 +1,539 @@ +layui.define(['message', 'table', 'jquery', 'element', 'yaml', 'form', 'tab', 'menu', 'frame', 'theme', 'convert'], + function(exports) { + "use strict"; + + var $ = layui.jquery, + form = layui.form, + element = layui.element, + yaml = layui.yaml, + pearTab = layui.tab, + convert = layui.convert, + pearMenu = layui.menu, + pearFrame = layui.frame, + pearTheme = layui.theme, + message = layui.message; + + var bodyFrame; + var sideMenu; + var bodyTab; + var config; + var logout = function() {}; + var msgInstance; + + var body = $('body'); + + var pearAdmin = new function() { + + // 默认配置 + var configType = 'yml'; + var configPath = 'pear.config.yml'; + + this.setConfigPath = function(path) { + configPath = path; + } + + this.setConfigType = function(type) { + configType = type; + } + + this.setAvatar = function(url, username) { + var image = new Image(); + image.src = url || "admin/images/avatar.jpg"; + image.onload = function() { + $(".layui-nav-img").attr("src", convert.imageToBase64(image)); + } + $(".layui-nav-img").parent().append(username); + } + + this.render = function(initConfig) { + if (initConfig !== undefined) { + applyConfig(initConfig); + } else { + applyConfig(pearAdmin.readConfig()); + } + } + + this.readConfig = function() { + if (configType === "yml") { + return yaml.load(configPath); + } else { + var data; + $.ajax({ + url: configPath, + type: 'get', + dataType: 'json', + async: false, + success: function(result) { + data = result; + } + }) + return data; + } + } + + this.messageRender = function(option) { + var option = { + elem: '.message', + url: option.header.message, + height: '250px' + }; + msgInstance = message.render(option); + } + + this.logoRender = function(param) { + $(".layui-logo .logo").attr("src", param.logo.image); + $(".layui-logo .title").html(param.logo.title); + } + + this.menuRender = function(param) { + sideMenu = pearMenu.render({ + elem: 'sideMenu', + async: param.menu.async !== undefined ? param.menu.async : true, + theme: "dark-theme", + height: '100%', + method: param.menu.method, + control: param.menu.control ? 'control' : false, // control + controlWidth: param.menu.controlWidth, + defaultMenu: 0, + accordion: param.menu.accordion, + url: param.menu.data, + data: param.menu.data, //async为false时,传入菜单数组 + parseData: false, + change: function() { + compatible(); + }, + done: function() { + sideMenu.selectItem(param.menu.select); + pearAdmin.collaspe(param); + } + }); + } + + this.bodyRender = function(param) { + body.on("click", ".refresh", function() { + var refreshA = $(".refresh a"); + refreshA.removeClass("layui-icon-refresh-1"); + refreshA.addClass("layui-anim"); + refreshA.addClass("layui-anim-rotate"); + refreshA.addClass("layui-anim-loop"); + refreshA.addClass("layui-icon-loading"); + if (param.tab.muiltTab) bodyTab.refresh(400); + else bodyFrame.refresh(400); + setTimeout(function() { + refreshA.addClass("layui-icon-refresh-1"); + refreshA.removeClass("layui-anim"); + refreshA.removeClass("layui-anim-rotate"); + refreshA.removeClass("layui-anim-loop"); + refreshA.removeClass("layui-icon-loading"); + }, 600) + }) + if (param.tab.muiltTab) { + bodyTab = pearTab.render({ + elem: 'content', + roll: true, + tool: true, + width: '100%', + height: '100%', + session: param.tab.session, + index: 0, + tabMax: param.tab.tabMax, + closeEvent: function(id) { + sideMenu.selectItem(id); + }, + data: [{ + id: param.tab.index.id, + url: param.tab.index.href, + title: param.tab.index.title, + close: false + }], + success: function(id) { + if (param.tab.session) { + setTimeout(function() { + sideMenu.selectItem(id); + bodyTab.positionTab(); + }, 500) + } + } + }); + bodyTab.click(function(id) { + if (!param.tab.keepState) { + bodyTab.refresh(false); + } + bodyTab.positionTab(); + sideMenu.selectItem(id); + }) + + sideMenu.click(function(dom, data) { + bodyTab.addTabOnly({ + id: data.menuId, + title: data.menuTitle, + url: data.menuUrl, + icon: data.menuIcon, + close: true + }, 300); + + compatible(); + + }) + } else { + bodyFrame = pearFrame.render({ + elem: 'content', + title: param.tab.index.title, + url: param.tab.index.href, + width: '100%', + height: '100%' + }); + + sideMenu.click(function(dom, data) { + bodyFrame.changePage(data.menuUrl, data.menuPath, true); + compatible() + }) + } + } + + this.keepLoad = function(param) { + compatible() + setTimeout(function() { + $(".loader-main").fadeOut(200); + }, param.other.keepLoad) + } + + this.collaspe = function(param) { + if (param.menu.collaspe) { + if ($(window).width() >= 768) { + collaspe() + } + } + } + + this.themeRender = function(option) { + if (option.theme.allowCustom === false) { + $(".setting").remove(); + } + var colorId = localStorage.getItem("theme-color"); + var currentColor = getColorById(colorId); + localStorage.setItem("theme-color", currentColor.id); + localStorage.setItem("theme-color-context", currentColor.color); + pearTheme.changeTheme(window, option.other.autoHead); + var menu = localStorage.getItem("theme-menu"); + if (menu == null) { + menu = option.theme.defaultMenu; + } else { + if (option.theme.allowCustom === false) { + menu = option.theme.defaultMenu; + } + } + localStorage.setItem("theme-menu", menu); + this.menuSkin(menu); + } + + this.menuSkin = function(theme) { + var pearAdmin = $(".pear-admin"); + pearAdmin.removeClass("light-theme"); + pearAdmin.removeClass("dark-theme"); + pearAdmin.addClass(theme); + } + + this.logout = function(callback) { + logout = callback; + } + + this.message = function(callback) { + if (callback != null) { + msgInstance.click(callback); + } else { + msgInstance.click(messageTip); + } + } + + this.jump = function(id, title, url) { + if (config.tab.muiltTab) { + bodyTab.addTabOnly({ + id: id, + title: title, + url: url, + icon: null, + close: true + }, 300); + } else { + sideMenu.selectItem(id); + bodyFrame.changePage(url, title, true); + } + } + }; + + var messageTip = function(id, title, context, form) { + layer.open({ + type: 1, + title: '消息', //标题 + area: ['390px', '330px'], //宽高 + shade: 0.4, //遮罩透明度 + content: "
                      来源 :   " + + form + "
                      标题 :   " + title + + "
                      内容 :   " + context + "
                      ", //支持获取DOM元素 + btn: ['确认'], //按钮组 + scrollbar: false, //屏蔽浏览器滚动条 + yes: function(index) { //layer.msg('yes'); //点击确定回调 + layer.close(index); + showToast(); + } + }); + } + + function collaspe() { + sideMenu.collaspe(); + var admin = $(".pear-admin"); + var left = $(".layui-icon-spread-left") + var right = $(".layui-icon-shrink-right") + if (admin.is(".pear-mini")) { + left.addClass("layui-icon-shrink-right") + left.removeClass("layui-icon-spread-left") + admin.removeClass("pear-mini"); + } else { + right.addClass("layui-icon-spread-left") + right.removeClass("layui-icon-shrink-right") + admin.addClass("pear-mini"); + } + } + + body.on("click", ".logout", function() { + // 回调 + var result = logout(); + + if (result) { + // 清空缓存 + bodyTab.clear(); + } + }) + + body.on("click", ".collaspe,.pear-cover", function() { + collaspe(); + }); + + body.on("click", ".fullScreen", function() { + if ($(this).hasClass("layui-icon-screen-restore")) { + screenFun(2).then(function() { + $(".fullScreen").eq(0).removeClass("layui-icon-screen-restore"); + }); + } else { + screenFun(1).then(function() { + $(".fullScreen").eq(0).addClass("layui-icon-screen-restore"); + }); + } + }); + + body.on("click", '[user-menu-id]', function() { + if (config.tab.muiltTab) { + bodyTab.addTabOnly({ + id: $(this).attr("user-menu-id"), + title: $(this).attr("user-menu-title"), + url: $(this).attr("user-menu-url"), + icon: "", + close: true + }, 300); + } else { + bodyFrame.changePage($(this).attr("user-menu-url"), "", true); + } + }); + + body.on("click", ".setting", function() { + + var bgColorHtml = + '
                    • ' + + '' + + '
                      ' + + '
                      ' + + '
                      ' + + '
                    • '; + + bgColorHtml += + '
                    • ' + + '' + + '
                      ' + + '
                      ' + + '
                      ' + + '
                    • '; + + var html = + '
                      \n' + + '
                      整体风格
                      \n' + + '
                      \n' + + '
                        \n' + bgColorHtml + '
                      \n' + + '
                      \n' + + '
                      '; + + layer.open({ + type: 1, + offset: 'r', + area: ['320px', '100%'], + title: false, + shade: 0.1, + closeBtn: 0, + shadeClose: false, + anim: -1, + skin: 'layer-anim-right', + move: false, + content: html + buildColorHtml() + buildLinkHtml() + bottomTool(), + success: function(layero, index) { + + var color = localStorage.getItem("theme-color"); + var menu = localStorage.getItem("theme-menu"); + + if (color !== "null") { + $(".select-color-item").removeClass("layui-icon").removeClass("layui-icon-ok"); + $("*[color-id='" + color + "']").addClass("layui-icon").addClass("layui-icon-ok"); + } + if (menu !== "null") { + $("*[data-select-bgcolor]").removeClass("layui-this"); + $("[data-select-bgcolor='" + menu + "']").addClass("layui-this"); + } + $('#layui-layer-shade' + index).click(function() { + var $layero = $('#layui-layer' + index); + $layero.animate({ + left: $layero.offset().left + $layero.width() + }, 200, function() { + layer.close(index); + }); + }) + + $('#closeTheme').click(function() { + var $layero = $('#layui-layer' + index); + $layero.animate({ + left: $layero.offset().left + $layero.width() + }, 200, function() { + layer.close(index); + }); + }) + } + }); + }); + + function bottomTool() { + return "" + } + + body.on('click', '[data-select-bgcolor]', function() { + var theme = $(this).attr('data-select-bgcolor'); + $('[data-select-bgcolor]').removeClass("layui-this"); + $(this).addClass("layui-this"); + localStorage.setItem("theme-menu", theme); + pearAdmin.menuSkin(theme); + }); + + body.on('click', '.select-color-item', function() { + $(".select-color-item").removeClass("layui-icon").removeClass("layui-icon-ok"); + $(this).addClass("layui-icon").addClass("layui-icon-ok"); + var colorId = $(".select-color-item.layui-icon-ok").attr("color-id"); + var currentColor = getColorById(colorId); + localStorage.setItem("theme-color", currentColor.id); + localStorage.setItem("theme-color-context", currentColor.color); + pearTheme.changeTheme(window, config.other.autoHead); + }); + + function applyConfig(param) { + config = param; + pearAdmin.logoRender(param); + pearAdmin.menuRender(param); + pearAdmin.bodyRender(param); + pearAdmin.themeRender(param); + pearAdmin.keepLoad(param); + if (param.header.message != false) { + pearAdmin.messageRender(param); + } + } + + function getColorById(id) { + var color; + var flag = false; + $.each(config.colors, function(i, value) { + if (value.id === id) { + color = value; + flag = true; + } + }) + if (flag === false || config.theme.allowCustom === false) { + $.each(config.colors, function(i, value) { + if (value.id === config.theme.defaultColor) { + color = value; + } + }) + } + return color; + } + + function buildLinkHtml() { + var links = ""; + $.each(config.links, function(i, value) { + // value.target 存在,则为新窗口打开,增加 target="_blank" 属性 + links += '' + + ' ' + value.title + + '' + }) + return '
                      ' + links + '
                      '; + } + + function buildColorHtml() { + var colors = ""; + $.each(config.colors, function(i, value) { + colors += ""; + }) + return "
                      主题配色
                      " + + colors + "
                      " + } + + function compatible() { + if ($(window).width() <= 768) { + collaspe() + } + } + + function screenFun(num) { + num = num || 1; + num = num * 1; + var docElm = document.documentElement; + switch (num) { + case 1: + if (docElm.requestFullscreen) { + docElm.requestFullscreen(); + } else if (docElm.mozRequestFullScreen) { + docElm.mozRequestFullScreen(); + } else if (docElm.webkitRequestFullScreen) { + docElm.webkitRequestFullScreen(); + } else if (docElm.msRequestFullscreen) { + docElm.msRequestFullscreen(); + } + break; + case 2: + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitCancelFullScreen) { + document.webkitCancelFullScreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } + break; + } + return new Promise(function(res, rej) { + res("返回值"); + }); + } + + function isFullscreen() { + return document.fullscreenElement || + document.msFullscreenElement || + document.mozFullScreenElement || + document.webkitFullscreenElement || false; + } + + window.onresize = function() { + if (!isFullscreen()) { + $(".fullScreen").eq(0).removeClass("layui-icon-screen-restore"); + } + } + + exports('admin', pearAdmin); + }) diff --git a/public/static/component/pear/module/area.js b/public/static/component/pear/module/area.js new file mode 100644 index 0000000..604c91e --- /dev/null +++ b/public/static/component/pear/module/area.js @@ -0,0 +1,4070 @@ +layui.define(['layer', 'form', 'laytpl'], function (exports) { + "use strict"; + + let $ = layui.$ + , form = layui.form + , layarea = { + _id: 0 + , config: {} + , set: function (options) { + let that = this; + that.config = $.extend({}, that.config, options); + return that; + } + , on: function (events, callback) { + return layui.onevent.call(this, 'layarea', events, callback); + } + } + , thisArea = function () { + let that = this; + return { + layarea: function (files) { + that.layarea.call(that, files); + } + , config: that.config + , reload: that.reload + , events: that.events + } + } + , Class = function (options) { + let that = this; + that.config = $.extend({}, { + elem: '', + data: { + province: '', + city: '', + county: '', + provinceCode: 0, + cityCode: 0, + countyCode: 0, + } + }, options); + that.render(); + }; + + let areaList = { + province_list: { + 110000: '北京市', + 120000: '天津市', + 130000: '河北省', + 140000: '山西省', + 150000: '内蒙古自治区', + 210000: '辽宁省', + 220000: '吉林省', + 230000: '黑龙江省', + 310000: '上海市', + 320000: '江苏省', + 330000: '浙江省', + 340000: '安徽省', + 350000: '福建省', + 360000: '江西省', + 370000: '山东省', + 410000: '河南省', + 420000: '湖北省', + 430000: '湖南省', + 440000: '广东省', + 450000: '广西壮族自治区', + 460000: '海南省', + 500000: '重庆市', + 510000: '四川省', + 520000: '贵州省', + 530000: '云南省', + 540000: '西藏自治区', + 610000: '陕西省', + 620000: '甘肃省', + 630000: '青海省', + 640000: '宁夏回族自治区', + 650000: '新疆维吾尔自治区', + 710000: '台湾省', + 810000: '香港特别行政区', + 820000: '澳门特别行政区', + 900000: '海外' + }, + city_list: { + 110100: '北京市', + 120100: '天津市', + 130100: '石家庄市', + 130200: '唐山市', + 130300: '秦皇岛市', + 130400: '邯郸市', + 130500: '邢台市', + 130600: '保定市', + 130700: '张家口市', + 130800: '承德市', + 130900: '沧州市', + 131000: '廊坊市', + 131100: '衡水市', + 139000: '省直辖县', + 140100: '太原市', + 140200: '大同市', + 140300: '阳泉市', + 140400: '长治市', + 140500: '晋城市', + 140600: '朔州市', + 140700: '晋中市', + 140800: '运城市', + 140900: '忻州市', + 141000: '临汾市', + 141100: '吕梁市', + 150100: '呼和浩特市', + 150200: '包头市', + 150300: '乌海市', + 150400: '赤峰市', + 150500: '通辽市', + 150600: '鄂尔多斯市', + 150700: '呼伦贝尔市', + 150800: '巴彦淖尔市', + 150900: '乌兰察布市', + 152200: '兴安盟', + 152500: '锡林郭勒盟', + 152900: '阿拉善盟', + 210100: '沈阳市', + 210200: '大连市', + 210300: '鞍山市', + 210400: '抚顺市', + 210500: '本溪市', + 210600: '丹东市', + 210700: '锦州市', + 210800: '营口市', + 210900: '阜新市', + 211000: '辽阳市', + 211100: '盘锦市', + 211200: '铁岭市', + 211300: '朝阳市', + 211400: '葫芦岛市', + 220100: '长春市', + 220200: '吉林市', + 220300: '四平市', + 220400: '辽源市', + 220500: '通化市', + 220600: '白山市', + 220700: '松原市', + 220800: '白城市', + 222400: '延边朝鲜族自治州', + 230100: '哈尔滨市', + 230200: '齐齐哈尔市', + 230300: '鸡西市', + 230400: '鹤岗市', + 230500: '双鸭山市', + 230600: '大庆市', + 230700: '伊春市', + 230800: '佳木斯市', + 230900: '七台河市', + 231000: '牡丹江市', + 231100: '黑河市', + 231200: '绥化市', + 232700: '大兴安岭地区', + 310100: '上海市', + 320100: '南京市', + 320200: '无锡市', + 320300: '徐州市', + 320400: '常州市', + 320500: '苏州市', + 320600: '南通市', + 320700: '连云港市', + 320800: '淮安市', + 320900: '盐城市', + 321000: '扬州市', + 321100: '镇江市', + 321200: '泰州市', + 321300: '宿迁市', + 330100: '杭州市', + 330200: '宁波市', + 330300: '温州市', + 330400: '嘉兴市', + 330500: '湖州市', + 330600: '绍兴市', + 330700: '金华市', + 330800: '衢州市', + 330900: '舟山市', + 331000: '台州市', + 331100: '丽水市', + 340100: '合肥市', + 340200: '芜湖市', + 340300: '蚌埠市', + 340400: '淮南市', + 340500: '马鞍山市', + 340600: '淮北市', + 340700: '铜陵市', + 340800: '安庆市', + 341000: '黄山市', + 341100: '滁州市', + 341200: '阜阳市', + 341300: '宿州市', + 341500: '六安市', + 341600: '亳州市', + 341700: '池州市', + 341800: '宣城市', + 350100: '福州市', + 350200: '厦门市', + 350300: '莆田市', + 350400: '三明市', + 350500: '泉州市', + 350600: '漳州市', + 350700: '南平市', + 350800: '龙岩市', + 350900: '宁德市', + 360100: '南昌市', + 360200: '景德镇市', + 360300: '萍乡市', + 360400: '九江市', + 360500: '新余市', + 360600: '鹰潭市', + 360700: '赣州市', + 360800: '吉安市', + 360900: '宜春市', + 361000: '抚州市', + 361100: '上饶市', + 370100: '济南市', + 370200: '青岛市', + 370300: '淄博市', + 370400: '枣庄市', + 370500: '东营市', + 370600: '烟台市', + 370700: '潍坊市', + 370800: '济宁市', + 370900: '泰安市', + 371000: '威海市', + 371100: '日照市', + 371200: '莱芜市', + 371300: '临沂市', + 371400: '德州市', + 371500: '聊城市', + 371600: '滨州市', + 371700: '菏泽市', + 410100: '郑州市', + 410200: '开封市', + 410300: '洛阳市', + 410400: '平顶山市', + 410500: '安阳市', + 410600: '鹤壁市', + 410700: '新乡市', + 410800: '焦作市', + 410900: '濮阳市', + 411000: '许昌市', + 411100: '漯河市', + 411200: '三门峡市', + 411300: '南阳市', + 411400: '商丘市', + 411500: '信阳市', + 411600: '周口市', + 411700: '驻马店市', + 419000: '省直辖县', + 420100: '武汉市', + 420200: '黄石市', + 420300: '十堰市', + 420500: '宜昌市', + 420600: '襄阳市', + 420700: '鄂州市', + 420800: '荆门市', + 420900: '孝感市', + 421000: '荆州市', + 421100: '黄冈市', + 421200: '咸宁市', + 421300: '随州市', + 422800: '恩施土家族苗族自治州', + 429000: '省直辖县', + 430100: '长沙市', + 430200: '株洲市', + 430300: '湘潭市', + 430400: '衡阳市', + 430500: '邵阳市', + 430600: '岳阳市', + 430700: '常德市', + 430800: '张家界市', + 430900: '益阳市', + 431000: '郴州市', + 431100: '永州市', + 431200: '怀化市', + 431300: '娄底市', + 433100: '湘西土家族苗族自治州', + 440100: '广州市', + 440200: '韶关市', + 440300: '深圳市', + 440400: '珠海市', + 440500: '汕头市', + 440600: '佛山市', + 440700: '江门市', + 440800: '湛江市', + 440900: '茂名市', + 441200: '肇庆市', + 441300: '惠州市', + 441400: '梅州市', + 441500: '汕尾市', + 441600: '河源市', + 441700: '阳江市', + 441800: '清远市', + 441900: '东莞市', + 442000: '中山市', + 445100: '潮州市', + 445200: '揭阳市', + 445300: '云浮市', + 450100: '南宁市', + 450200: '柳州市', + 450300: '桂林市', + 450400: '梧州市', + 450500: '北海市', + 450600: '防城港市', + 450700: '钦州市', + 450800: '贵港市', + 450900: '玉林市', + 451000: '百色市', + 451100: '贺州市', + 451200: '河池市', + 451300: '来宾市', + 451400: '崇左市', + 460100: '海口市', + 460200: '三亚市', + 460300: '三沙市', + 460400: '儋州市', + 469000: '省直辖县', + 500100: '重庆市', + 500200: '县', + 510100: '成都市', + 510300: '自贡市', + 510400: '攀枝花市', + 510500: '泸州市', + 510600: '德阳市', + 510700: '绵阳市', + 510800: '广元市', + 510900: '遂宁市', + 511000: '内江市', + 511100: '乐山市', + 511300: '南充市', + 511400: '眉山市', + 511500: '宜宾市', + 511600: '广安市', + 511700: '达州市', + 511800: '雅安市', + 511900: '巴中市', + 512000: '资阳市', + 513200: '阿坝藏族羌族自治州', + 513300: '甘孜藏族自治州', + 513400: '凉山彝族自治州', + 520100: '贵阳市', + 520200: '六盘水市', + 520300: '遵义市', + 520400: '安顺市', + 520500: '毕节市', + 520600: '铜仁市', + 522300: '黔西南布依族苗族自治州', + 522600: '黔东南苗族侗族自治州', + 522700: '黔南布依族苗族自治州', + 530100: '昆明市', + 530300: '曲靖市', + 530400: '玉溪市', + 530500: '保山市', + 530600: '昭通市', + 530700: '丽江市', + 530800: '普洱市', + 530900: '临沧市', + 532300: '楚雄彝族自治州', + 532500: '红河哈尼族彝族自治州', + 532600: '文山壮族苗族自治州', + 532800: '西双版纳傣族自治州', + 532900: '大理白族自治州', + 533100: '德宏傣族景颇族自治州', + 533300: '怒江傈僳族自治州', + 533400: '迪庆藏族自治州', + 540100: '拉萨市', + 540200: '日喀则市', + 540300: '昌都市', + 540400: '林芝市', + 540500: '山南市', + 540600: '那曲市', + 542500: '阿里地区', + 610100: '西安市', + 610200: '铜川市', + 610300: '宝鸡市', + 610400: '咸阳市', + 610500: '渭南市', + 610600: '延安市', + 610700: '汉中市', + 610800: '榆林市', + 610900: '安康市', + 611000: '商洛市', + 620100: '兰州市', + 620200: '嘉峪关市', + 620300: '金昌市', + 620400: '白银市', + 620500: '天水市', + 620600: '武威市', + 620700: '张掖市', + 620800: '平凉市', + 620900: '酒泉市', + 621000: '庆阳市', + 621100: '定西市', + 621200: '陇南市', + 622900: '临夏回族自治州', + 623000: '甘南藏族自治州', + 630100: '西宁市', + 630200: '海东市', + 632200: '海北藏族自治州', + 632300: '黄南藏族自治州', + 632500: '海南藏族自治州', + 632600: '果洛藏族自治州', + 632700: '玉树藏族自治州', + 632800: '海西蒙古族藏族自治州', + 640100: '银川市', + 640200: '石嘴山市', + 640300: '吴忠市', + 640400: '固原市', + 640500: '中卫市', + 650100: '乌鲁木齐市', + 650200: '克拉玛依市', + 650400: '吐鲁番市', + 650500: '哈密市', + 652300: '昌吉回族自治州', + 652700: '博尔塔拉蒙古自治州', + 652800: '巴音郭楞蒙古自治州', + 652900: '阿克苏地区', + 653000: '克孜勒苏柯尔克孜自治州', + 653100: '喀什地区', + 653200: '和田地区', + 654000: '伊犁哈萨克自治州', + 654200: '塔城地区', + 654300: '阿勒泰地区', + 659000: '自治区直辖县级行政区划', + 710100: '台北市', + 710200: '高雄市', + 710300: '台南市', + 710400: '台中市', + 710500: '金门县', + 710600: '南投县', + 710700: '基隆市', + 710800: '新竹市', + 710900: '嘉义市', + 711100: '新北市', + 711200: '宜兰县', + 711300: '新竹县', + 711400: '桃园县', + 711500: '苗栗县', + 711700: '彰化县', + 711900: '嘉义县', + 712100: '云林县', + 712400: '屏东县', + 712500: '台东县', + 712600: '花莲县', + 712700: '澎湖县', + 712800: '连江县', + 810100: '香港岛', + 810200: '九龙', + 810300: '新界', + 820100: '澳门半岛', + 820200: '离岛', + 912400: '加拿大', + 941000: '韩国', + 984000: '美国' + }, + county_list: { + 110101: '东城区', + 110102: '西城区', + 110105: '朝阳区', + 110106: '丰台区', + 110107: '石景山区', + 110108: '海淀区', + 110109: '门头沟区', + 110111: '房山区', + 110112: '通州区', + 110113: '顺义区', + 110114: '昌平区', + 110115: '大兴区', + 110116: '怀柔区', + 110117: '平谷区', + 110118: '密云区', + 110119: '延庆区', + 120101: '和平区', + 120102: '河东区', + 120103: '河西区', + 120104: '南开区', + 120105: '河北区', + 120106: '红桥区', + 120110: '东丽区', + 120111: '西青区', + 120112: '津南区', + 120113: '北辰区', + 120114: '武清区', + 120115: '宝坻区', + 120116: '滨海新区', + 120117: '宁河区', + 120118: '静海区', + 120119: '蓟州区', + 130102: '长安区', + 130104: '桥西区', + 130105: '新华区', + 130107: '井陉矿区', + 130108: '裕华区', + 130109: '藁城区', + 130110: '鹿泉区', + 130111: '栾城区', + 130121: '井陉县', + 130123: '正定县', + 130125: '行唐县', + 130126: '灵寿县', + 130127: '高邑县', + 130128: '深泽县', + 130129: '赞皇县', + 130130: '无极县', + 130131: '平山县', + 130132: '元氏县', + 130133: '赵县', + 130181: '辛集市', + 130183: '晋州市', + 130184: '新乐市', + 130202: '路南区', + 130203: '路北区', + 130204: '古冶区', + 130205: '开平区', + 130207: '丰南区', + 130208: '丰润区', + 130209: '曹妃甸区', + 130223: '滦县', + 130224: '滦南县', + 130225: '乐亭县', + 130227: '迁西县', + 130229: '玉田县', + 130281: '遵化市', + 130283: '迁安市', + 130302: '海港区', + 130303: '山海关区', + 130304: '北戴河区', + 130306: '抚宁区', + 130321: '青龙满族自治县', + 130322: '昌黎县', + 130324: '卢龙县', + 130390: '经济技术开发区', + 130402: '邯山区', + 130403: '丛台区', + 130404: '复兴区', + 130406: '峰峰矿区', + 130407: '肥乡区', + 130408: '永年区', + 130423: '临漳县', + 130424: '成安县', + 130425: '大名县', + 130426: '涉县', + 130427: '磁县', + 130430: '邱县', + 130431: '鸡泽县', + 130432: '广平县', + 130433: '馆陶县', + 130434: '魏县', + 130435: '曲周县', + 130481: '武安市', + 130502: '桥东区', + 130503: '桥西区', + 130521: '邢台县', + 130522: '临城县', + 130523: '内丘县', + 130524: '柏乡县', + 130525: '隆尧县', + 130526: '任县', + 130527: '南和县', + 130528: '宁晋县', + 130529: '巨鹿县', + 130530: '新河县', + 130531: '广宗县', + 130532: '平乡县', + 130533: '威县', + 130534: '清河县', + 130535: '临西县', + 130581: '南宫市', + 130582: '沙河市', + 130602: '竞秀区', + 130606: '莲池区', + 130607: '满城区', + 130608: '清苑区', + 130609: '徐水区', + 130623: '涞水县', + 130624: '阜平县', + 130626: '定兴县', + 130627: '唐县', + 130628: '高阳县', + 130629: '容城县', + 130630: '涞源县', + 130631: '望都县', + 130632: '安新县', + 130633: '易县', + 130634: '曲阳县', + 130635: '蠡县', + 130636: '顺平县', + 130637: '博野县', + 130638: '雄县', + 130681: '涿州市', + 130682: '定州市', + 130683: '安国市', + 130684: '高碑店市', + 130702: '桥东区', + 130703: '桥西区', + 130705: '宣化区', + 130706: '下花园区', + 130708: '万全区', + 130709: '崇礼区', + 130722: '张北县', + 130723: '康保县', + 130724: '沽源县', + 130725: '尚义县', + 130726: '蔚县', + 130727: '阳原县', + 130728: '怀安县', + 130730: '怀来县', + 130731: '涿鹿县', + 130732: '赤城县', + 130802: '双桥区', + 130803: '双滦区', + 130804: '鹰手营子矿区', + 130821: '承德县', + 130822: '兴隆县', + 130824: '滦平县', + 130825: '隆化县', + 130826: '丰宁满族自治县', + 130827: '宽城满族自治县', + 130828: '围场满族蒙古族自治县', + 130881: '平泉市', + 130902: '新华区', + 130903: '运河区', + 130921: '沧县', + 130922: '青县', + 130923: '东光县', + 130924: '海兴县', + 130925: '盐山县', + 130926: '肃宁县', + 130927: '南皮县', + 130928: '吴桥县', + 130929: '献县', + 130930: '孟村回族自治县', + 130981: '泊头市', + 130982: '任丘市', + 130983: '黄骅市', + 130984: '河间市', + 131002: '安次区', + 131003: '广阳区', + 131022: '固安县', + 131023: '永清县', + 131024: '香河县', + 131025: '大城县', + 131026: '文安县', + 131028: '大厂回族自治县', + 131081: '霸州市', + 131082: '三河市', + 131090: '开发区', + 131102: '桃城区', + 131103: '冀州区', + 131121: '枣强县', + 131122: '武邑县', + 131123: '武强县', + 131124: '饶阳县', + 131125: '安平县', + 131126: '故城县', + 131127: '景县', + 131128: '阜城县', + 131182: '深州市', + 140105: '小店区', + 140106: '迎泽区', + 140107: '杏花岭区', + 140108: '尖草坪区', + 140109: '万柏林区', + 140110: '晋源区', + 140121: '清徐县', + 140122: '阳曲县', + 140123: '娄烦县', + 140181: '古交市', + 140202: '城区', + 140203: '矿区', + 140211: '南郊区', + 140212: '新荣区', + 140221: '阳高县', + 140222: '天镇县', + 140223: '广灵县', + 140224: '灵丘县', + 140225: '浑源县', + 140226: '左云县', + 140227: '大同县', + 140302: '城区', + 140303: '矿区', + 140311: '郊区', + 140321: '平定县', + 140322: '盂县', + 140402: '城区', + 140411: '郊区', + 140421: '长治县', + 140423: '襄垣县', + 140424: '屯留县', + 140425: '平顺县', + 140426: '黎城县', + 140427: '壶关县', + 140428: '长子县', + 140429: '武乡县', + 140430: '沁县', + 140431: '沁源县', + 140481: '潞城市', + 140502: '城区', + 140521: '沁水县', + 140522: '阳城县', + 140524: '陵川县', + 140525: '泽州县', + 140581: '高平市', + 140602: '朔城区', + 140603: '平鲁区', + 140621: '山阴县', + 140622: '应县', + 140623: '右玉县', + 140624: '怀仁县', + 140702: '榆次区', + 140721: '榆社县', + 140722: '左权县', + 140723: '和顺县', + 140724: '昔阳县', + 140725: '寿阳县', + 140726: '太谷县', + 140727: '祁县', + 140728: '平遥县', + 140729: '灵石县', + 140781: '介休市', + 140802: '盐湖区', + 140821: '临猗县', + 140822: '万荣县', + 140823: '闻喜县', + 140824: '稷山县', + 140825: '新绛县', + 140826: '绛县', + 140827: '垣曲县', + 140828: '夏县', + 140829: '平陆县', + 140830: '芮城县', + 140881: '永济市', + 140882: '河津市', + 140902: '忻府区', + 140921: '定襄县', + 140922: '五台县', + 140923: '代县', + 140924: '繁峙县', + 140925: '宁武县', + 140926: '静乐县', + 140927: '神池县', + 140928: '五寨县', + 140929: '岢岚县', + 140930: '河曲县', + 140931: '保德县', + 140932: '偏关县', + 140981: '原平市', + 141002: '尧都区', + 141021: '曲沃县', + 141022: '翼城县', + 141023: '襄汾县', + 141024: '洪洞县', + 141025: '古县', + 141026: '安泽县', + 141027: '浮山县', + 141028: '吉县', + 141029: '乡宁县', + 141030: '大宁县', + 141031: '隰县', + 141032: '永和县', + 141033: '蒲县', + 141034: '汾西县', + 141081: '侯马市', + 141082: '霍州市', + 141102: '离石区', + 141121: '文水县', + 141122: '交城县', + 141123: '兴县', + 141124: '临县', + 141125: '柳林县', + 141126: '石楼县', + 141127: '岚县', + 141128: '方山县', + 141129: '中阳县', + 141130: '交口县', + 141181: '孝义市', + 141182: '汾阳市', + 150102: '新城区', + 150103: '回民区', + 150104: '玉泉区', + 150105: '赛罕区', + 150121: '土默特左旗', + 150122: '托克托县', + 150123: '和林格尔县', + 150124: '清水河县', + 150125: '武川县', + 150202: '东河区', + 150203: '昆都仑区', + 150204: '青山区', + 150205: '石拐区', + 150206: '白云鄂博矿区', + 150207: '九原区', + 150221: '土默特右旗', + 150222: '固阳县', + 150223: '达尔罕茂明安联合旗', + 150302: '海勃湾区', + 150303: '海南区', + 150304: '乌达区', + 150402: '红山区', + 150403: '元宝山区', + 150404: '松山区', + 150421: '阿鲁科尔沁旗', + 150422: '巴林左旗', + 150423: '巴林右旗', + 150424: '林西县', + 150425: '克什克腾旗', + 150426: '翁牛特旗', + 150428: '喀喇沁旗', + 150429: '宁城县', + 150430: '敖汉旗', + 150502: '科尔沁区', + 150521: '科尔沁左翼中旗', + 150522: '科尔沁左翼后旗', + 150523: '开鲁县', + 150524: '库伦旗', + 150525: '奈曼旗', + 150526: '扎鲁特旗', + 150581: '霍林郭勒市', + 150602: '东胜区', + 150603: '康巴什区', + 150621: '达拉特旗', + 150622: '准格尔旗', + 150623: '鄂托克前旗', + 150624: '鄂托克旗', + 150625: '杭锦旗', + 150626: '乌审旗', + 150627: '伊金霍洛旗', + 150702: '海拉尔区', + 150703: '扎赉诺尔区', + 150721: '阿荣旗', + 150722: '莫力达瓦达斡尔族自治旗', + 150723: '鄂伦春自治旗', + 150724: '鄂温克族自治旗', + 150725: '陈巴尔虎旗', + 150726: '新巴尔虎左旗', + 150727: '新巴尔虎右旗', + 150781: '满洲里市', + 150782: '牙克石市', + 150783: '扎兰屯市', + 150784: '额尔古纳市', + 150785: '根河市', + 150802: '临河区', + 150821: '五原县', + 150822: '磴口县', + 150823: '乌拉特前旗', + 150824: '乌拉特中旗', + 150825: '乌拉特后旗', + 150826: '杭锦后旗', + 150902: '集宁区', + 150921: '卓资县', + 150922: '化德县', + 150923: '商都县', + 150924: '兴和县', + 150925: '凉城县', + 150926: '察哈尔右翼前旗', + 150927: '察哈尔右翼中旗', + 150928: '察哈尔右翼后旗', + 150929: '四子王旗', + 150981: '丰镇市', + 152201: '乌兰浩特市', + 152202: '阿尔山市', + 152221: '科尔沁右翼前旗', + 152222: '科尔沁右翼中旗', + 152223: '扎赉特旗', + 152224: '突泉县', + 152501: '二连浩特市', + 152502: '锡林浩特市', + 152522: '阿巴嘎旗', + 152523: '苏尼特左旗', + 152524: '苏尼特右旗', + 152525: '东乌珠穆沁旗', + 152526: '西乌珠穆沁旗', + 152527: '太仆寺旗', + 152528: '镶黄旗', + 152529: '正镶白旗', + 152530: '正蓝旗', + 152531: '多伦县', + 152921: '阿拉善左旗', + 152922: '阿拉善右旗', + 152923: '额济纳旗', + 210102: '和平区', + 210103: '沈河区', + 210104: '大东区', + 210105: '皇姑区', + 210106: '铁西区', + 210111: '苏家屯区', + 210112: '浑南区', + 210113: '沈北新区', + 210114: '于洪区', + 210115: '辽中区', + 210123: '康平县', + 210124: '法库县', + 210181: '新民市', + 210190: '经济技术开发区', + 210202: '中山区', + 210203: '西岗区', + 210204: '沙河口区', + 210211: '甘井子区', + 210212: '旅顺口区', + 210213: '金州区', + 210214: '普兰店区', + 210224: '长海县', + 210281: '瓦房店市', + 210283: '庄河市', + 210302: '铁东区', + 210303: '铁西区', + 210304: '立山区', + 210311: '千山区', + 210321: '台安县', + 210323: '岫岩满族自治县', + 210381: '海城市', + 210390: '高新区', + 210402: '新抚区', + 210403: '东洲区', + 210404: '望花区', + 210411: '顺城区', + 210421: '抚顺县', + 210422: '新宾满族自治县', + 210423: '清原满族自治县', + 210502: '平山区', + 210503: '溪湖区', + 210504: '明山区', + 210505: '南芬区', + 210521: '本溪满族自治县', + 210522: '桓仁满族自治县', + 210602: '元宝区', + 210603: '振兴区', + 210604: '振安区', + 210624: '宽甸满族自治县', + 210681: '东港市', + 210682: '凤城市', + 210702: '古塔区', + 210703: '凌河区', + 210711: '太和区', + 210726: '黑山县', + 210727: '义县', + 210781: '凌海市', + 210782: '北镇市', + 210793: '经济技术开发区', + 210802: '站前区', + 210803: '西市区', + 210804: '鲅鱼圈区', + 210811: '老边区', + 210881: '盖州市', + 210882: '大石桥市', + 210902: '海州区', + 210903: '新邱区', + 210904: '太平区', + 210905: '清河门区', + 210911: '细河区', + 210921: '阜新蒙古族自治县', + 210922: '彰武县', + 211002: '白塔区', + 211003: '文圣区', + 211004: '宏伟区', + 211005: '弓长岭区', + 211011: '太子河区', + 211021: '辽阳县', + 211081: '灯塔市', + 211102: '双台子区', + 211103: '兴隆台区', + 211104: '大洼区', + 211122: '盘山县', + 211202: '银州区', + 211204: '清河区', + 211221: '铁岭县', + 211223: '西丰县', + 211224: '昌图县', + 211281: '调兵山市', + 211282: '开原市', + 211302: '双塔区', + 211303: '龙城区', + 211321: '朝阳县', + 211322: '建平县', + 211324: '喀喇沁左翼蒙古族自治县', + 211381: '北票市', + 211382: '凌源市', + 211402: '连山区', + 211403: '龙港区', + 211404: '南票区', + 211421: '绥中县', + 211422: '建昌县', + 211481: '兴城市', + 215090: '工业园区', + 220102: '南关区', + 220103: '宽城区', + 220104: '朝阳区', + 220105: '二道区', + 220106: '绿园区', + 220112: '双阳区', + 220113: '九台区', + 220122: '农安县', + 220182: '榆树市', + 220183: '德惠市', + 220192: '经济技术开发区', + 220202: '昌邑区', + 220203: '龙潭区', + 220204: '船营区', + 220211: '丰满区', + 220221: '永吉县', + 220281: '蛟河市', + 220282: '桦甸市', + 220283: '舒兰市', + 220284: '磐石市', + 220302: '铁西区', + 220303: '铁东区', + 220322: '梨树县', + 220323: '伊通满族自治县', + 220381: '公主岭市', + 220382: '双辽市', + 220402: '龙山区', + 220403: '西安区', + 220421: '东丰县', + 220422: '东辽县', + 220502: '东昌区', + 220503: '二道江区', + 220521: '通化县', + 220523: '辉南县', + 220524: '柳河县', + 220581: '梅河口市', + 220582: '集安市', + 220602: '浑江区', + 220605: '江源区', + 220621: '抚松县', + 220622: '靖宇县', + 220623: '长白朝鲜族自治县', + 220681: '临江市', + 220702: '宁江区', + 220721: '前郭尔罗斯蒙古族自治县', + 220722: '长岭县', + 220723: '乾安县', + 220781: '扶余市', + 220802: '洮北区', + 220821: '镇赉县', + 220822: '通榆县', + 220881: '洮南市', + 220882: '大安市', + 221090: '工业园区', + 222401: '延吉市', + 222402: '图们市', + 222403: '敦化市', + 222404: '珲春市', + 222405: '龙井市', + 222406: '和龙市', + 222424: '汪清县', + 222426: '安图县', + 230102: '道里区', + 230103: '南岗区', + 230104: '道外区', + 230108: '平房区', + 230109: '松北区', + 230110: '香坊区', + 230111: '呼兰区', + 230112: '阿城区', + 230113: '双城区', + 230123: '依兰县', + 230124: '方正县', + 230125: '宾县', + 230126: '巴彦县', + 230127: '木兰县', + 230128: '通河县', + 230129: '延寿县', + 230183: '尚志市', + 230184: '五常市', + 230202: '龙沙区', + 230203: '建华区', + 230204: '铁锋区', + 230205: '昂昂溪区', + 230206: '富拉尔基区', + 230207: '碾子山区', + 230208: '梅里斯达斡尔族区', + 230221: '龙江县', + 230223: '依安县', + 230224: '泰来县', + 230225: '甘南县', + 230227: '富裕县', + 230229: '克山县', + 230230: '克东县', + 230231: '拜泉县', + 230281: '讷河市', + 230302: '鸡冠区', + 230303: '恒山区', + 230304: '滴道区', + 230305: '梨树区', + 230306: '城子河区', + 230307: '麻山区', + 230321: '鸡东县', + 230381: '虎林市', + 230382: '密山市', + 230402: '向阳区', + 230403: '工农区', + 230404: '南山区', + 230405: '兴安区', + 230406: '东山区', + 230407: '兴山区', + 230421: '萝北县', + 230422: '绥滨县', + 230502: '尖山区', + 230503: '岭东区', + 230505: '四方台区', + 230506: '宝山区', + 230521: '集贤县', + 230522: '友谊县', + 230523: '宝清县', + 230524: '饶河县', + 230602: '萨尔图区', + 230603: '龙凤区', + 230604: '让胡路区', + 230605: '红岗区', + 230606: '大同区', + 230621: '肇州县', + 230622: '肇源县', + 230623: '林甸县', + 230624: '杜尔伯特蒙古族自治县', + 230702: '伊春区', + 230703: '南岔区', + 230704: '友好区', + 230705: '西林区', + 230706: '翠峦区', + 230707: '新青区', + 230708: '美溪区', + 230709: '金山屯区', + 230710: '五营区', + 230711: '乌马河区', + 230712: '汤旺河区', + 230713: '带岭区', + 230714: '乌伊岭区', + 230715: '红星区', + 230716: '上甘岭区', + 230722: '嘉荫县', + 230781: '铁力市', + 230803: '向阳区', + 230804: '前进区', + 230805: '东风区', + 230811: '郊区', + 230822: '桦南县', + 230826: '桦川县', + 230828: '汤原县', + 230881: '同江市', + 230882: '富锦市', + 230883: '抚远市', + 230902: '新兴区', + 230903: '桃山区', + 230904: '茄子河区', + 230921: '勃利县', + 231002: '东安区', + 231003: '阳明区', + 231004: '爱民区', + 231005: '西安区', + 231025: '林口县', + 231081: '绥芬河市', + 231083: '海林市', + 231084: '宁安市', + 231085: '穆棱市', + 231086: '东宁市', + 231102: '爱辉区', + 231121: '嫩江县', + 231123: '逊克县', + 231124: '孙吴县', + 231181: '北安市', + 231182: '五大连池市', + 231202: '北林区', + 231221: '望奎县', + 231222: '兰西县', + 231223: '青冈县', + 231224: '庆安县', + 231225: '明水县', + 231226: '绥棱县', + 231281: '安达市', + 231282: '肇东市', + 231283: '海伦市', + 232721: '呼玛县', + 232722: '塔河县', + 232723: '漠河县', + 232790: '松岭区', + 232791: '呼中区', + 232792: '加格达奇区', + 232793: '新林区', + 310101: '黄浦区', + 310104: '徐汇区', + 310105: '长宁区', + 310106: '静安区', + 310107: '普陀区', + 310109: '虹口区', + 310110: '杨浦区', + 310112: '闵行区', + 310113: '宝山区', + 310114: '嘉定区', + 310115: '浦东新区', + 310116: '金山区', + 310117: '松江区', + 310118: '青浦区', + 310120: '奉贤区', + 310151: '崇明区', + 320102: '玄武区', + 320104: '秦淮区', + 320105: '建邺区', + 320106: '鼓楼区', + 320111: '浦口区', + 320113: '栖霞区', + 320114: '雨花台区', + 320115: '江宁区', + 320116: '六合区', + 320117: '溧水区', + 320118: '高淳区', + 320205: '锡山区', + 320206: '惠山区', + 320211: '滨湖区', + 320213: '梁溪区', + 320214: '新吴区', + 320281: '江阴市', + 320282: '宜兴市', + 320302: '鼓楼区', + 320303: '云龙区', + 320305: '贾汪区', + 320311: '泉山区', + 320312: '铜山区', + 320321: '丰县', + 320322: '沛县', + 320324: '睢宁县', + 320381: '新沂市', + 320382: '邳州市', + 320391: '工业园区', + 320402: '天宁区', + 320404: '钟楼区', + 320411: '新北区', + 320412: '武进区', + 320413: '金坛区', + 320481: '溧阳市', + 320505: '虎丘区', + 320506: '吴中区', + 320507: '相城区', + 320508: '姑苏区', + 320509: '吴江区', + 320581: '常熟市', + 320582: '张家港市', + 320583: '昆山市', + 320585: '太仓市', + 320590: '工业园区', + 320591: '高新区', + 320602: '崇川区', + 320611: '港闸区', + 320612: '通州区', + 320621: '海安县', + 320623: '如东县', + 320681: '启东市', + 320682: '如皋市', + 320684: '海门市', + 320691: '高新区', + 320703: '连云区', + 320706: '海州区', + 320707: '赣榆区', + 320722: '东海县', + 320723: '灌云县', + 320724: '灌南县', + 320803: '淮安区', + 320804: '淮阴区', + 320812: '清江浦区', + 320813: '洪泽区', + 320826: '涟水县', + 320830: '盱眙县', + 320831: '金湖县', + 320890: '经济开发区', + 320902: '亭湖区', + 320903: '盐都区', + 320904: '大丰区', + 320921: '响水县', + 320922: '滨海县', + 320923: '阜宁县', + 320924: '射阳县', + 320925: '建湖县', + 320981: '东台市', + 321002: '广陵区', + 321003: '邗江区', + 321012: '江都区', + 321023: '宝应县', + 321081: '仪征市', + 321084: '高邮市', + 321090: '经济开发区', + 321102: '京口区', + 321111: '润州区', + 321112: '丹徒区', + 321181: '丹阳市', + 321182: '扬中市', + 321183: '句容市', + 321202: '海陵区', + 321203: '高港区', + 321204: '姜堰区', + 321281: '兴化市', + 321282: '靖江市', + 321283: '泰兴市', + 321302: '宿城区', + 321311: '宿豫区', + 321322: '沭阳县', + 321323: '泗阳县', + 321324: '泗洪县', + 330102: '上城区', + 330103: '下城区', + 330104: '江干区', + 330105: '拱墅区', + 330106: '西湖区', + 330108: '滨江区', + 330109: '萧山区', + 330110: '余杭区', + 330111: '富阳区', + 330112: '临安区', + 330122: '桐庐县', + 330127: '淳安县', + 330182: '建德市', + 330203: '海曙区', + 330205: '江北区', + 330206: '北仑区', + 330211: '镇海区', + 330212: '鄞州区', + 330213: '奉化区', + 330225: '象山县', + 330226: '宁海县', + 330281: '余姚市', + 330282: '慈溪市', + 330302: '鹿城区', + 330303: '龙湾区', + 330304: '瓯海区', + 330305: '洞头区', + 330324: '永嘉县', + 330326: '平阳县', + 330327: '苍南县', + 330328: '文成县', + 330329: '泰顺县', + 330381: '瑞安市', + 330382: '乐清市', + 330402: '南湖区', + 330411: '秀洲区', + 330421: '嘉善县', + 330424: '海盐县', + 330481: '海宁市', + 330482: '平湖市', + 330483: '桐乡市', + 330502: '吴兴区', + 330503: '南浔区', + 330521: '德清县', + 330522: '长兴县', + 330523: '安吉县', + 330602: '越城区', + 330603: '柯桥区', + 330604: '上虞区', + 330624: '新昌县', + 330681: '诸暨市', + 330683: '嵊州市', + 330702: '婺城区', + 330703: '金东区', + 330723: '武义县', + 330726: '浦江县', + 330727: '磐安县', + 330781: '兰溪市', + 330782: '义乌市', + 330783: '东阳市', + 330784: '永康市', + 330802: '柯城区', + 330803: '衢江区', + 330822: '常山县', + 330824: '开化县', + 330825: '龙游县', + 330881: '江山市', + 330902: '定海区', + 330903: '普陀区', + 330921: '岱山县', + 330922: '嵊泗县', + 331002: '椒江区', + 331003: '黄岩区', + 331004: '路桥区', + 331022: '三门县', + 331023: '天台县', + 331024: '仙居县', + 331081: '温岭市', + 331082: '临海市', + 331083: '玉环市', + 331102: '莲都区', + 331121: '青田县', + 331122: '缙云县', + 331123: '遂昌县', + 331124: '松阳县', + 331125: '云和县', + 331126: '庆元县', + 331127: '景宁畲族自治县', + 331181: '龙泉市', + 340102: '瑶海区', + 340103: '庐阳区', + 340104: '蜀山区', + 340111: '包河区', + 340121: '长丰县', + 340122: '肥东县', + 340123: '肥西县', + 340124: '庐江县', + 340181: '巢湖市', + 340190: '高新技术开发区', + 340191: '经济技术开发区', + 340202: '镜湖区', + 340203: '弋江区', + 340207: '鸠江区', + 340208: '三山区', + 340221: '芜湖县', + 340222: '繁昌县', + 340223: '南陵县', + 340225: '无为县', + 340302: '龙子湖区', + 340303: '蚌山区', + 340304: '禹会区', + 340311: '淮上区', + 340321: '怀远县', + 340322: '五河县', + 340323: '固镇县', + 340402: '大通区', + 340403: '田家庵区', + 340404: '谢家集区', + 340405: '八公山区', + 340406: '潘集区', + 340421: '凤台县', + 340422: '寿县', + 340503: '花山区', + 340504: '雨山区', + 340506: '博望区', + 340521: '当涂县', + 340522: '含山县', + 340523: '和县', + 340602: '杜集区', + 340603: '相山区', + 340604: '烈山区', + 340621: '濉溪县', + 340705: '铜官区', + 340706: '义安区', + 340711: '郊区', + 340722: '枞阳县', + 340802: '迎江区', + 340803: '大观区', + 340811: '宜秀区', + 340822: '怀宁县', + 340824: '潜山县', + 340825: '太湖县', + 340826: '宿松县', + 340827: '望江县', + 340828: '岳西县', + 340881: '桐城市', + 341002: '屯溪区', + 341003: '黄山区', + 341004: '徽州区', + 341021: '歙县', + 341022: '休宁县', + 341023: '黟县', + 341024: '祁门县', + 341102: '琅琊区', + 341103: '南谯区', + 341122: '来安县', + 341124: '全椒县', + 341125: '定远县', + 341126: '凤阳县', + 341181: '天长市', + 341182: '明光市', + 341202: '颍州区', + 341203: '颍东区', + 341204: '颍泉区', + 341221: '临泉县', + 341222: '太和县', + 341225: '阜南县', + 341226: '颍上县', + 341282: '界首市', + 341302: '埇桥区', + 341321: '砀山县', + 341322: '萧县', + 341323: '灵璧县', + 341324: '泗县', + 341390: '经济开发区', + 341502: '金安区', + 341503: '裕安区', + 341504: '叶集区', + 341522: '霍邱县', + 341523: '舒城县', + 341524: '金寨县', + 341525: '霍山县', + 341602: '谯城区', + 341621: '涡阳县', + 341622: '蒙城县', + 341623: '利辛县', + 341702: '贵池区', + 341721: '东至县', + 341722: '石台县', + 341723: '青阳县', + 341802: '宣州区', + 341821: '郎溪县', + 341822: '广德县', + 341823: '泾县', + 341824: '绩溪县', + 341825: '旌德县', + 341881: '宁国市', + 350102: '鼓楼区', + 350103: '台江区', + 350104: '仓山区', + 350105: '马尾区', + 350111: '晋安区', + 350112: '长乐区', + 350121: '闽侯县', + 350122: '连江县', + 350123: '罗源县', + 350124: '闽清县', + 350125: '永泰县', + 350128: '平潭县', + 350181: '福清市', + 350203: '思明区', + 350205: '海沧区', + 350206: '湖里区', + 350211: '集美区', + 350212: '同安区', + 350213: '翔安区', + 350302: '城厢区', + 350303: '涵江区', + 350304: '荔城区', + 350305: '秀屿区', + 350322: '仙游县', + 350402: '梅列区', + 350403: '三元区', + 350421: '明溪县', + 350423: '清流县', + 350424: '宁化县', + 350425: '大田县', + 350426: '尤溪县', + 350427: '沙县', + 350428: '将乐县', + 350429: '泰宁县', + 350430: '建宁县', + 350481: '永安市', + 350502: '鲤城区', + 350503: '丰泽区', + 350504: '洛江区', + 350505: '泉港区', + 350521: '惠安县', + 350524: '安溪县', + 350525: '永春县', + 350526: '德化县', + 350527: '金门县', + 350581: '石狮市', + 350582: '晋江市', + 350583: '南安市', + 350602: '芗城区', + 350603: '龙文区', + 350622: '云霄县', + 350623: '漳浦县', + 350624: '诏安县', + 350625: '长泰县', + 350626: '东山县', + 350627: '南靖县', + 350628: '平和县', + 350629: '华安县', + 350681: '龙海市', + 350702: '延平区', + 350703: '建阳区', + 350721: '顺昌县', + 350722: '浦城县', + 350723: '光泽县', + 350724: '松溪县', + 350725: '政和县', + 350781: '邵武市', + 350782: '武夷山市', + 350783: '建瓯市', + 350802: '新罗区', + 350803: '永定区', + 350821: '长汀县', + 350823: '上杭县', + 350824: '武平县', + 350825: '连城县', + 350881: '漳平市', + 350902: '蕉城区', + 350921: '霞浦县', + 350922: '古田县', + 350923: '屏南县', + 350924: '寿宁县', + 350925: '周宁县', + 350926: '柘荣县', + 350981: '福安市', + 350982: '福鼎市', + 360102: '东湖区', + 360103: '西湖区', + 360104: '青云谱区', + 360105: '湾里区', + 360111: '青山湖区', + 360112: '新建区', + 360121: '南昌县', + 360123: '安义县', + 360124: '进贤县', + 360190: '经济技术开发区', + 360192: '高新区', + 360202: '昌江区', + 360203: '珠山区', + 360222: '浮梁县', + 360281: '乐平市', + 360302: '安源区', + 360313: '湘东区', + 360321: '莲花县', + 360322: '上栗县', + 360323: '芦溪县', + 360402: '濂溪区', + 360403: '浔阳区', + 360404: '柴桑区', + 360423: '武宁县', + 360424: '修水县', + 360425: '永修县', + 360426: '德安县', + 360428: '都昌县', + 360429: '湖口县', + 360430: '彭泽县', + 360481: '瑞昌市', + 360482: '共青城市', + 360483: '庐山市', + 360490: '经济技术开发区', + 360502: '渝水区', + 360521: '分宜县', + 360602: '月湖区', + 360622: '余江县', + 360681: '贵溪市', + 360702: '章贡区', + 360703: '南康区', + 360704: '赣县区', + 360722: '信丰县', + 360723: '大余县', + 360724: '上犹县', + 360725: '崇义县', + 360726: '安远县', + 360727: '龙南县', + 360728: '定南县', + 360729: '全南县', + 360730: '宁都县', + 360731: '于都县', + 360732: '兴国县', + 360733: '会昌县', + 360734: '寻乌县', + 360735: '石城县', + 360781: '瑞金市', + 360802: '吉州区', + 360803: '青原区', + 360821: '吉安县', + 360822: '吉水县', + 360823: '峡江县', + 360824: '新干县', + 360825: '永丰县', + 360826: '泰和县', + 360827: '遂川县', + 360828: '万安县', + 360829: '安福县', + 360830: '永新县', + 360881: '井冈山市', + 360902: '袁州区', + 360921: '奉新县', + 360922: '万载县', + 360923: '上高县', + 360924: '宜丰县', + 360925: '靖安县', + 360926: '铜鼓县', + 360981: '丰城市', + 360982: '樟树市', + 360983: '高安市', + 361002: '临川区', + 361003: '东乡区', + 361021: '南城县', + 361022: '黎川县', + 361023: '南丰县', + 361024: '崇仁县', + 361025: '乐安县', + 361026: '宜黄县', + 361027: '金溪县', + 361028: '资溪县', + 361030: '广昌县', + 361102: '信州区', + 361103: '广丰区', + 361121: '上饶县', + 361123: '玉山县', + 361124: '铅山县', + 361125: '横峰县', + 361126: '弋阳县', + 361127: '余干县', + 361128: '鄱阳县', + 361129: '万年县', + 361130: '婺源县', + 361181: '德兴市', + 370102: '历下区', + 370103: '市中区', + 370104: '槐荫区', + 370105: '天桥区', + 370112: '历城区', + 370113: '长清区', + 370114: '章丘区', + 370124: '平阴县', + 370125: '济阳县', + 370126: '商河县', + 370190: '高新区', + 370202: '市南区', + 370203: '市北区', + 370211: '黄岛区', + 370212: '崂山区', + 370213: '李沧区', + 370214: '城阳区', + 370215: '即墨区', + 370281: '胶州市', + 370283: '平度市', + 370285: '莱西市', + 370290: '开发区', + 370302: '淄川区', + 370303: '张店区', + 370304: '博山区', + 370305: '临淄区', + 370306: '周村区', + 370321: '桓台县', + 370322: '高青县', + 370323: '沂源县', + 370402: '市中区', + 370403: '薛城区', + 370404: '峄城区', + 370405: '台儿庄区', + 370406: '山亭区', + 370481: '滕州市', + 370502: '东营区', + 370503: '河口区', + 370505: '垦利区', + 370522: '利津县', + 370523: '广饶县', + 370602: '芝罘区', + 370611: '福山区', + 370612: '牟平区', + 370613: '莱山区', + 370634: '长岛县', + 370681: '龙口市', + 370682: '莱阳市', + 370683: '莱州市', + 370684: '蓬莱市', + 370685: '招远市', + 370686: '栖霞市', + 370687: '海阳市', + 370690: '开发区', + 370702: '潍城区', + 370703: '寒亭区', + 370704: '坊子区', + 370705: '奎文区', + 370724: '临朐县', + 370725: '昌乐县', + 370781: '青州市', + 370782: '诸城市', + 370783: '寿光市', + 370784: '安丘市', + 370785: '高密市', + 370786: '昌邑市', + 370790: '开发区', + 370791: '高新区', + 370811: '任城区', + 370812: '兖州区', + 370826: '微山县', + 370827: '鱼台县', + 370828: '金乡县', + 370829: '嘉祥县', + 370830: '汶上县', + 370831: '泗水县', + 370832: '梁山县', + 370881: '曲阜市', + 370883: '邹城市', + 370890: '高新区', + 370902: '泰山区', + 370911: '岱岳区', + 370921: '宁阳县', + 370923: '东平县', + 370982: '新泰市', + 370983: '肥城市', + 371002: '环翠区', + 371003: '文登区', + 371082: '荣成市', + 371083: '乳山市', + 371091: '经济技术开发区', + 371102: '东港区', + 371103: '岚山区', + 371121: '五莲县', + 371122: '莒县', + 371202: '莱城区', + 371203: '钢城区', + 371302: '兰山区', + 371311: '罗庄区', + 371312: '河东区', + 371321: '沂南县', + 371322: '郯城县', + 371323: '沂水县', + 371324: '兰陵县', + 371325: '费县', + 371326: '平邑县', + 371327: '莒南县', + 371328: '蒙阴县', + 371329: '临沭县', + 371402: '德城区', + 371403: '陵城区', + 371422: '宁津县', + 371423: '庆云县', + 371424: '临邑县', + 371425: '齐河县', + 371426: '平原县', + 371427: '夏津县', + 371428: '武城县', + 371481: '乐陵市', + 371482: '禹城市', + 371502: '东昌府区', + 371521: '阳谷县', + 371522: '莘县', + 371523: '茌平县', + 371524: '东阿县', + 371525: '冠县', + 371526: '高唐县', + 371581: '临清市', + 371602: '滨城区', + 371603: '沾化区', + 371621: '惠民县', + 371622: '阳信县', + 371623: '无棣县', + 371625: '博兴县', + 371626: '邹平县', + 371702: '牡丹区', + 371703: '定陶区', + 371721: '曹县', + 371722: '单县', + 371723: '成武县', + 371724: '巨野县', + 371725: '郓城县', + 371726: '鄄城县', + 371728: '东明县', + 410102: '中原区', + 410103: '二七区', + 410104: '管城回族区', + 410105: '金水区', + 410106: '上街区', + 410108: '惠济区', + 410122: '中牟县', + 410181: '巩义市', + 410182: '荥阳市', + 410183: '新密市', + 410184: '新郑市', + 410185: '登封市', + 410190: '高新技术开发区', + 410191: '经济技术开发区', + 410202: '龙亭区', + 410203: '顺河回族区', + 410204: '鼓楼区', + 410205: '禹王台区', + 410212: '祥符区', + 410221: '杞县', + 410222: '通许县', + 410223: '尉氏县', + 410225: '兰考县', + 410302: '老城区', + 410303: '西工区', + 410304: '瀍河回族区', + 410305: '涧西区', + 410306: '吉利区', + 410311: '洛龙区', + 410322: '孟津县', + 410323: '新安县', + 410324: '栾川县', + 410325: '嵩县', + 410326: '汝阳县', + 410327: '宜阳县', + 410328: '洛宁县', + 410329: '伊川县', + 410381: '偃师市', + 410402: '新华区', + 410403: '卫东区', + 410404: '石龙区', + 410411: '湛河区', + 410421: '宝丰县', + 410422: '叶县', + 410423: '鲁山县', + 410425: '郏县', + 410481: '舞钢市', + 410482: '汝州市', + 410502: '文峰区', + 410503: '北关区', + 410505: '殷都区', + 410506: '龙安区', + 410522: '安阳县', + 410523: '汤阴县', + 410526: '滑县', + 410527: '内黄县', + 410581: '林州市', + 410590: '开发区', + 410602: '鹤山区', + 410603: '山城区', + 410611: '淇滨区', + 410621: '浚县', + 410622: '淇县', + 410702: '红旗区', + 410703: '卫滨区', + 410704: '凤泉区', + 410711: '牧野区', + 410721: '新乡县', + 410724: '获嘉县', + 410725: '原阳县', + 410726: '延津县', + 410727: '封丘县', + 410728: '长垣县', + 410781: '卫辉市', + 410782: '辉县市', + 410802: '解放区', + 410803: '中站区', + 410804: '马村区', + 410811: '山阳区', + 410821: '修武县', + 410822: '博爱县', + 410823: '武陟县', + 410825: '温县', + 410882: '沁阳市', + 410883: '孟州市', + 410902: '华龙区', + 410922: '清丰县', + 410923: '南乐县', + 410926: '范县', + 410927: '台前县', + 410928: '濮阳县', + 411002: '魏都区', + 411003: '建安区', + 411024: '鄢陵县', + 411025: '襄城县', + 411081: '禹州市', + 411082: '长葛市', + 411102: '源汇区', + 411103: '郾城区', + 411104: '召陵区', + 411121: '舞阳县', + 411122: '临颍县', + 411202: '湖滨区', + 411203: '陕州区', + 411221: '渑池县', + 411224: '卢氏县', + 411281: '义马市', + 411282: '灵宝市', + 411302: '宛城区', + 411303: '卧龙区', + 411321: '南召县', + 411322: '方城县', + 411323: '西峡县', + 411324: '镇平县', + 411325: '内乡县', + 411326: '淅川县', + 411327: '社旗县', + 411328: '唐河县', + 411329: '新野县', + 411330: '桐柏县', + 411381: '邓州市', + 411402: '梁园区', + 411403: '睢阳区', + 411421: '民权县', + 411422: '睢县', + 411423: '宁陵县', + 411424: '柘城县', + 411425: '虞城县', + 411426: '夏邑县', + 411481: '永城市', + 411502: '浉河区', + 411503: '平桥区', + 411521: '罗山县', + 411522: '光山县', + 411523: '新县', + 411524: '商城县', + 411525: '固始县', + 411526: '潢川县', + 411527: '淮滨县', + 411528: '息县', + 411602: '川汇区', + 411621: '扶沟县', + 411622: '西华县', + 411623: '商水县', + 411624: '沈丘县', + 411625: '郸城县', + 411626: '淮阳县', + 411627: '太康县', + 411628: '鹿邑县', + 411681: '项城市', + 411690: '经济开发区', + 411702: '驿城区', + 411721: '西平县', + 411722: '上蔡县', + 411723: '平舆县', + 411724: '正阳县', + 411725: '确山县', + 411726: '泌阳县', + 411727: '汝南县', + 411728: '遂平县', + 411729: '新蔡县', + 419001: '济源市', + 420102: '江岸区', + 420103: '江汉区', + 420104: '硚口区', + 420105: '汉阳区', + 420106: '武昌区', + 420107: '青山区', + 420111: '洪山区', + 420112: '东西湖区', + 420113: '汉南区', + 420114: '蔡甸区', + 420115: '江夏区', + 420116: '黄陂区', + 420117: '新洲区', + 420202: '黄石港区', + 420203: '西塞山区', + 420204: '下陆区', + 420205: '铁山区', + 420222: '阳新县', + 420281: '大冶市', + 420302: '茅箭区', + 420303: '张湾区', + 420304: '郧阳区', + 420322: '郧西县', + 420323: '竹山县', + 420324: '竹溪县', + 420325: '房县', + 420381: '丹江口市', + 420502: '西陵区', + 420503: '伍家岗区', + 420504: '点军区', + 420505: '猇亭区', + 420506: '夷陵区', + 420525: '远安县', + 420526: '兴山县', + 420527: '秭归县', + 420528: '长阳土家族自治县', + 420529: '五峰土家族自治县', + 420581: '宜都市', + 420582: '当阳市', + 420583: '枝江市', + 420590: '经济开发区', + 420602: '襄城区', + 420606: '樊城区', + 420607: '襄州区', + 420624: '南漳县', + 420625: '谷城县', + 420626: '保康县', + 420682: '老河口市', + 420683: '枣阳市', + 420684: '宜城市', + 420702: '梁子湖区', + 420703: '华容区', + 420704: '鄂城区', + 420802: '东宝区', + 420804: '掇刀区', + 420821: '京山县', + 420822: '沙洋县', + 420881: '钟祥市', + 420902: '孝南区', + 420921: '孝昌县', + 420922: '大悟县', + 420923: '云梦县', + 420981: '应城市', + 420982: '安陆市', + 420984: '汉川市', + 421002: '沙市区', + 421003: '荆州区', + 421022: '公安县', + 421023: '监利县', + 421024: '江陵县', + 421081: '石首市', + 421083: '洪湖市', + 421087: '松滋市', + 421102: '黄州区', + 421121: '团风县', + 421122: '红安县', + 421123: '罗田县', + 421124: '英山县', + 421125: '浠水县', + 421126: '蕲春县', + 421127: '黄梅县', + 421181: '麻城市', + 421182: '武穴市', + 421202: '咸安区', + 421221: '嘉鱼县', + 421222: '通城县', + 421223: '崇阳县', + 421224: '通山县', + 421281: '赤壁市', + 421303: '曾都区', + 421321: '随县', + 421381: '广水市', + 422801: '恩施市', + 422802: '利川市', + 422822: '建始县', + 422823: '巴东县', + 422825: '宣恩县', + 422826: '咸丰县', + 422827: '来凤县', + 422828: '鹤峰县', + 429004: '仙桃市', + 429005: '潜江市', + 429006: '天门市', + 429021: '神农架林区', + 430102: '芙蓉区', + 430103: '天心区', + 430104: '岳麓区', + 430105: '开福区', + 430111: '雨花区', + 430112: '望城区', + 430121: '长沙县', + 430181: '浏阳市', + 430182: '宁乡市', + 430202: '荷塘区', + 430203: '芦淞区', + 430204: '石峰区', + 430211: '天元区', + 430221: '株洲县', + 430223: '攸县', + 430224: '茶陵县', + 430225: '炎陵县', + 430281: '醴陵市', + 430302: '雨湖区', + 430304: '岳塘区', + 430321: '湘潭县', + 430381: '湘乡市', + 430382: '韶山市', + 430405: '珠晖区', + 430406: '雁峰区', + 430407: '石鼓区', + 430408: '蒸湘区', + 430412: '南岳区', + 430421: '衡阳县', + 430422: '衡南县', + 430423: '衡山县', + 430424: '衡东县', + 430426: '祁东县', + 430481: '耒阳市', + 430482: '常宁市', + 430502: '双清区', + 430503: '大祥区', + 430511: '北塔区', + 430521: '邵东县', + 430522: '新邵县', + 430523: '邵阳县', + 430524: '隆回县', + 430525: '洞口县', + 430527: '绥宁县', + 430528: '新宁县', + 430529: '城步苗族自治县', + 430581: '武冈市', + 430602: '岳阳楼区', + 430603: '云溪区', + 430611: '君山区', + 430621: '岳阳县', + 430623: '华容县', + 430624: '湘阴县', + 430626: '平江县', + 430681: '汨罗市', + 430682: '临湘市', + 430702: '武陵区', + 430703: '鼎城区', + 430721: '安乡县', + 430722: '汉寿县', + 430723: '澧县', + 430724: '临澧县', + 430725: '桃源县', + 430726: '石门县', + 430781: '津市市', + 430802: '永定区', + 430811: '武陵源区', + 430821: '慈利县', + 430822: '桑植县', + 430902: '资阳区', + 430903: '赫山区', + 430921: '南县', + 430922: '桃江县', + 430923: '安化县', + 430981: '沅江市', + 431002: '北湖区', + 431003: '苏仙区', + 431021: '桂阳县', + 431022: '宜章县', + 431023: '永兴县', + 431024: '嘉禾县', + 431025: '临武县', + 431026: '汝城县', + 431027: '桂东县', + 431028: '安仁县', + 431081: '资兴市', + 431102: '零陵区', + 431103: '冷水滩区', + 431121: '祁阳县', + 431122: '东安县', + 431123: '双牌县', + 431124: '道县', + 431125: '江永县', + 431126: '宁远县', + 431127: '蓝山县', + 431128: '新田县', + 431129: '江华瑶族自治县', + 431202: '鹤城区', + 431221: '中方县', + 431222: '沅陵县', + 431223: '辰溪县', + 431224: '溆浦县', + 431225: '会同县', + 431226: '麻阳苗族自治县', + 431227: '新晃侗族自治县', + 431228: '芷江侗族自治县', + 431229: '靖州苗族侗族自治县', + 431230: '通道侗族自治县', + 431281: '洪江市', + 431302: '娄星区', + 431321: '双峰县', + 431322: '新化县', + 431381: '冷水江市', + 431382: '涟源市', + 433101: '吉首市', + 433122: '泸溪县', + 433123: '凤凰县', + 433124: '花垣县', + 433125: '保靖县', + 433126: '古丈县', + 433127: '永顺县', + 433130: '龙山县', + 440103: '荔湾区', + 440104: '越秀区', + 440105: '海珠区', + 440106: '天河区', + 440111: '白云区', + 440112: '黄埔区', + 440113: '番禺区', + 440114: '花都区', + 440115: '南沙区', + 440117: '从化区', + 440118: '增城区', + 440203: '武江区', + 440204: '浈江区', + 440205: '曲江区', + 440222: '始兴县', + 440224: '仁化县', + 440229: '翁源县', + 440232: '乳源瑶族自治县', + 440233: '新丰县', + 440281: '乐昌市', + 440282: '南雄市', + 440303: '罗湖区', + 440304: '福田区', + 440305: '南山区', + 440306: '宝安区', + 440307: '龙岗区', + 440308: '盐田区', + 440309: '龙华区', + 440310: '坪山区', + 440402: '香洲区', + 440403: '斗门区', + 440404: '金湾区', + 440507: '龙湖区', + 440511: '金平区', + 440512: '濠江区', + 440513: '潮阳区', + 440514: '潮南区', + 440515: '澄海区', + 440523: '南澳县', + 440604: '禅城区', + 440605: '南海区', + 440606: '顺德区', + 440607: '三水区', + 440608: '高明区', + 440703: '蓬江区', + 440704: '江海区', + 440705: '新会区', + 440781: '台山市', + 440783: '开平市', + 440784: '鹤山市', + 440785: '恩平市', + 440802: '赤坎区', + 440803: '霞山区', + 440804: '坡头区', + 440811: '麻章区', + 440823: '遂溪县', + 440825: '徐闻县', + 440881: '廉江市', + 440882: '雷州市', + 440883: '吴川市', + 440890: '经济技术开发区', + 440902: '茂南区', + 440904: '电白区', + 440981: '高州市', + 440982: '化州市', + 440983: '信宜市', + 441202: '端州区', + 441203: '鼎湖区', + 441204: '高要区', + 441223: '广宁县', + 441224: '怀集县', + 441225: '封开县', + 441226: '德庆县', + 441284: '四会市', + 441302: '惠城区', + 441303: '惠阳区', + 441322: '博罗县', + 441323: '惠东县', + 441324: '龙门县', + 441402: '梅江区', + 441403: '梅县区', + 441422: '大埔县', + 441423: '丰顺县', + 441424: '五华县', + 441426: '平远县', + 441427: '蕉岭县', + 441481: '兴宁市', + 441502: '城区', + 441521: '海丰县', + 441523: '陆河县', + 441581: '陆丰市', + 441602: '源城区', + 441621: '紫金县', + 441622: '龙川县', + 441623: '连平县', + 441624: '和平县', + 441625: '东源县', + 441702: '江城区', + 441704: '阳东区', + 441721: '阳西县', + 441781: '阳春市', + 441802: '清城区', + 441803: '清新区', + 441821: '佛冈县', + 441823: '阳山县', + 441825: '连山壮族瑶族自治县', + 441826: '连南瑶族自治县', + 441881: '英德市', + 441882: '连州市', + 441901: '中堂镇', + 441903: '南城区', + 441904: '长安镇', + 441905: '东坑镇', + 441906: '樟木头镇', + 441907: '莞城区', + 441908: '石龙镇', + 441909: '桥头镇', + 441910: '万江区', + 441911: '麻涌镇', + 441912: '虎门镇', + 441913: '谢岗镇', + 441914: '石碣镇', + 441915: '茶山镇', + 441916: '东城区', + 441917: '洪梅镇', + 441918: '道滘镇', + 441919: '高埗镇', + 441920: '企石镇', + 441921: '凤岗镇', + 441922: '大岭山镇', + 441923: '松山湖', + 441924: '清溪镇', + 441925: '望牛墩镇', + 441926: '厚街镇', + 441927: '常平镇', + 441928: '寮步镇', + 441929: '石排镇', + 441930: '横沥镇', + 441931: '塘厦镇', + 441932: '黄江镇', + 441933: '大朗镇', + 441990: '沙田镇', + 442001: '南头镇', + 442002: '神湾镇', + 442003: '东凤镇', + 442004: '五桂山镇', + 442005: '黄圃镇', + 442006: '小榄镇', + 442007: '石岐区街道', + 442008: '横栏镇', + 442009: '三角镇', + 442010: '三乡镇', + 442011: '港口镇', + 442012: '沙溪镇', + 442013: '板芙镇', + 442014: '沙朗镇', + 442015: '东升镇', + 442016: '阜沙镇', + 442017: '民众镇', + 442018: '东区街道', + 442019: '火炬开发区', + 442020: '西区街道', + 442021: '南区街道', + 442022: '古镇', + 442023: '坦洲镇', + 442024: '大涌镇', + 442025: '南朗镇', + 445102: '湘桥区', + 445103: '潮安区', + 445122: '饶平县', + 445202: '榕城区', + 445203: '揭东区', + 445222: '揭西县', + 445224: '惠来县', + 445281: '普宁市', + 445302: '云城区', + 445303: '云安区', + 445321: '新兴县', + 445322: '郁南县', + 445381: '罗定市', + 450102: '兴宁区', + 450103: '青秀区', + 450105: '江南区', + 450107: '西乡塘区', + 450108: '良庆区', + 450109: '邕宁区', + 450110: '武鸣区', + 450123: '隆安县', + 450124: '马山县', + 450125: '上林县', + 450126: '宾阳县', + 450127: '横县', + 450202: '城中区', + 450203: '鱼峰区', + 450204: '柳南区', + 450205: '柳北区', + 450206: '柳江区', + 450222: '柳城县', + 450223: '鹿寨县', + 450224: '融安县', + 450225: '融水苗族自治县', + 450226: '三江侗族自治县', + 450302: '秀峰区', + 450303: '叠彩区', + 450304: '象山区', + 450305: '七星区', + 450311: '雁山区', + 450312: '临桂区', + 450321: '阳朔县', + 450323: '灵川县', + 450324: '全州县', + 450325: '兴安县', + 450326: '永福县', + 450327: '灌阳县', + 450328: '龙胜各族自治县', + 450329: '资源县', + 450330: '平乐县', + 450331: '荔浦县', + 450332: '恭城瑶族自治县', + 450403: '万秀区', + 450405: '长洲区', + 450406: '龙圩区', + 450421: '苍梧县', + 450422: '藤县', + 450423: '蒙山县', + 450481: '岑溪市', + 450502: '海城区', + 450503: '银海区', + 450512: '铁山港区', + 450521: '合浦县', + 450602: '港口区', + 450603: '防城区', + 450621: '上思县', + 450681: '东兴市', + 450702: '钦南区', + 450703: '钦北区', + 450721: '灵山县', + 450722: '浦北县', + 450802: '港北区', + 450803: '港南区', + 450804: '覃塘区', + 450821: '平南县', + 450881: '桂平市', + 450902: '玉州区', + 450903: '福绵区', + 450921: '容县', + 450922: '陆川县', + 450923: '博白县', + 450924: '兴业县', + 450981: '北流市', + 451002: '右江区', + 451021: '田阳县', + 451022: '田东县', + 451023: '平果县', + 451024: '德保县', + 451026: '那坡县', + 451027: '凌云县', + 451028: '乐业县', + 451029: '田林县', + 451030: '西林县', + 451031: '隆林各族自治县', + 451081: '靖西市', + 451102: '八步区', + 451103: '平桂区', + 451121: '昭平县', + 451122: '钟山县', + 451123: '富川瑶族自治县', + 451202: '金城江区', + 451203: '宜州区', + 451221: '南丹县', + 451222: '天峨县', + 451223: '凤山县', + 451224: '东兰县', + 451225: '罗城仫佬族自治县', + 451226: '环江毛南族自治县', + 451227: '巴马瑶族自治县', + 451228: '都安瑶族自治县', + 451229: '大化瑶族自治县', + 451302: '兴宾区', + 451321: '忻城县', + 451322: '象州县', + 451323: '武宣县', + 451324: '金秀瑶族自治县', + 451381: '合山市', + 451402: '江州区', + 451421: '扶绥县', + 451422: '宁明县', + 451423: '龙州县', + 451424: '大新县', + 451425: '天等县', + 451481: '凭祥市', + 460105: '秀英区', + 460106: '龙华区', + 460107: '琼山区', + 460108: '美兰区', + 460202: '海棠区', + 460203: '吉阳区', + 460204: '天涯区', + 460205: '崖州区', + 460321: '西沙群岛', + 460322: '南沙群岛', + 460323: '中沙群岛的岛礁及其海域', + 460401: '那大镇', + 460402: '和庆镇', + 460403: '南丰镇', + 460404: '大成镇', + 460405: '雅星镇', + 460406: '兰洋镇', + 460407: '光村镇', + 460408: '木棠镇', + 460409: '海头镇', + 460410: '峨蔓镇', + 460411: '王五镇', + 460412: '白马井镇', + 460413: '中和镇', + 460414: '排浦镇', + 460415: '东成镇', + 460416: '新州镇', + 469001: '五指山市', + 469002: '琼海市', + 469005: '文昌市', + 469006: '万宁市', + 469007: '东方市', + 469021: '定安县', + 469022: '屯昌县', + 469023: '澄迈县', + 469024: '临高县', + 469025: '白沙黎族自治县', + 469026: '昌江黎族自治县', + 469027: '乐东黎族自治县', + 469028: '陵水黎族自治县', + 469029: '保亭黎族苗族自治县', + 469030: '琼中黎族苗族自治县', + 500101: '万州区', + 500102: '涪陵区', + 500103: '渝中区', + 500104: '大渡口区', + 500105: '江北区', + 500106: '沙坪坝区', + 500107: '九龙坡区', + 500108: '南岸区', + 500109: '北碚区', + 500110: '綦江区', + 500111: '大足区', + 500112: '渝北区', + 500113: '巴南区', + 500114: '黔江区', + 500115: '长寿区', + 500116: '江津区', + 500117: '合川区', + 500118: '永川区', + 500119: '南川区', + 500120: '璧山区', + 500151: '铜梁区', + 500152: '潼南区', + 500153: '荣昌区', + 500154: '开州区', + 500155: '梁平区', + 500156: '武隆区', + 500229: '城口县', + 500230: '丰都县', + 500231: '垫江县', + 500233: '忠县', + 500235: '云阳县', + 500236: '奉节县', + 500237: '巫山县', + 500238: '巫溪县', + 500240: '石柱土家族自治县', + 500241: '秀山土家族苗族自治县', + 500242: '酉阳土家族苗族自治县', + 500243: '彭水苗族土家族自治县', + 510104: '锦江区', + 510105: '青羊区', + 510106: '金牛区', + 510107: '武侯区', + 510108: '成华区', + 510112: '龙泉驿区', + 510113: '青白江区', + 510114: '新都区', + 510115: '温江区', + 510116: '双流区', + 510117: '郫都区', + 510121: '金堂县', + 510129: '大邑县', + 510131: '蒲江县', + 510132: '新津县', + 510181: '都江堰市', + 510182: '彭州市', + 510183: '邛崃市', + 510184: '崇州市', + 510185: '简阳市', + 510191: '高新区', + 510302: '自流井区', + 510303: '贡井区', + 510304: '大安区', + 510311: '沿滩区', + 510321: '荣县', + 510322: '富顺县', + 510402: '东区', + 510403: '西区', + 510411: '仁和区', + 510421: '米易县', + 510422: '盐边县', + 510502: '江阳区', + 510503: '纳溪区', + 510504: '龙马潭区', + 510521: '泸县', + 510522: '合江县', + 510524: '叙永县', + 510525: '古蔺县', + 510603: '旌阳区', + 510604: '罗江区', + 510623: '中江县', + 510681: '广汉市', + 510682: '什邡市', + 510683: '绵竹市', + 510703: '涪城区', + 510704: '游仙区', + 510705: '安州区', + 510722: '三台县', + 510723: '盐亭县', + 510725: '梓潼县', + 510726: '北川羌族自治县', + 510727: '平武县', + 510781: '江油市', + 510791: '高新区', + 510802: '利州区', + 510811: '昭化区', + 510812: '朝天区', + 510821: '旺苍县', + 510822: '青川县', + 510823: '剑阁县', + 510824: '苍溪县', + 510903: '船山区', + 510904: '安居区', + 510921: '蓬溪县', + 510922: '射洪县', + 510923: '大英县', + 511002: '市中区', + 511011: '东兴区', + 511024: '威远县', + 511025: '资中县', + 511083: '隆昌市', + 511102: '市中区', + 511111: '沙湾区', + 511112: '五通桥区', + 511113: '金口河区', + 511123: '犍为县', + 511124: '井研县', + 511126: '夹江县', + 511129: '沐川县', + 511132: '峨边彝族自治县', + 511133: '马边彝族自治县', + 511181: '峨眉山市', + 511302: '顺庆区', + 511303: '高坪区', + 511304: '嘉陵区', + 511321: '南部县', + 511322: '营山县', + 511323: '蓬安县', + 511324: '仪陇县', + 511325: '西充县', + 511381: '阆中市', + 511402: '东坡区', + 511403: '彭山区', + 511421: '仁寿县', + 511423: '洪雅县', + 511424: '丹棱县', + 511425: '青神县', + 511502: '翠屏区', + 511503: '南溪区', + 511521: '宜宾县', + 511523: '江安县', + 511524: '长宁县', + 511525: '高县', + 511526: '珙县', + 511527: '筠连县', + 511528: '兴文县', + 511529: '屏山县', + 511602: '广安区', + 511603: '前锋区', + 511621: '岳池县', + 511622: '武胜县', + 511623: '邻水县', + 511681: '华蓥市', + 511702: '通川区', + 511703: '达川区', + 511722: '宣汉县', + 511723: '开江县', + 511724: '大竹县', + 511725: '渠县', + 511781: '万源市', + 511802: '雨城区', + 511803: '名山区', + 511822: '荥经县', + 511823: '汉源县', + 511824: '石棉县', + 511825: '天全县', + 511826: '芦山县', + 511827: '宝兴县', + 511902: '巴州区', + 511903: '恩阳区', + 511921: '通江县', + 511922: '南江县', + 511923: '平昌县', + 512002: '雁江区', + 512021: '安岳县', + 512022: '乐至县', + 513201: '马尔康市', + 513221: '汶川县', + 513222: '理县', + 513223: '茂县', + 513224: '松潘县', + 513225: '九寨沟县', + 513226: '金川县', + 513227: '小金县', + 513228: '黑水县', + 513230: '壤塘县', + 513231: '阿坝县', + 513232: '若尔盖县', + 513233: '红原县', + 513301: '康定市', + 513322: '泸定县', + 513323: '丹巴县', + 513324: '九龙县', + 513325: '雅江县', + 513326: '道孚县', + 513327: '炉霍县', + 513328: '甘孜县', + 513329: '新龙县', + 513330: '德格县', + 513331: '白玉县', + 513332: '石渠县', + 513333: '色达县', + 513334: '理塘县', + 513335: '巴塘县', + 513336: '乡城县', + 513337: '稻城县', + 513338: '得荣县', + 513401: '西昌市', + 513422: '木里藏族自治县', + 513423: '盐源县', + 513424: '德昌县', + 513425: '会理县', + 513426: '会东县', + 513427: '宁南县', + 513428: '普格县', + 513429: '布拖县', + 513430: '金阳县', + 513431: '昭觉县', + 513432: '喜德县', + 513433: '冕宁县', + 513434: '越西县', + 513435: '甘洛县', + 513436: '美姑县', + 513437: '雷波县', + 520102: '南明区', + 520103: '云岩区', + 520111: '花溪区', + 520112: '乌当区', + 520113: '白云区', + 520115: '观山湖区', + 520121: '开阳县', + 520122: '息烽县', + 520123: '修文县', + 520181: '清镇市', + 520201: '钟山区', + 520203: '六枝特区', + 520221: '水城县', + 520281: '盘州市', + 520302: '红花岗区', + 520303: '汇川区', + 520304: '播州区', + 520322: '桐梓县', + 520323: '绥阳县', + 520324: '正安县', + 520325: '道真仡佬族苗族自治县', + 520326: '务川仡佬族苗族自治县', + 520327: '凤冈县', + 520328: '湄潭县', + 520329: '余庆县', + 520330: '习水县', + 520381: '赤水市', + 520382: '仁怀市', + 520402: '西秀区', + 520403: '平坝区', + 520422: '普定县', + 520423: '镇宁布依族苗族自治县', + 520424: '关岭布依族苗族自治县', + 520425: '紫云苗族布依族自治县', + 520502: '七星关区', + 520521: '大方县', + 520522: '黔西县', + 520523: '金沙县', + 520524: '织金县', + 520525: '纳雍县', + 520526: '威宁彝族回族苗族自治县', + 520527: '赫章县', + 520602: '碧江区', + 520603: '万山区', + 520621: '江口县', + 520622: '玉屏侗族自治县', + 520623: '石阡县', + 520624: '思南县', + 520625: '印江土家族苗族自治县', + 520626: '德江县', + 520627: '沿河土家族自治县', + 520628: '松桃苗族自治县', + 522301: '兴义市', + 522322: '兴仁县', + 522323: '普安县', + 522324: '晴隆县', + 522325: '贞丰县', + 522326: '望谟县', + 522327: '册亨县', + 522328: '安龙县', + 522601: '凯里市', + 522622: '黄平县', + 522623: '施秉县', + 522624: '三穗县', + 522625: '镇远县', + 522626: '岑巩县', + 522627: '天柱县', + 522628: '锦屏县', + 522629: '剑河县', + 522630: '台江县', + 522631: '黎平县', + 522632: '榕江县', + 522633: '从江县', + 522634: '雷山县', + 522635: '麻江县', + 522636: '丹寨县', + 522701: '都匀市', + 522702: '福泉市', + 522722: '荔波县', + 522723: '贵定县', + 522725: '瓮安县', + 522726: '独山县', + 522727: '平塘县', + 522728: '罗甸县', + 522729: '长顺县', + 522730: '龙里县', + 522731: '惠水县', + 522732: '三都水族自治县', + 530102: '五华区', + 530103: '盘龙区', + 530111: '官渡区', + 530112: '西山区', + 530113: '东川区', + 530114: '呈贡区', + 530115: '晋宁区', + 530124: '富民县', + 530125: '宜良县', + 530126: '石林彝族自治县', + 530127: '嵩明县', + 530128: '禄劝彝族苗族自治县', + 530129: '寻甸回族彝族自治县', + 530181: '安宁市', + 530302: '麒麟区', + 530303: '沾益区', + 530321: '马龙县', + 530322: '陆良县', + 530323: '师宗县', + 530324: '罗平县', + 530325: '富源县', + 530326: '会泽县', + 530381: '宣威市', + 530402: '红塔区', + 530403: '江川区', + 530422: '澄江县', + 530423: '通海县', + 530424: '华宁县', + 530425: '易门县', + 530426: '峨山彝族自治县', + 530427: '新平彝族傣族自治县', + 530428: '元江哈尼族彝族傣族自治县', + 530502: '隆阳区', + 530521: '施甸县', + 530523: '龙陵县', + 530524: '昌宁县', + 530581: '腾冲市', + 530602: '昭阳区', + 530621: '鲁甸县', + 530622: '巧家县', + 530623: '盐津县', + 530624: '大关县', + 530625: '永善县', + 530626: '绥江县', + 530627: '镇雄县', + 530628: '彝良县', + 530629: '威信县', + 530630: '水富县', + 530702: '古城区', + 530721: '玉龙纳西族自治县', + 530722: '永胜县', + 530723: '华坪县', + 530724: '宁蒗彝族自治县', + 530802: '思茅区', + 530821: '宁洱哈尼族彝族自治县', + 530822: '墨江哈尼族自治县', + 530823: '景东彝族自治县', + 530824: '景谷傣族彝族自治县', + 530825: '镇沅彝族哈尼族拉祜族自治县', + 530826: '江城哈尼族彝族自治县', + 530827: '孟连傣族拉祜族佤族自治县', + 530828: '澜沧拉祜族自治县', + 530829: '西盟佤族自治县', + 530902: '临翔区', + 530921: '凤庆县', + 530922: '云县', + 530923: '永德县', + 530924: '镇康县', + 530925: '双江拉祜族佤族布朗族傣族自治县', + 530926: '耿马傣族佤族自治县', + 530927: '沧源佤族自治县', + 532301: '楚雄市', + 532322: '双柏县', + 532323: '牟定县', + 532324: '南华县', + 532325: '姚安县', + 532326: '大姚县', + 532327: '永仁县', + 532328: '元谋县', + 532329: '武定县', + 532331: '禄丰县', + 532501: '个旧市', + 532502: '开远市', + 532503: '蒙自市', + 532504: '弥勒市', + 532523: '屏边苗族自治县', + 532524: '建水县', + 532525: '石屏县', + 532527: '泸西县', + 532528: '元阳县', + 532529: '红河县', + 532530: '金平苗族瑶族傣族自治县', + 532531: '绿春县', + 532532: '河口瑶族自治县', + 532601: '文山市', + 532622: '砚山县', + 532623: '西畴县', + 532624: '麻栗坡县', + 532625: '马关县', + 532626: '丘北县', + 532627: '广南县', + 532628: '富宁县', + 532801: '景洪市', + 532822: '勐海县', + 532823: '勐腊县', + 532901: '大理市', + 532922: '漾濞彝族自治县', + 532923: '祥云县', + 532924: '宾川县', + 532925: '弥渡县', + 532926: '南涧彝族自治县', + 532927: '巍山彝族回族自治县', + 532928: '永平县', + 532929: '云龙县', + 532930: '洱源县', + 532931: '剑川县', + 532932: '鹤庆县', + 533102: '瑞丽市', + 533103: '芒市', + 533122: '梁河县', + 533123: '盈江县', + 533124: '陇川县', + 533301: '泸水市', + 533323: '福贡县', + 533324: '贡山独龙族怒族自治县', + 533325: '兰坪白族普米族自治县', + 533401: '香格里拉市', + 533422: '德钦县', + 533423: '维西傈僳族自治县', + 540102: '城关区', + 540103: '堆龙德庆区', + 540104: '达孜区', + 540121: '林周县', + 540122: '当雄县', + 540123: '尼木县', + 540124: '曲水县', + 540127: '墨竹工卡县', + 540202: '桑珠孜区', + 540221: '南木林县', + 540222: '江孜县', + 540223: '定日县', + 540224: '萨迦县', + 540225: '拉孜县', + 540226: '昂仁县', + 540227: '谢通门县', + 540228: '白朗县', + 540229: '仁布县', + 540230: '康马县', + 540231: '定结县', + 540232: '仲巴县', + 540233: '亚东县', + 540234: '吉隆县', + 540235: '聂拉木县', + 540236: '萨嘎县', + 540237: '岗巴县', + 540302: '卡若区', + 540321: '江达县', + 540322: '贡觉县', + 540323: '类乌齐县', + 540324: '丁青县', + 540325: '察雅县', + 540326: '八宿县', + 540327: '左贡县', + 540328: '芒康县', + 540329: '洛隆县', + 540330: '边坝县', + 540402: '巴宜区', + 540421: '工布江达县', + 540422: '米林县', + 540423: '墨脱县', + 540424: '波密县', + 540425: '察隅县', + 540426: '朗县', + 540502: '乃东区', + 540521: '扎囊县', + 540522: '贡嘎县', + 540523: '桑日县', + 540524: '琼结县', + 540525: '曲松县', + 540526: '措美县', + 540527: '洛扎县', + 540528: '加查县', + 540529: '隆子县', + 540530: '错那县', + 540531: '浪卡子县', + 540602: '色尼区', + 542421: '那曲县', + 542422: '嘉黎县', + 542423: '比如县', + 542424: '聂荣县', + 542425: '安多县', + 542426: '申扎县', + 542427: '索县', + 542428: '班戈县', + 542429: '巴青县', + 542430: '尼玛县', + 542431: '双湖县', + 542521: '普兰县', + 542522: '札达县', + 542523: '噶尔县', + 542524: '日土县', + 542525: '革吉县', + 542526: '改则县', + 542527: '措勤县', + 610102: '新城区', + 610103: '碑林区', + 610104: '莲湖区', + 610111: '灞桥区', + 610112: '未央区', + 610113: '雁塔区', + 610114: '阎良区', + 610115: '临潼区', + 610116: '长安区', + 610117: '高陵区', + 610118: '鄠邑区', + 610122: '蓝田县', + 610124: '周至县', + 610202: '王益区', + 610203: '印台区', + 610204: '耀州区', + 610222: '宜君县', + 610302: '渭滨区', + 610303: '金台区', + 610304: '陈仓区', + 610322: '凤翔县', + 610323: '岐山县', + 610324: '扶风县', + 610326: '眉县', + 610327: '陇县', + 610328: '千阳县', + 610329: '麟游县', + 610330: '凤县', + 610331: '太白县', + 610402: '秦都区', + 610403: '杨陵区', + 610404: '渭城区', + 610422: '三原县', + 610423: '泾阳县', + 610424: '乾县', + 610425: '礼泉县', + 610426: '永寿县', + 610427: '彬县', + 610428: '长武县', + 610429: '旬邑县', + 610430: '淳化县', + 610431: '武功县', + 610481: '兴平市', + 610502: '临渭区', + 610503: '华州区', + 610522: '潼关县', + 610523: '大荔县', + 610524: '合阳县', + 610525: '澄城县', + 610526: '蒲城县', + 610527: '白水县', + 610528: '富平县', + 610581: '韩城市', + 610582: '华阴市', + 610602: '宝塔区', + 610603: '安塞区', + 610621: '延长县', + 610622: '延川县', + 610623: '子长县', + 610625: '志丹县', + 610626: '吴起县', + 610627: '甘泉县', + 610628: '富县', + 610629: '洛川县', + 610630: '宜川县', + 610631: '黄龙县', + 610632: '黄陵县', + 610702: '汉台区', + 610703: '南郑区', + 610722: '城固县', + 610723: '洋县', + 610724: '西乡县', + 610725: '勉县', + 610726: '宁强县', + 610727: '略阳县', + 610728: '镇巴县', + 610729: '留坝县', + 610730: '佛坪县', + 610802: '榆阳区', + 610803: '横山区', + 610822: '府谷县', + 610824: '靖边县', + 610825: '定边县', + 610826: '绥德县', + 610827: '米脂县', + 610828: '佳县', + 610829: '吴堡县', + 610830: '清涧县', + 610831: '子洲县', + 610881: '神木市', + 610902: '汉滨区', + 610921: '汉阴县', + 610922: '石泉县', + 610923: '宁陕县', + 610924: '紫阳县', + 610925: '岚皋县', + 610926: '平利县', + 610927: '镇坪县', + 610928: '旬阳县', + 610929: '白河县', + 611002: '商州区', + 611021: '洛南县', + 611022: '丹凤县', + 611023: '商南县', + 611024: '山阳县', + 611025: '镇安县', + 611026: '柞水县', + 620102: '城关区', + 620103: '七里河区', + 620104: '西固区', + 620105: '安宁区', + 620111: '红古区', + 620121: '永登县', + 620122: '皋兰县', + 620123: '榆中县', + 620201: '市辖区', + 620290: '雄关区', + 620291: '长城区', + 620292: '镜铁区', + 620293: '新城镇', + 620294: '峪泉镇', + 620295: '文殊镇', + 620302: '金川区', + 620321: '永昌县', + 620402: '白银区', + 620403: '平川区', + 620421: '靖远县', + 620422: '会宁县', + 620423: '景泰县', + 620502: '秦州区', + 620503: '麦积区', + 620521: '清水县', + 620522: '秦安县', + 620523: '甘谷县', + 620524: '武山县', + 620525: '张家川回族自治县', + 620602: '凉州区', + 620621: '民勤县', + 620622: '古浪县', + 620623: '天祝藏族自治县', + 620702: '甘州区', + 620721: '肃南裕固族自治县', + 620722: '民乐县', + 620723: '临泽县', + 620724: '高台县', + 620725: '山丹县', + 620802: '崆峒区', + 620821: '泾川县', + 620822: '灵台县', + 620823: '崇信县', + 620824: '华亭县', + 620825: '庄浪县', + 620826: '静宁县', + 620902: '肃州区', + 620921: '金塔县', + 620922: '瓜州县', + 620923: '肃北蒙古族自治县', + 620924: '阿克塞哈萨克族自治县', + 620981: '玉门市', + 620982: '敦煌市', + 621002: '西峰区', + 621021: '庆城县', + 621022: '环县', + 621023: '华池县', + 621024: '合水县', + 621025: '正宁县', + 621026: '宁县', + 621027: '镇原县', + 621102: '安定区', + 621121: '通渭县', + 621122: '陇西县', + 621123: '渭源县', + 621124: '临洮县', + 621125: '漳县', + 621126: '岷县', + 621202: '武都区', + 621221: '成县', + 621222: '文县', + 621223: '宕昌县', + 621224: '康县', + 621225: '西和县', + 621226: '礼县', + 621227: '徽县', + 621228: '两当县', + 622901: '临夏市', + 622921: '临夏县', + 622922: '康乐县', + 622923: '永靖县', + 622924: '广河县', + 622925: '和政县', + 622926: '东乡族自治县', + 622927: '积石山保安族东乡族撒拉族自治县', + 623001: '合作市', + 623021: '临潭县', + 623022: '卓尼县', + 623023: '舟曲县', + 623024: '迭部县', + 623025: '玛曲县', + 623026: '碌曲县', + 623027: '夏河县', + 630102: '城东区', + 630103: '城中区', + 630104: '城西区', + 630105: '城北区', + 630121: '大通回族土族自治县', + 630122: '湟中县', + 630123: '湟源县', + 630202: '乐都区', + 630203: '平安区', + 630222: '民和回族土族自治县', + 630223: '互助土族自治县', + 630224: '化隆回族自治县', + 630225: '循化撒拉族自治县', + 632221: '门源回族自治县', + 632222: '祁连县', + 632223: '海晏县', + 632224: '刚察县', + 632321: '同仁县', + 632322: '尖扎县', + 632323: '泽库县', + 632324: '河南蒙古族自治县', + 632521: '共和县', + 632522: '同德县', + 632523: '贵德县', + 632524: '兴海县', + 632525: '贵南县', + 632621: '玛沁县', + 632622: '班玛县', + 632623: '甘德县', + 632624: '达日县', + 632625: '久治县', + 632626: '玛多县', + 632701: '玉树市', + 632722: '杂多县', + 632723: '称多县', + 632724: '治多县', + 632725: '囊谦县', + 632726: '曲麻莱县', + 632801: '格尔木市', + 632802: '德令哈市', + 632821: '乌兰县', + 632822: '都兰县', + 632823: '天峻县', + 640104: '兴庆区', + 640105: '西夏区', + 640106: '金凤区', + 640121: '永宁县', + 640122: '贺兰县', + 640181: '灵武市', + 640202: '大武口区', + 640205: '惠农区', + 640221: '平罗县', + 640302: '利通区', + 640303: '红寺堡区', + 640323: '盐池县', + 640324: '同心县', + 640381: '青铜峡市', + 640402: '原州区', + 640422: '西吉县', + 640423: '隆德县', + 640424: '泾源县', + 640425: '彭阳县', + 640502: '沙坡头区', + 640521: '中宁县', + 640522: '海原县', + 650102: '天山区', + 650103: '沙依巴克区', + 650104: '新市区', + 650105: '水磨沟区', + 650106: '头屯河区', + 650107: '达坂城区', + 650109: '米东区', + 650121: '乌鲁木齐县', + 650202: '独山子区', + 650203: '克拉玛依区', + 650204: '白碱滩区', + 650205: '乌尔禾区', + 650402: '高昌区', + 650421: '鄯善县', + 650422: '托克逊县', + 650502: '伊州区', + 650521: '巴里坤哈萨克自治县', + 650522: '伊吾县', + 652301: '昌吉市', + 652302: '阜康市', + 652323: '呼图壁县', + 652324: '玛纳斯县', + 652325: '奇台县', + 652327: '吉木萨尔县', + 652328: '木垒哈萨克自治县', + 652701: '博乐市', + 652702: '阿拉山口市', + 652722: '精河县', + 652723: '温泉县', + 652801: '库尔勒市', + 652822: '轮台县', + 652823: '尉犁县', + 652824: '若羌县', + 652825: '且末县', + 652826: '焉耆回族自治县', + 652827: '和静县', + 652828: '和硕县', + 652829: '博湖县', + 652901: '阿克苏市', + 652922: '温宿县', + 652923: '库车县', + 652924: '沙雅县', + 652925: '新和县', + 652926: '拜城县', + 652927: '乌什县', + 652928: '阿瓦提县', + 652929: '柯坪县', + 653001: '阿图什市', + 653022: '阿克陶县', + 653023: '阿合奇县', + 653024: '乌恰县', + 653101: '喀什市', + 653121: '疏附县', + 653122: '疏勒县', + 653123: '英吉沙县', + 653124: '泽普县', + 653125: '莎车县', + 653126: '叶城县', + 653127: '麦盖提县', + 653128: '岳普湖县', + 653129: '伽师县', + 653130: '巴楚县', + 653131: '塔什库尔干塔吉克自治县', + 653201: '和田市', + 653221: '和田县', + 653222: '墨玉县', + 653223: '皮山县', + 653224: '洛浦县', + 653225: '策勒县', + 653226: '于田县', + 653227: '民丰县', + 654002: '伊宁市', + 654003: '奎屯市', + 654004: '霍尔果斯市', + 654021: '伊宁县', + 654022: '察布查尔锡伯自治县', + 654023: '霍城县', + 654024: '巩留县', + 654025: '新源县', + 654026: '昭苏县', + 654027: '特克斯县', + 654028: '尼勒克县', + 654201: '塔城市', + 654202: '乌苏市', + 654221: '额敏县', + 654223: '沙湾县', + 654224: '托里县', + 654225: '裕民县', + 654226: '和布克赛尔蒙古自治县', + 654301: '阿勒泰市', + 654321: '布尔津县', + 654322: '富蕴县', + 654323: '福海县', + 654324: '哈巴河县', + 654325: '青河县', + 654326: '吉木乃县', + 659001: '石河子市', + 659002: '阿拉尔市', + 659003: '图木舒克市', + 659004: '五家渠市', + 659005: '北屯市', + 659006: '铁门关市', + 659007: '双河市', + 659008: '可克达拉市', + 659009: '昆玉市', + 710101: '中正区', + 710102: '大同区', + 710103: '中山区', + 710104: '松山区', + 710105: '大安区', + 710106: '万华区', + 710107: '信义区', + 710108: '士林区', + 710109: '北投区', + 710110: '内湖区', + 710111: '南港区', + 710112: '文山区', + 710199: '其它区', + 710201: '新兴区', + 710202: '前金区', + 710203: '芩雅区', + 710204: '盐埕区', + 710205: '鼓山区', + 710206: '旗津区', + 710207: '前镇区', + 710208: '三民区', + 710209: '左营区', + 710210: '楠梓区', + 710211: '小港区', + 710241: '苓雅区', + 710242: '仁武区', + 710243: '大社区', + 710244: '冈山区', + 710245: '路竹区', + 710246: '阿莲区', + 710247: '田寮区', + 710248: '燕巢区', + 710249: '桥头区', + 710250: '梓官区', + 710251: '弥陀区', + 710252: '永安区', + 710253: '湖内区', + 710254: '凤山区', + 710255: '大寮区', + 710256: '林园区', + 710257: '鸟松区', + 710258: '大树区', + 710259: '旗山区', + 710260: '美浓区', + 710261: '六龟区', + 710262: '内门区', + 710263: '杉林区', + 710264: '甲仙区', + 710265: '桃源区', + 710266: '那玛夏区', + 710267: '茂林区', + 710268: '茄萣区', + 710299: '其它区', + 710301: '中西区', + 710302: '东区', + 710303: '南区', + 710304: '北区', + 710305: '安平区', + 710306: '安南区', + 710339: '永康区', + 710340: '归仁区', + 710341: '新化区', + 710342: '左镇区', + 710343: '玉井区', + 710344: '楠西区', + 710345: '南化区', + 710346: '仁德区', + 710347: '关庙区', + 710348: '龙崎区', + 710349: '官田区', + 710350: '麻豆区', + 710351: '佳里区', + 710352: '西港区', + 710353: '七股区', + 710354: '将军区', + 710355: '学甲区', + 710356: '北门区', + 710357: '新营区', + 710358: '后壁区', + 710359: '白河区', + 710360: '东山区', + 710361: '六甲区', + 710362: '下营区', + 710363: '柳营区', + 710364: '盐水区', + 710365: '善化区', + 710366: '大内区', + 710367: '山上区', + 710368: '新市区', + 710369: '安定区', + 710399: '其它区', + 710401: '中区', + 710402: '东区', + 710403: '南区', + 710404: '西区', + 710405: '北区', + 710406: '北屯区', + 710407: '西屯区', + 710408: '南屯区', + 710431: '太平区', + 710432: '大里区', + 710433: '雾峰区', + 710434: '乌日区', + 710435: '丰原区', + 710436: '后里区', + 710437: '石冈区', + 710438: '东势区', + 710439: '和平区', + 710440: '新社区', + 710441: '潭子区', + 710442: '大雅区', + 710443: '神冈区', + 710444: '大肚区', + 710445: '沙鹿区', + 710446: '龙井区', + 710447: '梧栖区', + 710448: '清水区', + 710449: '大甲区', + 710450: '外埔区', + 710451: '大安区', + 710499: '其它区', + 710507: '金沙镇', + 710508: '金湖镇', + 710509: '金宁乡', + 710510: '金城镇', + 710511: '烈屿乡', + 710512: '乌坵乡', + 710614: '南投市', + 710615: '中寮乡', + 710616: '草屯镇', + 710617: '国姓乡', + 710618: '埔里镇', + 710619: '仁爱乡', + 710620: '名间乡', + 710621: '集集镇', + 710622: '水里乡', + 710623: '鱼池乡', + 710624: '信义乡', + 710625: '竹山镇', + 710626: '鹿谷乡', + 710701: '仁爱区', + 710702: '信义区', + 710703: '中正区', + 710704: '中山区', + 710705: '安乐区', + 710706: '暖暖区', + 710707: '七堵区', + 710799: '其它区', + 710801: '东区', + 710802: '北区', + 710803: '香山区', + 710899: '其它区', + 710901: '东区', + 710902: '西区', + 710999: '其它区', + 711130: '万里区', + 711132: '板桥区', + 711133: '汐止区', + 711134: '深坑区', + 711136: '瑞芳区', + 711137: '平溪区', + 711138: '双溪区', + 711140: '新店区', + 711141: '坪林区', + 711142: '乌来区', + 711143: '永和区', + 711144: '中和区', + 711145: '土城区', + 711146: '三峡区', + 711147: '树林区', + 711149: '三重区', + 711150: '新庄区', + 711151: '泰山区', + 711152: '林口区', + 711154: '五股区', + 711155: '八里区', + 711156: '淡水区', + 711157: '三芝区', + 711287: '宜兰市', + 711288: '头城镇', + 711289: '礁溪乡', + 711290: '壮围乡', + 711291: '员山乡', + 711292: '罗东镇', + 711293: '三星乡', + 711294: '大同乡', + 711295: '五结乡', + 711296: '冬山乡', + 711297: '苏澳镇', + 711298: '南澳乡', + 711299: '钓鱼台', + 711387: '竹北市', + 711388: '湖口乡', + 711389: '新丰乡', + 711390: '新埔镇', + 711391: '关西镇', + 711392: '芎林乡', + 711393: '宝山乡', + 711394: '竹东镇', + 711395: '五峰乡', + 711396: '横山乡', + 711397: '尖石乡', + 711398: '北埔乡', + 711399: '峨眉乡', + 711487: '中坜市', + 711488: '平镇市', + 711489: '龙潭乡', + 711490: '杨梅市', + 711491: '新屋乡', + 711492: '观音乡', + 711493: '桃园市', + 711494: '龟山乡', + 711495: '八德市', + 711496: '大溪镇', + 711497: '复兴乡', + 711498: '大园乡', + 711499: '芦竹乡', + 711582: '竹南镇', + 711583: '头份镇', + 711584: '三湾乡', + 711585: '南庄乡', + 711586: '狮潭乡', + 711587: '后龙镇', + 711588: '通霄镇', + 711589: '苑里镇', + 711590: '苗栗市', + 711591: '造桥乡', + 711592: '头屋乡', + 711593: '公馆乡', + 711594: '大湖乡', + 711595: '泰安乡', + 711596: '铜锣乡', + 711597: '三义乡', + 711598: '西湖乡', + 711599: '卓兰镇', + 711774: '彰化市', + 711775: '芬园乡', + 711776: '花坛乡', + 711777: '秀水乡', + 711778: '鹿港镇', + 711779: '福兴乡', + 711780: '线西乡', + 711781: '和美镇', + 711782: '伸港乡', + 711783: '员林镇', + 711784: '社头乡', + 711785: '永靖乡', + 711786: '埔心乡', + 711787: '溪湖镇', + 711788: '大村乡', + 711789: '埔盐乡', + 711790: '田中镇', + 711791: '北斗镇', + 711792: '田尾乡', + 711793: '埤头乡', + 711794: '溪州乡', + 711795: '竹塘乡', + 711796: '二林镇', + 711797: '大城乡', + 711798: '芳苑乡', + 711799: '二水乡', + 711982: '番路乡', + 711983: '梅山乡', + 711984: '竹崎乡', + 711985: '阿里山乡', + 711986: '中埔乡', + 711987: '大埔乡', + 711988: '水上乡', + 711989: '鹿草乡', + 711990: '太保市', + 711991: '朴子市', + 711992: '东石乡', + 711993: '六脚乡', + 711994: '新港乡', + 711995: '民雄乡', + 711996: '大林镇', + 711997: '溪口乡', + 711998: '义竹乡', + 711999: '布袋镇', + 712180: '斗南镇', + 712181: '大埤乡', + 712182: '虎尾镇', + 712183: '土库镇', + 712184: '褒忠乡', + 712185: '东势乡', + 712186: '台西乡', + 712187: '仑背乡', + 712188: '麦寮乡', + 712189: '斗六市', + 712190: '林内乡', + 712191: '古坑乡', + 712192: '莿桐乡', + 712193: '西螺镇', + 712194: '二仑乡', + 712195: '北港镇', + 712196: '水林乡', + 712197: '口湖乡', + 712198: '四湖乡', + 712199: '元长乡', + 712467: '屏东市', + 712468: '三地门乡', + 712469: '雾台乡', + 712470: '玛家乡', + 712471: '九如乡', + 712472: '里港乡', + 712473: '高树乡', + 712474: '盐埔乡', + 712475: '长治乡', + 712476: '麟洛乡', + 712477: '竹田乡', + 712478: '内埔乡', + 712479: '万丹乡', + 712480: '潮州镇', + 712481: '泰武乡', + 712482: '来义乡', + 712483: '万峦乡', + 712484: '莰顶乡', + 712485: '新埤乡', + 712486: '南州乡', + 712487: '林边乡', + 712488: '东港镇', + 712489: '琉球乡', + 712490: '佳冬乡', + 712491: '新园乡', + 712492: '枋寮乡', + 712493: '枋山乡', + 712494: '春日乡', + 712495: '狮子乡', + 712496: '车城乡', + 712497: '牡丹乡', + 712498: '恒春镇', + 712499: '满州乡', + 712584: '台东市', + 712585: '绿岛乡', + 712586: '兰屿乡', + 712587: '延平乡', + 712588: '卑南乡', + 712589: '鹿野乡', + 712590: '关山镇', + 712591: '海端乡', + 712592: '池上乡', + 712593: '东河乡', + 712594: '成功镇', + 712595: '长滨乡', + 712596: '金峰乡', + 712597: '大武乡', + 712598: '达仁乡', + 712599: '太麻里乡', + 712686: '花莲市', + 712687: '新城乡', + 712688: '太鲁阁', + 712689: '秀林乡', + 712690: '吉安乡', + 712691: '寿丰乡', + 712692: '凤林镇', + 712693: '光复乡', + 712694: '丰滨乡', + 712695: '瑞穗乡', + 712696: '万荣乡', + 712697: '玉里镇', + 712698: '卓溪乡', + 712699: '富里乡', + 712794: '马公市', + 712795: '西屿乡', + 712796: '望安乡', + 712797: '七美乡', + 712798: '白沙乡', + 712799: '湖西乡', + 712896: '南竿乡', + 712897: '北竿乡', + 712898: '东引乡', + 712899: '莒光乡', + 810101: '中西区', + 810102: '湾仔', + 810103: '东区', + 810104: '南区', + 810201: '九龙城区', + 810202: '油尖旺区', + 810203: '深水埗区', + 810204: '黄大仙区', + 810205: '观塘区', + 810301: '北区', + 810302: '大埔区', + 810303: '沙田区', + 810304: '西贡区', + 810305: '元朗区', + 810306: '屯门区', + 810307: '荃湾区', + 810308: '葵青区', + 810309: '离岛区', + 820101: '澳门半岛', + 820201: '离岛' + } + }; + + + Class.prototype.config = { + elem: '', + data: { + province: '', + city: '', + county: '', + provinceCode: 0, + cityCode: 0, + countyCode: 0, + }, + change: function(result){} + }; + + Class.prototype.index = 0; + + Class.prototype.render = function () { + let that = this, options = that.config; + options.elem = $(options.elem); + + that.events(); + }; + + Class.prototype.reload = function (op) { + let options = this.config; + options.data = $.extend(options.data, op.data || {}); + this.events(true); + }; + + Class.prototype.events = function (reload = false) { + let that = this, options = that.config; + let provinceFilter = 'province-' + layarea._id; + let cityFilter = 'city-' + layarea._id; + let countyFilter = 'county-' + layarea._id; + + let provinceEl = options.elem.find('.province-selector'); + let cityEl = options.elem.find('.city-selector'); + let countyEl = options.elem.find('.county-selector'); + + if (reload){ + options.data.provinceCode = getCode('province', options.data.province); + let code = getCode('city', options.data.city, options.data.provinceCode.slice(0, 2)); + options.data.cityCode = code; + options.data.countyCode = getCode('county', options.data.county, options.data.cityCode.slice(0, 4)); + renderProvince(); + return; + } + //filter + if(provinceEl.attr('lay-filter')){ + provinceFilter = provinceEl.attr('lay-filter'); + } + if(cityEl.attr('lay-filter')){ + cityFilter = cityEl.attr('lay-filter'); + } + if(countyEl.attr('lay-filter')){ + countyFilter = countyEl.attr('lay-filter'); + } + provinceEl.attr('lay-filter', provinceFilter); + cityEl.attr('lay-filter', cityFilter); + countyEl.attr('lay-filter', countyFilter); + + //获取默认值 + if(provinceEl.data('value')){ + options.data.province = provinceEl.data('value'); + options.data.provinceCode = getCode('province', options.data.province); + } else if (!options.data.province) { + options.data.province = ''; + } + if(cityEl.data('value')){ + options.data.city = cityEl.data('value'); + let code = getCode('city', options.data.city, options.data.provinceCode.slice(0, 2)); + options.data.cityCode = code; + } else if (!options.data.city) { + options.data.city = ''; + } + if(countyEl.data('value')){ + options.data.county = countyEl.data('value'); + options.data.countyCode = getCode('county', options.data.county, options.data.cityCode.slice(0, 4)); + } else if (!options.data.county) { + options.data.county = ''; + } + provinceEl.attr('lay-filter', provinceFilter); + cityEl.attr('lay-filter', cityFilter); + countyEl.attr('lay-filter', countyFilter); + + //监听结果 + form.on('select('+provinceFilter+')', function(data){ + options.data.province = data.value; + options.data.provinceCode = getCode('province', data.value); + renderCity(options.data.provinceCode); + + options.change(options.data); + }); + form.on('select('+cityFilter+')', function(data){ + options.data.city = data.value; + if(options.data.provinceCode){ + options.data.cityCode = getCode('city', data.value, options.data.provinceCode.slice(0, 2)); + renderCounty(options.data.cityCode); + } + + options.change(options.data); + }); + form.on('select('+countyFilter+')', function(data){ + options.data.county = data.value; + if(options.data.cityCode){ + options.data.countyCode = getCode('county', data.value, options.data.cityCode.slice(0, 4)); + } + options.change(options.data); + }); + + renderProvince(); + + //查找province + function renderProvince(){ + let tpl = ''; + let provinceList = getList("province"); + let currentCode = ''; + let currentName = ''; + provinceList.forEach(function(_item){ + // if (!currentCode){ + // currentCode = _item.code; + // currentName = _item.name; + // } + if(_item.name === options.data.province){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + provinceEl.html(tpl); + provinceEl.val(options.data.province); + form.render('select'); + renderCity(currentCode); + } + + function renderCity(provinceCode){ + let tpl = ''; + let cityList = getList('city', provinceCode.slice(0, 2)); + let currentCode = ''; + let currentName = ''; + cityList.forEach(function(_item){ + // if (!currentCode){ + // currentCode = _item.code; + // currentName = _item.name; + // } + if(_item.name === options.data.city){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + options.data.city = currentName; + cityEl.html(tpl); + cityEl.val(options.data.city); + form.render('select'); + renderCounty(currentCode); + } + + function renderCounty(cityCode){ + let tpl = ''; + let countyList = getList('county', cityCode.slice(0, 4)); + let currentCode = ''; + let currentName = ''; + countyList.forEach(function(_item){ + // if (!currentCode){ + // currentCode = _item.code; + // currentName = _item.name; + // } + if(_item.name === options.data.county){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + options.data.county = currentName; + countyEl.html(tpl); + countyEl.val(options.data.county); + + form.render('select'); + } + + function getList(type, code) { + let result = []; + + if (type !== 'province' && !code) { + return result; + } + + let list = areaList[type + "_list"] || {}; + result = Object.keys(list).map(function (code) { + return { + code: code, + name: list[code] + }; + }); + + if (code) { + // oversea code + if (code[0] === '9' && type === 'city') { + code = '9'; + } + + result = result.filter(function (item) { + return item.code.indexOf(code) === 0; + }); + } + + return result; + } + + function getCode(type, name, parentCode = 0){ + let code = ''; + let list = areaList[type + "_list"] || {}; + let result = {}; + Object.keys(list).map(function (_code) { + if(parentCode){ + if(_code.indexOf(parentCode) === 0){ + result[_code] = list[_code]; + } + }else{ + result[_code] = list[_code]; + } + }); + layui.each(result, function(_code, _name){ + if(_name === name){ + code = _code; + } + }); + + return code; + } + }; + + layarea.render = function (options) { + let inst = new Class(options); + layarea._id++; + return thisArea.call(inst); + }; + + exports('area', layarea); + }); \ No newline at end of file diff --git a/public/static/component/pear/module/button.js b/public/static/component/pear/module/button.js new file mode 100644 index 0000000..d77c18d --- /dev/null +++ b/public/static/component/pear/module/button.js @@ -0,0 +1,53 @@ +layui.define(['jquery'], function(exports) { + "use strict"; + + /** + * Button component + * */ + var MOD_NAME = 'button', + $ = layui.jquery; + + var button = function(opt) { + this.option = opt; + }; + + /** + * Button start loading + * */ + button.prototype.load = function(opt) { + + var option = { + elem: opt.elem, + time: opt.time ? opt.time : false, + done: opt.done ? opt.done : function(){} + } + var text = $(option.elem).html(); + + $(option.elem).html(""); + + $(option.elem).attr("disabled", "disabled"); + + var buttons = $(option.elem); + + if (option.time != "" || option.time !=false) { + setTimeout(function() { + $(option.elem).attr("disabled", false); + buttons.html(text); + option.done(); + }, option.time); + } + option.text = text; + return new button(option); + } + + /** + * Button stop loaded + * */ + button.prototype.stop = function(success) { + $(this.option.elem).attr("disabled", false); + $(this.option.elem).html(this.option.text); + success && success(); + } + + exports(MOD_NAME, new button()); +}); diff --git a/public/static/component/pear/module/card.js b/public/static/component/pear/module/card.js new file mode 100644 index 0000000..9cb32f1 --- /dev/null +++ b/public/static/component/pear/module/card.js @@ -0,0 +1,267 @@ +layui.define(['table', 'laypage','jquery', 'element'], function(exports) { + "use strict"; + + var MOD_NAME = 'card', + $ = layui.jquery, + element = layui.element, + laypage = layui.laypage; + + var _instances = {}; // 记录所有实例 + + var defaultOption = { + elem: "#currentTableId",// 构建的模型 + url: "",// 数据 url 连接 + loading: true,//是否加载 + limit: 0, //每页数量默认是每行数量的双倍 + linenum: 4, //每行数量 2,3,4,6 + currentPage: 1,//当前页 + data:[], //静态数据 + limits:[], //页码 + page: true, //是否分页 + layout: ['count', 'prev', 'page', 'next','limit', 'skip'],//分页控件 + request: { + pageName: 'page' //页码的参数名称,默认:page + , limitName: 'limit' //每页数据量的参数名,默认:limit + , idName: 'id' //主键名称,默认:id + , titleName: 'title' //标题名称,默认:title + , imageName: 'image' //图片地址,默认:image + , remarkName: 'remark' //备注名称,默认:remark + , timeName: 'time' //时间名称,默认:time + }, + response: { + statusName: 'code' //规定数据状态的字段名称,默认:code + , statusCode: 0 //规定成功的状态码,默认:0 + , msgName: 'msg' //规定状态信息的字段名称,默认:msg + , countName: 'count' //规定数据总数的字段名称,默认:count + , dataName: 'data' //规定数据列表的字段名称,默认:data + }, + clickItem: function(data){}, + done: function () { + + } + }; + + var card = function(opt) { + _instances[opt.elem.substring(1)] = this; + this.reload(opt); + }; + card.prototype.initOptions = function (opt) { + this.option = $.extend(true, {}, defaultOption, opt); + if (!this.option.limit || this.option.limit == 0) { + this.option.limit = this.option.linenum * 2; + } + if (!this.option.limits || this.option.limits.length == 0) { + this.option.limits = [this.option.limit]; + } + }; + + card.prototype.init = function () { + var option = this.option; + var url = option.url; + var html = ""; + html += option.loading == true ? '
                      ' : '
                      '; + html += ''; + html += '
                      '; + $(option.elem).html(html); + html = ""; + if (!!url) { + if (url.indexOf("?") >= 0) { + url = url + '&v=1.0.0'; + } + else { + url = url + '?v=1.0.0'; + } + if (!!option.page) { + url = url + '&' + option.request.limitName + '=' + option.limit; + url = url + '&' + option.request.pageName + '=' + option.currentPage; + } + if (!!option.where) { + for (let key in option.where) { + url = url + '&' + key + '=' + option.where[key]; + } + } + getData(url).then(function(data){ + data = initData(data, option); + if (data.code != option.response.statusCode) { + option.data = []; + option.count = 0; + } else { + option.data = data.data; + option.count = option.data.length; + } + + if (!!option.data && option.data.length > 0) { + html = createComponent(option.elem.substring(1), option.linenum, option.data); + html += "
                      "; + } + else { + html = "

                      没有数据

                      "; + } + $(option.elem).html(html); + if (option.page) { + laypage.render({ + elem: 'cardpage' + , count: option.count, limit: option.limit, limits: option.limits, curr: option.currentPage + , layout: option.layout + , jump: function (obj, first) { + option.limit = obj.limit; + option.currentPage = obj.curr; + if (!first) { + _instances[option.elem.substring(1)].reload(option); + } + } + }); + } + }); + } + else { + if (!option.alldata) { + option.alldata = option.data; + } + if (option.page) { + var data = []; + option.count = option.alldata.length; + for (var i = (option.currentPage - 1) * option.limit; i < option.currentPage * option.limit && i 0) { + html = createComponent(option.elem.substring(1), option.linenum, option.data); + html += "
                      "; + } + else { + html = "

                      没有数据

                      "; + } + $(option.elem).html(html); + if (option.page) { + laypage.render({ + elem: 'cardpage' + , count: option.count, limit: option.limit, limits: option.limits, curr: option.currentPage + , layout: option.layout + , jump: function (obj, first) { + option.limit = obj.limit; + option.currentPage = obj.curr; + if (!first) { + _instances[option.elem.substring(1)].reload(option); + } + } + }); + } + } + } + + card.prototype.reload = function (opt) { + this.initOptions(this.option ? $.extend(true, this.option, opt) : opt); + this.init(); // 初始化表格 + } + + function createComponent(elem,linenum,data) { + var html = "
                      " + var content = createCards(elem, linenum,data); + var page = ""; + content = content + page; + html += content + "
                      " + return html; + } + + function createCards(elem, linenum,data) { + var content = "
                      "; + for (var i = 0; i < data.length; i++) { + content += createCard(elem, linenum,data[i],i); + } + content += "
                      "; + return content; + } + + function createCard(elem, linenum, item, no) { + var line = 12 / linenum; + var card = + '

                      ' + item.title + '

                      ' + item.remark + '
                      ' +item.time + '
                      ' + return card; + } + + function initData(tempData, option) { + var data = {}; + data.code = tempData[option.response.statusName]; + data.msg = tempData[option.response.msgName]; + data.count = tempData[option.response.countName]; + var dataList = tempData[option.response.dataName]; + data.data = []; + for (var i = 0; i < dataList.length; i++) { + var item = {}; + item.id = dataList[i][option.request.idName]; + item.image = dataList[i][option.request.imageName]; + item.title = dataList[i][option.request.titleName]; + item.remark = dataList[i][option.request.remarkName]; + item.time = dataList[i][option.request.timeName]; + data.data.push(item); + } + return data; + } + + function getData(url) { + var defer = $.Deferred(); + $.get(url + "?fresh=" + Math.random(), function(result) { + defer.resolve(result) + }); + return defer.promise(); + } + + window.cardTableCheckedCard = function (elem,obj) { + $(obj).addClass('layui-table-click').siblings().removeClass('layui-table-click'); + var item = {}; + item.id = obj.id; + item.image = $(obj).find('.project-list-item-cover')[0].src; + item.title = $(obj).find('h2')[0].innerHTML; + item.remark = $(obj).find('.project-list-item-text')[0].innerHTML; + item.time = $(obj).find('.time')[0].innerHTML; + _instances[elem.id].option.checkedItem = item; + _instances[elem.id].option.clickItem(item); + } + + /** 对外提供的方法 */ + var tt = { + + render: function (options) { + return new card(options); + }, + + reload: function (id, opt) { + _instances[id].option.checkedItem = null; + _instances[id].reload(opt); + }, + + getChecked: function (id) { + var option = _instances[id].option; + var data = option.checkedItem; + var item = {}; + if (!data) { + return null; + } + item[option.request.idName] = data.id; + item[option.request.imageName] = data.image; + item[option.request.titleName] = data.title; + item[option.request.remarkName] = data.remark; + item[option.request.timeName] = data.time; + return item; + }, + + getAllData: function (id) { + var option = _instances[id].option; + var data = []; + for (var i = 0; i < option.data.length; i++) { + var item = {}; + item[option.request.idName] = option.data[i].id; + item[option.request.imageName] = option.data[i].image; + item[option.request.titleName] = option.data[i].title; + item[option.request.remarkName] = option.data[i].remark; + item[option.request.timeName] = option.data[i].time; + data.push(item); + } + return data; + }, + } + + exports(MOD_NAME, tt); +}) \ No newline at end of file diff --git a/public/static/component/pear/module/common.js b/public/static/component/pear/module/common.js new file mode 100644 index 0000000..6f1eac8 --- /dev/null +++ b/public/static/component/pear/module/common.js @@ -0,0 +1,71 @@ +layui.define(['jquery', 'element','table'], function(exports) { + "use strict"; + + /** + * 常用封装类 + * */ + var MOD_NAME = 'common', + $ = layui.jquery, + table = layui.table, + element = layui.element; + + var common = new function() { + + /** + * 获取当前表格选中字段 + * @param obj 表格回调参数 + * @param field 要获取的字段 + * */ + this.checkField = function(obj, field) { + let data = table.checkStatus(obj.config.id).data; + if (data.length === 0) { + return ""; + } + let ids = ""; + for (let i = 0; i < data.length; i++) { + ids += data[i][field] + ","; + } + ids = ids.substr(0, ids.length - 1); + return ids; + } + + /** + * 当前是否为与移动端 + * */ + this.isModile = function(){ + if ($(window).width() <= 768) { + return true; + } + return false; + } + + + /** + * 提交 json 数据 + * @param data 提交数据 + * @param href 提交接口 + * @param table 刷新父级表 + * + * */ + this.submit = function(data,href,table,callback){ + $.ajax({ + url:href, + data:JSON.stringify(data), + dataType:'json', + contentType:'application/json', + type:'post', + success:callback !=null?callback(result):function(result){ + if(result.success){ + layer.msg(result.msg,{icon:1,time:1000},function(){ + parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页 + parent.layui.table.reload(table); + }); + }else{ + layer.msg(result.msg,{icon:2,time:1000}); + } + } + }) + } + } + exports(MOD_NAME, common); +}); diff --git a/public/static/component/pear/module/context.js b/public/static/component/pear/module/context.js new file mode 100644 index 0000000..a803e02 --- /dev/null +++ b/public/static/component/pear/module/context.js @@ -0,0 +1,19 @@ +layui.define(['jquery', 'element'], function(exports) { + "use strict"; + + var MOD_NAME = 'context', + $ = layui.jquery, + element = layui.element; + + var context = new function() { + + this.put = function(key,value){ + localStorage.setItem(key,value); + } + + this.get = function(key){ + return localStorage.getItem(key); + } + } + exports(MOD_NAME, context); +}); diff --git a/public/static/component/pear/module/convert.js b/public/static/component/pear/module/convert.js new file mode 100644 index 0000000..1f86ba5 --- /dev/null +++ b/public/static/component/pear/module/convert.js @@ -0,0 +1,27 @@ +layui.define(['jquery', 'element'], function(exports) { + "use strict"; + + /** + * 类 型 转 换 工 具 类 + * */ + var MOD_NAME = 'convert', + $ = layui.jquery, + element = layui.element; + + var convert = new function() { + + // image 转 base64 + this.imageToBase64 = function(img) { + var canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0, img.width, img.height); + var ext = img.src.substring(img.src.lastIndexOf(".")+1).toLowerCase(); + var dataURL = canvas.toDataURL("image/"+ext); + return dataURL; + } + + } + exports(MOD_NAME, convert); +}); diff --git a/public/static/component/pear/module/count.js b/public/static/component/pear/module/count.js new file mode 100644 index 0000000..c9a659f --- /dev/null +++ b/public/static/component/pear/module/count.js @@ -0,0 +1,37 @@ +layui.define(['jquery', 'element'], function(exports) { + "use strict"; + + var MOD_NAME = 'count', + $ = layui.jquery, + element = layui.element; + + var count = new function() { + + this.up = function(targetEle, options) { + + options = options || {}; + + var $this = document.getElementById(targetEle), + time = options.time, + finalNum = options.num, + regulator = options.regulator, + step = finalNum / (time / regulator), + count = 0.00, + initial = 0; + + var timer = setInterval(function() { + count = count + step; + if (count >= finalNum) { + clearInterval(timer); + count = finalNum; + } + var t = count.toFixed(options.bit?options.bit:0);; + if (t == initial) return; + initial = t; + $this.innerHTML = initial; + }, 30); + } + + } + exports(MOD_NAME, count); +}); diff --git a/public/static/component/pear/module/cropper.js b/public/static/component/pear/module/cropper.js new file mode 100644 index 0000000..6d77497 --- /dev/null +++ b/public/static/component/pear/module/cropper.js @@ -0,0 +1,3087 @@ +/*! + * Cropper v3.0.0 + */ + +layui.define(['jquery'], function (exports) { + var $ = layui.jquery; + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + + var DEFAULTS = { + // Define the view mode of the cropper + viewMode: 0, // 0, 1, 2, 3 + + // Define the dragging mode of the cropper + dragMode: 'crop', // 'crop', 'move' or 'none' + + // Define the aspect ratio of the crop box + aspectRatio: NaN, + + // An object with the previous cropping result data + data: null, + + // A selector for adding extra containers to preview + preview: '', + + // Re-render the cropper when resize the window + responsive: true, + + // Restore the cropped area after resize the window + restore: true, + + // Check if the current image is a cross-origin image + checkCrossOrigin: true, + + // Check the current image's Exif Orientation information + checkOrientation: true, + + // Show the black modal + modal: true, + + // Show the dashed lines for guiding + guides: true, + + // Show the center indicator for guiding + center: true, + + // Show the white modal to highlight the crop box + highlight: true, + + // Show the grid background + background: true, + + // Enable to crop the image automatically when initialize + autoCrop: true, + + // Define the percentage of automatic cropping area when initializes + autoCropArea: 0.8, + + // Enable to move the image + movable: true, + + // Enable to rotate the image + rotatable: true, + + // Enable to scale the image + scalable: true, + + // Enable to zoom the image + zoomable: true, + + // Enable to zoom the image by dragging touch + zoomOnTouch: true, + + // Enable to zoom the image by wheeling mouse + zoomOnWheel: true, + + // Define zoom ratio when zoom the image by wheeling mouse + wheelZoomRatio: 0.1, + + // Enable to move the crop box + cropBoxMovable: true, + + // Enable to resize the crop box + cropBoxResizable: true, + + // Toggle drag mode between "crop" and "move" when click twice on the cropper + toggleDragModeOnDblclick: true, + + // Size limitation + minCanvasWidth: 0, + minCanvasHeight: 0, + minCropBoxWidth: 0, + minCropBoxHeight: 0, + minContainerWidth: 200, + minContainerHeight: 100, + + // Shortcuts of events + ready: null, + cropstart: null, + cropmove: null, + cropend: null, + crop: null, + zoom: null + }; + + var TEMPLATE = '
                      ' + '
                      ' + '
                      ' + '
                      ' + '
                      ' + '
                      ' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
                      ' + '
                      '; + + var REGEXP_DATA_URL_HEAD = /^data:.*,/; + var REGEXP_USERAGENT = /(Macintosh|iPhone|iPod|iPad).*AppleWebKit/i; + var navigator = typeof window !== 'undefined' ? window.navigator : null; + var IS_SAFARI_OR_UIWEBVIEW = navigator && REGEXP_USERAGENT.test(navigator.userAgent); + var fromCharCode = String.fromCharCode; + + function isNumber(n) { + return typeof n === 'number' && !isNaN(n); + } + + function isUndefined(n) { + return typeof n === 'undefined'; + } + + function toArray(obj, offset) { + var args = []; + + // This is necessary for IE8 + if (isNumber(offset)) { + args.push(offset); + } + + return args.slice.apply(obj, args); + } + + // Custom proxy to avoid jQuery's guid + function proxy(fn, context) { + for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + + return function () { + for (var _len2 = arguments.length, args2 = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args2[_key2] = arguments[_key2]; + } + + return fn.apply(context, args.concat(toArray(args2))); + }; + } + + function objectKeys(obj) { + var keys = []; + + $.each(obj, function (key) { + keys.push(key); + }); + + return keys; + } + + function isCrossOriginURL(url) { + var parts = url.match(/^(https?:)\/\/([^:/?#]+):?(\d*)/i); + + return parts && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port); + } + + function addTimestamp(url) { + var timestamp = 'timestamp=' + new Date().getTime(); + + return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp; + } + + function getImageSize(image, callback) { + // Modern browsers (ignore Safari, #120 & #509) + if (image.naturalWidth && !IS_SAFARI_OR_UIWEBVIEW) { + callback(image.naturalWidth, image.naturalHeight); + return; + } + + // IE8: Don't use `new Image()` here (#319) + var newImage = document.createElement('img'); + + newImage.onload = function load() { + callback(this.width, this.height); + }; + + newImage.src = image.src; + } + + function getTransform(options) { + var transforms = []; + var translateX = options.translateX; + var translateY = options.translateY; + var rotate = options.rotate; + var scaleX = options.scaleX; + var scaleY = options.scaleY; + + if (isNumber(translateX) && translateX !== 0) { + transforms.push('translateX(' + translateX + 'px)'); + } + + if (isNumber(translateY) && translateY !== 0) { + transforms.push('translateY(' + translateY + 'px)'); + } + + // Rotate should come first before scale to match orientation transform + if (isNumber(rotate) && rotate !== 0) { + transforms.push('rotate(' + rotate + 'deg)'); + } + + if (isNumber(scaleX) && scaleX !== 1) { + transforms.push('scaleX(' + scaleX + ')'); + } + + if (isNumber(scaleY) && scaleY !== 1) { + transforms.push('scaleY(' + scaleY + ')'); + } + + return transforms.length ? transforms.join(' ') : 'none'; + } + + function getRotatedSizes(data, isReversed) { + var deg = Math.abs(data.degree) % 180; + var arc = (deg > 90 ? 180 - deg : deg) * Math.PI / 180; + var sinArc = Math.sin(arc); + var cosArc = Math.cos(arc); + var width = data.width; + var height = data.height; + var aspectRatio = data.aspectRatio; + var newWidth = void 0; + var newHeight = void 0; + + if (!isReversed) { + newWidth = width * cosArc + height * sinArc; + newHeight = width * sinArc + height * cosArc; + } else { + newWidth = width / (cosArc + sinArc / aspectRatio); + newHeight = newWidth / aspectRatio; + } + + return { + width: newWidth, + height: newHeight + }; + } + + function getSourceCanvas(image, data, options) { + var canvas = $('')[0]; + var context = canvas.getContext('2d'); + var dstX = 0; + var dstY = 0; + var dstWidth = data.naturalWidth; + var dstHeight = data.naturalHeight; + var rotate = data.rotate; + var scaleX = data.scaleX; + var scaleY = data.scaleY; + var scalable = isNumber(scaleX) && isNumber(scaleY) && (scaleX !== 1 || scaleY !== 1); + var rotatable = isNumber(rotate) && rotate !== 0; + var advanced = rotatable || scalable; + var canvasWidth = dstWidth * Math.abs(scaleX || 1); + var canvasHeight = dstHeight * Math.abs(scaleY || 1); + var translateX = void 0; + var translateY = void 0; + var rotated = void 0; + + if (scalable) { + translateX = canvasWidth / 2; + translateY = canvasHeight / 2; + } + + if (rotatable) { + rotated = getRotatedSizes({ + width: canvasWidth, + height: canvasHeight, + degree: rotate + }); + + canvasWidth = rotated.width; + canvasHeight = rotated.height; + translateX = canvasWidth / 2; + translateY = canvasHeight / 2; + } + + canvas.width = canvasWidth; + canvas.height = canvasHeight; + + if (options.fillColor) { + context.fillStyle = options.fillColor; + context.fillRect(0, 0, canvasWidth, canvasHeight); + } + + if (advanced) { + dstX = -dstWidth / 2; + dstY = -dstHeight / 2; + + context.save(); + context.translate(translateX, translateY); + } + + // Rotate should come first before scale as in the "getTransform" function + if (rotatable) { + context.rotate(rotate * Math.PI / 180); + } + + if (scalable) { + context.scale(scaleX, scaleY); + } + + context.imageSmoothingEnabled = !!options.imageSmoothingEnabled; + + if (options.imageSmoothingQuality) { + context.imageSmoothingQuality = options.imageSmoothingQuality; + } + + context.drawImage(image, Math.floor(dstX), Math.floor(dstY), Math.floor(dstWidth), Math.floor(dstHeight)); + + if (advanced) { + context.restore(); + } + + return canvas; + } + + function getStringFromCharCode(dataView, start, length) { + var str = ''; + var i = void 0; + + for (i = start, length += start; i < length; i += 1) { + str += fromCharCode(dataView.getUint8(i)); + } + + return str; + } + + function getOrientation(arrayBuffer) { + var dataView = new DataView(arrayBuffer); + var length = dataView.byteLength; + var orientation = void 0; + var exifIDCode = void 0; + var tiffOffset = void 0; + var firstIFDOffset = void 0; + var littleEndian = void 0; + var endianness = void 0; + var app1Start = void 0; + var ifdStart = void 0; + var offset = void 0; + var i = void 0; + + // Only handle JPEG image (start by 0xFFD8) + if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) { + offset = 2; + + while (offset < length) { + if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) { + app1Start = offset; + break; + } + + offset += 1; + } + } + + if (app1Start) { + exifIDCode = app1Start + 4; + tiffOffset = app1Start + 10; + + if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') { + endianness = dataView.getUint16(tiffOffset); + littleEndian = endianness === 0x4949; + + if (littleEndian || endianness === 0x4D4D /* bigEndian */) { + if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) { + firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian); + + if (firstIFDOffset >= 0x00000008) { + ifdStart = tiffOffset + firstIFDOffset; + } + } + } + } + } + + if (ifdStart) { + length = dataView.getUint16(ifdStart, littleEndian); + + for (i = 0; i < length; i += 1) { + offset = ifdStart + i * 12 + 2; + + if (dataView.getUint16(offset, littleEndian) === 0x0112 /* Orientation */) { + // 8 is the offset of the current tag's value + offset += 8; + + // Get the original orientation value + orientation = dataView.getUint16(offset, littleEndian); + + // Override the orientation with its default value for Safari (#120) + if (IS_SAFARI_OR_UIWEBVIEW) { + dataView.setUint16(offset, 1, littleEndian); + } + + break; + } + } + } + + return orientation; + } + + function dataURLToArrayBuffer(dataURL) { + var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, ''); + var binary = atob(base64); + var length = binary.length; + var arrayBuffer = new ArrayBuffer(length); + var dataView = new Uint8Array(arrayBuffer); + var i = void 0; + + for (i = 0; i < length; i += 1) { + dataView[i] = binary.charCodeAt(i); + } + + return arrayBuffer; + } + + // Only available for JPEG image + function arrayBufferToDataURL(arrayBuffer) { + var dataView = new Uint8Array(arrayBuffer); + var length = dataView.length; + var base64 = ''; + var i = void 0; + + for (i = 0; i < length; i += 1) { + base64 += fromCharCode(dataView[i]); + } + + return 'data:image/jpeg;base64,' + btoa(base64); + } + + var render = { + render: function render() { + var self = this; + + self.initContainer(); + self.initCanvas(); + self.initCropBox(); + + self.renderCanvas(); + + if (self.cropped) { + self.renderCropBox(); + } + }, + initContainer: function initContainer() { + var self = this; + var options = self.options; + var $this = self.$element; + var $container = self.$container; + var $cropper = self.$cropper; + var hidden = 'cropper-hidden'; + + $cropper.addClass(hidden); + $this.removeClass(hidden); + + $cropper.css(self.container = { + width: Math.max($container.width(), Number(options.minContainerWidth) || 200), + height: Math.max($container.height(), Number(options.minContainerHeight) || 100) + }); + + $this.addClass(hidden); + $cropper.removeClass(hidden); + }, + + + // Canvas (image wrapper) + initCanvas: function initCanvas() { + var self = this; + var viewMode = self.options.viewMode; + var container = self.container; + var containerWidth = container.width; + var containerHeight = container.height; + var image = self.image; + var imageNaturalWidth = image.naturalWidth; + var imageNaturalHeight = image.naturalHeight; + var is90Degree = Math.abs(image.rotate) % 180 === 90; + var naturalWidth = is90Degree ? imageNaturalHeight : imageNaturalWidth; + var naturalHeight = is90Degree ? imageNaturalWidth : imageNaturalHeight; + var aspectRatio = naturalWidth / naturalHeight; + var canvasWidth = containerWidth; + var canvasHeight = containerHeight; + + if (containerHeight * aspectRatio > containerWidth) { + if (viewMode === 3) { + canvasWidth = containerHeight * aspectRatio; + } else { + canvasHeight = containerWidth / aspectRatio; + } + } else if (viewMode === 3) { + canvasHeight = containerWidth / aspectRatio; + } else { + canvasWidth = containerHeight * aspectRatio; + } + + var canvas = { + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + aspectRatio: aspectRatio, + width: canvasWidth, + height: canvasHeight + }; + + canvas.left = (containerWidth - canvasWidth) / 2; + canvas.top = (containerHeight - canvasHeight) / 2; + canvas.oldLeft = canvas.left; + canvas.oldTop = canvas.top; + + self.canvas = canvas; + self.limited = viewMode === 1 || viewMode === 2; + self.limitCanvas(true, true); + self.initialImage = $.extend({}, image); + self.initialCanvas = $.extend({}, canvas); + }, + limitCanvas: function limitCanvas(isSizeLimited, isPositionLimited) { + var self = this; + var options = self.options; + var viewMode = options.viewMode; + var container = self.container; + var containerWidth = container.width; + var containerHeight = container.height; + var canvas = self.canvas; + var aspectRatio = canvas.aspectRatio; + var cropBox = self.cropBox; + var cropped = self.cropped && cropBox; + + if (isSizeLimited) { + var minCanvasWidth = Number(options.minCanvasWidth) || 0; + var minCanvasHeight = Number(options.minCanvasHeight) || 0; + + if (viewMode) { + if (viewMode > 1) { + minCanvasWidth = Math.max(minCanvasWidth, containerWidth); + minCanvasHeight = Math.max(minCanvasHeight, containerHeight); + + if (viewMode === 3) { + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } else if (minCanvasWidth) { + minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBox.width : 0); + } else if (minCanvasHeight) { + minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBox.height : 0); + } else if (cropped) { + minCanvasWidth = cropBox.width; + minCanvasHeight = cropBox.height; + + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } + + if (minCanvasWidth && minCanvasHeight) { + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasHeight = minCanvasWidth / aspectRatio; + } else { + minCanvasWidth = minCanvasHeight * aspectRatio; + } + } else if (minCanvasWidth) { + minCanvasHeight = minCanvasWidth / aspectRatio; + } else if (minCanvasHeight) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } + + canvas.minWidth = minCanvasWidth; + canvas.minHeight = minCanvasHeight; + canvas.maxWidth = Infinity; + canvas.maxHeight = Infinity; + } + + if (isPositionLimited) { + if (viewMode) { + var newCanvasLeft = containerWidth - canvas.width; + var newCanvasTop = containerHeight - canvas.height; + + canvas.minLeft = Math.min(0, newCanvasLeft); + canvas.minTop = Math.min(0, newCanvasTop); + canvas.maxLeft = Math.max(0, newCanvasLeft); + canvas.maxTop = Math.max(0, newCanvasTop); + + if (cropped && self.limited) { + canvas.minLeft = Math.min(cropBox.left, cropBox.left + cropBox.width - canvas.width); + canvas.minTop = Math.min(cropBox.top, cropBox.top + cropBox.height - canvas.height); + canvas.maxLeft = cropBox.left; + canvas.maxTop = cropBox.top; + + if (viewMode === 2) { + if (canvas.width >= containerWidth) { + canvas.minLeft = Math.min(0, newCanvasLeft); + canvas.maxLeft = Math.max(0, newCanvasLeft); + } + + if (canvas.height >= containerHeight) { + canvas.minTop = Math.min(0, newCanvasTop); + canvas.maxTop = Math.max(0, newCanvasTop); + } + } + } + } else { + canvas.minLeft = -canvas.width; + canvas.minTop = -canvas.height; + canvas.maxLeft = containerWidth; + canvas.maxTop = containerHeight; + } + } + }, + renderCanvas: function renderCanvas(isChanged) { + var self = this; + var canvas = self.canvas; + var image = self.image; + var rotate = image.rotate; + var naturalWidth = image.naturalWidth; + var naturalHeight = image.naturalHeight; + + if (self.rotated) { + self.rotated = false; + + // Computes rotated sizes with image sizes + var rotated = getRotatedSizes({ + width: image.width, + height: image.height, + degree: rotate + }); + var aspectRatio = rotated.width / rotated.height; + var isSquareImage = image.aspectRatio === 1; + + if (isSquareImage || aspectRatio !== canvas.aspectRatio) { + canvas.left -= (rotated.width - canvas.width) / 2; + canvas.top -= (rotated.height - canvas.height) / 2; + canvas.width = rotated.width; + canvas.height = rotated.height; + canvas.aspectRatio = aspectRatio; + canvas.naturalWidth = naturalWidth; + canvas.naturalHeight = naturalHeight; + + // Computes rotated sizes with natural image sizes + if (isSquareImage && rotate % 90 || rotate % 180) { + var rotated2 = getRotatedSizes({ + width: naturalWidth, + height: naturalHeight, + degree: rotate + }); + + canvas.naturalWidth = rotated2.width; + canvas.naturalHeight = rotated2.height; + } + + self.limitCanvas(true, false); + } + } + + if (canvas.width > canvas.maxWidth || canvas.width < canvas.minWidth) { + canvas.left = canvas.oldLeft; + } + + if (canvas.height > canvas.maxHeight || canvas.height < canvas.minHeight) { + canvas.top = canvas.oldTop; + } + + canvas.width = Math.min(Math.max(canvas.width, canvas.minWidth), canvas.maxWidth); + canvas.height = Math.min(Math.max(canvas.height, canvas.minHeight), canvas.maxHeight); + + self.limitCanvas(false, true); + + canvas.left = Math.min(Math.max(canvas.left, canvas.minLeft), canvas.maxLeft); + canvas.top = Math.min(Math.max(canvas.top, canvas.minTop), canvas.maxTop); + canvas.oldLeft = canvas.left; + canvas.oldTop = canvas.top; + + self.$canvas.css({ + width: canvas.width, + height: canvas.height, + transform: getTransform({ + translateX: canvas.left, + translateY: canvas.top + }) + }); + + self.renderImage(); + + if (self.cropped && self.limited) { + self.limitCropBox(true, true); + } + + if (isChanged) { + self.output(); + } + }, + renderImage: function renderImage(isChanged) { + var self = this; + var canvas = self.canvas; + var image = self.image; + var reversed = void 0; + + if (image.rotate) { + reversed = getRotatedSizes({ + width: canvas.width, + height: canvas.height, + degree: image.rotate, + aspectRatio: image.aspectRatio + }, true); + } + + $.extend(image, reversed ? { + width: reversed.width, + height: reversed.height, + left: (canvas.width - reversed.width) / 2, + top: (canvas.height - reversed.height) / 2 + } : { + width: canvas.width, + height: canvas.height, + left: 0, + top: 0 + }); + + self.$clone.css({ + width: image.width, + height: image.height, + transform: getTransform($.extend({ + translateX: image.left, + translateY: image.top + }, image)) + }); + + if (isChanged) { + self.output(); + } + }, + initCropBox: function initCropBox() { + var self = this; + var options = self.options; + var canvas = self.canvas; + var aspectRatio = options.aspectRatio; + var autoCropArea = Number(options.autoCropArea) || 0.8; + var cropBox = { + width: canvas.width, + height: canvas.height + }; + + if (aspectRatio) { + if (canvas.height * aspectRatio > canvas.width) { + cropBox.height = cropBox.width / aspectRatio; + } else { + cropBox.width = cropBox.height * aspectRatio; + } + } + + self.cropBox = cropBox; + self.limitCropBox(true, true); + + // Initialize auto crop area + cropBox.width = Math.min(Math.max(cropBox.width, cropBox.minWidth), cropBox.maxWidth); + cropBox.height = Math.min(Math.max(cropBox.height, cropBox.minHeight), cropBox.maxHeight); + + // The width of auto crop area must large than "minWidth", and the height too. (#164) + cropBox.width = Math.max(cropBox.minWidth, cropBox.width * autoCropArea); + cropBox.height = Math.max(cropBox.minHeight, cropBox.height * autoCropArea); + cropBox.left = canvas.left + (canvas.width - cropBox.width) / 2; + cropBox.top = canvas.top + (canvas.height - cropBox.height) / 2; + cropBox.oldLeft = cropBox.left; + cropBox.oldTop = cropBox.top; + + self.initialCropBox = $.extend({}, cropBox); + }, + limitCropBox: function limitCropBox(isSizeLimited, isPositionLimited) { + var self = this; + var options = self.options; + var aspectRatio = options.aspectRatio; + var container = self.container; + var containerWidth = container.width; + var containerHeight = container.height; + var canvas = self.canvas; + var cropBox = self.cropBox; + var limited = self.limited; + + if (isSizeLimited) { + var minCropBoxWidth = Number(options.minCropBoxWidth) || 0; + var minCropBoxHeight = Number(options.minCropBoxHeight) || 0; + var maxCropBoxWidth = Math.min(containerWidth, limited ? canvas.width : containerWidth); + var maxCropBoxHeight = Math.min(containerHeight, limited ? canvas.height : containerHeight); + + // The min/maxCropBoxWidth/Height must be less than containerWidth/Height + minCropBoxWidth = Math.min(minCropBoxWidth, containerWidth); + minCropBoxHeight = Math.min(minCropBoxHeight, containerHeight); + + if (aspectRatio) { + if (minCropBoxWidth && minCropBoxHeight) { + if (minCropBoxHeight * aspectRatio > minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + } else if (minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else if (minCropBoxHeight) { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + + if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) { + maxCropBoxHeight = maxCropBoxWidth / aspectRatio; + } else { + maxCropBoxWidth = maxCropBoxHeight * aspectRatio; + } + } + + // The minWidth/Height must be less than maxWidth/Height + cropBox.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth); + cropBox.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight); + cropBox.maxWidth = maxCropBoxWidth; + cropBox.maxHeight = maxCropBoxHeight; + } + + if (isPositionLimited) { + if (limited) { + cropBox.minLeft = Math.max(0, canvas.left); + cropBox.minTop = Math.max(0, canvas.top); + cropBox.maxLeft = Math.min(containerWidth, canvas.left + canvas.width) - cropBox.width; + cropBox.maxTop = Math.min(containerHeight, canvas.top + canvas.height) - cropBox.height; + } else { + cropBox.minLeft = 0; + cropBox.minTop = 0; + cropBox.maxLeft = containerWidth - cropBox.width; + cropBox.maxTop = containerHeight - cropBox.height; + } + } + }, + renderCropBox: function renderCropBox() { + var self = this; + var options = self.options; + var container = self.container; + var containerWidth = container.width; + var containerHeight = container.height; + var cropBox = self.cropBox; + + if (cropBox.width > cropBox.maxWidth || cropBox.width < cropBox.minWidth) { + cropBox.left = cropBox.oldLeft; + } + + if (cropBox.height > cropBox.maxHeight || cropBox.height < cropBox.minHeight) { + cropBox.top = cropBox.oldTop; + } + + cropBox.width = Math.min(Math.max(cropBox.width, cropBox.minWidth), cropBox.maxWidth); + cropBox.height = Math.min(Math.max(cropBox.height, cropBox.minHeight), cropBox.maxHeight); + + self.limitCropBox(false, true); + + cropBox.left = Math.min(Math.max(cropBox.left, cropBox.minLeft), cropBox.maxLeft); + cropBox.top = Math.min(Math.max(cropBox.top, cropBox.minTop), cropBox.maxTop); + cropBox.oldLeft = cropBox.left; + cropBox.oldTop = cropBox.top; + + if (options.movable && options.cropBoxMovable) { + // Turn to move the canvas when the crop box is equal to the container + self.$face.data('action', cropBox.width === containerWidth && cropBox.height === containerHeight ? 'move' : 'all'); + } + + self.$cropBox.css({ + width: cropBox.width, + height: cropBox.height, + transform: getTransform({ + translateX: cropBox.left, + translateY: cropBox.top + }) + }); + + if (self.cropped && self.limited) { + self.limitCanvas(true, true); + } + + if (!self.disabled) { + self.output(); + } + }, + output: function output() { + var self = this; + + self.preview(); + + if (self.completed) { + self.trigger('crop', self.getData()); + } + } + }; + + var DATA_PREVIEW = 'preview'; + + var preview = { + initPreview: function initPreview() { + var self = this; + var crossOrigin = self.crossOrigin; + var url = crossOrigin ? self.crossOriginUrl : self.url; + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = url; + + var $clone2 = $(image); + + self.$preview = $(self.options.preview); + self.$clone2 = $clone2; + self.$viewBox.html($clone2); + self.$preview.each(function (i, element) { + var $this = $(element); + var img = document.createElement('img'); + + // Save the original size for recover + $this.data(DATA_PREVIEW, { + width: $this.width(), + height: $this.height(), + html: $this.html() + }); + + if (crossOrigin) { + img.crossOrigin = crossOrigin; + } + + img.src = url; + + /** + * Override img element styles + * Add `display:block` to avoid margin top issue + * Add `height:auto` to override `height` attribute on IE8 + * (Occur only when margin-top <= -height) + */ + img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;"'; + + $this.html(img); + }); + }, + resetPreview: function resetPreview() { + this.$preview.each(function (i, element) { + var $this = $(element); + var data = $this.data(DATA_PREVIEW); + + $this.css({ + width: data.width, + height: data.height + }).html(data.html).removeData(DATA_PREVIEW); + }); + }, + preview: function preview() { + var self = this; + var image = self.image; + var canvas = self.canvas; + var cropBox = self.cropBox; + var cropBoxWidth = cropBox.width; + var cropBoxHeight = cropBox.height; + var width = image.width; + var height = image.height; + var left = cropBox.left - canvas.left - image.left; + var top = cropBox.top - canvas.top - image.top; + + if (!self.cropped || self.disabled) { + return; + } + + self.$clone2.css({ + width: width, + height: height, + transform: getTransform($.extend({ + translateX: -left, + translateY: -top + }, image)) + }); + + self.$preview.each(function (i, element) { + var $this = $(element); + var data = $this.data(DATA_PREVIEW); + var originalWidth = data.width; + var originalHeight = data.height; + var newWidth = originalWidth; + var newHeight = originalHeight; + var ratio = 1; + + if (cropBoxWidth) { + ratio = originalWidth / cropBoxWidth; + newHeight = cropBoxHeight * ratio; + } + + if (cropBoxHeight && newHeight > originalHeight) { + ratio = originalHeight / cropBoxHeight; + newWidth = cropBoxWidth * ratio; + newHeight = originalHeight; + } + + $this.css({ + width: newWidth, + height: newHeight + }).find('img').css({ + width: width * ratio, + height: height * ratio, + transform: getTransform($.extend({ + translateX: -left * ratio, + translateY: -top * ratio + }, image)) + }); + }); + } + }; + + // Globals + var PointerEvent = typeof window !== 'undefined' ? window.PointerEvent : null; + + // Events + var EVENT_POINTER_DOWN = PointerEvent ? 'pointerdown' : 'touchstart mousedown'; + var EVENT_POINTER_MOVE = PointerEvent ? 'pointermove' : 'touchmove mousemove'; + var EVENT_POINTER_UP = PointerEvent ? ' pointerup pointercancel' : 'touchend touchcancel mouseup'; + var EVENT_WHEEL = 'wheel mousewheel DOMMouseScroll'; + var EVENT_DBLCLICK = 'dblclick'; + var EVENT_RESIZE = 'resize'; + var EVENT_CROP_START = 'cropstart'; + var EVENT_CROP_MOVE = 'cropmove'; + var EVENT_CROP_END = 'cropend'; + var EVENT_CROP = 'crop'; + var EVENT_ZOOM = 'zoom'; + + var events = { + bind: function bind() { + var self = this; + var options = self.options; + var $this = self.$element; + var $cropper = self.$cropper; + + if ($.isFunction(options.cropstart)) { + $this.on(EVENT_CROP_START, options.cropstart); + } + + if ($.isFunction(options.cropmove)) { + $this.on(EVENT_CROP_MOVE, options.cropmove); + } + + if ($.isFunction(options.cropend)) { + $this.on(EVENT_CROP_END, options.cropend); + } + + if ($.isFunction(options.crop)) { + $this.on(EVENT_CROP, options.crop); + } + + if ($.isFunction(options.zoom)) { + $this.on(EVENT_ZOOM, options.zoom); + } + + $cropper.on(EVENT_POINTER_DOWN, proxy(self.cropStart, this)); + + if (options.zoomable && options.zoomOnWheel) { + $cropper.on(EVENT_WHEEL, proxy(self.wheel, this)); + } + + if (options.toggleDragModeOnDblclick) { + $cropper.on(EVENT_DBLCLICK, proxy(self.dblclick, this)); + } + + $(document).on(EVENT_POINTER_MOVE, self.onCropMove = proxy(self.cropMove, this)).on(EVENT_POINTER_UP, self.onCropEnd = proxy(self.cropEnd, this)); + + if (options.responsive) { + $(window).on(EVENT_RESIZE, self.onResize = proxy(self.resize, this)); + } + }, + unbind: function unbind() { + var self = this; + var options = self.options; + var $this = self.$element; + var $cropper = self.$cropper; + + if ($.isFunction(options.cropstart)) { + $this.off(EVENT_CROP_START, options.cropstart); + } + + if ($.isFunction(options.cropmove)) { + $this.off(EVENT_CROP_MOVE, options.cropmove); + } + + if ($.isFunction(options.cropend)) { + $this.off(EVENT_CROP_END, options.cropend); + } + + if ($.isFunction(options.crop)) { + $this.off(EVENT_CROP, options.crop); + } + + if ($.isFunction(options.zoom)) { + $this.off(EVENT_ZOOM, options.zoom); + } + + $cropper.off(EVENT_POINTER_DOWN, self.cropStart); + + if (options.zoomable && options.zoomOnWheel) { + $cropper.off(EVENT_WHEEL, self.wheel); + } + + if (options.toggleDragModeOnDblclick) { + $cropper.off(EVENT_DBLCLICK, self.dblclick); + } + + $(document).off(EVENT_POINTER_MOVE, self.onCropMove).off(EVENT_POINTER_UP, self.onCropEnd); + + if (options.responsive) { + $(window).off(EVENT_RESIZE, self.onResize); + } + } + }; + + var REGEXP_ACTIONS = /^(e|w|s|n|se|sw|ne|nw|all|crop|move|zoom)$/; + + function getPointer(_ref, endOnly) { + var pageX = _ref.pageX, + pageY = _ref.pageY; + + var end = { + endX: pageX, + endY: pageY + }; + + if (endOnly) { + return end; + } + + return $.extend({ + startX: pageX, + startY: pageY + }, end); + } + + var handlers = { + resize: function resize() { + var self = this; + var options = self.options; + var $container = self.$container; + var container = self.container; + var minContainerWidth = Number(options.minContainerWidth) || 200; + var minContainerHeight = Number(options.minContainerHeight) || 100; + + if (self.disabled || container.width === minContainerWidth || container.height === minContainerHeight) { + return; + } + + var ratio = $container.width() / container.width; + + // Resize when width changed or height changed + if (ratio !== 1 || $container.height() !== container.height) { + var canvasData = void 0; + var cropBoxData = void 0; + + if (options.restore) { + canvasData = self.getCanvasData(); + cropBoxData = self.getCropBoxData(); + } + + self.render(); + + if (options.restore) { + self.setCanvasData($.each(canvasData, function (i, n) { + canvasData[i] = n * ratio; + })); + self.setCropBoxData($.each(cropBoxData, function (i, n) { + cropBoxData[i] = n * ratio; + })); + } + } + }, + dblclick: function dblclick() { + var self = this; + + if (self.disabled || self.options.dragMode === 'none') { + return; + } + + self.setDragMode(self.$dragBox.hasClass('cropper-crop') ? 'move' : 'crop'); + }, + wheel: function wheel(event) { + var self = this; + var e = event.originalEvent || event; + var ratio = Number(self.options.wheelZoomRatio) || 0.1; + + if (self.disabled) { + return; + } + + event.preventDefault(); + + // Limit wheel speed to prevent zoom too fast + if (self.wheeling) { + return; + } + + self.wheeling = true; + + setTimeout(function () { + self.wheeling = false; + }, 50); + + var delta = 1; + + if (e.deltaY) { + delta = e.deltaY > 0 ? 1 : -1; + } else if (e.wheelDelta) { + delta = -e.wheelDelta / 120; + } else if (e.detail) { + delta = e.detail > 0 ? 1 : -1; + } + + self.zoom(-delta * ratio, event); + }, + cropStart: function cropStart(e) { + var self = this; + + if (self.disabled) { + return; + } + + var options = self.options; + var pointers = self.pointers; + var originalEvent = e.originalEvent; + var action = void 0; + + if (originalEvent && originalEvent.changedTouches) { + // Handle touch event + $.each(originalEvent.changedTouches, function (i, touch) { + pointers[touch.identifier] = getPointer(touch); + }); + } else { + // Handle mouse event and pointer event + pointers[originalEvent && originalEvent.pointerId || 0] = getPointer(originalEvent || e); + } + + if (objectKeys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) { + action = 'zoom'; + } else { + action = $(e.target).data('action'); + } + + if (!REGEXP_ACTIONS.test(action)) { + return; + } + + if (self.trigger('cropstart', { + originalEvent: originalEvent, + action: action + }).isDefaultPrevented()) { + return; + } + + e.preventDefault(); + + self.action = action; + self.cropping = false; + + if (action === 'crop') { + self.cropping = true; + self.$dragBox.addClass('cropper-modal'); + } + }, + cropMove: function cropMove(e) { + var self = this; + var action = self.action; + + if (self.disabled || !action) { + return; + } + + var pointers = self.pointers; + var originalEvent = e.originalEvent; + + e.preventDefault(); + + if (self.trigger('cropmove', { + originalEvent: originalEvent, + action: action + }).isDefaultPrevented()) { + return; + } + + if (originalEvent && originalEvent.changedTouches) { + $.each(originalEvent.changedTouches, function (i, touch) { + $.extend(pointers[touch.identifier], getPointer(touch, true)); + }); + } else { + $.extend(pointers[originalEvent && originalEvent.pointerId || 0], getPointer(originalEvent || e, true)); + } + + self.change(e); + }, + cropEnd: function cropEnd(e) { + var self = this; + + if (self.disabled) { + return; + } + + var action = self.action; + var pointers = self.pointers; + var originalEvent = e.originalEvent; + + if (originalEvent && originalEvent.changedTouches) { + $.each(originalEvent.changedTouches, function (i, touch) { + delete pointers[touch.identifier]; + }); + } else { + delete pointers[originalEvent && originalEvent.pointerId || 0]; + } + + if (!action) { + return; + } + + e.preventDefault(); + + if (!objectKeys(pointers).length) { + self.action = ''; + } + + if (self.cropping) { + self.cropping = false; + self.$dragBox.toggleClass('cropper-modal', self.cropped && self.options.modal); + } + + self.trigger('cropend', { + originalEvent: originalEvent, + action: action + }); + } + }; + + // Actions + var ACTION_EAST = 'e'; + var ACTION_WEST = 'w'; + var ACTION_SOUTH = 's'; + var ACTION_NORTH = 'n'; + var ACTION_SOUTH_EAST = 'se'; + var ACTION_SOUTH_WEST = 'sw'; + var ACTION_NORTH_EAST = 'ne'; + var ACTION_NORTH_WEST = 'nw'; + + function getMaxZoomRatio(pointers) { + var pointers2 = $.extend({}, pointers); + var ratios = []; + + $.each(pointers, function (pointerId, pointer) { + delete pointers2[pointerId]; + + $.each(pointers2, function (pointerId2, pointer2) { + var x1 = Math.abs(pointer.startX - pointer2.startX); + var y1 = Math.abs(pointer.startY - pointer2.startY); + var x2 = Math.abs(pointer.endX - pointer2.endX); + var y2 = Math.abs(pointer.endY - pointer2.endY); + var z1 = Math.sqrt(x1 * x1 + y1 * y1); + var z2 = Math.sqrt(x2 * x2 + y2 * y2); + var ratio = (z2 - z1) / z1; + + ratios.push(ratio); + }); + }); + + ratios.sort(function (a, b) { + return Math.abs(a) < Math.abs(b); + }); + + return ratios[0]; + } + + var change = { + change: function change(e) { + var self = this; + var options = self.options; + var pointers = self.pointers; + var pointer = pointers[objectKeys(pointers)[0]]; + var container = self.container; + var canvas = self.canvas; + var cropBox = self.cropBox; + var action = self.action; + var aspectRatio = options.aspectRatio; + var width = cropBox.width; + var height = cropBox.height; + var left = cropBox.left; + var top = cropBox.top; + var right = left + width; + var bottom = top + height; + var minLeft = 0; + var minTop = 0; + var maxWidth = container.width; + var maxHeight = container.height; + var renderable = true; + var offset = void 0; + + // Locking aspect ratio in "free mode" by holding shift key (#259) + if (!aspectRatio && e.shiftKey) { + aspectRatio = width && height ? width / height : 1; + } + + if (self.limited) { + minLeft = cropBox.minLeft; + minTop = cropBox.minTop; + maxWidth = minLeft + Math.min(container.width, canvas.width, canvas.left + canvas.width); + maxHeight = minTop + Math.min(container.height, canvas.height, canvas.top + canvas.height); + } + + var range = { + x: pointer.endX - pointer.startX, + y: pointer.endY - pointer.startY + }; + + switch (action) { + // Move crop box + case 'all': + left += range.x; + top += range.y; + break; + + // Resize crop box + case ACTION_EAST: + if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + if (right + range.x > maxWidth) { + range.x = maxWidth - right; + } + + width += range.x; + + if (aspectRatio) { + height = width / aspectRatio; + top -= range.x / aspectRatio / 2; + } + + if (width < 0) { + action = ACTION_WEST; + width = 0; + } + + break; + + case ACTION_NORTH: + if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + if (top + range.y < minTop) { + range.y = minTop - top; + } + + height -= range.y; + top += range.y; + + if (aspectRatio) { + width = height * aspectRatio; + left += range.y * aspectRatio / 2; + } + + if (height < 0) { + action = ACTION_SOUTH; + height = 0; + } + + break; + + case ACTION_WEST: + if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + if (left + range.x < minLeft) { + range.x = minLeft - left; + } + + width -= range.x; + left += range.x; + + if (aspectRatio) { + height = width / aspectRatio; + top += range.x / aspectRatio / 2; + } + + if (width < 0) { + action = ACTION_EAST; + width = 0; + } + + break; + + case ACTION_SOUTH: + if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + if (bottom + range.y > maxHeight) { + range.y = maxHeight - bottom; + } + + height += range.y; + + if (aspectRatio) { + width = height * aspectRatio; + left -= range.y * aspectRatio / 2; + } + + if (height < 0) { + action = ACTION_NORTH; + height = 0; + } + + break; + + case ACTION_NORTH_EAST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || right >= maxWidth)) { + renderable = false; + break; + } + + height -= range.y; + top += range.y; + width = height * aspectRatio; + } else { + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_WEST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_NORTH_WEST; + width = 0; + } else if (height < 0) { + action = ACTION_SOUTH_EAST; + height = 0; + } + + break; + + case ACTION_NORTH_WEST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || left <= minLeft)) { + renderable = false; + break; + } + + height -= range.y; + top += range.y; + width = height * aspectRatio; + left += range.y * aspectRatio; + } else { + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_EAST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_NORTH_EAST; + width = 0; + } else if (height < 0) { + action = ACTION_SOUTH_WEST; + height = 0; + } + + break; + + case ACTION_SOUTH_WEST: + if (aspectRatio) { + if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) { + renderable = false; + break; + } + + width -= range.x; + left += range.x; + height = width / aspectRatio; + } else { + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_EAST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_SOUTH_EAST; + width = 0; + } else if (height < 0) { + action = ACTION_NORTH_WEST; + height = 0; + } + + break; + + case ACTION_SOUTH_EAST: + if (aspectRatio) { + if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) { + renderable = false; + break; + } + + width += range.x; + height = width / aspectRatio; + } else { + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_WEST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_SOUTH_WEST; + width = 0; + } else if (height < 0) { + action = ACTION_NORTH_EAST; + height = 0; + } + + break; + + // Move canvas + case 'move': + self.move(range.x, range.y); + renderable = false; + break; + + // Zoom canvas + case 'zoom': + self.zoom(getMaxZoomRatio(pointers), e.originalEvent); + renderable = false; + break; + + // Create crop box + case 'crop': + if (!range.x || !range.y) { + renderable = false; + break; + } + + offset = self.$cropper.offset(); + left = pointer.startX - offset.left; + top = pointer.startY - offset.top; + width = cropBox.minWidth; + height = cropBox.minHeight; + + if (range.x > 0) { + action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST; + } else if (range.x < 0) { + left -= width; + action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST; + } + + if (range.y < 0) { + top -= height; + } + + // Show the crop box if is hidden + if (!self.cropped) { + self.$cropBox.removeClass('cropper-hidden'); + self.cropped = true; + + if (self.limited) { + self.limitCropBox(true, true); + } + } + + break; + + default: + } + + if (renderable) { + cropBox.width = width; + cropBox.height = height; + cropBox.left = left; + cropBox.top = top; + self.action = action; + self.renderCropBox(); + } + + // Override + $.each(pointers, function (i, p) { + p.startX = p.endX; + p.startY = p.endY; + }); + } + }; + + function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length) ; i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + + function getPointersCenter(pointers) { + var pageX = 0; + var pageY = 0; + var count = 0; + + $.each(pointers, function (i, _ref) { + var startX = _ref.startX, + startY = _ref.startY; + + pageX += startX; + pageY += startY; + count += 1; + }); + + pageX /= count; + pageY /= count; + + return { + pageX: pageX, + pageY: pageY + }; + } + + var methods = { + // Show the crop box manually + crop: function crop() { + var self = this; + + if (!self.ready || self.disabled) { + return; + } + + if (!self.cropped) { + self.cropped = true; + self.limitCropBox(true, true); + + if (self.options.modal) { + self.$dragBox.addClass('cropper-modal'); + } + + self.$cropBox.removeClass('cropper-hidden'); + } + + self.setCropBoxData(self.initialCropBox); + }, + + + // Reset the image and crop box to their initial states + reset: function reset() { + var self = this; + + if (!self.ready || self.disabled) { + return; + } + + self.image = $.extend({}, self.initialImage); + self.canvas = $.extend({}, self.initialCanvas); + self.cropBox = $.extend({}, self.initialCropBox); + + self.renderCanvas(); + + if (self.cropped) { + self.renderCropBox(); + } + }, + + + // Clear the crop box + clear: function clear() { + var self = this; + + if (!self.cropped || self.disabled) { + return; + } + + $.extend(self.cropBox, { + left: 0, + top: 0, + width: 0, + height: 0 + }); + + self.cropped = false; + self.renderCropBox(); + + self.limitCanvas(true, true); + + // Render canvas after crop box rendered + self.renderCanvas(); + + self.$dragBox.removeClass('cropper-modal'); + self.$cropBox.addClass('cropper-hidden'); + }, + + + /** + * Replace the image's src and rebuild the cropper + * + * @param {String} url + * @param {Boolean} onlyColorChanged (optional) + */ + replace: function replace(url, onlyColorChanged) { + var self = this; + + if (!self.disabled && url) { + if (self.isImg) { + self.$element.attr('src', url); + } + + if (onlyColorChanged) { + self.url = url; + self.$clone.attr('src', url); + + if (self.ready) { + self.$preview.find('img').add(self.$clone2).attr('src', url); + } + } else { + if (self.isImg) { + self.replaced = true; + } + + // Clear previous data + self.options.data = null; + self.load(url); + } + } + }, + + + // Enable (unfreeze) the cropper + enable: function enable() { + var self = this; + + if (self.ready) { + self.disabled = false; + self.$cropper.removeClass('cropper-disabled'); + } + }, + + + // Disable (freeze) the cropper + disable: function disable() { + var self = this; + + if (self.ready) { + self.disabled = true; + self.$cropper.addClass('cropper-disabled'); + } + }, + + + // Destroy the cropper and remove the instance from the image + destroy: function destroy() { + var self = this; + var $this = self.$element; + + if (self.loaded) { + if (self.isImg && self.replaced) { + $this.attr('src', self.originalUrl); + } + + self.unbuild(); + $this.removeClass('cropper-hidden'); + } else if (self.isImg) { + $this.off('load', self.start); + } else if (self.$clone) { + self.$clone.remove(); + } + + $this.removeData('cropper'); + }, + + + /** + * Move the canvas with relative offsets + * + * @param {Number} offsetX + * @param {Number} offsetY (optional) + */ + move: function move(offsetX, offsetY) { + var self = this; + var canvas = self.canvas; + + self.moveTo(isUndefined(offsetX) ? offsetX : canvas.left + Number(offsetX), isUndefined(offsetY) ? offsetY : canvas.top + Number(offsetY)); + }, + + + /** + * Move the canvas to an absolute point + * + * @param {Number} x + * @param {Number} y (optional) + */ + moveTo: function moveTo(x, y) { + var self = this; + var canvas = self.canvas; + var changed = false; + + // If "y" is not present, its default value is "x" + if (isUndefined(y)) { + y = x; + } + + x = Number(x); + y = Number(y); + + if (self.ready && !self.disabled && self.options.movable) { + if (isNumber(x)) { + canvas.left = x; + changed = true; + } + + if (isNumber(y)) { + canvas.top = y; + changed = true; + } + + if (changed) { + self.renderCanvas(true); + } + } + }, + + + /** + * Zoom the canvas with a relative ratio + * + * @param {Number} ratio + * @param {jQuery Event} _event (private) + */ + zoom: function zoom(ratio, _event) { + var self = this; + var canvas = self.canvas; + + ratio = Number(ratio); + + if (ratio < 0) { + ratio = 1 / (1 - ratio); + } else { + ratio = 1 + ratio; + } + + self.zoomTo(canvas.width * ratio / canvas.naturalWidth, _event); + }, + + + /** + * Zoom the canvas to an absolute ratio + * + * @param {Number} ratio + * @param {jQuery Event} _event (private) + */ + zoomTo: function zoomTo(ratio, _event) { + var self = this; + var options = self.options; + var pointers = self.pointers; + var canvas = self.canvas; + var width = canvas.width; + var height = canvas.height; + var naturalWidth = canvas.naturalWidth; + var naturalHeight = canvas.naturalHeight; + + ratio = Number(ratio); + + if (ratio >= 0 && self.ready && !self.disabled && options.zoomable) { + var newWidth = naturalWidth * ratio; + var newHeight = naturalHeight * ratio; + var originalEvent = void 0; + + if (_event) { + originalEvent = _event.originalEvent; + } + + if (self.trigger('zoom', { + originalEvent: originalEvent, + oldRatio: width / naturalWidth, + ratio: newWidth / naturalWidth + }).isDefaultPrevented()) { + return; + } + + if (originalEvent) { + var offset = self.$cropper.offset(); + var center = pointers && objectKeys(pointers).length ? getPointersCenter(pointers) : { + pageX: _event.pageX || originalEvent.pageX || 0, + pageY: _event.pageY || originalEvent.pageY || 0 + }; + + // Zoom from the triggering point of the event + canvas.left -= (newWidth - width) * ((center.pageX - offset.left - canvas.left) / width); + canvas.top -= (newHeight - height) * ((center.pageY - offset.top - canvas.top) / height); + } else { + // Zoom from the center of the canvas + canvas.left -= (newWidth - width) / 2; + canvas.top -= (newHeight - height) / 2; + } + + canvas.width = newWidth; + canvas.height = newHeight; + self.renderCanvas(true); + } + }, + + + /** + * Rotate the canvas with a relative degree + * + * @param {Number} degree + */ + rotate: function rotate(degree) { + var self = this; + + self.rotateTo((self.image.rotate || 0) + Number(degree)); + }, + + + /** + * Rotate the canvas to an absolute degree + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#rotate() + * + * @param {Number} degree + */ + rotateTo: function rotateTo(degree) { + var self = this; + + degree = Number(degree); + + if (isNumber(degree) && self.ready && !self.disabled && self.options.rotatable) { + self.image.rotate = degree % 360; + self.rotated = true; + self.renderCanvas(true); + } + }, + + + /** + * Scale the image + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#scale() + * + * @param {Number} scaleX + * @param {Number} scaleY (optional) + */ + scale: function scale(scaleX, scaleY) { + var self = this; + var image = self.image; + var changed = false; + + // If "scaleY" is not present, its default value is "scaleX" + if (isUndefined(scaleY)) { + scaleY = scaleX; + } + + scaleX = Number(scaleX); + scaleY = Number(scaleY); + + if (self.ready && !self.disabled && self.options.scalable) { + if (isNumber(scaleX)) { + image.scaleX = scaleX; + changed = true; + } + + if (isNumber(scaleY)) { + image.scaleY = scaleY; + changed = true; + } + + if (changed) { + self.renderImage(true); + } + } + }, + + + /** + * Scale the abscissa of the image + * + * @param {Number} scaleX + */ + scaleX: function scaleX(_scaleX) { + var self = this; + var scaleY = self.image.scaleY; + + self.scale(_scaleX, isNumber(scaleY) ? scaleY : 1); + }, + + + /** + * Scale the ordinate of the image + * + * @param {Number} scaleY + */ + scaleY: function scaleY(_scaleY) { + var self = this; + var scaleX = self.image.scaleX; + + self.scale(isNumber(scaleX) ? scaleX : 1, _scaleY); + }, + + + /** + * Get the cropped area position and size data (base on the original image) + * + * @param {Boolean} isRounded (optional) + * @return {Object} data + */ + getData: function getData(isRounded) { + var self = this; + var options = self.options; + var image = self.image; + var canvas = self.canvas; + var cropBox = self.cropBox; + var ratio = void 0; + var data = void 0; + + if (self.ready && self.cropped) { + data = { + x: cropBox.left - canvas.left, + y: cropBox.top - canvas.top, + width: cropBox.width, + height: cropBox.height + }; + + ratio = image.width / image.naturalWidth; + + $.each(data, function (i, n) { + n /= ratio; + data[i] = isRounded ? Math.round(n) : n; + }); + } else { + data = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } + + if (options.rotatable) { + data.rotate = image.rotate || 0; + } + + if (options.scalable) { + data.scaleX = image.scaleX || 1; + data.scaleY = image.scaleY || 1; + } + + return data; + }, + + + /** + * Set the cropped area position and size with new data + * + * @param {Object} data + */ + setData: function setData(data) { + var self = this; + var options = self.options; + var image = self.image; + var canvas = self.canvas; + var cropBoxData = {}; + var rotated = void 0; + var isScaled = void 0; + var ratio = void 0; + + if ($.isFunction(data)) { + data = data.call(self.element); + } + + if (self.ready && !self.disabled && $.isPlainObject(data)) { + if (options.rotatable) { + if (isNumber(data.rotate) && data.rotate !== image.rotate) { + image.rotate = data.rotate; + rotated = true; + self.rotated = rotated; + } + } + + if (options.scalable) { + if (isNumber(data.scaleX) && data.scaleX !== image.scaleX) { + image.scaleX = data.scaleX; + isScaled = true; + } + + if (isNumber(data.scaleY) && data.scaleY !== image.scaleY) { + image.scaleY = data.scaleY; + isScaled = true; + } + } + + if (rotated) { + self.renderCanvas(); + } else if (isScaled) { + self.renderImage(); + } + + ratio = image.width / image.naturalWidth; + + if (isNumber(data.x)) { + cropBoxData.left = data.x * ratio + canvas.left; + } + + if (isNumber(data.y)) { + cropBoxData.top = data.y * ratio + canvas.top; + } + + if (isNumber(data.width)) { + cropBoxData.width = data.width * ratio; + } + + if (isNumber(data.height)) { + cropBoxData.height = data.height * ratio; + } + + self.setCropBoxData(cropBoxData); + } + }, + + + /** + * Get the container size data + * + * @return {Object} data + */ + getContainerData: function getContainerData() { + return this.ready ? this.container : {}; + }, + + + /** + * Get the image position and size data + * + * @return {Object} data + */ + getImageData: function getImageData() { + return this.loaded ? this.image : {}; + }, + + + /** + * Get the canvas position and size data + * + * @return {Object} data + */ + getCanvasData: function getCanvasData() { + var self = this; + var canvas = self.canvas; + var data = {}; + + if (self.ready) { + $.each(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (i, n) { + data[n] = canvas[n]; + }); + } + + return data; + }, + + + /** + * Set the canvas position and size with new data + * + * @param {Object} data + */ + setCanvasData: function setCanvasData(data) { + var self = this; + var canvas = self.canvas; + var aspectRatio = canvas.aspectRatio; + + if ($.isFunction(data)) { + data = data.call(self.$element); + } + + if (self.ready && !self.disabled && $.isPlainObject(data)) { + if (isNumber(data.left)) { + canvas.left = data.left; + } + + if (isNumber(data.top)) { + canvas.top = data.top; + } + + if (isNumber(data.width)) { + canvas.width = data.width; + canvas.height = data.width / aspectRatio; + } else if (isNumber(data.height)) { + canvas.height = data.height; + canvas.width = data.height * aspectRatio; + } + + self.renderCanvas(true); + } + }, + + + /** + * Get the crop box position and size data + * + * @return {Object} data + */ + getCropBoxData: function getCropBoxData() { + var self = this; + var cropBox = self.cropBox; + + return self.ready && self.cropped ? { + left: cropBox.left, + top: cropBox.top, + width: cropBox.width, + height: cropBox.height + } : {}; + }, + + + /** + * Set the crop box position and size with new data + * + * @param {Object} data + */ + setCropBoxData: function setCropBoxData(data) { + var self = this; + var cropBox = self.cropBox; + var aspectRatio = self.options.aspectRatio; + var widthChanged = void 0; + var heightChanged = void 0; + + if ($.isFunction(data)) { + data = data.call(self.$element); + } + + if (self.ready && self.cropped && !self.disabled && $.isPlainObject(data)) { + if (isNumber(data.left)) { + cropBox.left = data.left; + } + + if (isNumber(data.top)) { + cropBox.top = data.top; + } + + if (isNumber(data.width) && data.width !== cropBox.width) { + widthChanged = true; + cropBox.width = data.width; + } + + if (isNumber(data.height) && data.height !== cropBox.height) { + heightChanged = true; + cropBox.height = data.height; + } + + if (aspectRatio) { + if (widthChanged) { + cropBox.height = cropBox.width / aspectRatio; + } else if (heightChanged) { + cropBox.width = cropBox.height * aspectRatio; + } + } + + self.renderCropBox(); + } + }, + + + /** + * Get a canvas drawn the cropped image + * + * @param {Object} options (optional) + * @return {HTMLCanvasElement} canvas + */ + getCroppedCanvas: function getCroppedCanvas(options) { + var self = this; + + if (!self.ready || !window.HTMLCanvasElement) { + return null; + } + + if (!$.isPlainObject(options)) { + options = {}; + } + + if (!self.cropped) { + return getSourceCanvas(self.$clone[0], self.image, options); + } + + var data = self.getData(); + var originalWidth = data.width; + var originalHeight = data.height; + var aspectRatio = originalWidth / originalHeight; + var scaledWidth = void 0; + var scaledHeight = void 0; + var scaledRatio = void 0; + + if ($.isPlainObject(options)) { + scaledWidth = options.width; + scaledHeight = options.height; + + if (scaledWidth) { + scaledHeight = scaledWidth / aspectRatio; + scaledRatio = scaledWidth / originalWidth; + } else if (scaledHeight) { + scaledWidth = scaledHeight * aspectRatio; + scaledRatio = scaledHeight / originalHeight; + } + } + + // The canvas element will use `Math.Math.floor` on a float number, so Math.floor first + var canvasWidth = Math.floor(scaledWidth || originalWidth); + var canvasHeight = Math.floor(scaledHeight || originalHeight); + + var canvas = $('')[0]; + var context = canvas.getContext('2d'); + + canvas.width = canvasWidth; + canvas.height = canvasHeight; + + if (options.fillColor) { + context.fillStyle = options.fillColor; + context.fillRect(0, 0, canvasWidth, canvasHeight); + } + + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage + var parameters = function () { + var source = getSourceCanvas(self.$clone[0], self.image, options); + var sourceWidth = source.width; + var sourceHeight = source.height; + var canvasData = self.canvas; + var params = [source]; + + // Source canvas + var srcX = data.x + canvasData.naturalWidth * (Math.abs(data.scaleX || 1) - 1) / 2; + var srcY = data.y + canvasData.naturalHeight * (Math.abs(data.scaleY || 1) - 1) / 2; + var srcWidth = void 0; + var srcHeight = void 0; + + // Destination canvas + var dstX = void 0; + var dstY = void 0; + var dstWidth = void 0; + var dstHeight = void 0; + + if (srcX <= -originalWidth || srcX > sourceWidth) { + srcX = 0; + srcWidth = 0; + dstX = 0; + dstWidth = 0; + } else if (srcX <= 0) { + dstX = -srcX; + srcX = 0; + dstWidth = Math.min(sourceWidth, originalWidth + srcX); + srcWidth = dstWidth; + } else if (srcX <= sourceWidth) { + dstX = 0; + dstWidth = Math.min(originalWidth, sourceWidth - srcX); + srcWidth = dstWidth; + } + + if (srcWidth <= 0 || srcY <= -originalHeight || srcY > sourceHeight) { + srcY = 0; + srcHeight = 0; + dstY = 0; + dstHeight = 0; + } else if (srcY <= 0) { + dstY = -srcY; + srcY = 0; + dstHeight = Math.min(sourceHeight, originalHeight + srcY); + srcHeight = dstHeight; + } else if (srcY <= sourceHeight) { + dstY = 0; + dstHeight = Math.min(originalHeight, sourceHeight - srcY); + srcHeight = dstHeight; + } + + // All the numerical parameters should be integer for `drawImage` (#476) + params.push(Math.floor(srcX), Math.floor(srcY), Math.floor(srcWidth), Math.floor(srcHeight)); + + // Scale destination sizes + if (scaledRatio) { + dstX *= scaledRatio; + dstY *= scaledRatio; + dstWidth *= scaledRatio; + dstHeight *= scaledRatio; + } + + // Avoid "IndexSizeError" in IE and Firefox + if (dstWidth > 0 && dstHeight > 0) { + params.push(Math.floor(dstX), Math.floor(dstY), Math.floor(dstWidth), Math.floor(dstHeight)); + } + + return params; + }(); + + context.imageSmoothingEnabled = !!options.imageSmoothingEnabled; + + if (options.imageSmoothingQuality) { + context.imageSmoothingQuality = options.imageSmoothingQuality; + } + + context.drawImage.apply(context, _toConsumableArray(parameters)); + + return canvas; + }, + + + /** + * Change the aspect ratio of the crop box + * + * @param {Number} aspectRatio + */ + setAspectRatio: function setAspectRatio(aspectRatio) { + var self = this; + var options = self.options; + + if (!self.disabled && !isUndefined(aspectRatio)) { + // 0 -> NaN + options.aspectRatio = Math.max(0, aspectRatio) || NaN; + + if (self.ready) { + self.initCropBox(); + + if (self.cropped) { + self.renderCropBox(); + } + } + } + }, + + + /** + * Change the drag mode + * + * @param {String} mode (optional) + */ + setDragMode: function setDragMode(mode) { + var self = this; + var options = self.options; + var croppable = void 0; + var movable = void 0; + + if (self.loaded && !self.disabled) { + croppable = mode === 'crop'; + movable = options.movable && mode === 'move'; + mode = croppable || movable ? mode : 'none'; + + self.$dragBox.data('action', mode).toggleClass('cropper-crop', croppable).toggleClass('cropper-move', movable); + + if (!options.cropBoxMovable) { + // Sync drag mode to crop box when it is not movable(#300) + self.$face.data('action', mode).toggleClass('cropper-crop', croppable).toggleClass('cropper-move', movable); + } + } + } + }; + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var CLASS_HIDDEN = 'cropper-hidden'; + var REGEXP_DATA_URL = /^data:/; + var REGEXP_DATA_URL_JPEG = /^data:image\/jpeg;base64,/; + + var Cropper = function () { + function Cropper(element, options) { + _classCallCheck(this, Cropper); + + var self = this; + + self.$element = $(element); + self.options = $.extend({}, DEFAULTS, $.isPlainObject(options) && options); + self.loaded = false; + self.ready = false; + self.completed = false; + self.rotated = false; + self.cropped = false; + self.disabled = false; + self.replaced = false; + self.limited = false; + self.wheeling = false; + self.isImg = false; + self.originalUrl = ''; + self.canvas = null; + self.cropBox = null; + self.pointers = {}; + self.init(); + } + + _createClass(Cropper, [{ + key: 'init', + value: function init() { + var self = this; + var $this = self.$element; + var url = void 0; + + if ($this.is('img')) { + self.isImg = true; + + // Should use `$.fn.attr` here. e.g.: "img/picture.jpg" + url = $this.attr('src'); + self.originalUrl = url; + + // Stop when it's a blank image + if (!url) { + return; + } + + // Should use `$.fn.prop` here. e.g.: "http://example.com/img/picture.jpg" + url = $this.prop('src'); + } else if ($this.is('canvas') && window.HTMLCanvasElement) { + url = $this[0].toDataURL(); + } + + self.load(url); + } + + // A shortcut for triggering custom events + + }, { + key: 'trigger', + value: function trigger(type, data) { + var e = $.Event(type, data); + + this.$element.trigger(e); + + return e; + } + }, { + key: 'load', + value: function load(url) { + var self = this; + var options = self.options; + var $this = self.$element; + + if (!url) { + return; + } + + self.url = url; + self.image = {}; + + if (!options.checkOrientation || !window.ArrayBuffer) { + self.clone(); + return; + } + + // XMLHttpRequest disallows to open a Data URL in some browsers like IE11 and Safari + if (REGEXP_DATA_URL.test(url)) { + if (REGEXP_DATA_URL_JPEG.test(url)) { + self.read(dataURLToArrayBuffer(url)); + } else { + self.clone(); + } + return; + } + + var xhr = new XMLHttpRequest(); + + xhr.onerror = $.proxy(function () { + self.clone(); + }, this); + + xhr.onload = function load() { + self.read(this.response); + }; + + if (options.checkCrossOrigin && isCrossOriginURL(url) && $this.prop('crossOrigin')) { + url = addTimestamp(url); + } + + xhr.open('get', url); + xhr.responseType = 'arraybuffer'; + xhr.withCredentials = $this.prop('crossOrigin') === 'use-credentials'; + xhr.send(); + } + }, { + key: 'read', + value: function read(arrayBuffer) { + var self = this; + var options = self.options; + var orientation = getOrientation(arrayBuffer); + var image = self.image; + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + if (orientation > 1) { + self.url = arrayBufferToDataURL(arrayBuffer); + + switch (orientation) { + // flip horizontal + case 2: + scaleX = -1; + break; + + // rotate left 180° + case 3: + rotate = -180; + break; + + // flip vertical + case 4: + scaleY = -1; + break; + + // flip vertical + rotate right 90° + case 5: + rotate = 90; + scaleY = -1; + break; + + // rotate right 90° + case 6: + rotate = 90; + break; + + // flip horizontal + rotate right 90° + case 7: + rotate = 90; + scaleX = -1; + break; + + // rotate left 90° + case 8: + rotate = -90; + break; + + default: + } + } + + if (options.rotatable) { + image.rotate = rotate; + } + + if (options.scalable) { + image.scaleX = scaleX; + image.scaleY = scaleY; + } + + self.clone(); + } + }, { + key: 'clone', + value: function clone() { + var self = this; + var options = self.options; + var $this = self.$element; + var url = self.url; + var crossOrigin = ''; + var crossOriginUrl = void 0; + + if (options.checkCrossOrigin && isCrossOriginURL(url)) { + crossOrigin = $this.prop('crossOrigin'); + + if (crossOrigin) { + crossOriginUrl = url; + } else { + crossOrigin = 'anonymous'; + + // Bust cache (#148) when there is not a "crossOrigin" property + crossOriginUrl = addTimestamp(url); + } + } + + self.crossOrigin = crossOrigin; + self.crossOriginUrl = crossOriginUrl; + + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = crossOriginUrl || url; + + var $clone = $(image); + + self.$clone = $clone; + + if (self.isImg) { + if ($this[0].complete) { + self.start(); + } else { + $this.one('load', $.proxy(self.start, this)); + } + } else { + $clone.one('load', $.proxy(self.start, this)).one('error', $.proxy(self.stop, this)).addClass('cropper-hide').insertAfter($this); + } + } + }, { + key: 'start', + value: function start() { + var self = this; + var $clone = self.$clone; + var $image = self.$element; + + if (!self.isImg) { + $clone.off('error', self.stop); + $image = $clone; + } + + getImageSize($image[0], function (naturalWidth, naturalHeight) { + $.extend(self.image, { + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + aspectRatio: naturalWidth / naturalHeight + }); + + self.loaded = true; + self.build(); + }); + } + }, { + key: 'stop', + value: function stop() { + var self = this; + + self.$clone.remove(); + self.$clone = null; + } + }, { + key: 'build', + value: function build() { + var self = this; + var options = self.options; + var $this = self.$element; + var $clone = self.$clone; + + if (!self.loaded) { + return; + } + + // Unbuild first when replace + if (self.ready) { + self.unbuild(); + } + + var $cropper = $(TEMPLATE); + var $cropBox = $cropper.find('.cropper-crop-box'); + var $face = $cropBox.find('.cropper-face'); + + // Create cropper elements + self.$container = $this.parent(); + self.$cropper = $cropper; + self.$canvas = $cropper.find('.cropper-canvas').append($clone); + self.$dragBox = $cropper.find('.cropper-drag-box'); + self.$cropBox = $cropBox; + self.$viewBox = $cropper.find('.cropper-view-box'); + self.$face = $face; + + // Hide the original image + $this.addClass(CLASS_HIDDEN).after($cropper); + + // Show the clone image if is hidden + if (!self.isImg) { + $clone.removeClass('cropper-hide'); + } + + self.initPreview(); + self.bind(); + + options.aspectRatio = Math.max(0, options.aspectRatio) || NaN; + options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0; + + self.cropped = options.autoCrop; + + if (options.autoCrop) { + if (options.modal) { + self.$dragBox.addClass('cropper-modal'); + } + } else { + $cropBox.addClass(CLASS_HIDDEN); + } + + if (!options.guides) { + $cropBox.find('.cropper-dashed').addClass(CLASS_HIDDEN); + } + + if (!options.center) { + $cropBox.find('.cropper-center').addClass(CLASS_HIDDEN); + } + + if (options.cropBoxMovable) { + $face.addClass('cropper-move').data('action', 'all'); + } + + if (!options.highlight) { + $face.addClass('cropper-invisible'); + } + + if (options.background) { + $cropper.addClass('cropper-bg'); + } + + if (!options.cropBoxResizable) { + $cropBox.find('.cropper-line, .cropper-point').addClass(CLASS_HIDDEN); + } + + self.setDragMode(options.dragMode); + self.render(); + self.ready = true; + self.setData(options.data); + + // Trigger the ready event asynchronously to keep `data('cropper')` is defined + self.completing = setTimeout(function () { + if ($.isFunction(options.ready)) { + $this.one('ready', options.ready); + } + + self.trigger('ready'); + self.trigger('crop', self.getData()); + self.completed = true; + }, 0); + } + }, { + key: 'unbuild', + value: function unbuild() { + var self = this; + + if (!self.ready) { + return; + } + + if (!self.completed) { + clearTimeout(self.completing); + } + + self.ready = false; + self.completed = false; + self.initialImage = null; + + // Clear `initialCanvas` is necessary when replace + self.initialCanvas = null; + self.initialCropBox = null; + self.container = null; + self.canvas = null; + + // Clear `cropBox` is necessary when replace + self.cropBox = null; + self.unbind(); + + self.resetPreview(); + self.$preview = null; + + self.$viewBox = null; + self.$cropBox = null; + self.$dragBox = null; + self.$canvas = null; + self.$container = null; + + self.$cropper.remove(); + self.$cropper = null; + } + }], [{ + key: 'setDefaults', + value: function setDefaults(options) { + $.extend(DEFAULTS, $.isPlainObject(options) && options); + } + }]); + + return Cropper; + }(); + + $.extend(Cropper.prototype, render); + $.extend(Cropper.prototype, preview); + $.extend(Cropper.prototype, events); + $.extend(Cropper.prototype, handlers); + $.extend(Cropper.prototype, change); + $.extend(Cropper.prototype, methods); + + var NAMESPACE = 'cropper'; + var OtherCropper = $.fn.cropper; + + $.fn.cropper = function jQueryCropper(option) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var result = void 0; + + this.each(function (i, element) { + var $this = $(element); + var data = $this.data(NAMESPACE); + + if (!data) { + if (/destroy/.test(option)) { + return; + } + + var options = $.extend({}, $this.data(), $.isPlainObject(option) && option); + $this.data(NAMESPACE, data = new Cropper(element, options)); + } + + if (typeof option === 'string') { + var fn = data[option]; + + if ($.isFunction(fn)) { + result = fn.apply(data, args); + } + } + }); + + return typeof result !== 'undefined' ? result : this; + }; + + $.fn.cropper.Constructor = Cropper; + $.fn.cropper.setDefaults = Cropper.setDefaults; + + // No conflict + $.fn.cropper.noConflict = function noConflict() { + $.fn.cropper = OtherCropper; + return this; + }; + + exports('cropper', $.fn.cropper); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/design.js b/public/static/component/pear/module/design.js new file mode 100644 index 0000000..6bcf7ac --- /dev/null +++ b/public/static/component/pear/module/design.js @@ -0,0 +1,182 @@ +layui.define(['layer', 'form'], function(exports) { + var layer = layui.layer, + form = layui.form, + $ = layui.$, + key = ''; + delHtml() + $('button').on('click', function() { + var _this = $(this), + size = _this.data('size'), + type = _this.data('type'), + html = ''; + key = randStrName(); + switch (type) { + case 'text': + html = input(type, size) + break; + case 'password': + html = input(type, size) + break; + case 'select': + html = select(size) + break; + case 'checkbox_a': + html = checkbox_a(size) + break; + case 'checkbox_b': + html = checkbox_b(size) + break; + case 'radio': + html = radio(size) + break; + case 'textarea': + html = textarea(size) + break; + case 'submit': + html = submits(size) + break; + case 'del': + $('form').html("\n") + delHtml() + $('.code-show').text('') + return false + break; + default: + layer.msg('类型错误', { + icon: 2 + }) + } + + $('form').append(html); + form.render(); + setHtml(html) + }) + + function delHtml() { + layui.data('form_html', { + key: 'html', + remove: true + }); + } + + function setHtml(html) { + var h = layui.data('form_html'); + if (h && h.html) { + var _d = h.html + html + } else { + var _d = html + } + layui.data('form_html', { + key: 'html', + value: _d + }) + $('.code-show').text('
                      \n' + _d + '
                      ') + + } + + function input(type, size) { + var name = type === 'text' ? '输入框' : (type === 'password' ? '密码框' : ''); + var html = '
                      \n' + + ' \n' + + '
                      \n' + + ' \n' + + '
                      \n' + + '
                      \n'; + return html; + } + + function select(size) { + var html = '
                      \n' + + ' \n' + + '
                      \n' + + ' \n' + + '
                      \n' + + '
                      \n'; + return html; + } + + function checkbox_a(size) { + var html = '
                      \n' + + ' \n' + + '
                      \n' + + ' \n' + + ' \n' + + ' \n' + + '
                      \n' + + '
                      \n'; + return html; + } + + function checkbox_b(size) { + var html = '
                      \n' + + ' \n' + + '
                      \n' + + ' \n' + + '
                      \n' + + '
                      \n'; + return html; + } + + function radio(size) { + var html = '
                      \n' + + ' \n' + + '
                      \n' + + ' \n' + + ' \n' + + '
                      \n' + + '
                      \n'; + return html; + } + + function textarea(size) { + var html = '
                      \n' + + ' \n' + + '
                      \n' + + ' \n' + + '
                      \n' + + '
                      \n'; + return html; + } + + function submits(size) { + var html = '
                      \n' + + '
                      \n' + + ' \n' + + ' \n' + + '
                      \n' + + '
                      \n'; + return html; + } + + function jscode() { + var html = ''; + return html; + } + + function randStrName() { + return Math.random().toString(36).substr(8); + } + var jscodehtml = jscode(); + $('.js-show').text(jscodehtml) + form.on('submit(formDemo)', function(data) { + layer.msg(JSON.stringify(data.field)); + return false; + }); + exports('design', {}); +}); diff --git a/public/static/component/pear/module/drawer.js b/public/static/component/pear/module/drawer.js new file mode 100644 index 0000000..2ef84e7 --- /dev/null +++ b/public/static/component/pear/module/drawer.js @@ -0,0 +1,185 @@ +layui.define(['jquery', 'element'], function(exports) { + "use strict"; + + /** + * Drawer component + * */ + var MOD_NAME = 'drawer', + $ = layui.jquery, + element = layui.element; + + var drawer = new function() { + + /** + * open drawer + * */ + this.open = function(option) { + var obj = new mSlider({ + dom: option.dom, + direction: option.direction, + distance: option.distance, + time: option.time ? option.time : 0, + maskClose: option.maskClose, + callback: option.success + }); + obj.open(); + return obj; + } + + } + exports(MOD_NAME, drawer); +}); + +/** + * 源码 + * */ +(function(b, c) { + function a(d) { + this.opts = { + "direction": d.direction || "left", + "distance": d.distance || "60%", + "dom": this.Q(d.dom), + "time": d.time || "", + "maskClose": (d.maskClose + "").toString() !== "false" ? true : false, + "callback": d.callback || "" + }; + this.rnd = this.rnd(); + this.dom = this.opts.dom[0]; + this.wrap = ""; + this.inner = ""; + this.mask = ""; + this.init() + } + a.prototype = { + Q: function(d) { + return document.querySelectorAll(d) + }, + isMobile: function() { + return navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i) ? true : false + }, + addEvent: function(f, e, d) { + if (f.attachEvent) { + f.attachEvent("on" + e, d) + } else { + f.addEventListener(e, d, false) + } + }, + rnd: function() { + return Math.random().toString(36).substr(2, 6) + }, + init: function() { + var g = this; + if (!g.dom) { + console.log("未正确绑定弹窗容器"); + return + } + var d = document.createElement("div"); + var e = document.createElement("div"); + var f = document.createElement("div"); + d.setAttribute("class", "mSlider-main ms-" + g.rnd); + e.setAttribute("class", "mSlider-inner"); + f.setAttribute("class", "mSlider-mask"); + g.Q("body")[0].appendChild(d); + g.Q(".ms-" + g.rnd)[0].appendChild(e); + g.Q(".ms-" + g.rnd)[0].appendChild(f); + g.wrap = g.Q(".ms-" + g.rnd)[0]; + g.inner = g.Q(".ms-" + g.rnd + " .mSlider-inner")[0]; + g.mask = g.Q(".ms-" + g.rnd + " .mSlider-mask")[0]; + g.inner.appendChild(g.dom); + switch (g.opts.direction) { + case "top": + g.top = "0"; + g.left = "0"; + g.width = "100%"; + g.height = g.opts.distance; + g.translate = "0,-100%,0"; + break; + case "bottom": + g.bottom = "0"; + g.left = "0"; + g.width = "100%"; + g.height = g.opts.distance; + g.translate = "0,100%,0"; + break; + case "right": + g.top = "0"; + g.right = "0"; + g.width = g.opts.distance; + g.height = document.documentElement.clientHeight + "px"; + g.translate = "100%,0,0"; + break; + default: + g.top = "0"; + g.left = "0"; + g.width = g.opts.distance; + g.height = document.documentElement.clientHeight + "px"; + g.translate = "-100%,0,0" + } + g.wrap.style.display = "none"; + g.wrap.style.position = "fixed"; + g.wrap.style.top = "0"; + g.wrap.style.left = "0"; + g.wrap.style.width = "100%"; + g.wrap.style.height = "100%"; + g.wrap.style.zIndex = 9999999; + g.inner.style.position = "absolute"; + g.inner.style.top = g.top; + g.inner.style.bottom = g.bottom; + g.inner.style.left = g.left; + g.inner.style.right = g.right; + g.inner.style.width = g.width; + g.inner.style.height = g.height; + g.inner.style.backgroundColor = "#fff"; + g.inner.style.transform = "translate3d(" + g.translate + ")"; + g.inner.style.webkitTransition = "all .2s ease-out"; + g.inner.style.transition = "all .2s ease-out"; + g.inner.style.zIndex = 10000000; + g.mask.style.width = "100%"; + g.mask.style.height = "100%"; + g.mask.style.opacity = "0.1"; + g.mask.style.backgroundColor = "black"; + g.mask.style.zIndex = "9999998"; + g.mask.style.webkitBackfaceVisibility = "hidden"; + g.events() + }, + open: function() { + var d = this; + d.wrap.style.display = "block"; + + setTimeout(function() { + d.inner.style.transform = "translate3d(0,0,0)"; + d.inner.style.webkitTransform = "translate3d(0,0,0)"; + d.mask.style.opacity = 0.1 + }, 30); + if (d.opts.time) { + d.timer = setTimeout(function() { + d.close() + }, d.opts.time) + } + }, + close: function() { + var d = this; + d.timer && clearTimeout(d.timer); + d.inner.style.webkitTransform = "translate3d(" + d.translate + ")"; + d.inner.style.transform = "translate3d(" + d.translate + ")"; + d.mask.style.opacity = 0; + setTimeout(function() { + d.wrap.style.display = "none"; + d.timer = null; + d.opts.callback && d.opts.callback() + }, 300) + }, + events: function() { + var d = this; + d.addEvent(d.mask, "touchmove", function(f) { + f.preventDefault() + }); + d.addEvent(d.mask, (d.isMobile() ? "touchend" : "click"), function(f) { + if (d.opts.maskClose) { + d.close() + } + }) + } + }; + b.mSlider = a +})(window); \ No newline at end of file diff --git a/public/static/component/pear/module/dtree.js b/public/static/component/pear/module/dtree.js new file mode 100644 index 0000000..77ee91c --- /dev/null +++ b/public/static/component/pear/module/dtree.js @@ -0,0 +1,5538 @@ +/** + *@Name dtree 树形组件 + *@Author 智慧的小西瓜 + *@DOCS http://www.wisdomelon.com/DTreeHelper/ + *@License https://www.layui.com/ + *@LASTTIME 2020/03/31 + *@VERSION v2.5.8 + */ +layui.define(['jquery','layer','form'], function(exports) { + var $ = layui.$, + layer = layui.layer, + form = layui.form; + + // 树的公共定义样式汇总 + var LI_NAV_CHILD = "dtree-nav-ul-sid", LI_NAV_ITEM = "dtree-nav-item", + LI_DIV_ITEM = "dtree-nav-div", DTREEFONTSPECIAL="dtreefont-special", NONETITLE="dtree-none-text", + LI_DIV_MENUBAR = "dtree-menubar", + LI_DIV_TOOLBAR = "dtree-toolbar", TOOLBAR_TOOL = "dtree-toolbar-tool", TOOLBAR_TOOL_EM = "dtree-toolbar-fixed", + LI_DIV_CHECKBAR = "dtree-nav-checkbox-div", + LI_CLICK_CHECKBAR = "d-click-checkbar", //绑定点击复选框时需要用到 + LI_DIV_TEXT_CLASS = "t-click", UL_ROOT="dtree", + LI_NAV_FIRST_LINE = "dtree-nav-first-line", LI_NAV_LINE = "dtree-nav-line", LI_NAV_LAST_LINE = "dtree-nav-last-line"; + + + // 树的公共指定 + var NAV_THIS = "dtree-nav-this", //当前节点 + NAV_SHOW = "dtree-nav-show", //显示子节点 + NAV_HIDE = "dtree-nav-hide", //隐藏节点 + NAV_DIS = "dtree-disabled", //禁用节点 + ICON_HIDE = "dtree-icon-hide", //隐藏图标 + $BODY = $("body"), //body选择器 + $WIN = $(window), //window窗口 + $DOC = $(document), //当前文档 + MOD_NAME = "dtree", //模块名称 + VERSION = "v2.5.8", //版本 + OPTIONS = {}, //全局属性配置 + DTrees = {}; //当前被实例化的树的集合 + + // 树的自定义图标 + var DTREEFONT = "dtreefont", //默认使用图标字体 + LI_DIV_CHECKBAR_ON = "dtree-icon-fuxuankuangxuanzhong", //复选框选中图标 + LI_DIV_CHECKBAR_OUT = "dtree-icon-fuxuankuang", //复选框未选中图标 + LI_DIV_CHECKBAR_NOALL = "dtree-icon-fuxuankuang-banxuan", //复选框半选图标 + LI_DIV_MENUBAR_DOWN = "dtree-icon-move-down", //menubar的展开全部的图标 + LI_DIV_MENUBAR_UP = "dtree-icon-move-up", //menubar的收缩全部的图标 + LI_DIV_MENUBAR_REFRESH = "dtree-icon-refresh", //menubar的刷新图标 + LI_DIV_MENUBAR_CHECKALL = "dtree-icon-roundcheckfill", //menubar的全选图标 + LI_DIV_MENUBAR_UNCHECKALL = "dtree-icon-roundclosefill", //menubar的全不选图标 + LI_DIV_MENUBAR_INVERTALL = "dtree-icon-roundcheck", //menubar的反选图标 + LI_DIV_MENUBAR_DELETE = "dtree-icon-delete1", //menubar的删除图标 + LI_DIV_MENUBAR_SEARCH = "dtree-icon-search_list_light", //menubar的搜索图标 + LI_DIV_TOOLBAR_PULLDOWN = "dtree-icon-pulldown", //toolbar的展开图标 + LI_DIV_TOOLBAR_PULLUP = "dtree-icon-pullup", //toolbar的收缩图标 + LI_DIV_TOOLBAR_ADD = "dtree-icon-roundadd", //toolbar的新增图标 + LI_DIV_TOOLBAR_EDIT = "dtree-icon-bianji", //toolbar的编辑图标 + LI_DIV_TOOLBAR_DEL = "dtree-icon-roundclose"; //toolbar的删除图标 + + // 树的非叶子节点图标集合 + var nodeIconArray = { + "-1": {"open": "dtree-icon-null-open", "close": "dtree-icon-null-close"}, //未指定 + "0" : {"open": "dtree-icon-wenjianjiazhankai", "close": "dtree-icon-weibiaoti5"}, //文件夹(二级图标默认样式) + "1" : {"open": "dtree-icon-jian", "close": "dtree-icon-jia"}, //+-图标(一级图标默认样式) + "2" : {"open": "dtree-icon-xiangxia1", "close": "dtree-icon-xiangyou"} //箭头图标 + }; + + // 树的叶子节点图标集合 + var leafIconArray = { + "-1": "dtree-icon-null", //未指定 + "0" : "dtree-icon-weibiaoti5", //文件夹 + "1" : "dtree-icon-yonghu", //人员 + "2" : "dtree-icon-fenzhijigou", //机构 + "3" : "dtree-icon-fenguangbaobiao", //报表 + "4" : "dtree-icon-xinxipilu", //信息 + "5" : "dtree-icon-shuye1", //叶子(二级图标默认样式) + "6" : "dtree-icon-caidan_xunzhang", //勋章 + "7" : "dtree-icon-normal-file", //文件 + "8" : "dtree-icon-dian", //小圆点(一级图标默认样式) + "9" : "dtree-icon-set-sm", //齿轮 + "10" : "dtree-icon-rate" //星星 + }; + + // 树的自定义样式 + var DTREE = "dtree-", //自定义样式前缀 + ITEMTHIS = "-item-this", //自定义样式当前行选中后缀 + ITEM = "-item", //自定义样式当前行后缀 + DFONT = "-dtreefont", //自定义样式图标样式后缀 + FICON = "-ficon", //自定义样式一级图标样式后缀 + ICON = "-icon", //自定义样式二级图标样式后缀 + CBOX = "-checkbox", //自定义样式复选框样式后缀 + CHS = "-choose"; //自定义样式复选框选中样式后缀 + + // 树自定义操作事件名称集合 绑定dtree-click的事件 + var eventName = { + checkNodeClick: "checkNodeClick", //点击复选框 + itemNodeClick: "itemNodeClick" //点击子节点div + }; + + // 树默认toolbar提供的功能集合 绑定dtree-tool的事件 + var defaultTool = { + pulldown: "pulldown", //点击展开当前节点下的全部节点 + pullup: "pullup", //点击收缩当前节点下的全部节点 + addTool: "addToolbar", //点击toolbar新增 + editTool: "editToolbar", //点击toolbar编辑 + delTool: "delToolbar" //点击toolbar删除 + }; + + // 树默认menubar提供的功能集合 绑定dtree-menu的事件 + var defaultMenu = { + moveDown: "moveDown", //menubar展开全部节点 + moveUp: "moveUp", //menubar收缩全部节点 + refresh: "refresh", //menubar刷新树 + checkAll: "checkAll", //menubar全选 + unCheckAll: "unCheckAll", //menubar全不选 + invertAll: "invertAll", //menubar反选 + remove: "remove", //menubar删除选中节点 + searchNode: "searchNode" //menubar查询节点 + }; + + // 树的公共事件 + var event = { + getElemId: function(options){ // 根据传入的参数获取ID + var elem = options.elem || ""; + var obj = options.obj || $(elem); + + if (obj.length == 0) { //页面中未找到绑定id + return ""; + } else { + return $(obj)[0].id; + } + }, + escape: function(html){ // 编码 + if(typeof html !== 'string') return ''; + return html.replace(entityReg.escape, function(match){return entityMap.escape[match];}); + }, + unescape: function(str){ // 解码 + if(typeof str !== 'string') return ''; + return str.replace(entityReg.unescape, function(match){return entityMap.unescape[match];}); + }, + cloneObj: function (obj, filter) { //深复制对象方法 + var newObj = {}; + if (obj instanceof Array) { + newObj = []; + } + var str = ""; + if(typeof filter !== 'undefined') {str = filter.join(",");} + for (var key in obj) { + if(str.indexOf(key) == -1){ + var val = obj[key]; + newObj[key] = typeof val === 'object' ? event.cloneObj(val, typeof filter !== undefined ? filter : []): val; + } + + } + return newObj; + }, + trimToDot: function(str){ + return str.replace(/ /g, "."); + } + }; + + // 特殊符号转义 + var keys = Object.keys || function(obj) { + obj = Object(obj); + var arr = []; + for(var a in obj) arr.push(a); + return arr; + }; + var invert = function(obj){ + obj = Object(obj); + var result = {}; + for(var a in obj) result[obj[a]] = a; + return result; + }; + var entityMap = { + escape: { + "&" : "&", + "<" : "<", + ">" : ">", + "'" : "&quo;" + } + }; + entityMap.unescape = invert(entityMap.escape); + var entityReg = { + escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'), + unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g') + }; + + //异步加载接口 + var AjaxHelper = { + request : function(config) { + var data = config.data ? config.data : {}; + var async = (typeof (config.async) === "boolean") ? config.async : true; + $.ajax({ + type : config.type ? config.type : "POST", + headers : config.headers, + url : config.url, + dataType : config.dataType ? config.dataType : "json", + data : data, + async : async, + contentType : config.contentType, + xhrFields: {withCredentials: config.withCredentials}, + beforeSend: function (XMLHttpRequest, self) { + if (typeof (config.beforeSend) === "function") { + return config.beforeSend(XMLHttpRequest, self); + } + return true; + }, + success : config.success, + error : function(XMLHttpRequest, textStatus, errorThrown) { + if (typeof (config.error) === "function") { + config.error(XMLHttpRequest, textStatus, errorThrown); + } else { + layer.msg("异步加载失败: " + textStatus,{icon:5, shift:6}); + } + }, + statusCode : { + 404 : function() { + layer.msg('未找到指定请求,请检查访问路径!',{icon:5, shift:6}); + }, + 500 : function() { + layer.msg('系统错误!',{icon:5, shift:6}); + } + }, + complete : function(XMLHttpRequest, textStatus) { + if (typeof (config.complete) === "function") { + config.complete(XMLHttpRequest, textStatus); + } + } + }); + }, + serialize: function(first, param){ //json序列化 key=value&key1=value1 + var p = first; + for (var key in param) { + p += key + "=" + param[key] + "&"; + } + p = p.substring(0, p.length-1); + return p; + } + }; + + /** 树类 Class定义 */ + var DTree = function(options){ + var _this = this; + /** 默认赋值**/ + this.formatter = { // 数据过滤 + title: false // 文字,默认不开启 + }; + this.response = { // 树返回的json格式 + statusName: "code", //返回标识 + statusCode: 200, //返回码 + message: "message", //返回信息 + rootName: "data", //根节点名称 + treeId: "id", //节点ID + parentId: "parentId", //父节点ID + title: "title", //节点名称 + ficonClass: "ficonClass", //自定义一级图标 + iconClass: "iconClass", //自定义二级图标 + childName: "children", //子节点名称 + last: "last", //是否最后一级节点 +// level: "level", //层级 + spread: "spread", //展开 + disabled: "disabled", //禁用 + hide: "hide", //隐藏 + checkArr: "checkArr", //复选框列表 + checked: "checked", //是否选中 + type: "type", //复选框标记 + basicData: "basicData" //表示用户自定义需要存储在树节点中的数据 + }; + this.defaultRequest = { // 树的默认发起请求参数格式,最后会将value作为参数名称传递 + nodeId: "nodeId", //节点ID + parentId: "parentId", //父节点ID + context: "context", //节点内容 + leaf: "leaf", //是否叶子节点 + level: "level", //层级 + spread: "spread", //节点展开状态 + dataType: "dataType", //节点标记 + checked: "checked", //节点复选框选中状态 + initchecked: "initchecked", //节点复选框初始状态 + basicData: "basicData", //用户自定义的记录节点数据 + recordData: "recordData", //当前data数据(排除basicData和children字段) + }; + this.toolbarFun = { + addTreeNode: function(param, $div) { //添加树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化 + return ; + }, + editTreeNode: function(param, $div) { //编辑树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化 + return ; + }, + editTreeLoad: function(param){ // 编辑树的数据回显,用于打开编辑时,回填数据 + return ; + }, + delTreeNode: function(param, $div){ //删除树后调用的函数,用于用户自定义,如未指定则树不会发生变化 + return ; + }, + loadToolbarBefore: function(buttons, param, $div){ // 右键菜单加载前的函数 + return buttons; + } + }; + this.toolbarStyle = { // 工具栏弹出层的自定义样式 + title: "节点", + area: ["60%","80%"] + }; + this.menubarFun = { + remove: function(checkbarNodes){ //删除复选框选中节点,需要用户自定义,如未指定则树只是页面上做了修改 + return true; + } + }; + this.menubarTips = { // 菜单栏的默认显示 + toolbar: [], + group: [defaultMenu.moveDown, defaultMenu.moveUp, defaultMenu.refresh, defaultMenu.checkAll, defaultMenu.unCheckAll, defaultMenu.invertAll, defaultMenu.remove, defaultMenu.searchNode], + freedom: [] + }; + this.checkbarFun = { + chooseBefore: function($i, node){ // 复选框点击前回调 + return true; + }, + chooseDone: function(checkbarNodesParam) { //复选框点击事件完毕后,返回该树关于复选框操作的全部信息,用于用户自定义,如未指定则树只是页面上做了修改 + return ; + } + }; + this.iframeDefaultRequest = { //iframe的默认参数,目的是与加载树的参数不一样 + nodeId: "nodeId", //节点ID + parentId: "parentId", //父节点ID + context: "context", //节点内容 + leaf: "leaf", //是否叶子节点 + level: "level", //层级 + spread: "spread", //节点展开状态 + dataType: "dataType", //节点标记 + checked: "checked", //节点复选框选中状态 + initchecked: "initchecked", //节点复选框初始状态 + basicData: "basicData", //用户自定义的记录节点数据 + recordData: "recordData", //当前data数据(排除basicData和children字段) + }; + + this.iframeFun = { + iframeDone: function(iframeParam){ //iframe加载完毕后,用于用户自定义事件 + return ; + } + }; + this.style = { //树最终使用的样式集合 + item: "", //每一项div的样式 + itemThis: "", //选中div的样式 + dfont: "", //一级图标的样式 + icon: "", //二级图标的样式 + cbox: "", //复选框的样式 + chs: "" //复选框选中的样式 + }; + this.usefontStyle = { //树最终使用的图标集合 + fnode:{ //一级节点 + node:{ //非叶子节点 + open:"", //节点展开 + close:"" //节点关闭 + }, + leaf:"" //叶子节点 + }, + snode:{ //二级节点 + node:{ //非叶子节点 + open:"", //节点展开 + close:"" //节点关闭 + }, + leaf:"" //叶子节点 + }, + checkbox:{ //复选框 + on:"", //复选框选中 + out:"", //未选中 + noall:"" //半选 + }, + menubar:{ //菜单栏 + movedown:"", //全部展开 + moveup:"", //全部收缩 + refresh:"", //刷新 + checkAll:"", //全选 + unCheckAll:"", //全不选 + invertAll:"", //反选 + remove:"", //删除 + search:"" //搜索 + }, + menubarExt:"", //扩展菜单栏 + toolbar:{ //工具栏 + menubar:{ //依附在菜单栏的工具栏 + movedown:"", //全部展开 + moveup:"", //全部收缩 + refresh:"", //刷新 + checkAll:"", //全选 + unCheckAll:"", //全不选 + invertAll:"", //反选 + remove:"", //删除 + search:"" //搜索 + }, + menubarExt:"", //依附在菜单栏的扩展菜单栏 + pulldown:"", //展开 + pullup:"", //收缩 + add:"", //添加 + edit:"", //编辑 + del:"" //删除 + }, + toolbarExt:"" //扩展工具栏 + } + + /** 数据绑定**/ + this.node = { // 树节点选中时,包含当前节点的全部信息 + nodeId: "", //节点ID + parentId: "", //父节点ID + context: "", //节点内容 + leaf: "", //是否叶子节点 + level: "", //层级 + spread: "", //节点展开状态 + dataType: "", //节点标记 + checked: "", //节点复选框选中状态 + initchecked: "", //节点复选框初始状态 + basicData: "", //用户自定义的记录节点数据 + recordData: "", //当前data数据(排除basicData和children字段) + }; + + this.toolbarMenu = {}; // 工具栏右键菜单绑定的所有元素 + this.checkbarNode = []; // 复选框标记的全部节点数据 + this.errData = []; // 记录在渲染节点时有问题的数据 + this.checkArrLen = 0; // 添加节点的时判断复选框个数 + this.temp = []; // 临时变量 + this.bak = ""; // 临时变量 + this.setting(options); + }; + + /******************** 初始参数加载 ********************/ + /** + * @Desc: 设置基本属性值 + * @Param: options:JSON对象,初始设置dtree所需的全部属性 + */ + DTree.prototype.setting = function(options) { + this.options = options || {}; + + /** 绑定元素参数(必填,2个参数项必填一个)**/ + this.elem = this.options.elem || OPTIONS.elem || ""; //树绑定的元素ID:#elem + if(typeof this.options.obj === 'undefined'){ + if(this.elem) { + if($(this.elem).length > 0) { + this.obj = $(this.elem); + } + } + } else { + this.obj = this.options.obj || OPTIONS.obj || this.obj; //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到 + this.elem = "#" + this.obj[0].id; + } + + /** 基本参数**/ + this.scroll = this.options.scroll || OPTIONS.scroll || this.elem; //树的上级div容器,让树可以显示滚动条的div容器的ID + this.accordion = (typeof (this.options.accordion) === "boolean") ? this.options.accordion : (typeof (OPTIONS.accordion) === "boolean") ? OPTIONS.accordion : false; //手风琴加载, 默认false + if(this.accordion) { + this.initLevel = 1; //默认展开节点 1节 + } else { + this.initLevel = this.options.initLevel || OPTIONS.initLevel || 2; //默认展开节点 2节 + } + this.type = this.options.type || OPTIONS.type || "load"; //树的加载方式 all,全量树, load,增量树,默认load + this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : (typeof (OPTIONS.cache) === "boolean") ? OPTIONS.cache : true; //数据缓存,默认true + this.record = this.options.record || OPTIONS.record || false; //开启数据记录模式,默认false + this.load = (typeof (this.options.load) === "boolean") ? this.options.load : (typeof (OPTIONS.load) === "boolean") ? OPTIONS.load : true; //开启加载动画,默认true + this.none = this.options.none || OPTIONS.nont || "无数据"; //初始加载无记录时显示文字 + this.tempHeight = this.options.height || OPTIONS.height; //临时转换高度变量 + if(this.tempHeight) { // 设置高度 + if(/^full-\d+$/.test(this.tempHeight)) { + this.fullHeightGap = this.tempHeight.split('-')[1]; + this.height = $WIN.height() - this.fullHeightGap; //设置高度 + } else { + this.fullHeightGap = this.tempHeight; + this.height = this.tempHeight; + } + } else { + this.fullHeightGap = ""; + this.height = ""; + } + this.width = this.options.width || OPTIONS.width || "260"; //宽度 + this.obj.css("width", this.width); + + /** 样式相关参数**/ + this.iconfont = this.options.iconfont || OPTIONS.iconfont || DTREEFONT; //默认图标字体 dtreefont + this.iconfontStyle = this.options.iconfontStyle || OPTIONS.iconfontStyle || {}; //用于自定义树的每个关键部位使用的图标 + this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray || OPTIONS.nodeIconArray) || nodeIconArray; //用户自定义非叶子节点图标集合,node + this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray || OPTIONS.leafIconArray) || leafIconArray; //用户自定义叶子节点图标集合,leaf + this.skin = this.options.skin || OPTIONS.skin || "theme"; // 自定义样式 + if(this.skin == "layui"){ // layui主题 + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : (typeof (OPTIONS.line) === "boolean") ? OPTIONS.line : true; //开启树线,默认开启 + this.ficon = this.options.ficon || OPTIONS.ficon || "7"; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'7' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'1' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; //一级图标中的leaf节点图标 + this.icon = this.options.icon || OPTIONS.icon || "-1"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } else if(this.skin == "laySimple"){ // laySimple主题 + this.line = this.options.line || OPTIONS.line || false; //开启树线,默认不开启 + this.ficon = this.options.ficon || OPTIONS.ficon || ["2","-1"]; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'-1' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "2") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'2' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标 + this.icon = this.options.icon || OPTIONS.icon || "-1"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } else { // 默认主题 或者自定义主题 + this.line = this.options.line || OPTIONS.line || false; //开启树线,默认不开启 + this.ficon = this.options.ficon || OPTIONS.ficon || "8"; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'8' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'1' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标 + this.icon = this.options.icon || OPTIONS.icon || "5"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'5' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'0' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } + + /** 数据加载参数**/ + this.url = this.options.url || OPTIONS.url || ""; //请求地址 + this.async = (typeof (this.options.async) === "boolean") ? this.options.async : (typeof (OPTIONS.async) === "boolean") ? OPTIONS.async : true; //异步同步加载,默认异步加载 + this.asyncLoad = this.options.asyncLoad || OPTIONS.asyncLoad || []; //初始异步加载层级数据 + this.headers = this.options.headers || OPTIONS.headers || {}; //ajax header属性 + this.method = this.options.method || OPTIONS.method || "post"; //请求类型 + this.dataType = this.options.dataType || OPTIONS.dataType || "json"; //参数类型 + this.contentType = this.options.contentType || OPTIONS.contentType || "application/x-www-form-urlencoded"; //发送信息至服务器时内容编码类型 + this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest || OPTIONS.defaultRequest) || this.defaultRequest; //默认请求参数 + this.filterRequest = this.options.filterRequest || OPTIONS.filterRequest || []; //过滤请求参数 + this.request = this.options.request || OPTIONS.request || {}; //用户自定义请求参数 + this.response = $.extend(this.response, this.options.response || OPTIONS.response) || this.response; //返回json格式 + this.data = this.options.data || OPTIONS.data || null; //初始化指定该参数,则不会访问异步接口 + this.dataFormat = this.options.dataFormat || OPTIONS.dataFormat || "levelRelationship"; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认 + this.dataStyle = this.options.dataStyle || OPTIONS.dataStyle || "defaultStyle"; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格 + this.errDataShow = this.options.errDataShow || OPTIONS.errDataShow || false; //是否在递归数据出现错误后,显示错误信息,默认false + this.withCredentials = this.options.withCredentials || OPTIONS.withCredentials || false; //是否允许跨域请求,默认false + this.beforeSend = this.options.beforeSend || OPTIONS.beforeSend || function(ajax, XMLHttpRequest, self){return true}; //异步加载之前的回调 + this.success = this.options.success || OPTIONS.success || function(data, obj, first){}; //树加载完毕后执行解析树之前的回调 + this.done = this.options.done || OPTIONS.done || function(data, obj, first){}; //树加载完毕后的回调 + this.formatter = $.extend(this.formatter, this.options.formatter || OPTIONS.formatter) || this.formatter; //数据过滤 + this.error = this.options.error || OPTIONS.error || function(XMLHttpRequest, textStatus, errorThrown){}; // 异步加载异常回调 + this.complete = this.options.complete || OPTIONS.complete || function(XMLHttpRequest, textStatus){}; // 异步加载完成回调 + + /** 复选框参数**/ + this.checkbar = this.options.checkbar || OPTIONS.checkbar || false; //是否开启复选框模式 + this.checkbarLoad = this.options.checkbarLoad || OPTIONS.checkbarLoad || "node"; //复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点 + this.checkbarType = this.options.checkbarType || OPTIONS.checkbarType || "all"; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all + this.checkbarData = this.options.checkbarData || OPTIONS.checkbarData || "choose"; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all记录全部数据,halfChoose记录选中和半选中的数据,默认choose + this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun || OPTIONS.checkbarFun) || this.checkbarFun; //checkbar事件加载 + + /** 菜单栏参数**/ + this.menubar = this.options.menubar || OPTIONS.menubar || false; //是否打开菜单栏 + this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips || OPTIONS.menubarTips) || this.menubarTips; //菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由 + this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun || OPTIONS.menubarFun) || this.menubarFun; //menubar事件加载 + + /** 工具栏参数**/ + this.toolbar = this.options.toolbar || OPTIONS.toolbar || false; //是否开启可编辑模式 + this.toolbarWay = this.options.toolbarWay || OPTIONS.toolbarWay || "contextmenu"; //工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧 + this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle || OPTIONS.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小 + this.toolbarLoad = this.options.toolbarLoad || OPTIONS.toolbarLoad || "node"; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级 + this.toolbarShow = this.options.toolbarShow || OPTIONS.toolbarShow || ["add","edit","delete"]; //toolbar三个按钮自定义加载 + this.toolbarBtn = this.options.toolbarBtn || OPTIONS.toolbarBtn || null; //toolbar增删改中内容的自定义加载 + this.toolbarExt = this.options.toolbarExt || OPTIONS.toolbarExt || []; //toolbar按钮扩展 + this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun || OPTIONS.toolbarFun) || this.toolbarFun; //toolbar事件加载 + + /** iframe模式参数**/ + this.useIframe = this.options.useIframe || OPTIONS.useIframe || false; //是否加载iframe 默认false, + this.iframeElem = this.options.iframeElem || OPTIONS.iframeElem || ""; //iframe的ID + this.iframeUrl = this.options.iframeUrl || OPTIONS.iframeUrl || ""; //树关联的iframe地址 + this.iframeLoad = this.options.iframeLoad || OPTIONS.iframeLoad || "leaf"; //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级 + this.iframeDefaultRequest = $.extend(this.iframeDefaultRequest, this.options.iframeDefaultRequest || OPTIONS.iframeDefaultRequest) || this.iframeDefaultRequest; //iframe的默认传递参数 + this.iframeRequest = $.extend(this.iframeRequest, this.options.iframeRequest) || $.extend(this.iframeRequest, OPTIONS.iframeRequest) || this.iframeRequest; //iframe的自定义参数 + this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || $.extend(this.iframeFun, OPTIONS.iframeFun) || this.iframeFun; //iframe事件加载 + + /** 下拉树模式参数**/ + this.select = this.options.select || false; + if(this.select) { + // 重置下拉树 + this.selectSetting(); + } + + /** 调用确认最终主题方法*/ + this.ensureTheme(); + }; + + /** + * @Desc: 重置基本属性值 + * @Param: options:JSON对象,重置dtree所需的全部属性 + */ + DTree.prototype.reloadSetting = function(options) { + this.options = $.extend(this.options, options) || this.options; + + /** 绑定元素参数**/ + this.elem = this.options.elem || this.elem; //树绑定的元素ID:#elem + if(typeof this.options.obj === 'undefined'){ + if(this.elem) { + if($(this.elem).length > 0) { + this.obj = $(this.elem); + } + } + } else { + this.obj = this.options.obj || this.obj; //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到 + this.elem = "#" + this.obj[0].id; + } + + /** 基本参数**/ + this.scroll = this.options.scroll || this.scroll; //树的上级div容器,让树可以显示滚动条的div容器 + this.accordion = (typeof (this.options.accordion) === "boolean") ? this.options.accordion : this.accordion; //开启手风琴加载 + if(this.accordion) { + this.initLevel = 1; //默认展开节点 1节 + } else { + this.initLevel = this.options.initLevel || this.initLevel; //默认展开节点 2节 + } + this.type = this.options.type || this.type; //树的加载方式 all,全量树, load,增量树,默认load + this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : this.cache; //开启数据缓存 + this.record = (typeof (this.options.record) === "boolean") ? this.options.record : this.record; //开启数据记录模式 + this.load = (typeof (this.options.load) === "boolean") ? this.options.load : this.load; //开启加载动画 + this.none = this.options.none || this.none; //初始节点加载无数据时显示文字 + this.tempHeight = this.options.height || this.height; //临时转换高度变量 + if(this.tempHeight) { //设置高度 + if(/^full-\d+$/.test(this.tempHeight)) { + this.fullHeightGap = this.tempHeight.split('-')[1]; + this.height = $WIN.height() - this.fullHeightGap; + } else { + this.fullHeightGap = this.tempHeight; + this.height = this.tempHeight; + } + } + this.width = this.options.width || this.width; //宽度 + this.obj.css("width", this.width); + + /** 样式相关参数**/ + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : this.line; //开启树线,默认不开启 + this.iconfont = this.options.iconfont || this.iconfont; //默认图标字体 dtreefont + this.iconfontStyle = this.options.iconfontStyle || this.iconfontStyle; //用于自定义树的每个关键部位使用的图标 + this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray) || this.nodeIconArray; //用户自定义非叶子节点图标集合,node + this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray) || this.leafIconArray; //用户自定义叶子节点图标集合,leaf + this.skin = this.options.skin || this.skin; //自定义样式 + if(this.skin == "layui"){ //layui主题 + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : true; //开启树线,默认开启 + this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'7' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'1' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; //一级图标中的leaf节点图标 + this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } else if(this.skin == "laySimple"){ //laySimple主题 + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; //开启树线,默认不开启 + this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'-1' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "2") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'2' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1];//一级图标中的leaf节点图标 + this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } else { // 默认主题 或者自定义主题 + this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; //开启树线,默认不开启 + this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'8' + this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'1' + this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标 + this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'5' + this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'0' + this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标 + } + + /** 数据加载参数**/ + this.url = this.options.url || this.url; //请求地址 + this.async = (typeof (this.options.async) === "boolean") ? this.options.async : this.async; //异步同步加载,默认异步加载 + this.asyncLoad = this.options.asyncLoad || this.asyncLoad; //初始异步加载层级数据 + this.headers = this.options.headers || this.headers; //ajax header属性 + this.method = this.options.method || this.method; //请求类型 + this.dataType = this.options.dataType || this.dataType; //参数类型 + this.contentType = this.options.contentType || this.contentType; //发送信息至服务器时内容编码类型 + this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest) || this.defaultRequest; //默认请求参数 + this.filterRequest = this.options.filterRequest || this.filterRequest; //过滤请求参数 + this.request = this.options.request || this.request; //用户自定义请求参数 + this.response = $.extend(this.response, this.options.response) || this.response; //返回json格式 + this.data = this.options.data || this.data; //初始化指定该参数,则不会访问异步接口 + this.dataFormat = this.options.dataFormat || this.dataFormat; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认 + this.dataStyle = this.options.dataStyle || this.dataStyle; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格 + this.errDataShow = (typeof (this.options.errDataShow) === "boolean") ? this.options.errDataShow : this.errDataShow; //是否在使用list模式递归数据出现错误时,显示错误信息 + this.withCredentials = (typeof (this.options.withCredentials) === "boolean") ? this.options.withCredentials : this.withCredentials; //是否允许跨域请求 + this.beforeSend = this.options.beforeSend || this.beforeSend; //异步加载之前的回调 + this.success = this.options.success || this.success; //树加载完毕后执行解析树之前的回调 + this.done = this.options.done || this.done; //树加载完毕后的回调 + this.formatter = $.extend(this.formatter, this.options.formatter)|| this.formatter; //数据过滤 + this.error = this.options.error || this.error; //异步加载异常回调 + this.complete = this.options.complete || this.complete; //异步加载完成回调 + + /** 复选框参数**/ + this.checkbar = this.options.checkbar || this.checkbar; //是否开启复选框模式 + this.checkbarLoad = this.options.checkbarLoad || this.checkbarLoad; //复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点 + this.checkbarType = this.options.checkbarType || this.checkbarType; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all + this.checkbarData = this.options.checkbarData || this.checkbarData; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all记录全部数据,halfChoose记录选中和半选中的数据,默认choose + this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun)|| this.checkbarFun; //checkbar事件加载 + + /** 菜单栏参数**/ + this.menubar = this.options.menubar || this.menubar; //是否打开菜单栏 + this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips) || this.menubarTips; //菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由 + this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun) || this.menubarFun; //menubar事件加载 + + /** 工具栏参数**/ + this.toolbar = this.options.toolbar || this.toolbar; //是否开启工具栏 + this.toolbarWay = this.options.toolbarWay || this.toolbarWay; //工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧 + this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小 + this.toolbarLoad = this.options.toolbarLoad || this.toolbarLoad; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级 + this.toolbarShow = this.options.toolbarShow || this.toolbarShow; //toolbar三个按钮 + this.toolbarBtn = this.options.toolbarBtn || this.toolbarBtn; //toolbar增删改中内容的自定义加载 + this.toolbarExt = this.options.toolbarExt || this.toolbarExt; //toolbar按钮扩展 + this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun) || this.toolbarFun; //toolbar事件加载 + + /** iframe模式参数**/ + this.useIframe = this.options.useIframe || this.useIframe;//是否加载iframe 默认false + this.iframeElem = this.options.iframeElem || this.iframeElem; //iframe的ID + this.iframeUrl = this.options.iframeUrl || this.iframeUrl; //树关联的iframe地址 + this.iframeLoad = this.options.iframeLoad || this.iframeLoad; //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级 + this.iframeDefaultRequest = $.extend(this.iframeDefaultRequest, this.options.iframeDefaultRequest) || this.iframeDefaultRequest; //iframe的默认传递参数 + this.iframeRequest = $.extend(this.iframeRequest, this.options.iframeRequest) || this.iframeRequest; //iframe的自定义参数 + this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载 + + /** 下拉树模式参数**/ + if(this.select) { + // 重置下拉树 + this.reloadSelectSetting(); + } + + /** 调用确认最终主题方法*/ + this.ensureTheme(); + + }; + + /** + * @Desc: 设置下拉树的基本参数值 + */ + DTree.prototype.selectSetting = function() { + /** select模式参数*/ + this.select = true; //配置成select模式 + + this.selectInitVal = this.obj.attr("data-value") || this.options.selectInitVal || ""; //输入框的值 + this.selectTreeDiv = this.obj[0].id + "_tree_div"; // 上级DIV节点 + this.selectCardDiv = this.obj[0].id + "_select_card_div"; // 上级layui卡片节点 + this.selectDiv = this.obj[0].id + "_select_div"; // 模拟的select节点 + this.selectTipsName = this.obj[0].id + "_select_input"; // select的提示输入框名称 + this.selectTips = this.options.selectTips || "请选择"; // 输入框的提示语 + this.selectCardHeight = this.options.selectCardHeight || "350"; // 下拉面板的高度 + this.selectInputName = this.options.selectInputName || {nodeId: this.obj[0].id + "_select_nodeId"}; // select表单中的元素 + + // 调取下拉树的特殊处理页面元素标识 + this.renderSelectDom(); + } + + /** + * @Desc: 重置下拉树的基本参数值 + */ + DTree.prototype.reloadSelectSetting = function() { + + this.selectInitVal = this.obj.attr("data-value") || this.options.selectInitVal || this.selectInitVal; //输入框的值 + this.selectTips = this.options.selectTips || this.selectTips; // 输入框的提示语 + this.selectCardHeight = this.options.selectCardHeight || this.selectCardHeight; // 下拉面板的高度 + this.selectInputName = $.extend(this.selectInputName, this.options.selectInputName) || this.selectInputName; // select表单中的元素 + + // 调取下拉树的特殊处理页面元素标识 + this.reloadSelectDom(); + } + + /******************** 下拉树设置区域 ********************/ + /** + * @Desc: 渲染下拉树的Dom结构 + */ + DTree.prototype.renderSelectDom = function() { + var _this = this; + var rootId = _this.obj[0].id; + + // 设置自定义表单隐藏域 + var selectInputName = _this.selectInputName; + var selectInput = []; + for(var key in selectInputName) { + selectInput.push(''); + } + + // 设置html + var prevHtml = ['
                      ', + '
                      ', selectInput.join(""), + '', + '', + '
                      '].join(''); + + _this.obj.before(prevHtml); + + var cardStyle = "style="; + if(this.selectCardHeight) { + cardStyle += "'height:"+_this.selectCardHeight+"px'"; + } + _this.obj.wrap('
                      ').wrap('
                      ').wrap('
                      '); + + } + + /** + * @Desc: 重新渲染下拉树的Dom结构 + */ + DTree.prototype.reloadSelectDom = function() { + var _this = this; + var rootId = _this.obj[0].id; + + // 设置自定义表单隐藏域 + var selectInputName = _this.selectInputName; + var selectInput = []; + for(var key in selectInputName) { + selectInput.push(''); + } + + $("div[dtree-id='"+rootId+"'][dtree-select='"+_this.selectDiv+"']").find("div.layui-select-title").html(""); + + // 设置html + var prevHtml = [selectInput.join(""), + '', + ''].join(''); + + $("div[dtree-id='"+rootId+"'][dtree-select='"+_this.selectDiv+"']").find("div.layui-select-title").html(prevHtml); + + var cardStyle = "style="; + if(this.selectCardHeight) { + cardStyle += "'height:"+_this.selectCardHeight+"px'"; + } + $("div[dtree-id='"+rootId+"'][dtree-card='"+_this.selectCardDiv+"']").attr("style", cardStyle); + } + + /** + * @Desc: 设置下拉树模式中,input输入框的值 + * @Param: param: input中的值对应树数据的ID值\当前树选中的数据JSON对象,可不传,不传的话则树内部读取 + */ + DTree.prototype.selectVal = function(param) { + var _this = this; + var rootId = _this.obj[0].id; + var selectInputName = _this.selectInputName; + var selectTipsNameValue = ""; + var selectValues = {}; + + // 如果开启了复选框,则此方法用来取值 + if(_this.checkbar) { + return _this.selectCheckboxVal(); + } + + if(typeof param === 'undefined') { // 不传,则为当前树中记录的ID + param = _this.getNowParam(); + } + if(typeof param === 'string') { // 传递ID,则查询树节点ID对应的值 + param = _this.getParam(param); + } + + selectTipsNameValue = param["context"]; + for(var key in selectInputName) { + selectValues[selectInputName[key]] = param[key]; + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+selectInputName[key]+"']").val(param[key] || ""); + } + + if(param["nodeId"] && !param["context"]) { + selectTipsNameValue = _this.getParam(param["nodeId"]); + } + + // 返显提示输入框值 + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+_this.selectTipsName+"']").val(selectTipsNameValue || ""); + + // 返回隐藏域中的值 + return selectValues; + } + + /** + * @Desc: 设置复选框模式中的下拉树的选中值 + */ + DTree.prototype.selectCheckboxVal = function() { + var _this = this; + var rootId = _this.obj[0].id; + var selectInputName = _this.selectInputName; + + // 获取全部复选框选中节点 + var param = _this.getCheckbarJsonArrParam(); + + selectTipsNameValue = param["context"]; + var selectValues = {}; + for(var key in selectInputName) { + var value = param[key].join(","); + selectValues[selectInputName[key]] = value; + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+selectInputName[key]+"']").val(value); + } + + $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+_this.selectTipsName+"']").val(selectTipsNameValue); + + // 返回隐藏域中的值 + return selectValues; + } + + /** + * @Desc: 重置下拉树的值,1.表单清空;2.节点重置;3.复选框重置 + */ + DTree.prototype.selectResetVal = function() { + var _this = this; + var rootId = _this.obj[0].id; + // 表单清空 + $("input[dtree-id='"+rootId+"']").val(""); + // 节点重置 + _this.cancelNavThis(); + if(_this.checkbar) { + // 复选框重置 + _this.cancelCheckedNode(); + } + } + + + /******************** 字体及图标区域 ********************/ + /** + * @Desc: 树使用的最终主题方案 + */ + DTree.prototype.ensureTheme = function(){ + var _this = this; + + // 确认style + this.style.item = DTREE + this.skin + ITEM; + this.style.itemThis = DTREE + this.skin + ITEMTHIS; + this.style.dfont = DTREE + this.skin + DFONT; + this.style.ficon = DTREE + this.skin + FICON; + this.style.icon = DTREE + this.skin + ICON; + this.style.cbox = DTREE + this.skin + CBOX; + this.style.chs = DTREE + this.skin + CHS; + + // 确认usefontStyle + var iconfont = this.iconfont; + var iconfonts = []; + if(typeof iconfont === 'string') { + iconfonts.push(iconfont); + } else { + iconfonts = iconfont; + } + + var iconfontStyle = this.iconfontStyle; + var iconfontStyles = []; + if(iconfontStyle.length == undefined) { + iconfontStyles.push(iconfontStyle); + } else { + iconfontStyles = iconfontStyle; + } + + for(var i=0; i 0) { + $lis.each(function(){ + _this.showLineLi($(this)); + }); + } else { + _this.obj.find("li[data-id]").each(function(){ + _this.showLineLi($(this)); + }); + } + } + } + + /** + * @Desc: 真正显示树线的方法 + * @Param: $li: JQuery对象,表示组成树的li节点 + */ + DTree.prototype.showLineLi = function($li){ + var _this = this; + var $div = $li.children("div"), + $nextLi = $li.next("li"), + $ul = $li.parent("ul"); + if($ul[0].id == _this.obj[0].id) { + // 根节点下的节点 + $li.removeClass(LI_NAV_LINE); + $li.removeClass(LI_NAV_LAST_LINE); + $li.addClass(LI_NAV_FIRST_LINE); + } else { + // 非根节点下的节点 + var $pnextLi = $ul.parent("li").next("li"); + if($pnextLi.length == 0) { + if($nextLi.length == 0){ + $li.removeClass(LI_NAV_LINE); + $li.removeClass(LI_NAV_FIRST_LINE); + $li.addClass(LI_NAV_LAST_LINE); + } else { + $li.removeClass(LI_NAV_FIRST_LINE); + $li.removeClass(LI_NAV_LAST_LINE); + $li.addClass(LI_NAV_LINE); + } + }else { + var $pnextdiv = $pnextLi.children("div"); + if($nextLi.length == 0 && $div.children("cite").attr("data-leaf") == "leaf" && $pnextdiv.children("cite").attr("data-leaf") == "leaf") { + $li.removeClass(LI_NAV_FIRST_LINE); + $li.removeClass(LI_NAV_LINE); + $li.addClass(LI_NAV_LAST_LINE); + } else { + $li.removeClass(LI_NAV_FIRST_LINE); + $li.removeClass(LI_NAV_LAST_LINE); + $li.addClass(LI_NAV_LINE); + } + } + } + } + + /******************** 初始化数据区域 ********************/ + /** + * @Desc: 设置高度 + */ + DTree.prototype.autoHeight = function(){ + var _this = this; + var height = _this.height; + if(height != "") { + if(_this.elem == _this.scroll){ + _this.obj.parent().css("height", height + "px"); + } else { + var $toolbarDiv = _this.obj.closest(_this.scroll); + $toolbarDiv.css("height", height + "px"); + } + } + }; + + /** + * @Desc: 重载树 + * @Param: options: dtree的所有属性的json对象 + */ + DTree.prototype.reload = function(options){ + var _this = this; + _this.reloadSetting(options); + _this.init(); + }; + + /** + * @Desc: 初始化加载 + */ + DTree.prototype.loadTreeInit = function(){ + var _this = this; + var asyncLoad = _this.asyncLoad; + // 初始化加载 + _this.init(function(){ + // ajax加载之后的回调 + if(asyncLoad && asyncLoad.length > 0) { + _this.obj.addClass(NAV_SHOW); + + // 说明此时要异步加载子节点 + _this.loadChildTreeInit(asyncLoad, 0); + } + }) + } + + /** + * @Desc: 初始化加载子节点 + * @Param: asyncLoad: 需异步加载的层级,在基础属性中配置 + * @Param: i: 已经加载到的层级 + */ + DTree.prototype.loadChildTreeInit = function(asyncLoad, i){ + var _this = this; + if(i == asyncLoad.length) { // 满足条件,终止递归 + return ; + } + + var $div = _this.getNode(asyncLoad[i]); + + if($div && $div.length > 0) { + // 设置节点状态 + var $ul = $div.next("ul"), + $i_fnode = _this.getNodeDom($div).fnode(), + $i_snode = _this.getNodeDom($div).snode(); + + $ul.addClass(NAV_SHOW); + _this.accordionUL($ul); + _this.operateIcon($i_fnode, $i_snode).open(); + // 加载子节点 + _this.getChild($div, undefined, function(){ + // 继续递归 + _this.loadChildTreeInit(asyncLoad, ++i); + }); + } + + } + + /** + * @Desc: 初始化树 + * @Param: callback: 异步加载完成之后的回调函数 + */ + DTree.prototype.init = function(callback){ + var _this = this; + if (typeof _this !== "object") { + layer.msg("树组件未成功加载,请检查配置", {icon:5}); + return ; + } + + // 设置组件高度 + _this.autoHeight(); + + if(_this.data) { + _this.dataLoadTree(true, _this.obj, _this.data); + } else { + _this.asyncLoadTree(true, _this.obj, callback); + } + }; + + /** + * @Desc: 加载子节点 + * @Param: $div: JQuery对象,代表当前子节点的父节点div + * @Param: data: data方式加载的数据 + * @Param: callback: 子节点加载完成之后的回调喊出 + */ + DTree.prototype.getChild = function($div, data, callback) { + var _this = this, $ul = $div.next("ul"); + + _this.setNodeParam($div); + + if(typeof data !== 'undefined') { + _this.dataLoadTree(false, $ul, data); + } else { + _this.asyncLoadTree(false, $ul, callback); + } + }; + + /** + * @Desc: 用data加载树 + * @Param: first: 表示是否第一次加载 + * @Param: $ul: JQuery对象,代表当前数据加载到的ul标签里 + * @Param: data: data加载的数据 + */ + DTree.prototype.dataLoadTree = function(first, $ul, data){ + var _this = this; + + if(typeof data.length === 'undefined'){ + layer.msg("数据解析异常,data数据格式不正确", {icon:5}); + return ; + } + + if(first && data.length == 0) { + $ul.html(_this.getNoneDom().text()); + return ; + } + + //先将ul中的元素清空 + $ul.html(""); + + var index = _this.load ? layer.load(1) : ""; + + setTimeout(function () { + // 加载完毕后执行树解析前的回调 + var returnData = _this.success(data, $ul, first); + if(returnData) { + data = returnData; + } + + var pid = (first == true) ? $ul.attr("data-id") : _this.node.nodeId; + var level = (first == true) ? 1 : parseInt(_this.node.level)+1; + + // 解析树 + if (_this.dataFormat == 'list'){ + //1.构建一个存放节点的树组 + var rootListData = _this.queryListTreeByPid(pid, data); + _this.loadListTree(rootListData, _this.data, level); + } else { + _this.loadTree(data, level); + } + + // 显示树线 + _this.showLine(); + + // 这种情况下需要一开始就将toolbar显示在页面上 + if(_this.toolbar && _this.toolbarWay != 'contextmenu') { + _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); + } + + // 判断是否存在错误数据,并是否打印错误数据 + _this.msgErrData(); + + // 设置下拉树的初始值 + if(first && _this.select && _this.selectInitVal){ + if(_this.checkbar) { // 复选框模式下 + _this.chooseDataInit(_this.selectInitVal); + _this.selectCheckboxVal(_this.selectInitVal); + } else { // 普通模式下 + _this.dataInit(_this.selectInitVal); + _this.selectVal(_this.selectInitVal); + } + } + + // 保存树副本 + _this.bak = _this.obj.html(); + + // 加载完毕后的回调 + _this.done(_this.data, $ul, first); + + if(_this.load){layer.close(index);} + }, 100); + } + + /** + * @Desc: 异步加载树 + * @Param: first: 表示是否第一次加载 + * @Param: $ul: JQuery对象,代表当前数据加载到的ul标签里 + * @Param: callback: 异步加载完成之后的回调函数 + */ + DTree.prototype.asyncLoadTree = function(first, $ul, callback){ + var _this = this; + + if (!_this.url) { + layer.msg("数据请求异常,url参数未指定", {icon:5}); + return ; + } + + //先将ul中的元素清空 + $ul.html(""); + + var index = ""; + + AjaxHelper.request({ + async: _this.async, + headers: _this.headers, + type: _this.method, + url: _this.url, + dataType: _this.dataType, + contentType: _this.contentType, + withCredentials: _this.withCredentials, + data: _this.getFilterRequestParam(_this.getRequestParam()), + beforeSend: function(XMLHttpRequest, self){ + index = _this.load ? layer.load(1) : ""; + var returnFlag = _this.beforeSend(this, XMLHttpRequest, self); + if(!returnFlag) { + if(_this.load){layer.close(index);} + } + return returnFlag; + }, + success: function(result) { + if (typeof result === 'string') { + result = $.parseJSON(result); + } + + // 加载完毕后执行树解析前的回调 + var returnData = _this.success(result, $ul, first); + if(returnData) { + result = returnData; + } + + var code = ""; + if (_this.dataStyle == 'layuiStyle'){ + code = result[_this.response.statusName]; + } else { + code = result.status[_this.response.statusName]; + } + + if (code == _this.response.statusCode) { + + var d = result[_this.response.rootName]; + + if(first && typeof d.length === 'undefined'){ + $ul.html(_this.getNoneDom().errText("数据解析异常,url回调后的数据格式不正确")); + //layer.msg("数据解析异常,url回调后的数据格式不正确", {icon:5}); + return ; + } + + if(first && d.length == 0) { + $ul.html(_this.getNoneDom().text()); + return ; + } + + //1.识别根节点ul中的data-id标签,判断顶级父节点 + var pid = (first == true) ? $ul.attr("data-id") : _this.node.nodeId; + var level = (first == true) ? 1 : parseInt(_this.node.level)+1; + + // 第一次解析树 + if (_this.dataFormat == 'list'){ + //1.构建一个存放节点的树组 + var rootListData = _this.queryListTreeByPid(pid, d); + if(first) { + _this.loadListTree(rootListData, d, level); + } else { + _this.loadListTree(rootListData, d, level, $ul); + } + } else { + if(first) { + _this.loadTree(d, level); + } else { + _this.loadTree(d, level, $ul); + } + } + + // 显示树线 + _this.showLine(); + + // 这种情况下需要一开始就将toolbar显示在页面上 + if(_this.toolbar && _this.toolbarWay != 'contextmenu') { + _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); + } + + // 判断是否存在错误数据,并是否打印错误数据 + _this.msgErrData(); + + if(!first) { + $ul.addClass(NAV_SHOW); + } + + // 设置下拉树的初始值 + if(first && _this.select && _this.selectInitVal){ + if(_this.checkbar) { // 复选框模式下 + _this.chooseDataInit(_this.selectInitVal); + _this.selectCheckboxVal(_this.selectInitVal); + } else { // 普通模式下 + _this.dataInit(_this.selectInitVal); + _this.selectVal(_this.selectInitVal); + } + } + + // 保存树副本 + _this.bak = _this.obj.html(); + + // 加载完毕后的回调 + _this.done(result, $ul, first); + + callback && callback(); + } else { + // 如果打印不出任何信息说明是在这里,用了错误的数据格式, 或返回码不正确 + if (_this.dataStyle == 'layuiStyle'){ + _this.obj.html(_this.getNoneDom().errText(result[_this.response.message])); + _this.error(null, code, result[_this.response.message]); + } else { + _this.obj.html(_this.getNoneDom().errText(result.status[_this.response.message])); + _this.error(null, code, result.status[_this.response.message]); + } + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown){// 异步加载异常回调 + _this.obj.html(_this.getNoneDom().errText(textStatus + ": " + errorThrown)); + _this.error(XMLHttpRequest, textStatus, errorThrown); + }, + complete: function(XMLHttpRequest, textStatus){// 异步加载完成回调 + if(_this.load){layer.close(index);} + _this.complete(XMLHttpRequest, textStatus); + } + }); + + } + + /** + * @Desc: 初始化渲染树或者拼接渲染树,list模式下 + * @Param: nowListData: 表示当前需要被渲染的数据 + * @Param: listData: 表示全部数据 + * @Param: level: 当前渲染的层级 + * @Param: $ul: JQuery对象,代表当前数据加载到的ul标签里 + */ + DTree.prototype.loadListTree = function(nowListData, listData, level, $ul){ + var _this = this; + $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点 + if (nowListData.length > 0){ + for (var i = 0; i < nowListData.length; i++) { + // 1.获取已知节点的全部数据 + var data = nowListData[i]; + if(typeof data !== "object") continue; + var parseData = _this.parseData(data); + var childListData = _this.queryListTreeByPid(parseData.treeId(), listData); // 根据已知数据的id判断该条数据是否还有子数据 + + // 3. 页面元素加载数据 + $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(childListData.length), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), ($ul.hasClass(UL_ROOT) ? "root" : "item"))); + // 4.有子数据的元素加载子节点 + if(childListData.length > 0){ + var cLevel = parseInt(level)+1; + _this.loadListTree(childListData, listData, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']")); + } + } + } + }; + + /** + * @Desc: 根据父ID查找list数据中匹配的元素 + * @Param: pid: 表示父ID + * @Param: listData: 表示全部数据 + */ + DTree.prototype.queryListTreeByPid = function(pid, listData){ + var _this = this; + var rootListData = []; + if (listData) { + for (var i = 0; i < listData.length; i++) { + var data = listData[i]; + if(typeof data !== "object") continue; + if(pid == "null" || pid == null){ + if(data[_this.response.parentId] == null) { rootListData.push(data); } + } else { + if (data[_this.response.parentId] == pid){ + if (data[_this.response.treeId] == pid){ + _this.errData.push(data); + } else { + rootListData.push(data); + } + } + } + } + } + return rootListData; + }; + + /** + * @Desc: 初始化渲染树或者拼接渲染树,层级关系模式下 + * @Param: listData: 表示全部数据 + * @Param: level: 当前渲染的层级 + * @Param: $ul: JQuery对象,代表当前数据加载到的ul标签里 + */ + DTree.prototype.loadTree = function(listData, level, $ul){ + var _this = this; + if (listData) { + $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点 + for (var i = 0; i < listData.length; i++) { // 遍历跟节点或追加的跟节点 + var data = listData[i]; + if(typeof data !== "object") continue; + if(data[_this.response.treeId] == data[_this.response.parentId]) { _this.errData.push(data); } + var parseData = _this.parseData(data); + var children = parseData.children(); + $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(children.length), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), ($ul.hasClass(UL_ROOT) ? "root" : "item"))); + if (children.length != 0) { + var cLevel = parseInt(level)+1; + _this.loadTree(children, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']")); + } + } + } + }; + + /** + * @Desc: 判断在数据加载时是否存在错误数据,并是否打印错误数据 + * @Param: + */ + DTree.prototype.msgErrData = function() { + var _this = this; + if(_this.errData.length > 0 && _this.errDataShow) { + var title = ""; + for(var i=0; i<_this.errData.length; i++) { + var edata = _this.errData[i]; + title += "数据:【"+edata[_this.response.title]+"】中节点id和上级id值一致! \n"; + } + layer.msg(title, {icon:2,time:5000}); + } + // 显示之后,将错误数据制空 + _this.errData = []; + }; + + /** + * @Desc: 解析单个数据 + * @Param: data: 被解析的单个数据对象 + */ + DTree.prototype.parseData = function(data) { + var _this = this; + + return { + treeId: function(){ + return data[_this.response.treeId]; + }, + parentId: function(){ + return data[_this.response.parentId]; + }, + fmtTitle: function(){ + if(typeof _this.formatter.title === 'function'){ + var ftitle = _this.formatter.title(data); + var tt = data[_this.response.title]; + tt = (ftitle == "" || ftitle == undefined || ftitle == null) ? tt : ftitle; + return tt || ""; + } + return data[_this.response.title]; + }, + title: function(){ + return data[_this.response.title]; + }, + level: function(){ + return data[_this.response.level] || ""; + }, + ficonClass: function(){ + return data[_this.response.ficonClass] || ""; + }, + iconClass: function(){ + return data[_this.response.iconClass] || ""; + }, + last: function(len){ + return ((len == 0) ? + ((typeof (data[_this.response.last]) === "boolean") ? data[_this.response.last] : true) : + ((typeof (data[_this.response.last]) === "boolean") ? data[_this.response.last] : false)); + }, + spread: function(level){ + return ((level < _this.initLevel) ? + ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : true) : + ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : false)); + }, + disabled: function(){ + return (typeof (data[_this.response.disabled]) === "boolean") ? data[_this.response.disabled] : false; + }, + hide: function(){ + return (typeof (data[_this.response.hide]) === "boolean") ? data[_this.response.hide] : false; + }, + checkArr: function(){ + var checkArr = []; + var checkArrData = data[_this.response.checkArr]; + if(typeof checkArrData === 'string'){ + if(checkArrData.indexOf("{") > -1 && checkArrData.indexOf("}") > -1){ + checkArrData = JSON.parse(checkArrData); + } else { + checkArrData = {"type":"0","checked":checkArrData}; + } + } + if((typeof checkArrData === 'object') && (checkArrData !== null)){ + if(typeof checkArrData.length === 'undefined'){ + checkArr.push(checkArrData); + } else { + checkArr = checkArrData; + } + } + + if(checkArr.length > 0 && checkArr.length > _this.checkArrLen){ + _this.checkArrLen = checkArr.length; // 获取复选框个数 + } + return checkArr; + + }, + children: function(){ + return data[_this.response.childName] || []; + }, + basicData: function(){ + return event.escape(JSON.stringify(data[_this.response.basicData])) || JSON.stringify({}); + }, + recordData: function(){ + var recordData = _this.record ? event.cloneObj(data, [_this.response.treeId, + _this.response.parentId, + _this.response.title, + _this.response.iconClass, + _this.response.childName, + _this.response.last, + _this.response.spread, + _this.response.disabled, + _this.response.hide, + _this.response.checkArr, + _this.response.checked, + _this.response.type, + _this.response.basicData]) : {}; + + return event.escape(JSON.stringify(recordData)); + }, + data: function(){ + return data; + } + } + + }; + + /** + * @Desc: 无节点数据、节点数据异常时显示dom + */ + DTree.prototype.getNoneDom = function(){ + var _this = this, + rootId = _this.obj[0].id, + noneTitle = _this.none; + + return { + text: function(){ + return "
                      "+noneTitle+"
                      "; + }, + errText: function(errInfo){ + return "
                      "+errInfo+"
                      "; + } + } + }; + + /** + * @Desc: 新增节点的dom值 + * @Param: treeId: 节点ID + * @Param: parentId: 节点父ID + * @Param: title: 节点标题 + * @Param: fmtTitle: 节点附加标题 + * @Param: last: 是否最后一级节点 + * @Param: ficonClass: 一级图标class + * @Param: iconClass: 二级图标class + * @Param: checkArr: 复选框 + * @Param: spread: 是否展开 + * @Param: disabled: 是否禁用 + * @Param: hide: 是否隐藏 + */ + DTree.prototype.getDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide) { + var _this = this, + rootId = _this.obj[0].id, + toolbar = _this.toolbar, + checkbar = _this.checkbar; + + return { + fnode: function() { // + - 图标 + // 获取图标的变量 + var fnodeIcon = _this.fnodeIcon, + fleafIcon = _this.fleafIcon; + + var fleafIconLeaf = _this.usefontStyle.fnode.leaf, + fnodeIconOpen = _this.usefontStyle.fnode.node.open, + fnodeIconClose = _this.usefontStyle.fnode.node.close; + + if(ficonClass){ + var iconfont = _this.iconfont; + if(typeof iconfont === 'string') { + fleafIconLeaf = iconfont + " " + ficonClass; + fnodeIconOpen = iconfont + " " + ficonClass; + fnodeIconClose = iconfont + " " + ficonClass; + } else { + fleafIconLeaf = iconfont[0] + " " + ficonClass; + fnodeIconOpen = iconfont[0] + " " + ficonClass; + fnodeIconClose = iconfont[0] + " " + ficonClass; + } + } + + if(fnodeIcon != "-1" && fleafIcon != "-1"){ // 都加载 + return last ? "" : + (spread ? "" : ""); + } + + if(fnodeIcon != "-1" && fleafIcon == "-1"){ // 加载node 隐藏leaf + return last ? "" : + (spread ? "" : ""); + } + + if(fnodeIcon == "-1" && fleafIcon != "-1"){ // 隐藏node 加载leaf + return last ? "" : + (spread ? "" : ""); + } + + if(fnodeIcon == "-1" && fleafIcon == "-1"){ // 都隐藏 + return last ? "" : + (spread ? "" : ""); + } + }, + node: function() { // 二级图标样式 + // 获取图标的变量 + var nodeIcon = _this.nodeIcon, + leafIcon = _this.leafIcon; + + var sleafIconLeaf = _this.usefontStyle.snode.leaf, + snodeIconOpen = _this.usefontStyle.snode.node.open, + snodeIconClose = _this.usefontStyle.snode.node.close; + if(iconClass){ + var iconfont = _this.iconfont; + if(typeof iconfont === 'string') { + sleafIconLeaf = iconfont + " " + iconClass; + snodeIconOpen = iconfont + " " + iconClass; + snodeIconClose = iconfont + " " + iconClass; + } else { + sleafIconLeaf = iconfont[0] + " " + iconClass; + snodeIconOpen = iconfont[0] + " " + iconClass; + snodeIconClose = iconfont[0] + " " + iconClass; + } + } + + if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载 + return last ? "" : + (spread ? "" : ""); + } + + if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf + return last ? "" : + (spread ? "" : ""); + } + + if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf + return last ? "" : + (spread ? "" : ""); + } + + if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 + return last ? "" : + (spread ? "" : ""); + } + }, + checkbox: function() { // 复选框 + var flag = false; + if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}} + + if(flag){ + var result = "
                      "; + if(checkArr && checkArr.length > 0){ + + for (var i = 0; i < checkArr.length; i++) { + var checkData = checkArr[i]; + var checked = checkData[_this.response.checked]; + var type = checkData[_this.response.type]; + var CHOOSE_CLASS = _this.usefontStyle.checkbox.out; + if (checked == "2") { //半选择 + CHOOSE_CLASS = _this.usefontStyle.checkbox.noall + " " + _this.style.chs; + } else if (checked == "1") { //选择 + CHOOSE_CLASS = _this.usefontStyle.checkbox.on + " " + _this.style.chs; + } else { //未选择或者无值 + CHOOSE_CLASS = _this.usefontStyle.checkbox.out; + } + var disClass = ""; + if(disabled){disClass = NAV_DIS;} + result += ""; + } + } + result += "
                      "; + return result; + } + + return ""; + }, + text: function() { // 文字显示 + var disClass = ""; + if(disabled){disClass = NAV_DIS;} + return ""+fmtTitle+""; + }, + ul: function() { //子节点ul + return last ? "
                        " : + (spread ? "
                          " : "
                            "); + } + }; + }; + + /** + * @Desc: 替换节点的dom值,或指定这些值 + * @Param: $div: JQuery对象,表示当前被操作的节点 + * @Param: treeId: 节点ID + * @Param: last: 是否最后一级节点 + * @Param: spread: 是否展开 + * @Param: disabled: 是否禁用 + * @Param: hide: 是否隐藏 + */ + DTree.prototype.replaceDom = function($div, treeId, last, spread, disabled, hide) { + var _this = this, + rootId = _this.obj[0].id, + toolbar = _this.toolbar, + checkbar = _this.checkbar; + + return { + fnode: function(ficonClass) { // + - 图标 + var fnode = ""; + + // 获取图标的变量 + var fnodeIcon = _this.fnodeIcon, + fleafIcon = _this.fleafIcon; + + var fleafIconLeaf = _this.usefontStyle.fnode.leaf, + fnodeIconOpen = _this.usefontStyle.fnode.node.open, + fnodeIconClose = _this.usefontStyle.fnode.node.close; + + if(ficonClass){ + var iconfont = _this.iconfont; + if(typeof iconfont === 'string') { + fleafIconLeaf = iconfont + " " + ficonClass; + fnodeIconOpen = iconfont + " " + ficonClass; + fnodeIconClose = iconfont + " " + ficonClass; + } else { + fleafIconLeaf = iconfont[0] + " " + ficonClass; + fnodeIconOpen = iconfont[0] + " " + ficonClass; + fnodeIconClose = iconfont[0] + " " + ficonClass; + } + } + + if(fnodeIcon != "-1" && leafIcon != "-1"){ // 都加载 + fnode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf + fnode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf + fnode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 + fnode = last ? "" : + (spread ? "" : ""); + } + if(fnode != ""){_this.getNodeDom($div).fnode().replaceWith($(fnode));} + }, + node: function(iconClass) { // 二级图标样式 + var snode = ""; + + // 获取图标的变量 + var nodeIcon = _this.nodeIcon, + leafIcon = _this.leafIcon; + + var sleafIconLeaf = _this.usefontStyle.snode.leaf, + snodeIconOpen = _this.usefontStyle.snode.node.open, + snodeIconClose = _this.usefontStyle.snode.node.close; + if(iconClass){ + var iconfont = _this.iconfont; + if(typeof iconfont === 'string') { + sleafIconLeaf = iconfont + " " + iconClass; + snodeIconOpen = iconfont + " " + iconClass; + snodeIconClose = iconfont + " " + iconClass; + } else { + sleafIconLeaf = iconfont[0] + " " + iconClass; + snodeIconOpen = iconfont[0] + " " + iconClass; + snodeIconClose = iconfont[0] + " " + iconClass; + } + } + + if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载 + snode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf + snode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf + snode = last ? "" : + (spread ? "" : ""); + }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 + snode = last ? "" : + (spread ? "" : ""); + } + if(snode != ""){_this.getNodeDom($div).snode().replaceWith($(snode));} + }, + checkbox: function(checkArr) { // 复选框 + var flag = false; + if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}} + + if(flag){ + var result = "
                            "; + if(checkArr && checkArr.length > 0){ + + for (var i = 0; i < checkArr.length; i++) { + var checkData = checkArr[i]; + var checked = checkData[_this.response.checked]; + var type = checkData[_this.response.type]; + var CHOOSE_CLASS = _this.usefontStyle.checkbox.out; + if (checked == "2") { //半选择 + CHOOSE_CLASS = _this.usefontStyle.checkbox.noall + " " + _this.style.chs; + } else if (checked == "1") { //选择 + CHOOSE_CLASS = _this.usefontStyle.checkbox.on + " " + _this.style.chs; + } else { //未选择或者无值 + CHOOSE_CLASS = _this.usefontStyle.checkbox.out; + } + var disClass = ""; + if(disabled){disClass = NAV_DIS;} + result += ""; + } + } + result += "
                            "; + _this.getNodeDom($div).snode().next("div").replaceWith($(result)); + } + }, + text: function(title) { // 文字显示 + var disClass = ""; + if(disabled){disClass = NAV_DIS;} + var cite = ""+title+"" + _this.getNodeDom($div).cite().replaceWith($(cite)); + }, + ul: function() { //子节点ul + var ul = last ? "
                              " : + (spread ? "
                                " : "
                                  "); + _this.getNodeDom($div).nextUl().replaceWith($(ul)); + }, + div: function(){ + $div.attr("data-id", treeId); + }, + basicData: function(basicData){ + basicData = (basicData == "{}") ? "" : basicData; + $div.attr("data-basic", basicData); + }, + recordData: function(recordData){ + recordData = (recordData == "{}") ? "" : recordData; + $div.attr("data-record", recordData); + }, + p_li: function(pId){ + var $li = $div.parent("li"); + $li.attr("data-id", treeId); + if(pId) { + $li.attr("data-pid", pId); + } + return $li; + } + }; + + }; + + /** + * @Desc: 获取拼接好的li的dom + * @Param: treeId: 节点ID + * @Param: parentId: 节点父ID + * @Param: title: 节点标题 + * @Param: fmtTitle: 节点附加标题 + * @Param: last: 是否最后一级节点 + * @Param: ficonClass: 一级图标class + * @Param: iconClass: 二级图标class + * @Param: checkArr: 复选框 + * @Param: level: 当前li的层级 + * @Param: spread: 是否展开 + * @Param: disabled: 是否禁用 + * @Param: hide: 是否隐藏 + * @Param: basicData: 自定义的扩展字段值(转义后的JSON字符) + * @Param: recordData: 开启记录模式的记录值(转义后的JSON字符) + * @Param: isRoot: 当前节点是否是根节点下的节点 + */ + DTree.prototype.getLiItemDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide, basicData, recordData, isRoot) { + var _this = this, + rootId = _this.obj[0].id; + + var dom = _this.getDom(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide); + basicData = (basicData == "{}") ? "" : basicData; + recordData = (recordData == "{}") ? "" : recordData; + var div = "
                                  " + + div , + dom.fnode(), + dom.node(), + dom.checkbox(), + dom.text(), + "
                                  ", dom.ul(), ""].join(""); + + return li; + }; + + /** + * @Desc: 初始化节点,用于数据回显 + * @Param: chooseId: 节点ID + */ + DTree.prototype.dataInit = function(chooseId){ + var _this = this; + var $div = _this.obj.find("div[data-id='"+chooseId+"']"); + if($div && $div.length > 0) { + _this.obj.find("."+NAV_THIS).removeClass(NAV_THIS); + _this.obj.find("."+_this.style.itemThis).removeClass(_this.style.itemThis); + $div.addClass(NAV_THIS); + $div.addClass(_this.style.itemThis); + _this.setNodeParam($div); + // 将该节点的父节点全部展开 + var $li_parents = $div.parents("."+LI_NAV_ITEM); + $li_parents.children("ul").addClass(NAV_SHOW); + $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).addClass(_this.usefontStyle.fnode.node.open); + $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).removeClass(_this.usefontStyle.fnode.node.close); + $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).addClass(_this.usefontStyle.snode.node.open); + $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).removeClass(_this.usefontStyle.snode.node.close); + } + return _this.getNowParam(); + }; + + /** + * @Desc: 基于备份的Html数据回滚 + * @Param: chooseId: 节点ID + */ + DTree.prototype.rollbackHtml = function(chooseId){ + var _this = this; + if(_this.bak) { + _this.obj.html(_this.bak); + // 取消全部选中状态 + _this.cancelNavThis(); + if(_this.checkbar) { + _this.cancelCheckedNode(); + _this.chooseDataInit(chooseId); + } else { + _this.dataInit(chooseId); + } + + _this.bak = _this.obj.html(); + } + }; + + + /******************** 基础事件区域 ********************/ + /** + * @Desc: 数据格式化 + * @Param: html: 需要格式化的数据 + */ + DTree.prototype.escape = function(html){ + return event.escape(html); + }; + + /** + * @Desc: 格式化数据转回正常数据 + * @Param: str: 需要转回的数据 + */ + DTree.prototype.unescape = function(str){ + return event.unescape(str); + }; + + /** + * @Desc: 取消选中当前选中的div + */ + DTree.prototype.cancelNavThis = function(){ + var _this = this; + _this.obj.find("div[data-id]").parent().find("."+NAV_THIS).removeClass(NAV_THIS); + _this.obj.find("div[data-id]").parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis); + } + + /** + * @Desc: 选中div + * @Param: id: 当前div本身 / 当前选中div的id值 + */ + DTree.prototype.navThis = function(id){ + var _this = this; + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + if($div != null) { + _this.cancelNavThis(); + $div.addClass(NAV_THIS); + $div.addClass(_this.style.itemThis); + } + } + + /** + * @Desc: 手风琴模式操作其他节点 + * @Param: $ul: JQuery对象,表示dtree中的ul节点 + */ + DTree.prototype.accordionUL = function($ul) { + var _this = this; + if(_this.accordion) { + $ul.closest("li[data-index]").siblings("li[data-index]").children("ul[data-id]").removeClass(NAV_SHOW); + var $divs = $ul.closest("li[data-index]").siblings("li[data-index]").children("ul[data-id]").prev("div"); + if($divs.length && $divs.length > 0) { + for (var i=0; i<$divs.length; i++) { + var $div = $($divs[i]); + var $i_fnode = _this.getNodeDom($div).fnode(), + $i_snode = _this.getNodeDom($div).snode(); + if($i_fnode.attr("data-spread") != 'last'){ + _this.operateIcon($i_fnode, $i_snode).close(); + } + } + } + + } + }; + + /** + * @Desc: 展开或隐藏节点 作用点: div + * @Param: $div: JQuery对象,表示当前操作的div节点 + */ + DTree.prototype.clickSpread = function($div) { + var _this = this; + var $i_fnode = _this.getNodeDom($div).fnode(), + $i_snode = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_fnode.attr("data-spread"), + $ul = $div.next("ul"); + + if ($ul.length > 0) { + if (spread == "close") { + if (_this.type=="load") { //增加加载 + if (_this.cache) { //开启缓存 + if ($ul.html()) { + $ul.addClass(NAV_SHOW); + _this.accordionUL($ul); + } else { //加载节点 + _this.getChild($div); + _this.accordionUL($ul); + } + }else { //每次取新的数据 + $ul.html(""); + _this.getChild($div); + _this.accordionUL($ul); + } + } else { // 全量加载 + $ul.addClass(NAV_SHOW); + _this.accordionUL($ul); + } + _this.operateIcon($i_fnode, $i_snode).open(); + } else if (spread == "open") { + $ul.removeClass(NAV_SHOW); + _this.operateIcon($i_fnode, $i_snode).close(); + } + } + }; + + /** + * @Desc: 设置节点为disabled + * @Param: disabledIds: 需要设置禁用的节点id字符串集合(用,分割)/id数组 + */ + DTree.prototype.setDisabledNodes = function(disabledIds){ + var _this = this; + var disabledId = []; + if(typeof disabledIds === "string") { + disabledId = disabledIds.split(","); + } else { + disabledId = disabledIds; + } + + if(disabledIds.length) { + for (var i=0; i 0) { + _this.getChild($div, data); + } else { + var parseData = _this.parseData(data); + + if(parseData.treeId()){ + var level = parseInt($div.parent("li").attr("data-index"))+1; + $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(0), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), "item")); + + // 建造完毕后,选中该DIV + $thisDiv = $ul.find("div[data-id='"+parseData.treeId()+"']"); + _this.setNodeParam($thisDiv); + + _this.showLine($ul.find("li")); + } else { + layer.msg("添加失败,节点ID为undefined!",{icon:5}); + // 重新赋值 + _this.setNodeParam($div); + } + } + } else { + _this.getChild($div); + } + } + + /** + * @Desc: 局部刷新树--编辑当前节点选中节点时 + * @Param: $div: JQuery对象,当前编辑节点的Div + * @Param: data: 当前需要渲染的数据,JSON对象、字符串 + */ + DTree.prototype.partialRefreshEdit = function($div, data){ + var _this = this; + $ul = $div.next("ul"), + $p_li = $div.parent("li"); + + if(data) { + if(typeof data === 'object') { + var parseData = _this.parseData(data); + + if(parseData.treeId()){ + var replaceDom = _this.replaceDom($div, parseData.treeId(), parseData.last(0), parseData.spread(), parseData.disabled(), parseData.hide()); + replaceDom.div(); + replaceDom.node(parseData.iconClass()); + replaceDom.checkbox(parseData.checkArr()); + replaceDom.text(parseData.title()); + replaceDom.ul(); + replaceDom.basicData(parseData.basicData()); + replaceDom.recordData(parseData.recordData()); + + var parentId = parseData.parentId(); + var oldParentId = $p_li.attr("data-pid"); + if(parentId && parentId != oldParentId) { + // 变更了父节点 + $p_li = replaceDom.p_li(parentId); + + // 根据parentId找到下挂节点的ul + var $goto_div = _this.getNodeDom(parentId).div(), + $goto_ul = _this.getNodeDom(parentId).nextUl(); + // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式 + if($goto_ul.children("li").length == 0){ + var $icon_i = $goto_div.find("i[data-spread]"); + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).openWithLeaf(); + $goto_ul.addClass(NAV_SHOW); + } + $goto_ul.append($p_li); + } else { + replaceDom.p_li(); + } + _this.setNodeParam($div); + } else { + layer.msg("编辑失败,节点ID为undefined!",{icon:5}); + // 重新赋值 + _this.setNodeParam($div); + } + } else { + _this.getNodeDom($div).cite().html(data); + } + } + } + + /** + * @Desc: 局部刷新树--当前节点选中被删除时 + * @Param: $div: JQuery对象,当前被删除节点的Div + */ + DTree.prototype.partialRefreshDel = function($div){ + var _this = this; + $p_li = $div.parent("li"); + $p_ul = _this.getNodeDom($div).parentUl(); + $p_div = _this.getNodeDom($div).parentDiv(); + + $p_li.remove(); + _this.showLine($p_ul.find("li")); + // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式 + if($p_ul.children("li").length == 0){ + var $icon_i = $p_div.find("i[data-spread]"); + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).closeWithLeaf(); + } + _this.initNodeParam(); + } + + /*** + * @Desc: 搜索节点,保留上级节点 + * @param: value: 传入的节点名称 + * layui-dtree群友: 没水平的水瓶提供。 + */ + DTree.prototype.fuzzySearch = function (value) { + var _this = this; + // + if (value.trim() == '') { + _this.obj.find("li").removeClass("layui-hide").attr("dtree-hide", false) + return + } + _this.obj.find("li").addClass("layui-hide").attr("dtree-hide", true) + + var cites = [] + var filterMode = _this.filterMode + /*if (filterMode == 'default') { + cites = _this.obj.find("li>div cite:contains('" + value + "')"); + }*/ + cites = _this.obj.find("li>div cite:contains('" + value + "')"); + cites.each(function (index, cite) { + var li = $(cite).parent().parent(); + var curNode = _this.getParam(li.attr("data-id")); + li.removeClass("layui-hide").attr("dtree-hide", false); + // 显示所有子级 + li.find('ul li').removeClass("layui-hide").attr("dtree-hide", false); + // 显示所有父级 + li.parents('li').removeClass("layui-hide").attr("dtree-hide", false); + }) + } + + /******************** 复选框区域 ********************/ + /** + * @Desc: 初始化复选框的值 + * @Param: chooseIds: 需要被选中的节点id字符串集合(用,分割)/id数组/id二维数组(多级复选框) + */ + DTree.prototype.chooseDataInit = function(chooseIds){ + var _this = this; + // 多级复选框二维数组 + var chooseIdArrs = []; + var chooseId = []; + if(typeof chooseIds === "string") { + chooseId = chooseIds.split(","); + } else { + chooseId = chooseIds; + } + if(chooseId.length) { + // 说明是数组 + for (var i=0; i."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).noCheck(); + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length; + if (flag == 0) { + //把父级去掉选中 + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($item_i).noCheck(); + } + } + } else { + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).check(); + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + //把父级选中 + _this.checkStatus($item_i).check(); + } + } + }; + + /** + * @Desc: 实现复选框点击, no-all 子集选中父级半选中,子集全选父级选中 + * @Param: $i: JQuery对象,表示当前点击的checkbox节点 + */ + DTree.prototype.checkAllOrNoallOrNot = function($i) { + var _this = this; + //$i 当前点击的checkbox + var $div = $i.closest("."+LI_DIV_ITEM), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).noCheck(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).noCheck(); + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length; + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + if (flag == 0) { + //把父级去掉选中 + _this.checkStatus($item_i).noCheck(); + } else { + //把父级半选 + _this.checkStatus($item_i).noallCheck(); + } + } + } else { //当前复选框为未选中状态,点击后变为选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).check(); + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length; + var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length; + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + if (flag1 != flag2) { + // 父级复选框半选 + _this.checkStatus($item_i).noallCheck(); + } else { + // 父级复选框全选 + _this.checkStatus($item_i).check(); + } + } + } + }; + + /** + * @Desc: 实现复选框点击,p-casc:父级选中子集全选,子集无法改变父级选中状态 + * @Param: $i: JQuery对象,表示当前点击的checkbox节点 + */ + DTree.prototype.checkAllOrPcascOrNot = function($i) { + var _this = this; + //$i 当前点击的checkbox + var $div = $i.closest("."+LI_DIV_ITEM), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).noCheck(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).noCheck(); + + } else { //当前复选框为未选中状态,点击后变为选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + + // 处理子级节点的选中状态 + var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + _this.checkStatus($child_li_i).check(); + } + }; + + /** + * @Desc: 实现复选框点击,self:各自选中互不影响 + * @Param: $i: JQuery对象,表示当前点击的checkbox节点 + */ + DTree.prototype.checkOrNot = function($i) { + var _this = this; + //$i 当前点击的checkbox + var $div = $i.closest("."+LI_DIV_ITEM), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).noCheck(); + } else { //当前复选框为未选中状态,点击后变为选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + } + }; + + /** + * @Desc: 实现复选框点击,only:只能选中1个复选框 + * @Param: $i: JQuery对象,表示当前点击的checkbox节点 + */ + DTree.prototype.checkOnly = function($i) { + var _this = this; + //$i 当前点击的checkbox + var $div = $i.closest("."+LI_DIV_ITEM), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + var checked = $i.attr("data-checked"); + // 将全部节点全部设为未选中状态 + var $all_i = _this.obj.find("i[data-checked]"); + _this.checkStatus($all_i).noCheck(); + + if (checked != "1") { //当前复选框为未选中状态,点击后变为选中状态 + // 处理当前节点的选中状态 + _this.checkStatus($i).check(); + } + }; + + /** + * @Desc: 实现复选框点击汇总,分派具体的点击方式 + * @Param: $i: JQuery对象,表示当前点击的checkbox节点 + */ + DTree.prototype.changeCheck = function($i) { + var _this = this; + var temp = _this.temp; + if(typeof $i === 'undefined') { + $i = temp[0]; + } + // 复选框选中事件 + if (_this.checkbarType == "all") { + _this.checkAllOrNot($i); + } else if(_this.checkbarType == "no-all") { + _this.checkAllOrNoallOrNot($i); + } else if(_this.checkbarType == "p-casc") { + _this.checkAllOrPcascOrNot($i); + } else if(_this.checkbarType == "self") { + _this.checkOrNot($i); + } else if(_this.checkbarType == "only") { + _this.checkOnly($i); + } else { + _this.checkAllOrNot($i); + } + + if(_this.select) { + // 设置复选框模式中的下拉树的值 + _this.selectCheckboxVal(); + } + + // 获取复选框选中节点的内容 + var checkbarNodes = _this.setAndGetCheckbarNodesParam(true); + + // 用户自定义想做的事情 + _this.checkbarFun.chooseDone(checkbarNodes); + layui.event.call(this, MOD_NAME, "chooseDone("+$(_this.obj)[0].id+")", {"checkbarParams": checkbarNodes}); + _this.temp = []; + }; + + /** + * @Desc: 复选框半选状态初始化设置,树节点渲染完毕后重置半选状态 + */ + DTree.prototype.initNoAllCheck = function(){ + var _this = this; + //1.获取所有选中节点 + var $is = _this.obj.find("i[data-checked='1']"); + if($is.length > 0){ + for ( var key = 0; key < $is.length; key++) { + var $i = $($is[key]), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length; + var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length; + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + if (flag1 != flag2) { + // 父级复选框半选 + _this.checkStatus($item_i).noallCheck(); + } else { + // 父级复选框全选 + _this.checkStatus($item_i).check(); + } + } + } + } + }; + + /** + * @Desc: 复选框选中状态初始化设置,树节点渲染完毕后重置选中状态 + */ + DTree.prototype.initAllCheck = function(){ + var _this = this; + //1.获取所有选中节点 + var $is = _this.obj.find("i[data-checked='1']"); + if($is.length > 0){ + for ( var key = 0; key < $is.length; key++) { + var $i = $($is[key]), + dataPar = $i.attr("data-par"), + dataType = $i.attr("data-type"), + $li = $i.closest(dataPar), //当前checkbox的上级li节点 + $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点 + $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点 + + // 处理父级节点的选中状态 + for (var i = 1, item = $parent_li; i < item.length; i++) { + var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']"); + // 父级复选框全选 + _this.checkStatus($item_i).check(); + } + } + } + }; + + /** + * @Desc: 设置复选框选中/未选中/半选 _this.checkStatus($i).check(); _this.checkStatus($i).noCheck(); _this.checkStatus($i).noallCheck(); + * @Param: $i: JQuery对象,表示当前点击的checkbox节点 + */ + DTree.prototype.checkStatus = function($i) { + var _this = this; + return { + check: function(){ + $i.removeClass(_this.usefontStyle.checkbox.out); + $i.removeClass(_this.usefontStyle.checkbox.noall); + $i.addClass(_this.usefontStyle.checkbox.on); + $i.addClass(_this.style.chs); + $i.attr("data-checked","1"); + }, + noCheck: function(){ + $i.removeClass(_this.usefontStyle.checkbox.noall); + $i.removeClass(_this.usefontStyle.checkbox.on); + $i.removeClass(_this.style.chs); + $i.addClass(_this.usefontStyle.checkbox.out); + $i.attr("data-checked","0"); + }, + noallCheck: function(){ + $i.removeClass(_this.usefontStyle.checkbox.out); + $i.removeClass(_this.usefontStyle.checkbox.on); + $i.addClass(_this.usefontStyle.checkbox.noall); + $i.addClass(_this.style.chs); + $i.attr("data-checked","2"); + } + } + }; + + /** + * @Desc: 设置树的复选框操作值的全部参数,并获取 + * @Param: requestParamFlag: 设置复选框返回值的数据结构, true:基于请求类型的返回对象数组, false:原始的节点返回对象数组 + */ + DTree.prototype.setAndGetCheckbarNodesParam = function(requestParamFlag) { + var _this = this; + //操作前先清空 + _this.checkbarNode = []; + // 选择所有复选框节点 + if (_this.checkbarData == "change"){ //记录变更数据 + _this.obj.find("i[data-par][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if ($i.attr("data-checked") != $i.attr("data-initchecked")) { + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + } + }); + } else if (_this.checkbarData == "all"){ //记录全部数据 + _this.obj.find("i[data-par][data-checked][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + }); + } else if (_this.checkbarData == "choose"){ //记录选中数据 + _this.obj.find("i[data-par][data-checked='1'][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + }); + } else if (_this.checkbarData == "halfChoose"){ //记录选中和半选数据 + _this.obj.find("i[data-par][data-checked='1'][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + }); + _this.obj.find("i[data-par][data-checked='2'][dtree-disabled='false']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + if(requestParamFlag) { + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + } else { + _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i)); + } + }); + } + return _this.checkbarNode; + }; + + /** + * @Desc: 获取树的复选框操作值的全部参数 + */ + DTree.prototype.getCheckbarNodesParam = function() { + var _this = this; + return _this.setAndGetCheckbarNodesParam(true); + }; + + /** + * @Desc: 获取树的一个复选框的参数 + * @Param: $div: JQuery对象,表示当前选中节点 + * @Param: $i: JQuery对象,表示当前选中的复选框节点 + */ + DTree.prototype.getCheckbarNodeParam = function($div, $i){ + var _this = this; + var temp_node = {}; + temp_node.nodeId = $div.attr("data-id"); + temp_node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid"); + temp_node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text(); + temp_node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false; + temp_node.level = _this.getNodeDom($div).parentLi().attr("data-index"); + temp_node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false; + + var basicData = $div.attr("data-basic"); + if(basicData) { + basicData = JSON.parse(event.unescape(basicData)); + } + temp_node.basicData = basicData; + var recordData = $div.attr("data-record"); + if(recordData) { + recordData = JSON.parse(event.unescape(recordData)); + } + temp_node.recordData = recordData; + + temp_node.dataType = $i.attr("data-type"); + temp_node.checked = $i.attr("data-checked"); + temp_node.initchecked = $i.attr("data-initchecked"); + return temp_node; + }; + + /** + * @Desc: 获取基于返回参数的树的复选框参数,选中数据横向存储 + */ + DTree.prototype.getCheckbarJsonArrParam = function(){ + var _this = this; + var checkbarJsonArr = { + nodeId: [], //节点ID + parentId: [], //父节点ID + context: [], //节点内容 + leaf: [], //是否叶子节点 + level: [], //层级 + spread: [], //节点展开状态 + dataType: [], //节点标记 + checked: [], //节点复选框选中状态 + initchecked: [], //节点复选框初始状态 + basicData: [], //用户自定义的记录节点数据 + recordData: [], //当前data数据(排除basicData和children字段) + }; + // 获取全部复选框选中节点 + var params = _this.setAndGetCheckbarNodesParam(false); + if(params && params.length > 0) { + for(var i=0; i 0) { _this.checkStatus($i).check(); } + } + + /** + * @Desc: 取消全部复选框选中 + */ + DTree.prototype.cancelCheckedNode = function(){ + var _this = this; + var $i = _this.obj.find("i[data-par][data-checked!='0']"); + if($i.length > 0) { _this.checkStatus($i).noCheck(); } + } + + /** + * @Desc: 反选复选框 + */ + DTree.prototype.invertCheckedNode = function(){ + var _this = this; + if(_this.obj.find("i[data-par]").length > 0) { + var flag = false; + _this.obj.find("i[data-par]").each(function(){ + var $i = $(this); + if($i.attr("data-checked") == '2'){ + flag = true; + }else if($i.attr("data-checked") == '0') { + _this.checkStatus($i).check(); + }else if($i.attr("data-checked") == '1') { + _this.checkStatus($i).noCheck(); + } + }); + + if(flag) { + _this.initNoAllCheck(); + } else { + _this.initAllCheck(); + } + } + } + + /** + * @Desc: 删除选中节点 + */ + DTree.prototype.removeCheckedNode = function(){ + var _this = this; + var len = _this.obj.find("i[data-par][data-checked='1']").length; + if(len == 0){ + layer.msg("请至少选中一个节点",{icon:2}); + }else{ + //操作前先清空 + _this.checkbarNode = []; + // 选择所有复选框节点 + var i_node = {}; + _this.obj.find("i[data-par][data-checked='1']").each(function(){ + var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM); + + _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); + }); + + layer.confirm('确定要删除选中节点?', {icon: 3, title:'删除选中节点'}, function(index1){ + var flag = _this.menubarFun.remove(_this.checkbarNode); + if(flag){ + _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).next("ul").remove(); + _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).remove(); + _this.checkbarNode=[]; + } + + layer.close(index1); + }); + } + } + + /******************** 工具栏及菜单栏区域 ********************/ + /** + * @Desc: 初始化菜单栏和工具栏的div + */ + DTree.prototype.initTreePlus = function(){ + var _this = this; + // 初始化菜单栏和工具栏的div + _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).remove(); + _this.toolbarMenu = {}; + if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0) _this.obj.before("
                                  "); + if(_this.toolbar){ + if(_this.toolbarWay == "contextmenu") { + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).remove(); + if(_this.toolbarShow && _this.toolbarShow.length > 0) { + _this.obj.before("
                                  "); + } + } + } + + }; + + /** + * @Desc: 开启工具栏和菜单栏 + */ + DTree.prototype.openTreePlus = function(){ + var _this = this; + // 先对工具栏做处理,因为菜单栏可能会与工具栏产生关联。 + var ggMenu = []; + if(_this.toolbar) _this.getToolbarDom(); + + if(_this.menubar) { + var menubarTips = _this.menubarTips, + mtbar = menubarTips.toolbar, + group = menubarTips.group, + freedom = menubarTips.freedom; + if(mtbar && mtbar.length > 0){ + // 菜单栏吸附工具栏上 + for(var i=0; i 0){ + // 菜单栏吸附在上方的按钮组div中 + for(var i=0; i"; + break; + case defaultMenu.moveUp: + gg = ""; + break; + case defaultMenu.refresh: + gg = ""; + break; + case defaultMenu.checkAll: + gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : ""; + break; + case defaultMenu.unCheckAll: + gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : ""; + break; + case defaultMenu.invertAll: + gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : ""; + break; + case defaultMenu.remove: + gg = (_this.checkbar) ? "" : ""; + break; + case defaultMenu.searchNode: + gg = ""; + break; + } + return gg; + }; + + /** + * @Desc: 获取扩展菜单栏 + * @Param: menu: 扩展菜单栏的Json对象 + */ + DTree.prototype.getExtMenubarDom = function(menu){ + var _this = this; + return ""; + }; + + /** + * @Desc: 获取依附在工具栏的菜单栏 + * @Param: menu: 菜单栏的具体操作字符串 + */ + DTree.prototype.getMenubarToolDom = function(menu){ + var _this = this; + var rootId = _this.obj[0].id; + switch (menu) { + case defaultMenu.moveDown: + _this.toolbarMenu[defaultMenu.moveDown] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.moveDown, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.movedown, "展开全部"); + break; + case defaultMenu.moveUp: + _this.toolbarMenu[defaultMenu.moveUp] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.moveUp, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.moveup, "收缩全部"); + break; + case defaultMenu.refresh: + _this.toolbarMenu[defaultMenu.refresh] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.refresh, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.refresh, "刷新"); + break; + case defaultMenu.checkAll: + if(_this.checkbar && _this.checkbarType != 'only') + _this.toolbarMenu[defaultMenu.checkAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.checkAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.checkAll, "全选节点"); + break; + case defaultMenu.unCheckAll: + if(_this.checkbar && _this.checkbarType != 'only') + _this.toolbarMenu[defaultMenu.unCheckAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.unCheckAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.unCheckAll, "全不选节点"); + break; + case defaultMenu.invertAll: + if(_this.checkbar && _this.checkbarType != 'only') + _this.toolbarMenu[defaultMenu.invertAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.invertAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.invertAll, "反选节点"); + break; + case defaultMenu.remove: + if(_this.checkbar) + _this.toolbarMenu[defaultMenu.remove] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.remove, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.remove, "删除选中"); + break; + case defaultMenu.searchNode: + _this.toolbarMenu[defaultMenu.searchNode] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.searchNode, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.searchNode, "查询"); + break; + } + }; + + /** + * @Desc: 获取依附在工具栏的扩展菜单栏 + * @Param: menu: 扩展菜单栏的Json对象 + */ + DTree.prototype.getExtMenubarToolDom = function(menu){ + var _this = this; + _this.toolbarMenu[menu.menubarId] = _this.setToolbarDom().setMenuToolbarOption(menu.menubarId, menu.title, _this.usefontStyle.toolbar.menubarExt+" "+menu.icon, ""); + }; + + /** + * @Desc: menubar内置方法 + */ + DTree.prototype.menubarMethod = function(){ + var _this = this; + return { + openAllNode: function(obj){ // 展开所有节点 + var $ulNode = obj || _this.obj.children("li").children("ul"); + // 遍历所有ul子节点 + for (var i = 0; i < $ulNode.length; i++) { + // 获取当前节点的信息 + var $ul = $($ulNode[i]), + $div = $ul.prev("div"), + $i_fnode = _this.getNodeDom($div).fnode(), + $i_snode = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_fnode.attr("data-spread"), + leaf = $cite.attr("data-leaf"); + + if (leaf == "leaf") { + continue; + } // 说明是叶子了,则继续循环下一个 + + if (spread == "open") { + // 说明该节点已经展开了,则进行子节点循环 + } else { + if (_this.type=="load") { //是否全量加载 + if (_this.cache) { //是否开启缓存 + if ($ul.html()) { + $ul.addClass(NAV_SHOW); + } else { //加载节点 + _this.getChild($div); + } + }else { //每次取新的数据 + $ul.html(""); + _this.getChild($div); + } + } else { // 全量加载 + $ul.addClass(NAV_SHOW); + } + _this.operateIcon($i_fnode, $i_snode).open(); + + } + var $childUl = $ul.children("li").children("ul"); + _this.menubarMethod().openAllNode($childUl); + } + }, + closeAllNode: function(){ //收缩所有节点 + _this.obj.find("."+LI_NAV_CHILD).each(function(){ + // 获取当前节点的信息 + var $ul = $(this), + $div = $ul.prev("div"), + $i_fnode = _this.getNodeDom($div).fnode(), + $i_snode = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_fnode.attr("data-spread"), + leaf = $cite.attr("data-leaf"); + + $ul.removeClass(NAV_SHOW); + if(leaf !== "leaf") { + _this.operateIcon($i_fnode, $i_snode).close(); + } + }); + }, + refreshTree: function(){// 刷新树 + _this.refreshTree(); + }, + checkAll: function(){ // 全选节点 + _this.checkAllNode(); + }, + unCheckAll: function(){ // 全不选节点 + _this.cancelCheckedNode(); + }, + invertAll: function(){ // 反选节点 + _this.invertCheckedNode(); + }, + remove: function(){// 删除选中节点 + _this.removeCheckedNode(); + }, + searchNode: function(){//模糊查询该值,展开该值节点 + layer.prompt({ + formType: 0, + value: "", + title: '查询节点' + }, function(value, index1, elem){ + if (value) { + var flag = _this.searchNode(value); + if (!flag) { + layer.msg("该名称节点不存在!", {icon:5}); + } + } else { + layer.msg("未指定查询节点名称", {icon:5}); + } + layer.close(index1); + }); + }, + extMethod: function(menuId, $div, flag){ + if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0 && flag == "group"){ + for(var i=0; i<_this.menubarTips.group.length; i++){ + var ext = _this.menubarTips.group[i]; + if (menuId == ext.menubarId){ + ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div)); + break; + } + } + } + if(_this.menubar && _this.menubarTips.toolbar && _this.menubarTips.toolbar.length > 0 && flag == "toolbar"){ + for(var i=0; i<_this.menubarTips.toolbar.length; i++){ + var ext = _this.menubarTips.toolbar[i]; + if (menuId == ext.menubarId){ + ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div)); + break; + } + } + } + if(_this.menubar && _this.menubarTips.freedom && _this.menubarTips.freedom.length > 0 && flag == "freedom"){ + for(var i=0; i<_this.menubarTips.freedom.length; i++){ + var ext = _this.menubarTips.freedom[i]; + if (menuId == ext.menubarId){ + ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div)); + break; + } + } + } + } + }; + }; + + /** + * @Desc: menubar监听方法 + * @Param: menuId:菜单栏的具体操作字符串 + * @Param: flag:菜单栏的显示方式 + */ + DTree.prototype.menubarListener = function(menuId, flag){ + var _this = this; + var $div = _this.getNodeDom().nowDiv(); + switch (menuId) { + case defaultMenu.moveDown: // 展开全部节点 + _this.menubarMethod().openAllNode(); + break; + case defaultMenu.moveUp: // 收缩全部节点 + _this.menubarMethod().closeAllNode(); + break; + case defaultMenu.refresh: + _this.menubarMethod().refreshTree(); // 刷新树 + break; + case defaultMenu.checkAll: + _this.menubarMethod().checkAll(); + break; + case defaultMenu.unCheckAll: + _this.menubarMethod().unCheckAll(); + break; + case defaultMenu.invertAll: + _this.menubarMethod().invertAll(); + break; + case defaultMenu.remove: + _this.menubarMethod().remove(); + break; + case defaultMenu.searchNode: + _this.menubarMethod().searchNode(); + break; + default: + _this.menubarMethod().extMethod(menuId, $div, flag); + break; + } + }; + + /** + * @Desc: 模糊查询该值,展开该值节点 + * @Param: value: 模糊查询的值 + */ + DTree.prototype.searchNode = function(value){ + var _this = this; + var b = false; + var $lis = []; + _this.obj.find("cite[data-leaf]").each(function(){ + var $nthis = $(this); + var html = $nthis.html(); + if(html.indexOf(value) > -1){ + if($nthis.attr("data-leaf") == "leaf") { + // 叶子节点提供包含父节点的所有信息 + var title = ""; + $nthis.parents("li").each(function(){ + title = "-" + $(this).find("cite[data-leaf]").html() + title; + }); + title = title.substring(1, title.length); + $nthis.attr("title", title); + } + // 保存当前cite所在的li及父li中包含该值,则只保留父的 + var i = 0; + $nthis.parents("li").each(function(){ + var html2 = $(this).find("cite[data-leaf]").html(); + if(html2.indexOf(value) > -1){ + i++; + } + if(i >= 2){ + return true; + } + }); + if (i < 2){ + $lis.push($nthis.closest("li").prop("outerHTML")); + } + } + }); + if($lis.length > 0) { + b = true; + // 1.将树节点清空 + _this.obj.html(""); + // 2.遍历所有cite节点,展开当前cite节点 + for(var i=0; i<$lis.length; i++){ + _this.obj.append($lis[i]); + } + } + return b; + }; + + + /******************** 工具栏区域 ********************/ + /** + * @Desc: 获取工具栏 + */ + DTree.prototype.getToolbarDom = function(){ + var _this = this; + var toolbarShow = _this.toolbarShow, + toolbarExt = _this.toolbarExt, + toolbarWay = _this.toolbarWay; + + if(toolbarShow.length > 0){ + for(var i=0; i 0){ + for(var i=0; i "+other +title+""; + } else if(toolbarWay == "fixed" || toolbarWay == "follow") { + return ""; + } + }, + setMenuToolbarOption: function(menubarId, title, classId, other){ + var rootId = _this.obj[0].id; + if(toolbarWay == "contextmenu") { + return "
                                   "+other +title+"
                                  "; + } else if(toolbarWay == "fixed" || toolbarWay == "follow") { + return ""; + } + }, + setToolbarPlace: function(toolbarMenu){ + if(toolbarWay == "contextmenu") { + if(toolbarMenu){ + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').html(""); + for(var key in toolbarMenu){ + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').append(toolbarMenu[key]); + } + } + } else if(toolbarWay == "fixed" || toolbarWay == "follow") { + _this.obj.find("cite[data-leaf][dtree-disabled='false']").each(function(){ + var $cite = $(this); + _this.dynamicToolbarDom($cite); + }); + } + } + } + }; + + /** + * @Desc: 在节点后动态绑定fixed和follow条件的工具栏 + * @Param: $cite: JQuery对象,表示当前文本节点 + */ + DTree.prototype.dynamicToolbarDom = function($cite){ + var _this = this; + var toolbarWay = _this.toolbarWay; + if($cite.next("em."+TOOLBAR_TOOL_EM).length == 0) { + var $div = $cite.parent("div"); + var param = _this.getRequestParam(_this.getTempNodeParam($div)); + var toolbarMenus = _this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), param, $div); + var hideCls = (toolbarWay == "follow") ? NAV_HIDE : ""; + var em = [""]; + if(toolbarMenus){ + for(var key in toolbarMenus){ + em.push(toolbarMenus[key]); + } + } + em.push(""); + $cite.after(em.join('')); + } + } + + /** + * @Desc: 隐藏toolbar + */ + DTree.prototype.toolbarHide = function() { + var _this = this; + if(_this.toolbar && _this.toolbarWay == "contextmenu") { + var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id); + $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); + } + } + + /** + * @Desc: toolbar内置方法 + */ + DTree.prototype.toolbarMethod = function(){ + var _this = this; + return { + pulldown: function(obj){ // 展开当前点击节点的下面全部节点 + if(!obj) return; + var $ulNode = obj; + // 遍历所有ul子节点 + for (var i = 0; i < $ulNode.length; i++) { + // 获取当前节点的信息 + var $ul = $($ulNode[i]), + $div = $ul.prev("div"), + $i_fnode = _this.getNodeDom($div).fnode(), + $i_snode = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_fnode.attr("data-spread"), + leaf = $cite.attr("data-leaf"); + + if (leaf == "leaf") { continue; } // 说明是叶子了,则继续循环下一个 + + if (spread == "open") { + // 说明该节点已经展开了,则进行子节点循环 + } else { + if (_this.type=="load") { //是否全量加载 + if (_this.cache) { //是否开启缓存 + if ($ul.html()) { + $ul.addClass(NAV_SHOW); + } else { //加载节点 + _this.getChild($div); + } + }else { //每次取新的数据 + $ul.html(""); + _this.getChild($div); + } + } else { // 全量加载 + $ul.addClass(NAV_SHOW); + } + _this.operateIcon($i_fnode, $i_snode).open(); + + } + var $childUl = $ul.children("li").children("ul"); + _this.toolbarMethod().pulldown($childUl); + } + }, + pullup: function($li){ // 收缩当前点击节点的下面全部节点 + $li.find("."+LI_NAV_CHILD).each(function(){ + // 获取当前节点的信息 + var $ul = $(this), + $div = $ul.prev("div"), + $i_fnode = _this.getNodeDom($div).fnode(), + $i_snode = _this.getNodeDom($div).snode(), + $cite = _this.getNodeDom($div).cite(), + spread = $i_fnode.attr("data-spread"), + leaf = $cite.attr("data-leaf"); + + $ul.removeClass(NAV_SHOW); + if(leaf !== "leaf") { + _this.operateIcon($i_fnode, $i_snode).close(); + } + }); + } + } + }; + + /** + * @Desc: toolbar监听方法 + * @Param: tool: 工具栏的具体操作字符串 + * @Param: $div: JQuery对象,表示当前操作节点 + */ + DTree.prototype.toolbarListener = function(tool, $div) { + var _this = this; + var $cite = $div.children("cite[data-leaf]"), + $ul = $div.next("ul"), + $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点 + $p_ul = $p_li.parent("ul"), //当前选中节点的顶级li节点的父级ul + $p_div = $p_ul.prev("div"), //当前选中节点的顶级li节点的父级ul的前一个div + title = (typeof _this.formatter.title === 'function') ? $cite.attr("data-title") : $cite.text(); + + switch (tool) { + case defaultTool.pulldown: + _this.toolbarMethod().pulldown($ul); + break; + case defaultTool.pullup: + _this.toolbarMethod().pullup($p_li); + break; + case defaultTool.addTool: + var content = _this.loadToolBar(title, defaultTool.addTool); + + layer.open({ + title: "新增"+_this.toolbarStyle.title, + type: 1, + area: _this.toolbarStyle.area, + content: content, + success: function(layero, index){ + form.render(); + form.on("submit(dtree_addNode_" + _this.obj[0].id + "_form)",function(data){ + var data = data.field; + var parentId = $div.attr("data-id"), + id = $div.attr("data-id")+"_node_"+$ul[0].childNodes.length, + leaf = true, + checked = "0", + level = parseInt($p_li.attr("data-index"))+1; + + var type = _this.response.type; + var checked = _this.response.checked; + // 创建子节点的DOM,添加子节点 + var checkArr = []; + if (_this.checkArrLen > 0) { + for (var i = 0; i < _this.checkArrLen; i++) { + checkArr.push({type: i, checked: "0"}); + } + } + + $ul.append(_this.getLiItemDom(id, parentId, data.addNodeName, data.addNodeName, true, "", "", checkArr, level, false, false, false, "", "", "item")); + // 先将li节点隐藏 + $ul.find("li[data-id='"+id+"']").hide(); + // 重新赋值 + var $addDiv = $ul.find("div[data-id='"+id+"']"); + node = _this.getNodeParam($addDiv); + + //获取组装后的requestNode,组合参数 + var requestNode = _this.getRequestParam(node); + requestNode = $.extend(requestNode, data); + + _this.temp = [id, $ul, $div, level]; + // 用户自定义想做的事情 + _this.toolbarFun.addTreeNode(requestNode, $div); + + layer.close(index); + return false; + }); + } + }); + break; + case defaultTool.editTool: + var content = _this.loadToolBar(title, defaultTool.editTool); + + layer.open({ + title: "编辑"+_this.toolbarStyle.title, + type: 1, + area: _this.toolbarStyle.area, + content: content, + success: function(layero, index){ + _this.toolbarFun.editTreeLoad(_this.getRequestParam(_this.getNodeParam($div))); + form.render(); + form.on("submit(dtree_editNode_" + _this.obj[0].id + "_form)",function(data){ + var data = data.field; + $cite.html(data.editNodeName); + node = _this.getNodeParam($div); + var requestNode = _this.getRequestParam(node); + requestNode = $.extend(requestNode, data); + _this.temp = [$cite, $div, title, $p_div]; + _this.toolbarFun.editTreeNode(requestNode, $div); + + layer.close(index); + }); + } + }); + break; + case defaultTool.delTool: + layer.confirm('确定要删除该'+_this.toolbarStyle.title+'?', {icon: 3, title:'删除'+_this.toolbarStyle.title}, function(index){ + var node = _this.getNodeParam($div); + _this.temp = [$p_li, $p_div]; + _this.toolbarFun.delTreeNode(_this.getRequestParam(_this.getNodeParam($div)), $div); + + layer.close(index); + }); + break; + default: + if(_this.toolbarExt.length > 0){ + for(var i=0; i<_this.toolbarExt.length; i++){ + var ext = _this.toolbarExt[i]; + if (tool == ext.toolbarId){ + ext.handler(_this.getRequestParam(_this.getNodeParam($div)), $div); + break; + } + } + } + break; + } + } + + + /** + * @Desc: 加载toolbar中的内容 + * @Param: title: 默认操作中的input输入框的值 + * @Param: name: 工具栏的具体操作字符串 + */ + DTree.prototype.loadToolBar = function(title, name){ + var _this = this; + var toolbarShow = _this.toolbarShow; + var nodeBarContents = _this.toolbarBtn; + + var html = ""; + switch (name) { + case defaultTool.addTool: + var addNodeBarDef = [{"label": "当前选中", "name": "nodeTitle", "type": "text", "value": title, "defElem": "nowChoose", "readonly": true}, + {"label": "新增"+_this.toolbarStyle.title, "name": "addNodeName", "type": "text", "value": "", "defElem": "nowChange", "verify": "required"}, + {"type": "submit", "value": "确认添加", "defElem": "btn", "filter": "dtree_addNode_" + _this.obj[0].id + "_form"}]; + + //2. 用户自定义的节点内容 + var addNodeBar = ['
                                  ']; + + if(nodeBarContents != null && nodeBarContents.length > 0){ + if(nodeBarContents[0] != null && nodeBarContents[0] != undefined && nodeBarContents[0].length > 0){ + var addNodeBarContents = nodeBarContents[0]; + // 1. 检查是否包含了now、newly、btn这三个默认项,将其他元素依次排列,将特殊元素至于栈顶 + for(var i=0; i', '
                                  ']; + // 3.遍历生成按钮 + for(var j=0; j
                                  '); + addNodeBar.push(addBtn.join('')); + addNodeBar.push('
                                  '); + html = addNodeBar.join(''); + break; + + case defaultTool.editTool: + var editNodeBarDef = [{"label": "当前选中", "name": "nodeTitle", "type": "text", "value": title, "defElem": "nowChoose", "readonly": true}, + {"label": "编辑"+_this.toolbarStyle.title, "name": "editNodeName", "type": "text", "value": "", "defElem": "nowChange", "verify": "required"}, + {"type": "submit", "value": "确认编辑", "defElem": "btn", "filter": "dtree_editNode_" + _this.obj[0].id + "_form"}]; + + var editNodeBar = ['
                                  ']; + //2. 用户自定义的节点内容 + if(nodeBarContents != null && nodeBarContents.length > 0){ + + if(nodeBarContents[1] != null && nodeBarContents[1] != undefined && nodeBarContents[1].length > 0){ + var editNodeBarContents = nodeBarContents[1]; + // 1. 检查是否包含了now、newly、btn这三个默认项,将其他元素依次排列,将特殊元素至于栈顶 + for(var i=0; i', '
                                  ']; + // 3.遍历生成按钮 + for(var j=0; j
                                  '); + editNodeBar.push(editBtn.join('')); + editNodeBar.push('
                                  '); + html = editNodeBar.join(''); + break; + } + return html; + }; + + /** + * @Desc: 获取toolbar详细的标签信息 + * @Param: nodeBarContents: 工具栏中的数据渲染内容JSON对象 + */ + DTree.prototype.loadToolBarDetail = function(nodeBarContents){ + var _this = this; + var readonly = (typeof (nodeBarContents.readonly) === "boolean") ? nodeBarContents.readonly : false; + var disabled = (typeof (nodeBarContents.disabled) === "boolean") ? nodeBarContents.disabled : false; + var id = nodeBarContents.id ? nodeBarContents.id : ""; + var name = nodeBarContents.name ? nodeBarContents.name : ""; + var val = nodeBarContents.value ? nodeBarContents.value : ""; + var verify = nodeBarContents.verify ? nodeBarContents.verify : ""; + var placeholder = nodeBarContents.placeholder ? nodeBarContents.placeholder : val; + return{ + text: function(){ + return ['
                                  ', + '', + '
                                  ', + '', + '
                                  ', + '
                                  '].join(''); + }, + textarea: function(){ + return ['
                                  ', + '', + '
                                  ', + '', + '
                                  ', + '
                                  '].join(''); + }, + hidden: function(){ + return [''].join(''); + }, + select: function(){ + var optionsData = (typeof nodeBarContents.optionsData === 'object') ? nodeBarContents.optionsData : nodeBarContents.optionsData(); + var options = ""; + for(var key in optionsData){ + if(val == optionsData[key]){ + options += ""; + } else { + options += ""; + } + } + return ['
                                  ', + '', + '
                                  ', + '', '
                                  ', '
                                  '].join(''); + }, + submit: function(){ + var filter = nodeBarContents.filter; + return [''].join(''); + }, + button: function(){ + return [''].join(''); + }, + reset: function(){ + return [''].join(''); + } + } + }; + + /** + * @Desc: 新增节点后改变节点内容 + * @Param: returnID: 当前需要加载的内容,JSON对象、字符串、指定字符串("refresh")、true + */ + DTree.prototype.changeTreeNodeAdd = function(returnID){ + var _this = this; + var temp = _this.temp; + var id = temp[0], $ul = temp[1], $div = temp[2], level = temp[3]; + var flag = false; + if(returnID){ + var $thisDiv = _this.obj.find("[data-id='"+id+"']"); + if(typeof returnID === "object"){ + // 如果是JSON格式数据,则将当前DIV删除,重新建造DIV + $thisDiv.remove(); + var parseData = _this.parseData(returnID); + + if(parseData.treeId()){ + $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(0), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), "item")); + + // 建造完毕后,选中该DIV + $thisDiv = $ul.find("div[data-id='"+parseData.treeId()+"']"); + _this.setNodeParam($thisDiv) + } else { + layer.msg("添加失败,节点ID为undefined!",{icon:5}); + // 将li节点删除 + $ul.find("li[data-id='"+id+"']").remove(); + // 重新赋值 + _this.setNodeParam($div); + // 临时变量制空 + _this.temp = []; + return ; + } + }else if(returnID == 'refresh' || returnID == true){ + // 如果是设置为refresh参数,则向后台发送请求,获取新增节点下的真实参数,局部刷新树。 + flag = true; + } else if(typeof returnID === "string" || typeof returnID === 'number'){ + $thisDiv.attr("data-id", returnID); + // 将li节点展示 + $ul.find("li[data-id='"+returnID+"']").show(); + _this.setNodeParam($thisDiv) + } + + // 判断当前点击的节点是否是最后一级节点,如果是,则需要修改节点的样式 + var $icon_i = $div.find("i[data-spread]"); + if ($icon_i.eq(0).attr("data-spread") == "last") { + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).openWithLeaf(); + } else { //如果不是,也要修改节点样式 + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).open(); + } + $ul.addClass(NAV_SHOW); //展开UL + _this.accordionUL($ul); + if(flag) { + _this.getChild($div); + } else { + // _this.showLine(); + _this.showLine($ul.find("li")); + // 这种情况下需要在新增节点后对节点新增工具栏 + if(_this.toolbar && _this.toolbarWay != 'contextmenu') { + _this.dynamicToolbarDom($thisDiv.find("cite[data-leaf]")); + } + } + + } else { + // 将li节点删除 + $ul.find("li[data-id='"+id+"']").remove(); + // 重新赋值 + _this.setNodeParam($div); + } + + _this.temp = []; // 临时变量制空 + + }; + + /** + * @Desc: 编辑页打开后显示编辑页内容 + * @Param: param: 编辑页打开之后回显的数据集 + */ + DTree.prototype.changeTreeNodeDone = function(param){ + var _this = this; + form.val('dtree_editNode_' + _this.obj[0].id + '_form', param); + form.render(); + }; + + /** + * @Desc: 修改节点后改变节点内容 + * @Param: returnID: 当前需要变更的内容,JSON对象 + */ + DTree.prototype.changeTreeNodeEdit = function(returnID){ + var _this = this; + var temp = _this.temp; + var $cite = temp[0], $div = temp[1], title = temp[2], $p_div = temp[3]; + var flag = false; + if(returnID){ + if(typeof returnID === "object"){ + var parseData = _this.parseData(data); + + if(parseData.treeId()){ + var replaceDom = _this.replaceDom($div, parseData.treeId(), parseData.last(0), parseData.spread(), parseData.disabled(), parseData.hide()); + replaceDom.node(parseData.iconClass()); + replaceDom.checkbox(parseData.checkArr()); + replaceDom.text(parseData.title()); + replaceDom.ul(); + replaceDom.basicData(parseData.basicData()); + replaceDom.recordData(parseData.recordData()); + _this.setNodeParam($div); + } else { + layer.msg("编辑失败,节点ID为undefined!",{icon:5}); + // 重新赋值 + _this.setNodeParam($div); + } + } + } else { + $cite.html(title); + _this.getNodeParam($div); + } + + _this.temp = []; // 临时变量制空 + }; + + /** + * @Desc: 删除节点后改变节点内容 + * @Param: flag: 是否要删除节点 + */ + DTree.prototype.changeTreeNodeDel = function(flag){ + var _this = this; + var temp = _this.temp; + var $p_li = temp[0], + $p_ul = $p_li.parent("ul"), + $p_div = temp[1]; + + if(flag){ + $p_li.remove(); + _this.showLine($p_ul.find("li")); + // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式 + if($p_ul.children("li").length == 0){ + var $icon_i = $p_div.find("i[data-spread]"); + _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).closeWithLeaf(); + } + _this.initNodeParam(); + } + + _this.temp = []; // 临时变量制空 + }; + + /******************** iframe区域 ********************/ + /** + * @Desc: 加载iframe + * @Param: $div: JQuery对象,表示当前节点 + * @Param: iframeParam: iframe加载的参数 + */ + DTree.prototype.loadIframe = function($div, iframeParam) { + var _this = this; + var $cite = _this.getNodeDom($div).cite(); + if (!_this.useIframe) { // 启用iframe + return false; + } + var iframeElem = _this.iframeElem, + iframeUrl = _this.iframeUrl, + iframeLoad = _this.iframeLoad; + + var flag = iframeLoad == "leaf" ? (($cite.attr("data-leaf") == "leaf") ? true : false) : true; + + if (flag) { + if ($(iframeElem).length > 0) { //iframe存在 + if (!iframeUrl) { + layer.msg("数据请求异常,iframeUrl参数未指定", {icon:5}); + return false; + } + var param = AjaxHelper.serialize("?", iframeParam); + if(iframeUrl.indexOf("?")> -1){ + param = "&"+param.substring(1, param.length); + } + var url = iframeUrl + param; + $(iframeElem).attr("src", url); + } else { + layer.msg("iframe绑定异常,请确认页面中是否有iframe页对应的容器", {icon:5}); + return false; + } + } + return flag; + }; + + /** + * @Desc: 获取传递出去的参数,根据iframe.iframeDefaultRequest、iframe.iframeRequest和node拼出发出请求的参数 + * @Param: nodes: 需要传递出去的参数 + */ + DTree.prototype.getIframeRequestParam = function(nodes){ + var _this = this; + var request = _this.iframeRequest, + defaultRequestNames = _this.iframeDefaultRequest, + node = nodes || _this.node, + requestParam = {}; + + // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值 + for ( var key in request) { + requestParam[key] = request[key]; + } + for ( var key in defaultRequestNames) { + var paramName = defaultRequestNames[key]; + var paramValue = node[key]; + if(typeof paramValue === "boolean"){ + requestParam[paramName] = paramValue; + }else { + if(paramValue){ + requestParam[paramName] = paramValue; + } + } + } + + // 解决传递中文的乱码问题 + var reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/; //正则匹配中文 + for(var key in requestParam){ + if(reg.test(requestParam[key])) { + var str = requestParam[key]; + requestParam[key] = encodeURI(encodeURI(str)); + } + } + + return requestParam; + }; + + /******************** 数据回调区域 ********************/ + /** + * @Desc: 根据具体的id获取基于当前id的div以及对应的其他dom元素 + * @Param: id: 节点的ID值 + */ + DTree.prototype.getNodeDom = function(id){ + var _this = this; + // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + return { + div: function(){ // 获取当前div + return $div; + }, + fnode: function(){ // 获取一级图标元素 + return ($div == null) ? null : $div.find("i[data-spread]").eq(0); + }, + snode: function(){ // 获取二级图标元素 + return ($div == null) ? null : $div.find("i[data-spread]").eq(1); + }, + checkbox: function(){ // 获取复选框元素 + return ($div == null) ? null : $div.find("i[data-par]"); + }, + cite: function(){ // 获取cite元素 + return ($div == null) ? null : $div.find("cite[data-leaf]"); + }, + nextUl: function(){ // 获取相邻的ul元素 + return ($div == null) ? null : $div.next("ul"); + }, + parentLi: function(){ // 获取父级li元素 + return ($div == null) ? null : $div.parent("li"); + }, + parentUl: function(){ // 获取基于当前$div的上级$ul + return ($div == null) ? null : $div.parent("li").parent("ul"); + }, + parentDiv: function(){ // 获取基于当前$div的上级$div + return ($div == null) ? null : $div.parent("li").parent("ul").prev("div"); + }, + nowDiv: function(){ // 获取当前选中节点,没有则返回null + return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS); + }, + nowOrRootDiv: function(){ // 获取当前选中节点,没有则返回根节点下的第一个div + return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? _this.obj.children("li").eq(0).children("div").eq(0) : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS); + }, + nowOrRootUl: function(){ // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下 + return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? _this.obj : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).next("ul"); + } + } + }; + + /** + * @Desc: 获取当前选中节点下一个ul节点 或根节点。为了将新节点放入ul下 + */ + DTree.prototype.getNowNodeUl = function() { + var _this = this; + return _this.getNodeDom().nowOrRootUl(); + }; + + /** + * @Desc: 获取当前选中div节点 或第一个根div节点。 + */ + DTree.prototype.getNowNode = function() { + var _this = this; + return _this.getNodeDom().nowOrRootDiv(); + }; + + /** + * @Desc: 获取当前选中div节点 无则返回null。 + */ + DTree.prototype.getNowNodeOrNull = function() { + var _this = this; + return _this.getNodeDom().nowDiv(); + }; + + /** + * @Desc: 根据获取指定div节点。 + * @Param: id: 指定节点的ID + */ + DTree.prototype.getNode = function(id) { + var _this = this; + return _this.getNodeDom(id).div(); + }; + + /** + * @Desc: 设置当前选中节点的全部参数 + * @Param: $div: 当前选中的节点 + */ + DTree.prototype.setNodeParam = function($div) { + var _this = this; + _this.node.nodeId = $div.attr("data-id"); + _this.node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid"); + _this.node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text(); + _this.node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false; + _this.node.level = _this.getNodeDom($div).parentLi().attr("data-index"); + _this.node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false; + + var basicData = $div.attr("data-basic"); + if(basicData) { + basicData = JSON.parse(event.unescape(basicData)); + } + _this.node.basicData = basicData; + + var recordData = $div.attr("data-record"); + if(recordData) { + recordData = JSON.parse(event.unescape(recordData)); + } + _this.node.recordData = recordData; + + if (_this.getNodeDom($div).checkbox()) { + var dataTypes = "", checkeds = "", initcheckeds = ""; + _this.getNodeDom($div).checkbox().each(function(){ + dataTypes += $(this).attr("data-type") + ","; + checkeds += $(this).attr("data-checked") + ","; + initcheckeds += $(this).attr("data-initchecked") + ","; + }); + dataTypes = dataTypes.substring(0, dataTypes.length-1); + checkeds = checkeds.substring(0, checkeds.length-1); + initcheckeds = initcheckeds.substring(0, initcheckeds.length-1); + + _this.node.dataType = dataTypes; + _this.node.checked = checkeds; + _this.node.initchecked = initcheckeds; + } + }; + + /** + * @Desc: 获取当前选中节点的全部参数 + * @Param: $div: 当前选中的节点 + */ + DTree.prototype.getNodeParam = function($div) { + var _this = this; + if ($div) { + _this.setNodeParam($div); + } else { + if(_this.obj.find("div[data-id]").parent().find("."+NAV_THIS).length == 0){ + _this.initNodeParam(); + } + } + return this.node; + }; + + /** + * @Desc: 获取一个临时的node参数 + * @Param: $div: 当前选中的节点 + */ + DTree.prototype.getTempNodeParam = function($div) { + var _this = this; + var temp_node = {}; + temp_node.nodeId = $div.attr("data-id"); + temp_node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid"); + temp_node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text(); + temp_node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false; + temp_node.level = _this.getNodeDom($div).parentLi().attr("data-index"); + temp_node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false; + + var basicData = $div.attr("data-basic"); + if(basicData) { + basicData = JSON.parse(event.unescape(basicData)); + } + temp_node.basicData = basicData; + var recordData = $div.attr("data-record"); + if(recordData) { + recordData = JSON.parse(event.unescape(recordData)); + } + temp_node.recordData = recordData; + + if (_this.getNodeDom($div).checkbox()) { + var dataTypes = "", checkeds = "", initcheckeds = ""; + _this.getNodeDom($div).checkbox().each(function(){ + dataTypes += $(this).attr("data-type") + ","; + checkeds += $(this).attr("data-checked") + ","; + initcheckeds += $(this).attr("data-initchecked") + ","; + }); + dataTypes = dataTypes.substring(0, dataTypes.length-1); + checkeds = checkeds.substring(0, checkeds.length-1); + initcheckeds = initcheckeds.substring(0, initcheckeds.length-1); + + temp_node.dataType = dataTypes; + temp_node.checked = checkeds; + temp_node.initchecked = initcheckeds; + } + return temp_node; + }; + + /** + * @Desc: 重置内置参数 + */ + DTree.prototype.initNodeParam = function(){ + var _this = this; + _this.node.nodeId = ""; + _this.node.parentId = ""; + _this.node.context = ""; + _this.node.leaf = ""; + _this.node.level = ""; + _this.node.spread = ""; + _this.node.dataType = ""; + _this.node.checked = ""; + _this.node.initchecked = ""; + _this.node.basicData = ""; + _this.node.recordData = ""; + + if(_this.select) { + _this.selectResetVal(); + } + }; + + /** + * @Desc: 获取传递出去的参数,根据defaultRequest、request和node拼出发出请求的参数 + * @Param: nodes:需要传递出去的参数 + */ + DTree.prototype.getRequestParam = function(nodes){ + var _this = this; + var request = _this.request, + defaultRequestNames = _this.defaultRequest, + node = nodes || _this.node, + requestParam = {}; + + // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值 + for ( var key in request) { + requestParam[key] = request[key]; + } + for ( var key in defaultRequestNames) { + var paramName = defaultRequestNames[key]; + var paramValue = node[key]; + if(typeof paramValue === "boolean"){ + requestParam[paramName] = paramValue; + }else { + if(paramValue){ + requestParam[paramName] = paramValue; + } + } + + } + return requestParam; + }; + + /** + * @Desc: 获取filterParam过滤后的requestParam + * @Param: requestParam:请求参数 + */ + DTree.prototype.getFilterRequestParam = function(requestParam){ + var _this = this; + var filterRequest = _this.filterRequest; + return event.cloneObj(requestParam, filterRequest); + }; + + /** + * @Desc: 获取当前选中的请求参数 + */ + DTree.prototype.getNowParam = function(){ + var _this = this; + + return _this.getRequestParam(_this.getNodeParam()); + }; + + /** + * @Desc: 根据id获取指定div节点选中参数 + * @Param: id:节点的ID值 + */ + DTree.prototype.getParam = function(id){ + var _this = this; + + // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + if($div != null){ return _this.callbackData().node(_this.getTempNodeParam($div)); } else { return {}; } + }; + + /** + * @Desc: 根据id获取节点上级节点参数 + * @Param: id:节点的ID值 + */ + DTree.prototype.getParentParam = function(id){ + var _this = this; + // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + if($div != null){ return _this.callbackData().parentNode($div); } else { return {}; } + }; + + /** + * @Desc: 根据id获取节点的全部上级节点参数值 + * @Param: id:节点的ID值 + */ + DTree.prototype.getAllParentParam = function(id){ + var _this = this; + // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null + var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']"); + var arr = []; + if($div != null){ + var level = _this.getTempNodeParam($div).level; + for(var i=1; i 0){ + $childDivs.each(function(){ + var $cDiv = $(this); + childNode.push(_this.getRequestParam(_this.getTempNodeParam($cDiv))); + }); + } + return childNode; + }, + parentNode: function($div){ // 获取上级节点值 + var pId = _this.getNodeDom($div).parentLi().attr("data-pid"); + var $pdiv = _this.obj.find("div[data-id='"+pId+"']"); + if($pdiv.length > 0) {return _this.getRequestParam(_this.getTempNodeParam($pdiv));} else {return {};} + + } + } + }; + + /******************** 事件回调区域 ********************/ + /** + * @Desc: 绑定浏览器事件 + */ + DTree.prototype.bindBrowserEvent = function(){ + var _this = this; + var rootId = _this.obj[0].id; + + // 绑定文件夹展开/收缩的图标的点击事件,点击时给当前节点的div添加选中class + _this.obj.on("click", "i[data-spread]", function(event) { + event.stopPropagation(); + var $i = $(this), + $div = $i.parent("div"), + node = _this.getNodeParam($div); + + _this.toolbarHide(); + _this.navThis($div); + _this.clickSpread($div); // 展开或隐藏节点 + + // 树状态改变后,用户自定义想做的事情 + layui.event.call(this, MOD_NAME, "changeTree("+$(_this.obj)[0].id+")", { + dom: _this.callbackData().dom($i), + param: _this.callbackData().node(node), + show: _this.callbackData().dom($i).attr("data-spread") == "open" ? true : false + }); + }); + + // 绑定所有子节点div的单击事件,点击时触发加载iframe或用户自定义想做的事情 + _this.obj.on("click", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event) { + event.stopPropagation(); + var $div = $(this), + $cite = $div.find("cite"), + node = _this.getNodeParam($div); + _this.toolbarHide(); + _this.navThis($div); + + if(_this.select) { + _this.selectVal(node.nodeId); + $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").click(); + } + + if (_this.useIframe) { + var iframeParam = _this.getFilterRequestParam(_this.getIframeRequestParam(node)); + var flag = _this.loadIframe($div, iframeParam); // 加载iframe + if (flag) { + // iframe加载完毕后,用户自定义想做的事情 + _this.iframeFun.iframeDone(iframeParam); + + layui.event.call(this, MOD_NAME, "iframeDone("+$(_this.obj)[0].id+")", { + "iframeParam": iframeParam, + dom: _this.callbackData().dom($div) + }); + } + } else { + // 单击事件执行完毕后,用户自定义想做的事情 + layui.event.call(this, MOD_NAME, "node("+$(_this.obj)[0].id+")", { + param: _this.callbackData().node(node), + childParams: _this.callbackData().childNode($div), + parentParam: _this.callbackData().parentNode($div), + dom: _this.callbackData().dom($div) + }); + } + }); + + // 绑定所有子节点div的双击事件,暴露on给用户自定义 + _this.obj.on("dblclick", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event) { + event.stopPropagation(); + var $div = $(this), + $cite = $div.find("cite"), + node = _this.getNodeParam($div); + _this.toolbarHide(); + _this.navThis($div); + + if(_this.select) { + _this.selectVal(node.nodeId); + $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").click(); + } + + // 双击事件执行完毕后,用户自定义想做的事情 + layui.event.call(this, MOD_NAME, "nodedblclick("+$(_this.obj)[0].id+")", { + param: _this.callbackData().node(node), + childParams: _this.callbackData().childNode($div), + parentParam: _this.callbackData().parentNode($div), + dom: _this.callbackData().dom($div) + }); + }); + + if(_this.checkbar) { + // 绑定cheboxbar的节点复选框 + _this.obj.on("click", "i[dtree-click='"+eventName.checkNodeClick+"'][dtree-disabled='false']", function(event) { + _this.toolbarHide(); + var $i = $(this), + $div = $i.closest("div[dtree-click='"+eventName.itemNodeClick+"']"), + node = _this.getNodeParam($div); + // 复选框选中前的回调 + var flag = _this.checkbarFun.chooseBefore($i, _this.getRequestParam(node)); + _this.temp = [$i]; + if(flag){_this.changeCheck();} + + event.stopPropagation(); + }); + } + + if(_this.menubar) { + // 绑定menubar的点击事件 + _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).on("click", "button[d-menu]", function(event) { + event.stopPropagation(); + _this.toolbarHide(); + _this.menubarListener($(this).attr("d-menu"), "group"); + }); + + // 绑定menubar的点击事件 + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[d-menu]", function(event) { + event.stopPropagation(); + _this.toolbarHide(); + _this.menubarListener($(this).attr("d-menu"), "toolbar"); + }); + + // 绑定menubar的点击按钮事件 + _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").on("click", function(event) { + event.stopPropagation(); + _this.toolbarHide(); + _this.menubarListener($(this).attr("dtree-menu"), "freedom"); + }); + } + + if(_this.toolbar) { + if(_this.toolbarWay == "contextmenu") { + //绑定所有子节点div的右键点击事件,用于显示toolbar + _this.obj.on("contextmenu", "div[dtree-click='"+eventName.itemNodeClick+"'][d-contextmenu='true'][dtree-disabled='false']", function(e){ + var $div = $(this), + node = _this.getNodeParam($div); + + _this.toolbarHide(); + // toolbar加载前执行的方法,执行完毕之后创建按钮 + _this.setToolbarDom().setToolbarPlace(_this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), _this.getRequestParam(node), $div)); + + var e = e || window.event, + mx = e.pageX - $div.offset().left +45 , + my = $div.offset().top - _this.obj.closest(_this.scroll).offset().top +15; + + _this.navThis($div); + var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id); + $toolBarDiv.find(".layui-nav-child").addClass('layui-anim-fadein layui-show'); + $toolBarDiv.css({'left':mx+'px','top':my+'px'}); + + e.stopPropagation(); + return false; + }); + + // 绑定装载树的上层出现滚动条的容器,让toolbar隐藏 + _this.obj.closest(_this.scroll).scroll(function() { + _this.toolbarHide(); + }); + + // 绑定toolbar的点击事件 + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[dtree-tool]", function(event) { + event.stopPropagation(); + var $div = _this.getNodeDom().nowOrRootDiv(), + node = _this.getNodeParam($div); + _this.toolbarHide(); + var tool = $(this).attr("dtree-tool"); + _this.toolbarListener(tool, $div); + }); + } else if(_this.toolbarWay == "fixed") { + // 绑定toolbar的点击事件 + _this.obj.on("click", "a[dtree-tool]", function(event) { + event.stopPropagation(); + var $a = $(this), + $cite = $a.parent("em."+TOOLBAR_TOOL_EM).prev("cite"), //当前选中节点的text + $div = $cite.parent("div"), + node = _this.getNodeParam($div); + var tool = $a.attr("dtree-tool"); + + _this.toolbarHide(); + _this.navThis($div); + _this.toolbarListener(tool, $div); + }); + } else if(_this.toolbarWay == "follow") { + //绑定所有子节点div的mouseover mouseout事件,用于显示或隐藏toolbar + _this.obj.on("mouseover mouseout", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event){ + var $div = $(this), + $toolBarEm = $div.children("em."+TOOLBAR_TOOL_EM); + if(event.type == "mouseover"){ + $toolBarEm.removeClass(NAV_HIDE); + event.stopPropagation(); + } else if(event.type == "mouseout"){ + $toolBarEm.addClass(NAV_HIDE); + event.stopPropagation(); + } + }); + + // 绑定toolbar的点击事件 + _this.obj.on("click", "a[dtree-tool]", function(event) { + event.stopPropagation(); + var $a = $(this), + $cite = $a.parent("em."+TOOLBAR_TOOL_EM).prev("cite"), //当前选中节点的text + $div = $cite.parent("div"), + node = _this.getNodeParam($div); + var tool = $a.attr("dtree-tool"); + + _this.toolbarHide(); + _this.navThis($div); + _this.toolbarListener(tool, $div); + }); + } + } + + if(_this.select) { + // 绑定select的点击事件 + $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").on("click", function(event){ + event.stopPropagation(); + var dl = $(this).find('dl'); + //debugger; + $(this).toggleClass("layui-form-selected"); + + var $card = $("div[dtree-id='" + rootId + "'][dtree-card='"+_this.selectCardDiv+"']"); + + $card.toggleClass("dtree-select-show layui-anim layui-anim-upbit"); + var top = $(this).offset().top + $(this).outerHeight() - $WIN.scrollTop() - 5, + cardHeight = $card.height(), + winHeight = $WIN.height(); +// console.log("top = $(this).offset().top: " + $(this).offset().top + " + $(this).outerHeight(): " + $(this).outerHeight() + " - $WIN.scrollTop(): " + $WIN.scrollTop() + " - 5 =" + top); +// console.log("winHeight = " + winHeight); + if($card.hasClass('dtree-select-up')) { + $card.removeClass('dtree-select-up'); + } + + //上下定位识别 + if(top + cardHeight > $WIN.height() && top >= cardHeight){ + console.log(" top + cardHeight : "+ top + " + " + cardHeight + " > $WIN.height() :" + $WIN.height() + " && top >= cardHeight :" + top + " > " + cardHeight); + if($card.hasClass('dtree-select-up')) { + $card.removeClass('dtree-select-up'); + } else { + $card.addClass('dtree-select-up'); + } + } else { + $card.removeClass('dtree-select-up'); + } + + // 下拉树面板开闭状态改变后,用户自定义想做的事情 + layui.event.call(this, MOD_NAME, "changeSelect("+$(_this.obj)[0].id+")", { + show: $(this).hasClass("layui-form-selected"), + param: _this.selectVal() + }); + }); + + } + }; + + // 绑定body的单击,让本页面所有的toolbar隐藏 + $BODY.on("click", function(event){ + $("div."+LI_DIV_TOOLBAR).find(".layui-show").removeClass('layui-anim-fadein layui-show'); + // $("div[dtree-id][dtree-select]").removeClass("layui-form-selected"); + // $("div[dtree-id][dtree-card]").removeClass("dtree-select-show layui-anim layui-anim-upbit"); + + }); + + // 解绑浏览器事件 + DTree.prototype.unbindBrowserEvent = function(){ + var _this = this; + + // 本身事件解绑 + _this.obj.unbind(); + // 菜单栏解绑 + if(_this.menubar){ + _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).unbind(); + if(_this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").length > 0){ + _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").unbind(); + } + } + + // 工具栏解绑 + if(_this.toolbar){ + if(_this.toolbarWay == "contextmenu") { + _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).unbind(); + if(_this.obj.closest(_this.scroll).length > 0){ + _this.obj.closest(_this.scroll).unbind(); + } + } + } + + // 下拉树解绑 + if(_this.select) { + // 解绑select的点击事件 + $("div[dtree-id='" + _this.obj[0].id + "'][dtree-select='"+_this.selectDiv+"']").removeClass("layui-form-selected"); + $("div[dtree-id='" + _this.obj[0].id + "'][dtree-card='"+_this.selectCardDiv+"']").removeClass("dtree-select-show layui-anim layui-anim-upbit"); + $("div[dtree-id='" + _this.obj[0].id + "'][dtree-select='"+_this.selectDiv+"']").unbind(); + } + }; + + + /** 外部访问 **/ + var dtree = { + set: function(options){ //设置全局属性 + if(typeof options !== 'undefined') { + $.extend(OPTIONS, options); + } + }, + render: function(options){ // 初始化树 + var dTree = null; + var id = event.getElemId(options); + if(id == "") { + layer.msg("页面中未找到绑定id", {icon:5}); + } else { + dTree = DTrees[id]; + if(typeof dTree === 'object'){ + dTree.unbindBrowserEvent(); + } + // 创建树 + dTree = new DTree(options); + // 添加到树数组中去 + DTrees[id] = dTree; + dTree.initTreePlus(); + dTree.openTreePlus(); + dTree.loadTreeInit(); + dTree.bindBrowserEvent(); + } + + return dTree; + }, + renderSelect: function(options){ // 初始化下拉树 + var dTree = null; + var id = event.getElemId(options); + if(id == "") { + layer.msg("页面中未找到绑定id", {icon:5}); + } else { + dTree = DTrees[id]; + if(typeof dTree === 'object'){ + dTree.unbindBrowserEvent(); + } + // 创建下拉树 + dTree = new DTree(options); + dTree.selectSetting(); + // 添加到树数组中去 + DTrees[id] = dTree; + dTree.initTreePlus(); + dTree.openTreePlus(); + dTree.loadTreeInit(); + dTree.bindBrowserEvent(); + } + + return dTree; + }, + reload: function(dTree, options){ // 重新加载树 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + dTree.reloadSetting(options); + dTree.initTreePlus(); + dTree.openTreePlus(); + dTree.initNodeParam(); + dTree.loadTreeInit(); + dTree.unbindBrowserEvent(); + dTree.bindBrowserEvent(); + }, + on: function(events, callback) { // 绑定事件 + if(events.indexOf("'") > 0){ + events = events.replace(/'/g,""); + } + if(events.indexOf('"') > 0) { + events = events.replace(/"/g,""); + } + return layui.onevent.call(this, MOD_NAME, events, callback); + }, + click: function(dTree, id) { // 模拟单击事件 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + $("div[dtree-click='"+eventName.itemNodeClick+"'][dtree-id='"+dTree.obj[0].id+"'][data-id='"+id+"']").click(); + }, + getNowParam: function(dTree){ // 获取当前选中值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getNowParam(); // 获取当前选中值 + }, + getParam: function(dTree, id){ // 获取指定节点值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getParam(id); // 获取指定节点值 + }, + getParentParam: function(dTree, id){ // 获取参数的上级节点 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getParentParam(id); + }, + getAllParentParam: function(dTree, id){ // 获取参数的全部上级节点 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getAllParentParam(id); + }, + getChildParam: function(dTree, id){ // 获取参数的全部下级节点 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.getChildParam(id); + }, + getCheckbarNodesParam: function(dTree){ // 获取复选框选中值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return {}; + } + return dTree.getCheckbarNodesParam(); // 获取复选框选中值 + }, + getCheckbarJsonArrParam: function(dTree){ // 获取复选框选中值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return {}; + } + return dTree.getCheckbarJsonArrParam(); // 获取复选框选中值 + }, + dataInit: function(dTree, chooseId){ // 初始化选中树,针对数据反选 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + if(chooseId){ + return dTree.dataInit(chooseId); + } + }, + chooseDataInit: function(dTree, chooseIds){ // 初始化复选框选中,针对数据反选 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + if(chooseIds){ + return dTree.chooseDataInit(chooseIds); + } + }, + changeCheckbarNodes: function(dTree){ //判断复选框是否发生变更 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.changeCheckbarNodes(); + }, + initNoAllCheck: function(dTree) { //复选框半选状态初始化设置 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.initNoAllCheck(); + }, + initAllCheck: function(dTree){ // 复选框选中状态初始化设置 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.initAllCheck(); + }, + selectVal: function(dTree, param){ // select模式设置输入框选中值 + if(typeof dTree === "string"){ + dTree = DTrees[dTree]; + } + if(typeof dTree === "undefined"){ + layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2}); + return ; + } + return dTree.selectVal(param); // select模式设置输入框选中值 + }, + escape: function(html){ // 字符串格式化 + return event.escape(html); + }, + unescape: function(str){ // 字符串反格式化 + return event.unescape(str); + }, + serialize: function(first, param) { // 序列化JSON对象 + return AjaxHelper.serialize(first, param); + }, + version: function(){ //获取版本号 + return VERSION; + } + }; + + exports('dtree', dtree); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/echarts.js b/public/static/component/pear/module/echarts.js new file mode 100644 index 0000000..b48c4ab --- /dev/null +++ b/public/static/component/pear/module/echarts.js @@ -0,0 +1,90229 @@ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* 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. +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.echarts = {})); +}(this, (function (exports) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } + + var Browser = (function () { + function Browser() { + this.firefox = false; + this.ie = false; + this.edge = false; + this.newEdge = false; + this.weChat = false; + } + return Browser; + }()); + var Env = (function () { + function Env() { + this.browser = new Browser(); + this.node = false; + this.wxa = false; + this.worker = false; + this.canvasSupported = false; + this.svgSupported = false; + this.touchEventsSupported = false; + this.pointerEventsSupported = false; + this.domSupported = false; + } + return Env; + }()); + var env = new Env(); + if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') { + env.wxa = true; + env.canvasSupported = true; + env.touchEventsSupported = true; + } + else if (typeof document === 'undefined' && typeof self !== 'undefined') { + env.worker = true; + env.canvasSupported = true; + } + else if (typeof navigator === 'undefined') { + env.node = true; + env.canvasSupported = true; + env.svgSupported = true; + } + else { + detect(navigator.userAgent, env); + } + function detect(ua, env) { + var browser = env.browser; + var firefox = ua.match(/Firefox\/([\d.]+)/); + var ie = ua.match(/MSIE\s([\d.]+)/) + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge?\/([\d.]+)/); + var weChat = (/micromessenger/i).test(ua); + if (firefox) { + browser.firefox = true; + browser.version = firefox[1]; + } + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + if (edge) { + browser.edge = true; + browser.version = edge[1]; + browser.newEdge = +edge[1].split('.')[0] > 18; + } + if (weChat) { + browser.weChat = true; + } + env.canvasSupported = !!document.createElement('canvas').getContext; + env.svgSupported = typeof SVGRect !== 'undefined'; + env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge; + env.pointerEventsSupported = 'onpointerdown' in window + && (browser.edge || (browser.ie && +browser.version >= 11)); + env.domSupported = typeof document !== 'undefined'; + } + + var BUILTIN_OBJECT = { + '[object Function]': true, + '[object RegExp]': true, + '[object Date]': true, + '[object Error]': true, + '[object CanvasGradient]': true, + '[object CanvasPattern]': true, + '[object Image]': true, + '[object Canvas]': true + }; + var TYPED_ARRAY = { + '[object Int8Array]': true, + '[object Uint8Array]': true, + '[object Uint8ClampedArray]': true, + '[object Int16Array]': true, + '[object Uint16Array]': true, + '[object Int32Array]': true, + '[object Uint32Array]': true, + '[object Float32Array]': true, + '[object Float64Array]': true + }; + 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 ctorFunction = function () { }.constructor; + var protoFunction = ctorFunction ? ctorFunction.prototype : null; + var methods = {}; + function $override(name, fn) { + methods[name] = fn; + } + var idStart = 0x0907; + function guid() { + return idStart++; + } + function logError() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (typeof console !== 'undefined') { + console.error.apply(console, args); + } + } + function clone(source) { + if (source == null || typeof source !== 'object') { + return source; + } + var result = source; + var typeStr = objToString.call(source); + if (typeStr === '[object Array]') { + if (!isPrimitive(source)) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + } + else if (TYPED_ARRAY[typeStr]) { + if (!isPrimitive(source)) { + var Ctor = source.constructor; + if (Ctor.from) { + result = Ctor.from(source); + } + else { + result = new Ctor(source.length); + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + } + } + else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key)) { + result[key] = clone(source[key]); + } + } + } + return result; + } + function merge(target, source, overwrite) { + 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) + && !isBuiltInObject(sourceProp) + && !isBuiltInObject(targetProp) + && !isPrimitive(sourceProp) + && !isPrimitive(targetProp)) { + merge(targetProp, sourceProp, overwrite); + } + else if (overwrite || !(key in target)) { + target[key] = clone(source[key]); + } + } + } + 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; + } + function extend(target, source) { + if (Object.assign) { + Object.assign(target, source); + } + else { + for (var key in source) { + if (source.hasOwnProperty(key)) { + target[key] = source[key]; + } + } + } + return target; + } + function defaults(target, source, overlay) { + var keysArr = keys(source); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if ((overlay ? source[key] != null : target[key] == null)) { + target[key] = source[key]; + } + } + return target; + } + var createCanvas = function () { + return methods.createCanvas(); + }; + methods.createCanvas = function () { + return document.createElement('canvas'); + }; + 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; + } + function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + function F() { } + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + for (var prop in clazzPrototype) { + if (clazzPrototype.hasOwnProperty(prop)) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; + } + function mixin(target, source, override) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + if (Object.getOwnPropertyNames) { + var keyList = Object.getOwnPropertyNames(source); + for (var i = 0; i < keyList.length; i++) { + var key = keyList[i]; + if (key !== 'constructor') { + if ((override ? source[key] != null : target[key] == null)) { + target[key] = source[key]; + } + } + } + } + else { + defaults(target, source, override); + } + } + function isArrayLike(data) { + if (!data) { + return false; + } + if (typeof data === 'string') { + return false; + } + return typeof data.length === 'number'; + } + function each(arr, cb, context) { + if (!(arr && cb)) { + return; + } + if (arr.forEach && arr.forEach === nativeForEach) { + arr.forEach(cb, context); + } + else if (arr.length === +arr.length) { + for (var i = 0, len = arr.length; i < len; i++) { + cb.call(context, arr[i], i, arr); + } + } + else { + for (var key in arr) { + if (arr.hasOwnProperty(key)) { + cb.call(context, arr[key], key, arr); + } + } + } + } + function map(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.map && arr.map === nativeMap) { + return arr.map(cb, context); + } + else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + result.push(cb.call(context, arr[i], i, arr)); + } + return result; + } + } + function reduce(arr, cb, memo, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + memo = cb.call(context, memo, arr[i], i, arr); + } + return memo; + } + function filter(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.filter && arr.filter === nativeFilter) { + return arr.filter(cb, context); + } + else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + result.push(arr[i]); + } + } + return result; + } + } + function find(arr, cb, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + return arr[i]; + } + } + } + function keys(obj) { + if (!obj) { + return []; + } + if (Object.keys) { + return Object.keys(obj); + } + var keyList = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + keyList.push(key); + } + } + return keyList; + } + function bindPolyfill(func, context) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; + } + var bind = (protoFunction && isFunction(protoFunction.bind)) + ? protoFunction.call.bind(protoFunction.bind) + : bindPolyfill; + function curry(func) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; + } + function isArray(value) { + if (Array.isArray) { + return Array.isArray(value); + } + return objToString.call(value) === '[object Array]'; + } + function isFunction(value) { + return typeof value === 'function'; + } + function isString(value) { + return typeof value === 'string'; + } + function isStringSafe(value) { + return objToString.call(value) === '[object String]'; + } + function isNumber(value) { + return typeof value === 'number'; + } + function isObject(value) { + var type = typeof value; + return type === 'function' || (!!value && type === 'object'); + } + function isBuiltInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)]; + } + function isTypedArray(value) { + return !!TYPED_ARRAY[objToString.call(value)]; + } + function isDom(value) { + return typeof value === 'object' + && typeof value.nodeType === 'number' + && typeof value.ownerDocument === 'object'; + } + function isGradientObject(value) { + return value.colorStops != null; + } + function isPatternObject(value) { + return value.image != null; + } + function isRegExp(value) { + return objToString.call(value) === '[object RegExp]'; + } + function eqNaN(value) { + return value !== value; + } + function retrieve() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + for (var i = 0, len = args.length; i < len; i++) { + if (args[i] != null) { + return args[i]; + } + } + } + function retrieve2(value0, value1) { + return value0 != null + ? value0 + : value1; + } + function retrieve3(value0, value1, value2) { + return value0 != null + ? value0 + : value1 != null + ? value1 + : value2; + } + function slice(arr) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return nativeSlice.apply(arr, args); + } + function normalizeCssArray(val) { + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + var len = val.length; + if (len === 2) { + return [val[0], val[1], val[0], val[1]]; + } + else if (len === 3) { + return [val[0], val[1], val[2], val[1]]; + } + return val; + } + function assert(condition, message) { + if (!condition) { + throw new Error(message); + } + } + function trim(str) { + if (str == null) { + return null; + } + else if (typeof str.trim === 'function') { + return str.trim(); + } + else { + return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + } + var primitiveKey = '__ec_primitive__'; + function setAsPrimitive(obj) { + obj[primitiveKey] = true; + } + function isPrimitive(obj) { + return obj[primitiveKey]; + } + var HashMap = (function () { + function HashMap(obj) { + this.data = {}; + var isArr = isArray(obj); + this.data = {}; + var thisMap = this; + (obj instanceof HashMap) + ? obj.each(visit) + : (obj && each(obj, visit)); + function visit(value, key) { + isArr ? thisMap.set(value, key) : thisMap.set(key, value); + } + } + HashMap.prototype.get = function (key) { + return this.data.hasOwnProperty(key) ? this.data[key] : null; + }; + HashMap.prototype.set = function (key, value) { + return (this.data[key] = value); + }; + HashMap.prototype.each = function (cb, context) { + for (var key in this.data) { + if (this.data.hasOwnProperty(key)) { + cb.call(context, this.data[key], key); + } + } + }; + HashMap.prototype.keys = function () { + return keys(this.data); + }; + HashMap.prototype.removeKey = function (key) { + delete this.data[key]; + }; + return HashMap; + }()); + function createHashMap(obj) { + return new HashMap(obj); + } + function concatArray(a, b) { + var newArray = new a.constructor(a.length + b.length); + for (var i = 0; i < a.length; i++) { + newArray[i] = a[i]; + } + var offset = a.length; + for (var i = 0; i < b.length; i++) { + newArray[i + offset] = b[i]; + } + return newArray; + } + function createObject(proto, properties) { + var obj; + if (Object.create) { + obj = Object.create(proto); + } + else { + var StyleCtor = function () { }; + StyleCtor.prototype = proto; + obj = new StyleCtor(); + } + if (properties) { + extend(obj, properties); + } + return obj; + } + function hasOwn(own, prop) { + return own.hasOwnProperty(prop); + } + function noop() { } + + var util = /*#__PURE__*/Object.freeze({ + __proto__: null, + $override: $override, + guid: guid, + logError: logError, + clone: clone, + merge: merge, + mergeAll: mergeAll, + extend: extend, + defaults: defaults, + createCanvas: createCanvas, + indexOf: indexOf, + inherits: inherits, + mixin: mixin, + isArrayLike: isArrayLike, + each: each, + map: map, + reduce: reduce, + filter: filter, + find: find, + keys: keys, + bind: bind, + curry: curry, + isArray: isArray, + isFunction: isFunction, + isString: isString, + isStringSafe: isStringSafe, + isNumber: isNumber, + isObject: isObject, + isBuiltInObject: isBuiltInObject, + isTypedArray: isTypedArray, + isDom: isDom, + isGradientObject: isGradientObject, + isPatternObject: isPatternObject, + isRegExp: isRegExp, + eqNaN: eqNaN, + retrieve: retrieve, + retrieve2: retrieve2, + retrieve3: retrieve3, + slice: slice, + normalizeCssArray: normalizeCssArray, + assert: assert, + trim: trim, + setAsPrimitive: setAsPrimitive, + isPrimitive: isPrimitive, + HashMap: HashMap, + createHashMap: createHashMap, + concatArray: concatArray, + createObject: createObject, + hasOwn: hasOwn, + noop: noop + }); + + function create(x, y) { + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + return [x, y]; + } + function copy(out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + } + function clone$1(v) { + return [v[0], v[1]]; + } + function set(out, a, b) { + out[0] = a; + out[1] = b; + return out; + } + function add(out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + } + function scaleAndAdd(out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + } + function sub(out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + } + function len(v) { + return Math.sqrt(lenSquare(v)); + } + var length = len; + function lenSquare(v) { + return v[0] * v[0] + v[1] * v[1]; + } + var lengthSquare = lenSquare; + function mul(out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + } + function div(out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + } + function dot(v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + } + function scale(out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + } + function normalize(out, v) { + var d = len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } + else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; + } + function distance(v1, v2) { + return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1])); + } + var dist = distance; + function distanceSquare(v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); + } + var distSquare = distanceSquare; + function negate(out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + } + function lerp(out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + } + function applyTransform(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; + } + function min(out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + } + function max(out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + + var vector = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create, + copy: copy, + clone: clone$1, + set: set, + add: add, + scaleAndAdd: scaleAndAdd, + sub: sub, + len: len, + length: length, + lenSquare: lenSquare, + lengthSquare: lengthSquare, + mul: mul, + div: div, + dot: dot, + scale: scale, + normalize: normalize, + distance: distance, + dist: dist, + distanceSquare: distanceSquare, + distSquare: distSquare, + negate: negate, + lerp: lerp, + applyTransform: applyTransform, + min: min, + max: max + }); + + var Param = (function () { + function Param(target, e) { + this.target = target; + this.topTarget = e && e.topTarget; + } + return Param; + }()); + var Draggable = (function () { + function Draggable(handler) { + this.handler = handler; + handler.on('mousedown', this._dragStart, this); + handler.on('mousemove', this._drag, this); + handler.on('mouseup', this._dragEnd, this); + } + Draggable.prototype._dragStart = function (e) { + var draggingTarget = e.target; + while (draggingTarget && !draggingTarget.draggable) { + draggingTarget = draggingTarget.parent; + } + if (draggingTarget) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event); + } + }; + Draggable.prototype._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.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event); + var dropTarget = this.handler.findHover(x, y, draggingTarget).target; + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event); + } + } + } + }; + Draggable.prototype._dragEnd = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + draggingTarget.dragging = false; + } + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event); + if (this._dropTarget) { + this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event); + } + this._draggingTarget = null; + this._dropTarget = null; + }; + return Draggable; + }()); + + var Eventful = (function () { + function Eventful(eventProcessors) { + if (eventProcessors) { + this._$eventProcessor = eventProcessors; + } + } + Eventful.prototype.on = function (event, query, handler, context) { + if (!this._$handlers) { + this._$handlers = {}; + } + var _h = this._$handlers; + if (typeof query === 'function') { + context = handler; + handler = query; + query = null; + } + if (!handler || !event) { + return this; + } + var eventProcessor = this._$eventProcessor; + if (query != null && eventProcessor && eventProcessor.normalizeQuery) { + query = eventProcessor.normalizeQuery(query); + } + if (!_h[event]) { + _h[event] = []; + } + for (var i = 0; i < _h[event].length; i++) { + if (_h[event][i].h === handler) { + return this; + } + } + var wrap = { + h: handler, + query: query, + ctx: (context || this), + callAtLast: handler.zrEventfulCallAtLast + }; + var lastIndex = _h[event].length - 1; + var lastWrap = _h[event][lastIndex]; + (lastWrap && lastWrap.callAtLast) + ? _h[event].splice(lastIndex, 0, wrap) + : _h[event].push(wrap); + return this; + }; + Eventful.prototype.isSilent = function (eventName) { + var _h = this._$handlers; + return !_h || !_h[eventName] || !_h[eventName].length; + }; + Eventful.prototype.off = function (eventType, handler) { + var _h = this._$handlers; + if (!_h) { + return this; + } + if (!eventType) { + this._$handlers = {}; + return this; + } + if (handler) { + if (_h[eventType]) { + var newList = []; + for (var i = 0, l = _h[eventType].length; i < l; i++) { + if (_h[eventType][i].h !== handler) { + newList.push(_h[eventType][i]); + } + } + _h[eventType] = newList; + } + if (_h[eventType] && _h[eventType].length === 0) { + delete _h[eventType]; + } + } + else { + delete _h[eventType]; + } + return this; + }; + Eventful.prototype.trigger = function (eventType) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[eventType]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(eventType, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(hItem.ctx); + break; + case 1: + hItem.h.call(hItem.ctx, args[0]); + break; + case 2: + hItem.h.call(hItem.ctx, args[0], args[1]); + break; + default: + hItem.h.apply(hItem.ctx, args); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(eventType); + return this; + }; + Eventful.prototype.triggerWithContext = function (type) { + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[type]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var args = arguments; + var argLen = args.length; + var ctx = args[argLen - 1]; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(type, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(ctx); + break; + case 1: + hItem.h.call(ctx, args[0]); + break; + case 2: + hItem.h.call(ctx, args[0], args[1]); + break; + default: + hItem.h.apply(ctx, args.slice(1, argLen - 1)); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(type); + return this; + }; + return Eventful; + }()); + + var LN2 = Math.log(2); + function determinant(rows, rank, rowStart, rowMask, colMask, detCache) { + var cacheKey = rowMask + '-' + colMask; + var fullRank = rows.length; + if (detCache.hasOwnProperty(cacheKey)) { + return detCache[cacheKey]; + } + if (rank === 1) { + var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2); + return rows[rowStart][colStart]; + } + var subRowMask = rowMask | (1 << rowStart); + var subRowStart = rowStart + 1; + while (rowMask & (1 << subRowStart)) { + subRowStart++; + } + var sum = 0; + for (var j = 0, colLocalIdx = 0; j < fullRank; j++) { + var colTag = 1 << j; + if (!(colTag & colMask)) { + sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j] + * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache); + colLocalIdx++; + } + } + detCache[cacheKey] = sum; + return sum; + } + function buildTransformer(src, dest) { + var mA = [ + [src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]], + [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]], + [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]], + [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]], + [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]], + [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]], + [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]], + [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]] + ]; + var detCache = {}; + var det = determinant(mA, 8, 0, 0, 0, detCache); + if (det === 0) { + return; + } + var vh = []; + for (var i = 0; i < 8; i++) { + for (var j = 0; j < 8; j++) { + vh[j] == null && (vh[j] = 0); + vh[j] += ((i + j) % 2 ? -1 : 1) + * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache) + / det * dest[i]; + } + } + return function (out, srcPointX, srcPointY) { + var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1; + out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk; + out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk; + }; + } + + var EVENT_SAVED_PROP = '___zrEVENTSAVED'; + var _calcOut = []; + function transformLocalCoord(out, elFrom, elTarget, inX, inY) { + return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true) + && transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]); + } + function transformCoordWithViewport(out, el, inX, inY, inverse) { + if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) { + var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {}); + var markers = prepareCoordMarkers(el, saved); + var transformer = preparePointerTransformer(markers, saved, inverse); + if (transformer) { + transformer(out, inX, inY); + return true; + } + } + return false; + } + function prepareCoordMarkers(el, saved) { + var markers = saved.markers; + if (markers) { + return markers; + } + markers = saved.markers = []; + var propLR = ['left', 'right']; + var propTB = ['top', 'bottom']; + for (var i = 0; i < 4; i++) { + var marker = document.createElement('div'); + var stl = marker.style; + var idxLR = i % 2; + var idxTB = (i >> 1) % 2; + stl.cssText = [ + 'position: absolute', + 'visibility: hidden', + 'padding: 0', + 'margin: 0', + 'border-width: 0', + 'user-select: none', + 'width:0', + 'height:0', + propLR[idxLR] + ':0', + propTB[idxTB] + ':0', + propLR[1 - idxLR] + ':auto', + propTB[1 - idxTB] + ':auto', + '' + ].join('!important;'); + el.appendChild(marker); + markers.push(marker); + } + return markers; + } + function preparePointerTransformer(markers, saved, inverse) { + var transformerName = inverse ? 'invTrans' : 'trans'; + var transformer = saved[transformerName]; + var oldSrcCoords = saved.srcCoords; + var srcCoords = []; + var destCoords = []; + var oldCoordTheSame = true; + for (var i = 0; i < 4; i++) { + var rect = markers[i].getBoundingClientRect(); + var ii = 2 * i; + var x = rect.left; + var y = rect.top; + srcCoords.push(x, y); + oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1]; + destCoords.push(markers[i].offsetLeft, markers[i].offsetTop); + } + return (oldCoordTheSame && transformer) + ? transformer + : (saved.srcCoords = srcCoords, + saved[transformerName] = inverse + ? buildTransformer(destCoords, srcCoords) + : buildTransformer(srcCoords, destCoords)); + } + function isCanvasEl(el) { + return el.nodeName.toUpperCase() === 'CANVAS'; + } + + var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener; + var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; + var _calcOut$1 = []; + function clientToLocal(el, e, out, calculate) { + out = out || {}; + if (calculate || !env.canvasSupported) { + calculateZrXY(el, e, out); + } + else if (env.browser.firefox + && e.layerX != null + && e.layerX !== e.offsetX) { + out.zrX = e.layerX; + out.zrY = e.layerY; + } + else if (e.offsetX != null) { + out.zrX = e.offsetX; + out.zrY = e.offsetY; + } + else { + calculateZrXY(el, e, out); + } + return out; + } + function calculateZrXY(el, e, out) { + if (env.domSupported && el.getBoundingClientRect) { + var ex = e.clientX; + var ey = e.clientY; + if (isCanvasEl(el)) { + var box = el.getBoundingClientRect(); + out.zrX = ex - box.left; + out.zrY = ey - box.top; + return; + } + else { + if (transformCoordWithViewport(_calcOut$1, el, ex, ey)) { + out.zrX = _calcOut$1[0]; + out.zrY = _calcOut$1[1]; + return; + } + } + } + out.zrX = out.zrY = 0; + } + function getNativeEvent(e) { + return e + || window.event; + } + function normalizeEvent(el, e, calculate) { + e = getNativeEvent(e); + if (e.zrX != null) { + return e; + } + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + if (!isTouch) { + clientToLocal(el, e, e, calculate); + var wheelDelta = getWheelDeltaMayPolyfill(e); + e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3; + } + else { + var touch = eventType !== 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + touch && clientToLocal(el, touch, e, calculate); + } + var button = e.button; + if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) { + e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); + } + return e; + } + function getWheelDeltaMayPolyfill(e) { + var rawWheelDelta = e.wheelDelta; + if (rawWheelDelta) { + return rawWheelDelta; + } + var deltaX = e.deltaX; + var deltaY = e.deltaY; + if (deltaX == null || deltaY == null) { + return rawWheelDelta; + } + var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX); + var sign = deltaY > 0 ? -1 + : deltaY < 0 ? 1 + : deltaX > 0 ? -1 + : 1; + return 3 * delta * sign; + } + function addEventListener(el, name, handler, opt) { + if (isDomLevel2) { + el.addEventListener(name, handler, opt); + } + else { + el.attachEvent('on' + name, handler); + } + } + function removeEventListener(el, name, handler, opt) { + if (isDomLevel2) { + el.removeEventListener(name, handler, opt); + } + else { + el.detachEvent('on' + name, handler); + } + } + var stop = isDomLevel2 + ? function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + } + : function (e) { + e.returnValue = false; + e.cancelBubble = true; + }; + function isMiddleOrRightButtonOnMouseUpDown(e) { + return e.which === 2 || e.which === 3; + } + + var GestureMgr = (function () { + function GestureMgr() { + this._track = []; + } + GestureMgr.prototype.recognize = function (event, target, root) { + this._doTrack(event, target, root); + return this._recognize(event); + }; + GestureMgr.prototype.clear = function () { + this._track.length = 0; + return this; + }; + GestureMgr.prototype._doTrack = function (event, target, root) { + 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]; + var pos = clientToLocal(root, touch, {}); + trackItem.points.push([pos.zrX, pos.zrY]); + trackItem.touches.push(touch); + } + this._track.push(trackItem); + }; + GestureMgr.prototype._recognize = function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + }; + return GestureMgr; + }()); + function dist$1(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 (tracks, event) { + var trackLen = tracks.length; + if (!trackLen) { + return; + } + var pinchEnd = (tracks[trackLen - 1] || {}).points; + var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd; + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1) { + var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + event.pinchScale = pinchScale; + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + return { + type: 'pinch', + target: tracks[0].target, + event: event + }; + } + } + }; + + var SILENT = 'silent'; + function makeEventPacket(eveType, targetInfo, event) { + return { + type: eveType, + event: event, + target: targetInfo.target, + topTarget: targetInfo.topTarget, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta, + zrByTouch: event.zrByTouch, + which: event.which, + stop: stopEvent + }; + } + function stopEvent() { + stop(this.event); + } + var EmptyProxy = (function (_super) { + __extends(EmptyProxy, _super); + function EmptyProxy() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.handler = null; + return _this; + } + EmptyProxy.prototype.dispose = function () { }; + EmptyProxy.prototype.setCursor = function () { }; + return EmptyProxy; + }(Eventful)); + var HoveredResult = (function () { + function HoveredResult(x, y) { + this.x = x; + this.y = y; + } + return HoveredResult; + }()); + var handlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var Handler = (function (_super) { + __extends(Handler, _super); + function Handler(storage, painter, proxy, painterRoot) { + var _this = _super.call(this) || this; + _this._hovered = new HoveredResult(0, 0); + _this.storage = storage; + _this.painter = painter; + _this.painterRoot = painterRoot; + proxy = proxy || new EmptyProxy(); + _this.proxy = null; + _this.setHandlerProxy(proxy); + _this._draggingMgr = new Draggable(_this); + return _this; + } + Handler.prototype.setHandlerProxy = function (proxy) { + if (this.proxy) { + this.proxy.dispose(); + } + if (proxy) { + each(handlerNames, function (name) { + proxy.on && proxy.on(name, this[name], this); + }, this); + proxy.handler = this; + } + this.proxy = proxy; + }; + Handler.prototype.mousemove = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var lastHovered = this._hovered; + var lastHoveredTarget = lastHovered.target; + if (lastHoveredTarget && !lastHoveredTarget.__zr) { + lastHovered = this.findHover(lastHovered.x, lastHovered.y); + lastHoveredTarget = lastHovered.target; + } + var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y); + var hoveredTarget = hovered.target; + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default'); + if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(lastHovered, 'mouseout', event); + } + this.dispatchToElement(hovered, 'mousemove', event); + if (hoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(hovered, 'mouseover', event); + } + }; + Handler.prototype.mouseout = function (event) { + var eventControl = event.zrEventControl; + if (eventControl !== 'only_globalout') { + this.dispatchToElement(this._hovered, 'mouseout', event); + } + if (eventControl !== 'no_globalout') { + this.trigger('globalout', { type: 'globalout', event: event }); + } + }; + Handler.prototype.resize = function () { + this._hovered = new HoveredResult(0, 0); + }; + Handler.prototype.dispatch = function (eventName, eventArgs) { + var handler = this[eventName]; + handler && handler.call(this, eventArgs); + }; + Handler.prototype.dispose = function () { + this.proxy.dispose(); + this.storage = null; + this.proxy = null; + this.painter = null; + }; + Handler.prototype.setCursorStyle = function (cursorStyle) { + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(cursorStyle); + }; + Handler.prototype.dispatchToElement = function (targetInfo, eventName, event) { + targetInfo = targetInfo || {}; + var el = targetInfo.target; + if (el && el.silent) { + return; + } + var eventKey = ('on' + eventName); + var eventPacket = makeEventPacket(eventName, targetInfo, event); + while (el) { + el[eventKey] + && (eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket)); + el.trigger(eventName, eventPacket); + el = el.__hostTarget ? el.__hostTarget : el.parent; + if (eventPacket.cancelBubble) { + break; + } + } + if (!eventPacket.cancelBubble) { + this.trigger(eventName, eventPacket); + if (this.painter && this.painter.eachOtherLayer) { + this.painter.eachOtherLayer(function (layer) { + if (typeof (layer[eventKey]) === 'function') { + layer[eventKey].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + } + }; + Handler.prototype.findHover = function (x, y, exclude) { + var list = this.storage.getDisplayList(); + var out = new HoveredResult(x, y); + for (var i = list.length - 1; i >= 0; i--) { + var hoverCheckResult = void 0; + if (list[i] !== exclude + && !list[i].ignore + && (hoverCheckResult = isHover(list[i], x, y))) { + !out.topTarget && (out.topTarget = list[i]); + if (hoverCheckResult !== SILENT) { + out.target = list[i]; + break; + } + } + } + return out; + }; + Handler.prototype.processGesture = function (event, stage) { + if (!this._gestureMgr) { + this._gestureMgr = new GestureMgr(); + } + var gestureMgr = this._gestureMgr; + stage === 'start' && gestureMgr.clear(); + var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom); + stage === 'end' && gestureMgr.clear(); + if (gestureInfo) { + var type = gestureInfo.type; + event.gestureEvent = type; + var res = new HoveredResult(); + res.target = gestureInfo.target; + this.dispatchToElement(res, type, gestureInfo.event); + } + }; + return Handler; + }(Eventful)); + each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) { + Handler.prototype[name] = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var hovered; + var hoveredTarget; + if (name !== 'mouseup' || !isOutside) { + hovered = this.findHover(x, y); + hoveredTarget = hovered.target; + } + if (name === 'mousedown') { + this._downEl = hoveredTarget; + this._downPoint = [event.zrX, event.zrY]; + this._upEl = hoveredTarget; + } + else if (name === 'mouseup') { + this._upEl = hoveredTarget; + } + else if (name === 'click') { + if (this._downEl !== this._upEl + || !this._downPoint + || dist(this._downPoint, [event.zrX, event.zrY]) > 4) { + return; + } + this._downPoint = null; + } + this.dispatchToElement(hovered, name, event); + }; + }); + function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var el = displayable; + var isSilent = void 0; + var ignoreClip = false; + while (el) { + if (el.ignoreClip) { + ignoreClip = true; + } + if (!ignoreClip) { + var clipPath = el.getClipPath(); + if (clipPath && !clipPath.contain(x, y)) { + return false; + } + if (el.silent) { + isSilent = true; + } + } + var hostEl = el.__hostTarget; + el = hostEl ? hostEl : el.parent; + } + return isSilent ? SILENT : true; + } + return false; + } + function isOutsideBoundary(handlerInstance, x, y) { + var painter = handlerInstance.painter; + return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight(); + } + + function create$1() { + return [1, 0, 0, 1, 0, 0]; + } + function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + } + function copy$1(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; + } + function mul$1(out, m1, m2) { + 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; + } + function translate(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; + } + function rotate(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; + } + function scale$1(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; + } + function invert(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; + } + function clone$2(a) { + var b = create$1(); + copy$1(b, a); + return b; + } + + var matrix = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$1, + identity: identity, + copy: copy$1, + mul: mul$1, + translate: translate, + rotate: rotate, + scale: scale$1, + invert: invert, + clone: clone$2 + }); + + var mIdentity = identity; + var EPSILON = 5e-5; + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + var scaleTmp = []; + var tmpTransform = []; + var originTransform = create$1(); + var abs = Math.abs; + var Transformable = (function () { + function Transformable() { + } + Transformable.prototype.setPosition = function (arr) { + this.x = arr[0]; + this.y = arr[1]; + }; + Transformable.prototype.setScale = function (arr) { + this.scaleX = arr[0]; + this.scaleY = arr[1]; + }; + Transformable.prototype.setOrigin = function (arr) { + this.originX = arr[0]; + this.originY = arr[1]; + }; + Transformable.prototype.needLocalTransform = function () { + return isNotAroundZero(this.rotation) + || isNotAroundZero(this.x) + || isNotAroundZero(this.y) + || isNotAroundZero(this.scaleX - 1) + || isNotAroundZero(this.scaleY - 1); + }; + Transformable.prototype.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 || create$1(); + if (needLocalTransform) { + this.getLocalTransform(m); + } + else { + mIdentity(m); + } + if (parentHasTransform) { + if (needLocalTransform) { + mul$1(m, parent.transform, m); + } + else { + copy$1(m, parent.transform); + } + } + this.transform = m; + this._resolveGlobalScaleRatio(m); + }; + Transformable.prototype._resolveGlobalScaleRatio = function (m) { + var globalScaleRatio = this.globalScaleRatio; + if (globalScaleRatio != null && globalScaleRatio !== 1) { + this.getGlobalScale(scaleTmp); + var relX = scaleTmp[0] < 0 ? -1 : 1; + var relY = scaleTmp[1] < 0 ? -1 : 1; + var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0; + var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0; + m[0] *= sx; + m[1] *= sx; + m[2] *= sy; + m[3] *= sy; + } + this.invTransform = this.invTransform || create$1(); + invert(this.invTransform, m); + }; + Transformable.prototype.getLocalTransform = function (m) { + return Transformable.getLocalTransform(this, m); + }; + Transformable.prototype.getComputedTransform = function () { + var transformNode = this; + var ancestors = []; + while (transformNode) { + ancestors.push(transformNode); + transformNode = transformNode.parent; + } + while (transformNode = ancestors.pop()) { + transformNode.updateTransform(); + } + return this.transform; + }; + Transformable.prototype.setLocalTransform = function (m) { + if (!m) { + return; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + 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; + } + this.rotation = Math.atan2(-m[1] / sy, m[0] / sx); + if (sx < 0 && sy < 0) { + this.rotation += Math.PI; + sx = -sx; + sy = -sy; + } + this.x = m[4]; + this.y = m[5]; + this.scaleX = sx; + this.scaleY = sy; + }; + Transformable.prototype.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + mul$1(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var ox = this.originX; + var oy = this.originY; + if (ox || oy) { + originTransform[4] = ox; + originTransform[5] = oy; + mul$1(tmpTransform, m, originTransform); + tmpTransform[4] -= ox; + tmpTransform[5] -= oy; + m = tmpTransform; + } + this.setLocalTransform(m); + }; + Transformable.prototype.getGlobalScale = function (out) { + var m = this.transform; + out = out || []; + if (!m) { + out[0] = 1; + out[1] = 1; + return out; + } + out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]); + out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]); + if (m[0] < 0) { + out[0] = -out[0]; + } + if (m[3] < 0) { + out[1] = -out[1]; + } + return out; + }; + Transformable.prototype.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + applyTransform(v2, v2, invTransform); + } + return v2; + }; + Transformable.prototype.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + applyTransform(v2, v2, transform); + } + return v2; + }; + Transformable.prototype.getLineScale = function () { + var m = this.transform; + 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; + }; + Transformable.getLocalTransform = function (target, m) { + m = m || []; + mIdentity(m); + var ox = target.originX || 0; + var oy = target.originY || 0; + var sx = target.scaleX; + var sy = target.scaleY; + var rotation = target.rotation || 0; + var x = target.x; + var y = target.y; + m[4] -= ox; + m[5] -= oy; + m[0] *= sx; + m[1] *= sy; + m[2] *= sx; + m[3] *= sy; + m[4] *= sx; + m[5] *= sy; + if (rotation) { + rotate(m, m, rotation); + } + m[4] += ox; + m[5] += oy; + m[4] += x; + m[5] += y; + return m; + }; + Transformable.initDefaultProps = (function () { + var proto = Transformable.prototype; + proto.x = 0; + proto.y = 0; + proto.scaleX = 1; + proto.scaleY = 1; + proto.originX = 0; + proto.originY = 0; + proto.rotation = 0; + proto.globalScaleRatio = 1; + })(); + return Transformable; + }()); + + var easing = { + linear: function (k) { + return k; + }, + quadraticIn: function (k) { + return k * k; + }, + quadraticOut: function (k) { + return k * (2 - k); + }, + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + cubicIn: function (k) { + return k * k * k; + }, + cubicOut: function (k) { + return --k * k * k + 1; + }, + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + quarticIn: function (k) { + return k * k * k * k; + }, + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + quinticIn: function (k) { + return k * k * k * k * k; + }, + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + 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); + }, + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + 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); + }, + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + 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); + }, + 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)); + }, + 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); + }, + 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; + }, + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + 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); + }, + bounceIn: function (k) { + return 1 - easing.bounceOut(1 - k); + }, + 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; + } + }, + bounceInOut: function (k) { + if (k < 0.5) { + return easing.bounceIn(k * 2) * 0.5; + } + return easing.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } + }; + + var Clip = (function () { + function Clip(opts) { + this._initialized = false; + this._startTime = 0; + this._pausedTime = 0; + this._paused = false; + this._life = opts.life || 1000; + this._delay = opts.delay || 0; + this.loop = opts.loop == null ? false : opts.loop; + this.gap = opts.gap || 0; + this.easing = opts.easing || 'linear'; + this.onframe = opts.onframe; + this.ondestroy = opts.ondestroy; + this.onrestart = opts.onrestart; + } + Clip.prototype.step = function (globalTime, deltaTime) { + if (!this._initialized) { + this._startTime = globalTime + this._delay; + this._initialized = true; + } + if (this._paused) { + this._pausedTime += deltaTime; + return; + } + var percent = (globalTime - this._startTime - this._pausedTime) / this._life; + if (percent < 0) { + percent = 0; + } + percent = Math.min(percent, 1); + var easing$1 = this.easing; + var easingFunc = typeof easing$1 === 'string' + ? easing[easing$1] : easing$1; + var schedule = typeof easingFunc === 'function' + ? easingFunc(percent) + : percent; + this.onframe && this.onframe(schedule); + if (percent === 1) { + if (this.loop) { + this._restart(globalTime); + this.onrestart && this.onrestart(); + } + else { + return true; + } + } + return false; + }; + Clip.prototype._restart = function (globalTime) { + var remainder = (globalTime - this._startTime - this._pausedTime) % this._life; + this._startTime = globalTime - remainder + this.gap; + this._pausedTime = 0; + }; + Clip.prototype.pause = function () { + this._paused = true; + }; + Clip.prototype.resume = function () { + this._paused = false; + }; + return Clip; + }()); + + var Entry = (function () { + function Entry(val) { + this.value = val; + } + return Entry; + }()); + var LinkedList = (function () { + function LinkedList() { + this._len = 0; + } + LinkedList.prototype.insert = function (val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; + }; + LinkedList.prototype.insertEntry = function (entry) { + if (!this.head) { + this.head = this.tail = entry; + } + else { + this.tail.next = entry; + entry.prev = this.tail; + entry.next = null; + this.tail = entry; + } + this._len++; + }; + LinkedList.prototype.remove = function (entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } + else { + this.head = next; + } + if (next) { + next.prev = prev; + } + else { + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; + }; + LinkedList.prototype.len = function () { + return this._len; + }; + LinkedList.prototype.clear = function () { + this.head = this.tail = null; + this._len = 0; + }; + return LinkedList; + }()); + var LRU = (function () { + function LRU(maxSize) { + this._list = new LinkedList(); + this._maxSize = 10; + this._map = {}; + this._maxSize = maxSize; + } + LRU.prototype.put = function (key, value) { + var list = this._list; + var map = this._map; + var removed = null; + if (map[key] == null) { + var len = list.len(); + var entry = this._lastRemovedEntry; + if (len >= this._maxSize && len > 0) { + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + removed = leastUsedEntry.value; + this._lastRemovedEntry = leastUsedEntry; + } + if (entry) { + entry.value = value; + } + else { + entry = new Entry(value); + } + entry.key = key; + list.insertEntry(entry); + map[key] = entry; + } + return removed; + }; + LRU.prototype.get = function (key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + return entry.value; + } + }; + LRU.prototype.clear = function () { + this._list.clear(); + this._map = {}; + }; + LRU.prototype.len = function () { + return this._list.len(); + }; + return LRU; + }()); + + 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) { + i = Math.round(i); + return i < 0 ? 0 : i > 255 ? 255 : i; + } + function clampCssAngle(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 360 ? 360 : i; + } + function clampCssFloat(f) { + return f < 0 ? 0 : f > 1 ? 1 : f; + } + function parseCssInt(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); + } + function parseCssFloat(val) { + var str = val; + 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 lerpNumber(a, b, p) { + return a + (b - a) * p; + } + function setRgba(out, r, g, b, a) { + out[0] = r; + out[1] = g; + out[2] = b; + out[3] = a; + return out; + } + function copyRgba(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + var colorCache = new LRU(20); + var lastRemovedArr = null; + function putToCache(colorStr, rgbaArr) { + if (lastRemovedArr) { + copyRgba(lastRemovedArr, rgbaArr); + } + lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice())); + } + function parse(colorStr, rgbaArr) { + if (!colorStr) { + return; + } + rgbaArr = rgbaArr || []; + var cached = colorCache.get(colorStr); + if (cached) { + return copyRgba(rgbaArr, cached); + } + colorStr = colorStr + ''; + var str = colorStr.replace(/ /g, '').toLowerCase(); + if (str in kCSSColorTable) { + copyRgba(rgbaArr, kCSSColorTable[str]); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + var strLen = str.length; + if (str.charAt(0) === '#') { + if (strLen === 4 || strLen === 5) { + var iv = parseInt(str.slice(1, 4), 16); + if (!(iv >= 0 && iv <= 0xfff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), strLen === 5 ? parseInt(str.slice(4), 16) / 0xf : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + else if (strLen === 7 || strLen === 9) { + var iv = parseInt(str.slice(1, 7), 16); + if (!(iv >= 0 && iv <= 0xffffff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, strLen === 9 ? parseInt(str.slice(7), 16) / 0xff : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + return; + } + var op = str.indexOf('('); + var ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === strLen) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; + switch (fname) { + case 'rgba': + if (params.length !== 4) { + return params.length === 3 + ? setRgba(rgbaArr, +params[0], +params[1], +params[2], 1) + : setRgba(rgbaArr, 0, 0, 0, 1); + } + alpha = parseCssFloat(params.pop()); + case 'rgb': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), alpha); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsla': + if (params.length !== 4) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + params[3] = parseCssFloat(params[3]); + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsl': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + default: + return; + } + } + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + function hsla2rgba(hsla, rgba) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; + 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; + rgba = rgba || []; + setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1); + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + return rgba; + } + function rgba2hsla(rgba) { + if (!rgba) { + return; + } + var R = rgba[0] / 255; + var G = rgba[1] / 255; + var B = rgba[2] / 255; + var vMin = Math.min(R, G, B); + var vMax = Math.max(R, G, B); + var delta = vMax - vMin; + var L = (vMax + vMin) / 2; + var H; + var S; + 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; + } + 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; + } + if (colorArr[i] > 255) { + colorArr[i] = 255; + } + else if (colorArr[i] < 0) { + colorArr[i] = 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } + } + function toHex(color) { + var colorArr = parse(color); + if (colorArr) { + return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1); + } + } + function fastLerp(normalizedValue, colors, out) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1)) { + return; + } + out = out || []; + 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(lerpNumber(leftColor[0], rightColor[0], dv)); + out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)); + out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)); + out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)); + return out; + } + var fastMapToColor = fastLerp; + function lerp$1(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(lerpNumber(leftColor[0], rightColor[0], dv)), + clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)), + clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)) + ], 'rgba'); + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; + } + var mapToColor = lerp$1; + function modifyHSL(color, h, s, l) { + var colorArr = parse(color); + if (color) { + colorArr = rgba2hsla(colorArr); + h != null && (colorArr[0] = clampCssAngle(h)); + s != null && (colorArr[1] = parseCssFloat(s)); + l != null && (colorArr[2] = parseCssFloat(l)); + return stringify(hsla2rgba(colorArr), 'rgba'); + } + } + function modifyAlpha(color, alpha) { + var colorArr = parse(color); + if (colorArr && alpha != null) { + colorArr[3] = clampCssFloat(alpha); + return stringify(colorArr, 'rgba'); + } + } + function stringify(arrColor, type) { + if (!arrColor || !arrColor.length) { + return; + } + var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2]; + if (type === 'rgba' || type === 'hsva' || type === 'hsla') { + colorStr += ',' + arrColor[3]; + } + return type + '(' + colorStr + ')'; + } + function lum(color, backgroundLum) { + var arr = parse(color); + return arr + ? (0.299 * arr[0] + 0.587 * arr[1] + 0.114 * arr[2]) * arr[3] / 255 + + (1 - arr[3]) * backgroundLum + : 0; + } + function random() { + var r = Math.round(Math.random() * 255); + var g = Math.round(Math.random() * 255); + var b = Math.round(Math.random() * 255); + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } + + var color = /*#__PURE__*/Object.freeze({ + __proto__: null, + parse: parse, + lift: lift, + toHex: toHex, + fastLerp: fastLerp, + fastMapToColor: fastMapToColor, + lerp: lerp$1, + mapToColor: mapToColor, + modifyHSL: modifyHSL, + modifyAlpha: modifyAlpha, + stringify: stringify, + lum: lum, + random: random + }); + + var arraySlice = Array.prototype.slice; + function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + function step(p0, p1, percent) { + return percent > 0.5 ? p1 : p0; + } + function interpolate1DArray(out, p0, p1, percent) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber(p0[i], p1[i], percent); + } + } + function interpolate2DArray(out, p0, p1, percent) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent); + } + } + } + function add1DArray(out, p0, p1, sign) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = p0[i] + p1[i] * sign; + } + return out; + } + function add2DArray(out, p0, p1, sign) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = p0[i][j] + p1[i][j] * sign; + } + } + return out; + } + function fillArray(val0, val1, arrDim) { + var arr0 = val0; + var arr1 = val1; + if (!arr0.push || !arr1.push) { + return; + } + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len !== arr1Len) { + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + arr0.length = arr1Len; + } + else { + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i])); + } + } + } + var len2 = arr0[0] && arr0[0].length; + for (var i = 0; i < arr0.length; i++) { + if (arrDim === 1) { + if (isNaN(arr0[i])) { + arr0[i] = arr1[i]; + } + } + else { + for (var j = 0; j < len2; j++) { + if (isNaN(arr0[i][j])) { + arr0[i][j] = arr1[i][j]; + } + } + } + } + } + function is1DArraySame(arr0, arr1) { + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + return true; + } + 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 catmullRomInterpolate1DArray(out, p0, p1, p2, p3, t, t2, t3) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = catmullRomInterpolate(p0[i], p1[i], p2[i], p3[i], t, t2, t3); + } + } + function catmullRomInterpolate2DArray(out, p0, p1, p2, p3, t, t2, t3) { + var len = p0.length; + var len2 = p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[1] = []; + } + 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); + } + } + } + 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 guessArrayDim(value) { + return isArrayLike(value && value[0]) ? 2 : 1; + } + var tmpRgba = [0, 0, 0, 0]; + var Track = (function () { + function Track(propName) { + this.keyframes = []; + this.maxTime = 0; + this.arrDim = 0; + this.interpolable = true; + this._needsSort = false; + this._isAllValueEqual = true; + this._lastFrame = 0; + this._lastFramePercent = 0; + this.propName = propName; + } + Track.prototype.isFinished = function () { + return this._finished; + }; + Track.prototype.setFinished = function () { + this._finished = true; + if (this._additiveTrack) { + this._additiveTrack.setFinished(); + } + }; + Track.prototype.needsAnimate = function () { + return !this._isAllValueEqual && this.keyframes.length >= 2 && this.interpolable; + }; + Track.prototype.getAdditiveTrack = function () { + return this._additiveTrack; + }; + Track.prototype.addKeyframe = function (time, value) { + if (time >= this.maxTime) { + this.maxTime = time; + } + else { + this._needsSort = true; + } + var keyframes = this.keyframes; + var len = keyframes.length; + if (this.interpolable) { + if (isArrayLike(value)) { + var arrayDim = guessArrayDim(value); + if (len > 0 && this.arrDim !== arrayDim) { + this.interpolable = false; + return; + } + if (arrayDim === 1 && typeof value[0] !== 'number' + || arrayDim === 2 && typeof value[0][0] !== 'number') { + this.interpolable = false; + return; + } + if (len > 0) { + var lastFrame = keyframes[len - 1]; + if (this._isAllValueEqual) { + if (arrayDim === 1) { + if (!is1DArraySame(value, lastFrame.value)) { + this._isAllValueEqual = false; + } + } + else { + this._isAllValueEqual = false; + } + } + } + this.arrDim = arrayDim; + } + else { + if (this.arrDim > 0) { + this.interpolable = false; + return; + } + if (typeof value === 'string') { + var colorArray = parse(value); + if (colorArray) { + value = colorArray; + this.isValueColor = true; + } + else { + this.interpolable = false; + } + } + else if (typeof value !== 'number') { + this.interpolable = false; + return; + } + if (this._isAllValueEqual && len > 0) { + var lastFrame = keyframes[len - 1]; + if (this.isValueColor && !is1DArraySame(lastFrame.value, value)) { + this._isAllValueEqual = false; + } + else if (lastFrame.value !== value) { + this._isAllValueEqual = false; + } + } + } + } + var kf = { + time: time, + value: value, + percent: 0 + }; + this.keyframes.push(kf); + return kf; + }; + Track.prototype.prepare = function (additiveTrack) { + var kfs = this.keyframes; + if (this._needsSort) { + kfs.sort(function (a, b) { + return a.time - b.time; + }); + } + var arrDim = this.arrDim; + var kfsLen = kfs.length; + var lastKf = kfs[kfsLen - 1]; + for (var i = 0; i < kfsLen; i++) { + kfs[i].percent = kfs[i].time / this.maxTime; + if (arrDim > 0 && i !== kfsLen - 1) { + fillArray(kfs[i].value, lastKf.value, arrDim); + } + } + if (additiveTrack + && this.needsAnimate() + && additiveTrack.needsAnimate() + && arrDim === additiveTrack.arrDim + && this.isValueColor === additiveTrack.isValueColor + && !additiveTrack._finished) { + this._additiveTrack = additiveTrack; + var startValue = kfs[0].value; + for (var i = 0; i < kfsLen; i++) { + if (arrDim === 0) { + if (this.isValueColor) { + kfs[i].additiveValue + = add1DArray([], kfs[i].value, startValue, -1); + } + else { + kfs[i].additiveValue = kfs[i].value - startValue; + } + } + else if (arrDim === 1) { + kfs[i].additiveValue = add1DArray([], kfs[i].value, startValue, -1); + } + else if (arrDim === 2) { + kfs[i].additiveValue = add2DArray([], kfs[i].value, startValue, -1); + } + } + } + }; + Track.prototype.step = function (target, percent) { + if (this._finished) { + return; + } + if (this._additiveTrack && this._additiveTrack._finished) { + this._additiveTrack = null; + } + var isAdditive = this._additiveTrack != null; + var valueKey = isAdditive ? 'additiveValue' : 'value'; + var keyframes = this.keyframes; + var kfsNum = this.keyframes.length; + var propName = this.propName; + var arrDim = this.arrDim; + var isValueColor = this.isValueColor; + var frameIdx; + if (percent < 0) { + frameIdx = 0; + } + else if (percent < this._lastFramePercent) { + var start = Math.min(this._lastFrame + 1, kfsNum - 1); + for (frameIdx = start; frameIdx >= 0; frameIdx--) { + if (keyframes[frameIdx].percent <= percent) { + break; + } + } + frameIdx = Math.min(frameIdx, kfsNum - 2); + } + else { + for (frameIdx = this._lastFrame; frameIdx < kfsNum; frameIdx++) { + if (keyframes[frameIdx].percent > percent) { + break; + } + } + frameIdx = Math.min(frameIdx - 1, kfsNum - 2); + } + var nextFrame = keyframes[frameIdx + 1]; + var frame = keyframes[frameIdx]; + if (!(frame && nextFrame)) { + return; + } + this._lastFrame = frameIdx; + this._lastFramePercent = percent; + var range = (nextFrame.percent - frame.percent); + if (range === 0) { + return; + } + var w = (percent - frame.percent) / range; + var targetArr = isAdditive ? this._additiveValue + : (isValueColor ? tmpRgba : target[propName]); + if ((arrDim > 0 || isValueColor) && !targetArr) { + targetArr = this._additiveValue = []; + } + if (this.useSpline) { + var p1 = keyframes[frameIdx][valueKey]; + var p0 = keyframes[frameIdx === 0 ? frameIdx : frameIdx - 1][valueKey]; + var p2 = keyframes[frameIdx > kfsNum - 2 ? kfsNum - 1 : frameIdx + 1][valueKey]; + var p3 = keyframes[frameIdx > kfsNum - 3 ? kfsNum - 1 : frameIdx + 2][valueKey]; + if (arrDim > 0) { + arrDim === 1 + ? catmullRomInterpolate1DArray(targetArr, p0, p1, p2, p3, w, w * w, w * w * w) + : catmullRomInterpolate2DArray(targetArr, p0, p1, p2, p3, w, w * w, w * w * w); + } + else if (isValueColor) { + catmullRomInterpolate1DArray(targetArr, p0, p1, p2, p3, w, w * w, w * w * w); + if (!isAdditive) { + target[propName] = rgba2String(targetArr); + } + } + else { + var value = void 0; + if (!this.interpolable) { + value = p2; + } + else { + value = catmullRomInterpolate(p0, p1, p2, p3, w, w * w, w * w * w); + } + if (isAdditive) { + this._additiveValue = value; + } + else { + target[propName] = value; + } + } + } + else { + if (arrDim > 0) { + arrDim === 1 + ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w) + : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + } + else if (isValueColor) { + interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + if (!isAdditive) { + target[propName] = rgba2String(targetArr); + } + } + else { + var value = void 0; + if (!this.interpolable) { + value = step(frame[valueKey], nextFrame[valueKey], w); + } + else { + value = interpolateNumber(frame[valueKey], nextFrame[valueKey], w); + } + if (isAdditive) { + this._additiveValue = value; + } + else { + target[propName] = value; + } + } + } + if (isAdditive) { + this._addToTarget(target); + } + }; + Track.prototype._addToTarget = function (target) { + var arrDim = this.arrDim; + var propName = this.propName; + var additiveValue = this._additiveValue; + if (arrDim === 0) { + if (this.isValueColor) { + parse(target[propName], tmpRgba); + add1DArray(tmpRgba, tmpRgba, additiveValue, 1); + target[propName] = rgba2String(tmpRgba); + } + else { + target[propName] = target[propName] + additiveValue; + } + } + else if (arrDim === 1) { + add1DArray(target[propName], target[propName], additiveValue, 1); + } + else if (arrDim === 2) { + add2DArray(target[propName], target[propName], additiveValue, 1); + } + }; + return Track; + }()); + var Animator = (function () { + function Animator(target, loop, additiveTo) { + this._tracks = {}; + this._trackKeys = []; + this._delay = 0; + this._maxTime = 0; + this._paused = false; + this._started = 0; + this._clip = null; + this._target = target; + this._loop = loop; + if (loop && additiveTo) { + logError('Can\' use additive animation on looped animation.'); + return; + } + this._additiveAnimators = additiveTo; + } + Animator.prototype.getTarget = function () { + return this._target; + }; + Animator.prototype.changeTarget = function (target) { + this._target = target; + }; + Animator.prototype.when = function (time, props) { + return this.whenWithKeys(time, props, keys(props)); + }; + Animator.prototype.whenWithKeys = function (time, props, propNames) { + var tracks = this._tracks; + for (var i = 0; i < propNames.length; i++) { + var propName = propNames[i]; + var track = tracks[propName]; + if (!track) { + track = tracks[propName] = new Track(propName); + var initialValue = void 0; + var additiveTrack = this._getAdditiveTrack(propName); + if (additiveTrack) { + var lastFinalKf = additiveTrack.keyframes[additiveTrack.keyframes.length - 1]; + initialValue = lastFinalKf && lastFinalKf.value; + if (additiveTrack.isValueColor && initialValue) { + initialValue = rgba2String(initialValue); + } + } + else { + initialValue = this._target[propName]; + } + if (initialValue == null) { + continue; + } + if (time !== 0) { + track.addKeyframe(0, cloneValue(initialValue)); + } + this._trackKeys.push(propName); + } + track.addKeyframe(time, cloneValue(props[propName])); + } + this._maxTime = Math.max(this._maxTime, time); + return this; + }; + Animator.prototype.pause = function () { + this._clip.pause(); + this._paused = true; + }; + Animator.prototype.resume = function () { + this._clip.resume(); + this._paused = false; + }; + Animator.prototype.isPaused = function () { + return !!this._paused; + }; + Animator.prototype._doneCallback = function () { + this._setTracksFinished(); + this._clip = null; + var doneList = this._doneList; + if (doneList) { + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + } + }; + Animator.prototype._abortedCallback = function () { + this._setTracksFinished(); + var animation = this.animation; + var abortedList = this._abortedList; + if (animation) { + animation.removeClip(this._clip); + } + this._clip = null; + if (abortedList) { + for (var i = 0; i < abortedList.length; i++) { + abortedList[i].call(this); + } + } + }; + Animator.prototype._setTracksFinished = function () { + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < tracksKeys.length; i++) { + tracks[tracksKeys[i]].setFinished(); + } + }; + Animator.prototype._getAdditiveTrack = function (trackName) { + var additiveTrack; + var additiveAnimators = this._additiveAnimators; + if (additiveAnimators) { + for (var i = 0; i < additiveAnimators.length; i++) { + var track = additiveAnimators[i].getTrack(trackName); + if (track) { + additiveTrack = track; + } + } + } + return additiveTrack; + }; + Animator.prototype.start = function (easing, forceAnimate) { + if (this._started > 0) { + return; + } + this._started = 1; + var self = this; + var tracks = []; + for (var i = 0; i < this._trackKeys.length; i++) { + var propName = this._trackKeys[i]; + var track = this._tracks[propName]; + var additiveTrack = this._getAdditiveTrack(propName); + var kfs = track.keyframes; + track.prepare(additiveTrack); + if (track.needsAnimate()) { + tracks.push(track); + } + else if (!track.interpolable) { + var lastKf = kfs[kfs.length - 1]; + if (lastKf) { + self._target[track.propName] = lastKf.value; + } + } + } + if (tracks.length || forceAnimate) { + var clip = new Clip({ + life: this._maxTime, + loop: this._loop, + delay: this._delay, + onframe: function (percent) { + self._started = 2; + var additiveAnimators = self._additiveAnimators; + if (additiveAnimators) { + var stillHasAdditiveAnimator = false; + for (var i = 0; i < additiveAnimators.length; i++) { + if (additiveAnimators[i]._clip) { + stillHasAdditiveAnimator = true; + break; + } + } + if (!stillHasAdditiveAnimator) { + self._additiveAnimators = null; + } + } + for (var i = 0; i < tracks.length; i++) { + tracks[i].step(self._target, percent); + } + var onframeList = self._onframeList; + if (onframeList) { + for (var i = 0; i < onframeList.length; i++) { + onframeList[i](self._target, percent); + } + } + }, + ondestroy: function () { + self._doneCallback(); + } + }); + this._clip = clip; + if (this.animation) { + this.animation.addClip(clip); + } + if (easing && easing !== 'spline') { + clip.easing = easing; + } + } + else { + this._doneCallback(); + } + return this; + }; + Animator.prototype.stop = function (forwardToLast) { + if (!this._clip) { + return; + } + var clip = this._clip; + if (forwardToLast) { + clip.onframe(1); + } + this._abortedCallback(); + }; + Animator.prototype.delay = function (time) { + this._delay = time; + return this; + }; + Animator.prototype.during = function (cb) { + if (cb) { + if (!this._onframeList) { + this._onframeList = []; + } + this._onframeList.push(cb); + } + return this; + }; + Animator.prototype.done = function (cb) { + if (cb) { + if (!this._doneList) { + this._doneList = []; + } + this._doneList.push(cb); + } + return this; + }; + Animator.prototype.aborted = function (cb) { + if (cb) { + if (!this._abortedList) { + this._abortedList = []; + } + this._abortedList.push(cb); + } + return this; + }; + Animator.prototype.getClip = function () { + return this._clip; + }; + Animator.prototype.getTrack = function (propName) { + return this._tracks[propName]; + }; + Animator.prototype.stopTracks = function (propNames, forwardToLast) { + if (!propNames.length || !this._clip) { + return true; + } + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < propNames.length; i++) { + var track = tracks[propNames[i]]; + if (track) { + if (forwardToLast) { + track.step(this._target, 1); + } + else if (this._started === 1) { + track.step(this._target, 0); + } + track.setFinished(); + } + } + var allAborted = true; + for (var i = 0; i < tracksKeys.length; i++) { + if (!tracks[tracksKeys[i]].isFinished()) { + allAborted = false; + break; + } + } + if (allAborted) { + this._abortedCallback(); + } + return allAborted; + }; + Animator.prototype.saveFinalToTarget = function (target, trackKeys) { + if (!target) { + return; + } + trackKeys = trackKeys || this._trackKeys; + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track || track.isFinished()) { + continue; + } + var kfs = track.keyframes; + var lastKf = kfs[kfs.length - 1]; + if (lastKf) { + var val = cloneValue(lastKf.value); + if (track.isValueColor) { + val = rgba2String(val); + } + target[propName] = val; + } + } + }; + Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) { + trackKeys = trackKeys || keys(finalProps); + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track) { + continue; + } + var kfs = track.keyframes; + if (kfs.length > 1) { + var lastKf = kfs.pop(); + track.addKeyframe(lastKf.time, finalProps[propName]); + track.prepare(track.getAdditiveTrack()); + } + } + }; + return Animator; + }()); + + var Point = (function () { + function Point(x, y) { + this.x = x || 0; + this.y = y || 0; + } + Point.prototype.copy = function (other) { + this.x = other.x; + this.y = other.y; + return this; + }; + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; + Point.prototype.set = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + Point.prototype.equal = function (other) { + return other.x === this.x && other.y === this.y; + }; + Point.prototype.add = function (other) { + this.x += other.x; + this.y += other.y; + return this; + }; + Point.prototype.scale = function (scalar) { + this.x *= scalar; + this.y *= scalar; + }; + Point.prototype.scaleAndAdd = function (other, scalar) { + this.x += other.x * scalar; + this.y += other.y * scalar; + }; + Point.prototype.sub = function (other) { + this.x -= other.x; + this.y -= other.y; + return this; + }; + Point.prototype.dot = function (other) { + return this.x * other.x + this.y * other.y; + }; + Point.prototype.len = function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }; + Point.prototype.lenSquare = function () { + return this.x * this.x + this.y * this.y; + }; + Point.prototype.normalize = function () { + var len = this.len(); + this.x /= len; + this.y /= len; + return this; + }; + Point.prototype.distance = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return Math.sqrt(dx * dx + dy * dy); + }; + Point.prototype.distanceSquare = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return dx * dx + dy * dy; + }; + Point.prototype.negate = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Point.prototype.transform = function (m) { + if (!m) { + return; + } + var x = this.x; + var y = this.y; + this.x = m[0] * x + m[2] * y + m[4]; + this.y = m[1] * x + m[3] * y + m[5]; + return this; + }; + Point.prototype.toArray = function (out) { + out[0] = this.x; + out[1] = this.y; + return out; + }; + Point.prototype.fromArray = function (input) { + this.x = input[0]; + this.y = input[1]; + }; + Point.set = function (p, x, y) { + p.x = x; + p.y = y; + }; + Point.copy = function (p, p2) { + p.x = p2.x; + p.y = p2.y; + }; + Point.len = function (p) { + return Math.sqrt(p.x * p.x + p.y * p.y); + }; + Point.lenSquare = function (p) { + return p.x * p.x + p.y * p.y; + }; + Point.dot = function (p0, p1) { + return p0.x * p1.x + p0.y * p1.y; + }; + Point.add = function (out, p0, p1) { + out.x = p0.x + p1.x; + out.y = p0.y + p1.y; + }; + Point.sub = function (out, p0, p1) { + out.x = p0.x - p1.x; + out.y = p0.y - p1.y; + }; + Point.scale = function (out, p0, scalar) { + out.x = p0.x * scalar; + out.y = p0.y * scalar; + }; + Point.scaleAndAdd = function (out, p0, p1, scalar) { + out.x = p0.x + p1.x * scalar; + out.y = p0.y + p1.y * scalar; + }; + Point.lerp = function (out, p0, p1, t) { + var onet = 1 - t; + out.x = onet * p0.x + t * p1.x; + out.y = onet * p0.y + t * p1.y; + }; + return Point; + }()); + + var mathMin = Math.min; + var mathMax = Math.max; + var lt = new Point(); + var rb = new Point(); + var lb = new Point(); + var rt = new Point(); + var minTv = new Point(); + var maxTv = new Point(); + var BoundingRect = (function () { + function BoundingRect(x, y, width, height) { + if (width < 0 && isFinite(width)) { + x = x + width; + width = -width; + } + if (height < 0 && isFinite(height)) { + y = y + height; + height = -height; + } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + BoundingRect.prototype.union = function (other) { + var x = mathMin(other.x, this.x); + var y = mathMin(other.y, this.y); + if (isFinite(this.x) && isFinite(this.width)) { + this.width = mathMax(other.x + other.width, this.x + this.width) - x; + } + else { + this.width = other.width; + } + if (isFinite(this.y) && isFinite(this.height)) { + this.height = mathMax(other.y + other.height, this.y + this.height) - y; + } + else { + this.height = other.height; + } + this.x = x; + this.y = y; + }; + BoundingRect.prototype.applyTransform = function (m) { + BoundingRect.applyTransform(this, this, m); + }; + BoundingRect.prototype.calculateTransform = function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + var m = create$1(); + translate(m, m, [-a.x, -a.y]); + scale$1(m, m, [sx, sy]); + translate(m, m, [b.x, b.y]); + return m; + }; + BoundingRect.prototype.intersect = function (b, mtv) { + if (!b) { + return false; + } + if (!(b instanceof BoundingRect)) { + b = BoundingRect.create(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; + var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + if (mtv) { + var dMin = Infinity; + var dMax = 0; + var d0 = Math.abs(ax1 - bx0); + var d1 = Math.abs(bx1 - ax0); + var d2 = Math.abs(ay1 - by0); + var d3 = Math.abs(by1 - ay0); + var dx = Math.min(d0, d1); + var dy = Math.min(d2, d3); + if (ax1 < bx0 || bx1 < ax0) { + if (dx > dMax) { + dMax = dx; + if (d0 < d1) { + Point.set(maxTv, -d0, 0); + } + else { + Point.set(maxTv, d1, 0); + } + } + } + else { + if (dx < dMin) { + dMin = dx; + if (d0 < d1) { + Point.set(minTv, d0, 0); + } + else { + Point.set(minTv, -d1, 0); + } + } + } + if (ay1 < by0 || by1 < ay0) { + if (dy > dMax) { + dMax = dy; + if (d2 < d3) { + Point.set(maxTv, 0, -d2); + } + else { + Point.set(maxTv, 0, d3); + } + } + } + else { + if (dx < dMin) { + dMin = dx; + if (d2 < d3) { + Point.set(minTv, 0, d2); + } + else { + Point.set(minTv, 0, -d3); + } + } + } + } + if (mtv) { + Point.copy(mtv, overlap ? minTv : maxTv); + } + return overlap; + }; + BoundingRect.prototype.contain = function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }; + BoundingRect.prototype.clone = function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }; + BoundingRect.prototype.copy = function (other) { + BoundingRect.copy(this, other); + }; + BoundingRect.prototype.plain = function () { + return { + x: this.x, + y: this.y, + width: this.width, + height: this.height + }; + }; + BoundingRect.prototype.isFinite = function () { + return isFinite(this.x) + && isFinite(this.y) + && isFinite(this.width) + && isFinite(this.height); + }; + BoundingRect.prototype.isZero = function () { + return this.width === 0 || this.height === 0; + }; + BoundingRect.create = function (rect) { + return new BoundingRect(rect.x, rect.y, rect.width, rect.height); + }; + BoundingRect.copy = function (target, source) { + target.x = source.x; + target.y = source.y; + target.width = source.width; + target.height = source.height; + }; + BoundingRect.applyTransform = function (target, source, m) { + if (!m) { + if (target !== source) { + BoundingRect.copy(target, source); + } + return; + } + if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) { + var sx = m[0]; + var sy = m[3]; + var tx = m[4]; + var ty = m[5]; + target.x = source.x * sx + tx; + target.y = source.y * sy + ty; + target.width = source.width * sx; + target.height = source.height * sy; + if (target.width < 0) { + target.x += target.width; + target.width = -target.width; + } + if (target.height < 0) { + target.y += target.height; + target.height = -target.height; + } + return; + } + lt.x = lb.x = source.x; + lt.y = rt.y = source.y; + rb.x = rt.x = source.x + source.width; + rb.y = lb.y = source.y + source.height; + lt.transform(m); + rt.transform(m); + rb.transform(m); + lb.transform(m); + target.x = mathMin(lt.x, rb.x, lb.x, rt.x); + target.y = mathMin(lt.y, rb.y, lb.y, rt.y); + var maxX = mathMax(lt.x, rb.x, lb.x, rt.x); + var maxY = mathMax(lt.y, rb.y, lb.y, rt.y); + target.width = maxX - target.x; + target.height = maxY - target.y; + }; + return BoundingRect; + }()); + + var textWidthCache = {}; + var DEFAULT_FONT = '12px sans-serif'; + var _ctx; + var _cachedFont; + function defaultMeasureText(text, font) { + if (!_ctx) { + _ctx = createCanvas().getContext('2d'); + } + if (_cachedFont !== font) { + _cachedFont = _ctx.font = font || DEFAULT_FONT; + } + return _ctx.measureText(text); + } + var methods$1 = { + measureText: defaultMeasureText + }; + function getWidth(text, font) { + font = font || DEFAULT_FONT; + var cacheOfFont = textWidthCache[font]; + if (!cacheOfFont) { + cacheOfFont = textWidthCache[font] = new LRU(500); + } + var width = cacheOfFont.get(text); + if (width == null) { + width = methods$1.measureText(text, font).width; + cacheOfFont.put(text, width); + } + return width; + } + function innerGetBoundingRect(text, font, textAlign, textBaseline) { + var width = getWidth(text, font); + var height = getLineHeight(font); + var x = adjustTextX(0, width, textAlign); + var y = adjustTextY(0, height, textBaseline); + var rect = new BoundingRect(x, y, width, height); + return rect; + } + function getBoundingRect(text, font, textAlign, textBaseline) { + var textLines = ((text || '') + '').split('\n'); + var len = textLines.length; + if (len === 1) { + return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline); + } + else { + var uniondRect = new BoundingRect(0, 0, 0, 0); + for (var i = 0; i < textLines.length; i++) { + var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline); + i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect); + } + return uniondRect; + } + } + function adjustTextX(x, width, textAlign) { + if (textAlign === 'right') { + x -= width; + } + else if (textAlign === 'center') { + x -= width / 2; + } + return x; + } + function adjustTextY(y, height, verticalAlign) { + if (verticalAlign === 'middle') { + y -= height / 2; + } + else if (verticalAlign === 'bottom') { + y -= height; + } + return y; + } + function getLineHeight(font) { + return getWidth('国', font); + } + function parsePercent(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + } + function calculateTextPosition(out, opts, rect) { + var textPosition = opts.position || 'inside'; + var distance = opts.distance != null ? opts.distance : 5; + var height = rect.height; + var width = rect.width; + var halfHeight = height / 2; + var x = rect.x; + var y = rect.y; + var textAlign = 'left'; + var textVerticalAlign = 'top'; + if (textPosition instanceof Array) { + x += parsePercent(textPosition[0], rect.width); + y += parsePercent(textPosition[1], rect.height); + textAlign = null; + textVerticalAlign = null; + } + else { + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'top': + x += width / 2; + y -= distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - distance; + textVerticalAlign = 'bottom'; + break; + case 'insideBottomRight': + x += width - distance; + y += height - distance; + textAlign = 'right'; + textVerticalAlign = 'bottom'; + break; + } + } + out = out || {}; + out.x = x; + out.y = y; + out.align = textAlign; + out.verticalAlign = textVerticalAlign; + return out; + } + + var dpr = 1; + if (typeof window !== 'undefined') { + dpr = Math.max(window.devicePixelRatio + || (window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI) + || 1, 1); + } + var devicePixelRatio = dpr; + var DARK_MODE_THRESHOLD = 0.4; + var DARK_LABEL_COLOR = '#333'; + var LIGHT_LABEL_COLOR = '#ccc'; + var LIGHTER_LABEL_COLOR = '#eee'; + + var PRESERVED_NORMAL_STATE = '__zr_normal__'; + var PRIMARY_STATES_KEYS = ['x', 'y', 'scaleX', 'scaleY', 'originX', 'originY', 'rotation', 'ignore']; + var DEFAULT_ANIMATABLE_MAP = { + x: true, + y: true, + scaleX: true, + scaleY: true, + originX: true, + originY: true, + rotation: true, + ignore: false + }; + var tmpTextPosCalcRes = {}; + var tmpBoundingRect = new BoundingRect(0, 0, 0, 0); + var Element = (function () { + function Element(props) { + this.id = guid(); + this.animators = []; + this.currentStates = []; + this.states = {}; + this._init(props); + } + Element.prototype._init = function (props) { + this.attr(props); + }; + Element.prototype.drift = function (dx, dy, e) { + 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.markRedraw(); + }; + Element.prototype.beforeUpdate = function () { }; + Element.prototype.afterUpdate = function () { }; + Element.prototype.update = function () { + this.updateTransform(); + if (this.__dirty) { + this.updateInnerText(); + } + }; + Element.prototype.updateInnerText = function (forceUpdate) { + var textEl = this._textContent; + if (textEl && (!textEl.ignore || forceUpdate)) { + if (!this.textConfig) { + this.textConfig = {}; + } + var textConfig = this.textConfig; + var isLocal = textConfig.local; + var attachedTransform = textEl.attachedTransform; + var textAlign = void 0; + var textVerticalAlign = void 0; + var textStyleChanged = false; + if (isLocal) { + attachedTransform.parent = this; + } + else { + attachedTransform.parent = null; + } + var innerOrigin = false; + attachedTransform.x = textEl.x; + attachedTransform.y = textEl.y; + attachedTransform.originX = textEl.originX; + attachedTransform.originY = textEl.originY; + attachedTransform.rotation = textEl.rotation; + attachedTransform.scaleX = textEl.scaleX; + attachedTransform.scaleY = textEl.scaleY; + if (textConfig.position != null) { + var layoutRect = tmpBoundingRect; + if (textConfig.layoutRect) { + layoutRect.copy(textConfig.layoutRect); + } + else { + layoutRect.copy(this.getBoundingRect()); + } + if (!isLocal) { + layoutRect.applyTransform(this.transform); + } + if (this.calculateTextPosition) { + this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } + else { + calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } + attachedTransform.x = tmpTextPosCalcRes.x; + attachedTransform.y = tmpTextPosCalcRes.y; + textAlign = tmpTextPosCalcRes.align; + textVerticalAlign = tmpTextPosCalcRes.verticalAlign; + var textOrigin = textConfig.origin; + if (textOrigin && textConfig.rotation != null) { + var relOriginX = void 0; + var relOriginY = void 0; + if (textOrigin === 'center') { + relOriginX = layoutRect.width * 0.5; + relOriginY = layoutRect.height * 0.5; + } + else { + relOriginX = parsePercent(textOrigin[0], layoutRect.width); + relOriginY = parsePercent(textOrigin[1], layoutRect.height); + } + innerOrigin = true; + attachedTransform.originX = -attachedTransform.x + relOriginX + (isLocal ? 0 : layoutRect.x); + attachedTransform.originY = -attachedTransform.y + relOriginY + (isLocal ? 0 : layoutRect.y); + } + } + if (textConfig.rotation != null) { + attachedTransform.rotation = textConfig.rotation; + } + var textOffset = textConfig.offset; + if (textOffset) { + attachedTransform.x += textOffset[0]; + attachedTransform.y += textOffset[1]; + if (!innerOrigin) { + attachedTransform.originX = -textOffset[0]; + attachedTransform.originY = -textOffset[1]; + } + } + var isInside = textConfig.inside == null + ? (typeof textConfig.position === 'string' && textConfig.position.indexOf('inside') >= 0) + : textConfig.inside; + var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {}); + var textFill = void 0; + var textStroke = void 0; + var autoStroke = void 0; + if (isInside && this.canBeInsideText()) { + textFill = textConfig.insideFill; + textStroke = textConfig.insideStroke; + if (textFill == null || textFill === 'auto') { + textFill = this.getInsideTextFill(); + } + if (textStroke == null || textStroke === 'auto') { + textStroke = this.getInsideTextStroke(textFill); + autoStroke = true; + } + } + else { + textFill = textConfig.outsideFill; + textStroke = textConfig.outsideStroke; + if (textFill == null || textFill === 'auto') { + textFill = this.getOutsideFill(); + } + if (textStroke == null || textStroke === 'auto') { + textStroke = this.getOutsideStroke(textFill); + autoStroke = true; + } + } + textFill = textFill || '#000'; + if (textFill !== innerTextDefaultStyle.fill + || textStroke !== innerTextDefaultStyle.stroke + || autoStroke !== innerTextDefaultStyle.autoStroke + || textAlign !== innerTextDefaultStyle.align + || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) { + textStyleChanged = true; + innerTextDefaultStyle.fill = textFill; + innerTextDefaultStyle.stroke = textStroke; + innerTextDefaultStyle.autoStroke = autoStroke; + innerTextDefaultStyle.align = textAlign; + innerTextDefaultStyle.verticalAlign = textVerticalAlign; + textEl.setDefaultTextStyle(innerTextDefaultStyle); + } + if (textStyleChanged) { + textEl.dirtyStyle(); + } + textEl.markRedraw(); + } + }; + Element.prototype.canBeInsideText = function () { + return true; + }; + Element.prototype.getInsideTextFill = function () { + return '#fff'; + }; + Element.prototype.getInsideTextStroke = function (textFill) { + return '#000'; + }; + Element.prototype.getOutsideFill = function () { + return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR; + }; + Element.prototype.getOutsideStroke = function (textFill) { + var backgroundColor = this.__zr && this.__zr.getBackgroundColor(); + var colorArr = typeof backgroundColor === 'string' && parse(backgroundColor); + if (!colorArr) { + colorArr = [255, 255, 255, 1]; + } + var alpha = colorArr[3]; + var isDark = this.__zr.isDarkMode(); + for (var i = 0; i < 3; i++) { + colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha); + } + colorArr[3] = 1; + return stringify(colorArr, 'rgba'); + }; + Element.prototype.traverse = function (cb, context) { }; + Element.prototype.attrKV = function (key, value) { + if (key === 'textConfig') { + this.setTextConfig(value); + } + else if (key === 'textContent') { + this.setTextContent(value); + } + else if (key === 'clipPath') { + this.setClipPath(value); + } + else if (key === 'extra') { + this.extra = this.extra || {}; + extend(this.extra, value); + } + else { + this[key] = value; + } + }; + Element.prototype.hide = function () { + this.ignore = true; + this.markRedraw(); + }; + Element.prototype.show = function () { + this.ignore = false; + this.markRedraw(); + }; + Element.prototype.attr = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.attrKV(keyOrObj, value); + } + else if (isObject(keyOrObj)) { + var obj = keyOrObj; + var keysArr = keys(obj); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + this.attrKV(key, keyOrObj[key]); + } + } + this.markRedraw(); + return this; + }; + Element.prototype.saveCurrentToNormalState = function (toState) { + this._innerSaveToNormal(toState); + var normalState = this._normalState; + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var fromStateTransition = animator.__fromStateTransition; + if (fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) { + continue; + } + var targetName = animator.targetName; + var target = targetName + ? normalState[targetName] : normalState; + animator.saveFinalToTarget(target); + } + }; + Element.prototype._innerSaveToNormal = function (toState) { + var normalState = this._normalState; + if (!normalState) { + normalState = this._normalState = {}; + } + if (toState.textConfig && !normalState.textConfig) { + normalState.textConfig = this.textConfig; + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS); + }; + Element.prototype._savePrimaryToNormal = function (toState, normalState, primaryKeys) { + for (var i = 0; i < primaryKeys.length; i++) { + var key = primaryKeys[i]; + if (toState[key] != null && !(key in normalState)) { + normalState[key] = this[key]; + } + } + }; + Element.prototype.hasState = function () { + return this.currentStates.length > 0; + }; + Element.prototype.getState = function (name) { + return this.states[name]; + }; + Element.prototype.ensureState = function (name) { + var states = this.states; + if (!states[name]) { + states[name] = {}; + } + return states[name]; + }; + Element.prototype.clearStates = function (noAnimation) { + this.useState(PRESERVED_NORMAL_STATE, false, noAnimation); + }; + Element.prototype.useState = function (stateName, keepCurrentStates, noAnimation) { + var toNormalState = stateName === PRESERVED_NORMAL_STATE; + var hasStates = this.hasState(); + if (!hasStates && toNormalState) { + return; + } + var currentStates = this.currentStates; + var animationCfg = this.stateTransition; + if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) { + return; + } + var state; + if (this.stateProxy && !toNormalState) { + state = this.stateProxy(stateName); + } + if (!state) { + state = (this.states && this.states[stateName]); + } + if (!state && !toNormalState) { + logError("State " + stateName + " not exists."); + return; + } + if (!toNormalState) { + this.saveCurrentToNormalState(state); + } + var useHoverLayer = !!(state && state.hoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + if (this._textContent) { + this._textContent.useState(stateName, keepCurrentStates); + } + if (this._textGuide) { + this._textGuide.useState(stateName, keepCurrentStates); + } + if (toNormalState) { + this.currentStates = []; + this._normalState = {}; + } + else { + if (!keepCurrentStates) { + this.currentStates = [stateName]; + } + else { + this.currentStates.push(stateName); + } + } + this._updateAnimationTargets(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= ~Element.REDARAW_BIT; + } + return state; + }; + Element.prototype.useStates = function (states, noAnimation) { + if (!states.length) { + this.clearStates(); + } + else { + var stateObjects = []; + var currentStates = this.currentStates; + var len = states.length; + var notChange = len === currentStates.length; + if (notChange) { + for (var i = 0; i < len; i++) { + if (states[i] !== currentStates[i]) { + notChange = false; + break; + } + } + } + if (notChange) { + return; + } + for (var i = 0; i < len; i++) { + var stateName = states[i]; + var stateObj = void 0; + if (this.stateProxy) { + stateObj = this.stateProxy(stateName, states); + } + if (!stateObj) { + stateObj = this.states[stateName]; + } + if (stateObj) { + stateObjects.push(stateObj); + } + } + var useHoverLayer = !!(stateObjects[len - 1] && stateObjects[len - 1].hoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + var mergedState = this._mergeStates(stateObjects); + var animationCfg = this.stateTransition; + this.saveCurrentToNormalState(mergedState); + this._applyStateObj(states.join(','), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + if (this._textContent) { + this._textContent.useStates(states); + } + if (this._textGuide) { + this._textGuide.useStates(states); + } + this._updateAnimationTargets(); + this.currentStates = states.slice(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= ~Element.REDARAW_BIT; + } + } + }; + Element.prototype._updateAnimationTargets = function () { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + if (animator.targetName) { + animator.changeTarget(this[animator.targetName]); + } + } + }; + Element.prototype.removeState = function (state) { + var idx = indexOf(this.currentStates, state); + if (idx >= 0) { + var currentStates = this.currentStates.slice(); + currentStates.splice(idx, 1); + this.useStates(currentStates); + } + }; + Element.prototype.replaceState = function (oldState, newState, forceAdd) { + var currentStates = this.currentStates.slice(); + var idx = indexOf(currentStates, oldState); + var newStateExists = indexOf(currentStates, newState) >= 0; + if (idx >= 0) { + if (!newStateExists) { + currentStates[idx] = newState; + } + else { + currentStates.splice(idx, 1); + } + } + else if (forceAdd && !newStateExists) { + currentStates.push(newState); + } + this.useStates(currentStates); + }; + Element.prototype.toggleState = function (state, enable) { + if (enable) { + this.useState(state, true); + } + else { + this.removeState(state); + } + }; + Element.prototype._mergeStates = function (states) { + var mergedState = {}; + var mergedTextConfig; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + extend(mergedState, state); + if (state.textConfig) { + mergedTextConfig = mergedTextConfig || {}; + extend(mergedTextConfig, state.textConfig); + } + } + if (mergedTextConfig) { + mergedState.textConfig = mergedTextConfig; + } + return mergedState; + }; + Element.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + var needsRestoreToNormal = !(state && keepCurrentStates); + if (state && state.textConfig) { + this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig); + extend(this.textConfig, state.textConfig); + } + else if (needsRestoreToNormal) { + if (normalState.textConfig) { + this.textConfig = normalState.textConfig; + } + } + var transitionTarget = {}; + var hasTransition = false; + for (var i = 0; i < PRIMARY_STATES_KEYS.length; i++) { + var key = PRIMARY_STATES_KEYS[i]; + var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key]; + if (state && state[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = state[key]; + } + else { + this[key] = state[key]; + } + } + else if (needsRestoreToNormal) { + if (normalState[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = normalState[key]; + } + else { + this[key] = normalState[key]; + } + } + } + } + if (!transition) { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var targetName = animator.targetName; + animator.__changeFinalValue(targetName + ? (state || normalState)[targetName] + : (state || normalState)); + } + } + if (hasTransition) { + this._transitionState(stateName, transitionTarget, animationCfg); + } + }; + Element.prototype._attachComponent = function (componentEl) { + if (componentEl.__zr && !componentEl.__hostTarget) { + throw new Error('Text element has been added to zrender.'); + } + if (componentEl === this) { + throw new Error('Recursive component attachment.'); + } + var zr = this.__zr; + if (zr) { + componentEl.addSelfToZr(zr); + } + componentEl.__zr = zr; + componentEl.__hostTarget = this; + }; + Element.prototype._detachComponent = function (componentEl) { + if (componentEl.__zr) { + componentEl.removeSelfFromZr(componentEl.__zr); + } + componentEl.__zr = null; + componentEl.__hostTarget = null; + }; + Element.prototype.getClipPath = function () { + return this._clipPath; + }; + Element.prototype.setClipPath = function (clipPath) { + if (this._clipPath && this._clipPath !== clipPath) { + this.removeClipPath(); + } + this._attachComponent(clipPath); + this._clipPath = clipPath; + this.markRedraw(); + }; + Element.prototype.removeClipPath = function () { + var clipPath = this._clipPath; + if (clipPath) { + this._detachComponent(clipPath); + this._clipPath = null; + this.markRedraw(); + } + }; + Element.prototype.getTextContent = function () { + return this._textContent; + }; + Element.prototype.setTextContent = function (textEl) { + var previousTextContent = this._textContent; + if (previousTextContent === textEl) { + return; + } + if (previousTextContent && previousTextContent !== textEl) { + this.removeTextContent(); + } + if (textEl.__zr && !textEl.__hostTarget) { + throw new Error('Text element has been added to zrender.'); + } + textEl.attachedTransform = new Transformable(); + this._attachComponent(textEl); + this._textContent = textEl; + this.markRedraw(); + }; + Element.prototype.setTextConfig = function (cfg) { + if (!this.textConfig) { + this.textConfig = {}; + } + extend(this.textConfig, cfg); + this.markRedraw(); + }; + Element.prototype.removeTextContent = function () { + var textEl = this._textContent; + if (textEl) { + textEl.attachedTransform = null; + this._detachComponent(textEl); + this._textContent = null; + this._innerTextDefaultStyle = null; + this.markRedraw(); + } + }; + Element.prototype.getTextGuideLine = function () { + return this._textGuide; + }; + Element.prototype.setTextGuideLine = function (guideLine) { + if (this._textGuide && this._textGuide !== guideLine) { + this.removeTextGuideLine(); + } + this._attachComponent(guideLine); + this._textGuide = guideLine; + this.markRedraw(); + }; + Element.prototype.removeTextGuideLine = function () { + var textGuide = this._textGuide; + if (textGuide) { + this._detachComponent(textGuide); + this._textGuide = null; + this.markRedraw(); + } + }; + Element.prototype.markRedraw = function () { + this.__dirty |= Element.REDARAW_BIT; + var zr = this.__zr; + if (zr) { + if (this.__inHover) { + zr.refreshHover(); + } + else { + zr.refresh(); + } + } + if (this.__hostTarget) { + this.__hostTarget.markRedraw(); + } + }; + Element.prototype.dirty = function () { + this.markRedraw(); + }; + Element.prototype._toggleHoverLayerFlag = function (inHover) { + this.__inHover = inHover; + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.__inHover = inHover; + } + if (textGuide) { + textGuide.__inHover = inHover; + } + }; + Element.prototype.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); + } + if (this._textContent) { + this._textContent.addSelfToZr(zr); + } + if (this._textGuide) { + this._textGuide.addSelfToZr(zr); + } + }; + Element.prototype.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); + } + if (this._textContent) { + this._textContent.removeSelfFromZr(zr); + } + if (this._textGuide) { + this._textGuide.removeSelfFromZr(zr); + } + }; + Element.prototype.animate = function (key, loop) { + var target = key ? this[key] : this; + if (!target) { + logError('Property "' + + key + + '" is not existed in element ' + + this.id); + return; + } + var animator = new Animator(target, loop); + this.addAnimator(animator, key); + return animator; + }; + Element.prototype.addAnimator = function (animator, key) { + var zr = this.__zr; + var el = this; + animator.during(function () { + el.updateDuringAnimation(key); + }).done(function () { + var animators = el.animators; + var idx = indexOf(animators, animator); + if (idx >= 0) { + animators.splice(idx, 1); + } + }); + this.animators.push(animator); + if (zr) { + zr.animation.addAnimator(animator); + } + zr && zr.wakeUp(); + }; + Element.prototype.updateDuringAnimation = function (key) { + this.markRedraw(); + }; + Element.prototype.stopAnimation = function (scope, forwardToLast) { + var animators = this.animators; + var len = animators.length; + var leftAnimators = []; + for (var i = 0; i < len; i++) { + var animator = animators[i]; + if (!scope || scope === animator.scope) { + animator.stop(forwardToLast); + } + else { + leftAnimators.push(animator); + } + } + this.animators = leftAnimators; + return this; + }; + Element.prototype.animateTo = function (target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps); + }; + Element.prototype.animateFrom = function (target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps, true); + }; + Element.prototype._transitionState = function (stateName, target, cfg, animationProps) { + var animators = animateTo(this, target, cfg, animationProps); + for (var i = 0; i < animators.length; i++) { + animators[i].__fromStateTransition = stateName; + } + }; + Element.prototype.getBoundingRect = function () { + return null; + }; + Element.prototype.getPaintRect = function () { + return null; + }; + Element.REDARAW_BIT = 1; + Element.initDefaultProps = (function () { + var elProto = Element.prototype; + elProto.type = 'element'; + elProto.name = ''; + elProto.ignore = false; + elProto.silent = false; + elProto.isGroup = false; + elProto.draggable = false; + elProto.dragging = false; + elProto.ignoreClip = false; + elProto.__inHover = false; + elProto.__dirty = Element.REDARAW_BIT; + var logs = {}; + function logDeprecatedError(key, xKey, yKey) { + if (!logs[key + xKey + yKey]) { + console.warn("DEPRECATED: '" + key + "' has been deprecated. use '" + xKey + "', '" + yKey + "' instead"); + logs[key + xKey + yKey] = true; + } + } + function createLegacyProperty(key, privateKey, xKey, yKey) { + Object.defineProperty(elProto, key, { + get: function () { + logDeprecatedError(key, xKey, yKey); + if (!this[privateKey]) { + var pos = this[privateKey] = []; + enhanceArray(this, pos); + } + return this[privateKey]; + }, + set: function (pos) { + logDeprecatedError(key, xKey, yKey); + this[xKey] = pos[0]; + this[yKey] = pos[1]; + this[privateKey] = pos; + enhanceArray(this, pos); + } + }); + function enhanceArray(self, pos) { + Object.defineProperty(pos, 0, { + get: function () { + return self[xKey]; + }, + set: function (val) { + self[xKey] = val; + } + }); + Object.defineProperty(pos, 1, { + get: function () { + return self[yKey]; + }, + set: function (val) { + self[yKey] = val; + } + }); + } + } + if (Object.defineProperty && (!env.browser.ie || env.browser.version > 8)) { + createLegacyProperty('position', '_legacyPos', 'x', 'y'); + createLegacyProperty('scale', '_legacyScale', 'scaleX', 'scaleY'); + createLegacyProperty('origin', '_legacyOrigin', 'originX', 'originY'); + } + })(); + return Element; + }()); + mixin(Element, Eventful); + mixin(Element, Transformable); + function animateTo(animatable, target, cfg, animationProps, reverse) { + cfg = cfg || {}; + var animators = []; + animateToShallow(animatable, '', animatable, target, cfg, animationProps, animators, reverse); + var finishCount = animators.length; + var doneHappened = false; + var cfgDone = cfg.done; + var cfgAborted = cfg.aborted; + var doneCb = function () { + doneHappened = true; + finishCount--; + if (finishCount <= 0) { + doneHappened + ? (cfgDone && cfgDone()) + : (cfgAborted && cfgAborted()); + } + }; + var abortedCb = function () { + finishCount--; + if (finishCount <= 0) { + doneHappened + ? (cfgDone && cfgDone()) + : (cfgAborted && cfgAborted()); + } + }; + if (!finishCount) { + cfgDone && cfgDone(); + } + if (animators.length > 0 && cfg.during) { + animators[0].during(function (target, percent) { + cfg.during(percent); + }); + } + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; + if (doneCb) { + animator.done(doneCb); + } + if (abortedCb) { + animator.aborted(abortedCb); + } + animator.start(cfg.easing, cfg.force); + } + return animators; + } + function copyArrShallow(source, target, len) { + for (var i = 0; i < len; i++) { + source[i] = target[i]; + } + } + function is2DArray(value) { + return isArrayLike(value[0]); + } + function copyValue(target, source, key) { + if (isArrayLike(source[key])) { + if (!isArrayLike(target[key])) { + target[key] = []; + } + if (isTypedArray(source[key])) { + var len = source[key].length; + if (target[key].length !== len) { + target[key] = new (source[key].constructor)(len); + copyArrShallow(target[key], source[key], len); + } + } + else { + var sourceArr = source[key]; + var targetArr = target[key]; + var len0 = sourceArr.length; + if (is2DArray(sourceArr)) { + var len1 = sourceArr[0].length; + for (var i = 0; i < len0; i++) { + if (!targetArr[i]) { + targetArr[i] = Array.prototype.slice.call(sourceArr[i]); + } + else { + copyArrShallow(targetArr[i], sourceArr[i], len1); + } + } + } + else { + copyArrShallow(targetArr, sourceArr, len0); + } + targetArr.length = sourceArr.length; + } + } + else { + target[key] = source[key]; + } + } + function animateToShallow(animatable, topKey, source, target, cfg, animationProps, animators, reverse) { + var animatableKeys = []; + var changedKeys = []; + var targetKeys = keys(target); + var duration = cfg.duration; + var delay = cfg.delay; + var additive = cfg.additive; + var setToFinal = cfg.setToFinal; + var animateAll = !isObject(animationProps); + for (var k = 0; k < targetKeys.length; k++) { + var innerKey = targetKeys[k]; + if (source[innerKey] != null + && target[innerKey] != null + && (animateAll || animationProps[innerKey])) { + if (isObject(target[innerKey]) && !isArrayLike(target[innerKey])) { + if (topKey) { + if (!reverse) { + source[innerKey] = target[innerKey]; + animatable.updateDuringAnimation(topKey); + } + continue; + } + animateToShallow(animatable, innerKey, source[innerKey], target[innerKey], cfg, animationProps && animationProps[innerKey], animators, reverse); + } + else { + animatableKeys.push(innerKey); + changedKeys.push(innerKey); + } + } + else if (!reverse) { + source[innerKey] = target[innerKey]; + animatable.updateDuringAnimation(topKey); + changedKeys.push(innerKey); + } + } + var keyLen = animatableKeys.length; + if (keyLen > 0 + || (cfg.force && !animators.length)) { + var existsAnimators = animatable.animators; + var existsAnimatorsOnSameTarget = []; + for (var i = 0; i < existsAnimators.length; i++) { + if (existsAnimators[i].targetName === topKey) { + existsAnimatorsOnSameTarget.push(existsAnimators[i]); + } + } + if (!additive && existsAnimatorsOnSameTarget.length) { + for (var i = 0; i < existsAnimatorsOnSameTarget.length; i++) { + var allAborted = existsAnimatorsOnSameTarget[i].stopTracks(changedKeys); + if (allAborted) { + var idx = indexOf(existsAnimators, existsAnimatorsOnSameTarget[i]); + existsAnimators.splice(idx, 1); + } + } + } + var revertedSource = void 0; + var reversedTarget = void 0; + var sourceClone = void 0; + if (reverse) { + reversedTarget = {}; + if (setToFinal) { + revertedSource = {}; + } + for (var i = 0; i < keyLen; i++) { + var innerKey = animatableKeys[i]; + reversedTarget[innerKey] = source[innerKey]; + if (setToFinal) { + revertedSource[innerKey] = target[innerKey]; + } + else { + source[innerKey] = target[innerKey]; + } + } + } + else if (setToFinal) { + sourceClone = {}; + for (var i = 0; i < keyLen; i++) { + var innerKey = animatableKeys[i]; + sourceClone[innerKey] = cloneValue(source[innerKey]); + copyValue(source, target, innerKey); + } + } + var animator = new Animator(source, false, additive ? existsAnimatorsOnSameTarget : null); + animator.targetName = topKey; + if (cfg.scope) { + animator.scope = cfg.scope; + } + if (setToFinal && revertedSource) { + animator.whenWithKeys(0, revertedSource, animatableKeys); + } + if (sourceClone) { + animator.whenWithKeys(0, sourceClone, animatableKeys); + } + animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animatableKeys).delay(delay || 0); + animatable.addAnimator(animator, topKey); + animators.push(animator); + } + } + + var DEFAULT_MIN_MERGE = 32; + var DEFAULT_MIN_GALLOPING = 7; + function minRunLength(n) { + var r = 0; + while (n >= DEFAULT_MIN_MERGE) { + r |= n & 1; + n >>= 1; + } + return n + r; + } + function makeAscendingRun(array, lo, hi, compare) { + var runHi = lo + 1; + if (runHi === hi) { + return 1; + } + if (compare(array[runHi++], array[lo]) < 0) { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) { + runHi++; + } + reverseRun(array, lo, runHi); + } + else { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) { + runHi++; + } + } + return runHi - lo; + } + function reverseRun(array, lo, hi) { + hi--; + while (lo < hi) { + var t = array[lo]; + array[lo++] = array[hi]; + array[hi--] = t; + } + } + function binaryInsertionSort(array, lo, hi, start, compare) { + if (start === lo) { + start++; + } + for (; start < hi; start++) { + var pivot = array[start]; + var left = lo; + var right = start; + var mid; + while (left < right) { + mid = left + right >>> 1; + if (compare(pivot, array[mid]) < 0) { + right = mid; + } + else { + left = mid + 1; + } + } + var n = start - left; + switch (n) { + case 3: + array[left + 3] = array[left + 2]; + case 2: + array[left + 2] = array[left + 1]; + case 1: + array[left + 1] = array[left]; + break; + default: + while (n > 0) { + array[left + n] = array[left + n - 1]; + n--; + } + } + array[left] = pivot; + } + } + function gallopLeft(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) > 0) { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + else { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) > 0) { + lastOffset = m + 1; + } + else { + offset = m; + } + } + return offset; + } + function gallopRight(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) < 0) { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + else { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) < 0) { + offset = m; + } + else { + lastOffset = m + 1; + } + } + return offset; + } + function TimSort(array, compare) { + var minGallop = DEFAULT_MIN_GALLOPING; + var length = 0; + var runStart; + var runLength; + var stackSize = 0; + length = array.length; + var tmp = []; + runStart = []; + runLength = []; + function pushRun(_runStart, _runLength) { + runStart[stackSize] = _runStart; + runLength[stackSize] = _runLength; + stackSize += 1; + } + function mergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1]) + || (n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) { + if (runLength[n - 1] < runLength[n + 1]) { + n--; + } + } + else if (runLength[n] > runLength[n + 1]) { + break; + } + mergeAt(n); + } + } + function forceMergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if (n > 0 && runLength[n - 1] < runLength[n + 1]) { + n--; + } + mergeAt(n); + } + } + function mergeAt(i) { + var start1 = runStart[i]; + var length1 = runLength[i]; + var start2 = runStart[i + 1]; + var length2 = runLength[i + 1]; + runLength[i] = length1 + length2; + if (i === stackSize - 3) { + runStart[i + 1] = runStart[i + 2]; + runLength[i + 1] = runLength[i + 2]; + } + stackSize--; + var k = gallopRight(array[start2], array, start1, length1, 0, compare); + start1 += k; + length1 -= k; + if (length1 === 0) { + return; + } + length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare); + if (length2 === 0) { + return; + } + if (length1 <= length2) { + mergeLow(start1, length1, start2, length2); + } + else { + mergeHigh(start1, length1, start2, length2); + } + } + function mergeLow(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length1; i++) { + tmp[i] = array[start1 + i]; + } + var cursor1 = 0; + var cursor2 = start2; + var dest = start1; + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + return; + } + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + return; + } + var _minGallop = minGallop; + var count1; + var count2; + var exit; + while (1) { + count1 = 0; + count2 = 0; + exit = false; + do { + if (compare(array[cursor2], tmp[cursor1]) < 0) { + array[dest++] = array[cursor2++]; + count2++; + count1 = 0; + if (--length2 === 0) { + exit = true; + break; + } + } + else { + array[dest++] = tmp[cursor1++]; + count1++; + count2 = 0; + if (--length1 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare); + if (count1 !== 0) { + for (i = 0; i < count1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + dest += count1; + cursor1 += count1; + length1 -= count1; + if (length1 <= 1) { + exit = true; + break; + } + } + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + exit = true; + break; + } + count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare); + if (count2 !== 0) { + for (i = 0; i < count2; i++) { + array[dest + i] = array[cursor2 + i]; + } + dest += count2; + cursor2 += count2; + length2 -= count2; + if (length2 === 0) { + exit = true; + break; + } + } + array[dest++] = tmp[cursor1++]; + if (--length1 === 1) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + minGallop < 1 && (minGallop = 1); + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + } + else if (length1 === 0) { + throw new Error(); + } + else { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + } + } + function mergeHigh(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length2; i++) { + tmp[i] = array[start2 + i]; + } + var cursor1 = start1 + length1 - 1; + var cursor2 = length2 - 1; + var dest = start2 + length2 - 1; + var customCursor = 0; + var customDest = 0; + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + return; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + return; + } + var _minGallop = minGallop; + while (true) { + var count1 = 0; + var count2 = 0; + var exit = false; + do { + if (compare(tmp[cursor2], array[cursor1]) < 0) { + array[dest--] = array[cursor1--]; + count1++; + count2 = 0; + if (--length1 === 0) { + exit = true; + break; + } + } + else { + array[dest--] = tmp[cursor2--]; + count2++; + count1 = 0; + if (--length2 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare); + if (count1 !== 0) { + dest -= count1; + cursor1 -= count1; + length1 -= count1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = count1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + if (length1 === 0) { + exit = true; + break; + } + } + array[dest--] = tmp[cursor2--]; + if (--length2 === 1) { + exit = true; + break; + } + count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare); + if (count2 !== 0) { + dest -= count2; + cursor2 -= count2; + length2 -= count2; + customDest = dest + 1; + customCursor = cursor2 + 1; + for (i = 0; i < count2; i++) { + array[customDest + i] = tmp[customCursor + i]; + } + if (length2 <= 1) { + exit = true; + break; + } + } + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + if (minGallop < 1) { + minGallop = 1; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + } + else if (length2 === 0) { + throw new Error(); + } + else { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + } + } + return { + mergeRuns: mergeRuns, + forceMergeRuns: forceMergeRuns, + pushRun: pushRun + }; + } + function sort(array, compare, lo, hi) { + if (!lo) { + lo = 0; + } + if (!hi) { + hi = array.length; + } + var remaining = hi - lo; + if (remaining < 2) { + return; + } + var runLength = 0; + if (remaining < DEFAULT_MIN_MERGE) { + runLength = makeAscendingRun(array, lo, hi, compare); + binaryInsertionSort(array, lo, hi, lo + runLength, compare); + return; + } + var ts = TimSort(array, compare); + var minRun = minRunLength(remaining); + do { + runLength = makeAscendingRun(array, lo, hi, compare); + if (runLength < minRun) { + var force = remaining; + if (force > minRun) { + force = minRun; + } + binaryInsertionSort(array, lo, lo + force, lo + runLength, compare); + runLength = force; + } + ts.pushRun(lo, runLength); + ts.mergeRuns(); + remaining -= runLength; + lo += runLength; + } while (remaining !== 0); + ts.forceMergeRuns(); + } + + var invalidZErrorLogged = false; + function logInvalidZError() { + if (invalidZErrorLogged) { + return; + } + invalidZErrorLogged = true; + console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors'); + } + function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; + } + var Storage = (function () { + function Storage() { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + this.displayableSortFunc = shapeCompareFunc; + } + Storage.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._roots.length; i++) { + this._roots[i].traverse(cb, context); + } + }; + Storage.prototype.getDisplayList = function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + var displayList = this._displayList; + if (update || !displayList.length) { + this.updateDisplayList(includeIgnore); + } + return displayList; + }; + Storage.prototype.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; + env.canvasSupported && sort(displayList, shapeCompareFunc); + }; + Storage.prototype._updateAndAddDisplayable = function (el, clipPaths, includeIgnore) { + if (el.ignore && !includeIgnore) { + return; + } + el.beforeUpdate(); + el.update(); + el.afterUpdate(); + var userSetClipPath = el.getClipPath(); + if (el.ignoreClip) { + clipPaths = null; + } + else if (userSetClipPath) { + if (clipPaths) { + clipPaths = clipPaths.slice(); + } + else { + clipPaths = []; + } + var currentClipPath = userSetClipPath; + var parentClipPath = el; + while (currentClipPath) { + currentClipPath.parent = parentClipPath; + currentClipPath.updateTransform(); + clipPaths.push(currentClipPath); + parentClipPath = currentClipPath; + currentClipPath = currentClipPath.getClipPath(); + } + } + if (el.childrenRef) { + var children = el.childrenRef(); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (el.__dirty) { + child.__dirty |= Element.REDARAW_BIT; + } + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + el.__dirty = 0; + } + else { + var disp = el; + if (clipPaths && clipPaths.length) { + disp.__clipPaths = clipPaths; + } + else if (disp.__clipPaths && disp.__clipPaths.length > 0) { + disp.__clipPaths = []; + } + if (isNaN(disp.z)) { + logInvalidZError(); + disp.z = 0; + } + if (isNaN(disp.z2)) { + logInvalidZError(); + disp.z2 = 0; + } + if (isNaN(disp.zlevel)) { + logInvalidZError(); + disp.zlevel = 0; + } + this._displayList[this._displayListLen++] = disp; + } + var decalEl = el.getDecalElement && el.getDecalElement(); + if (decalEl) { + this._updateAndAddDisplayable(decalEl, clipPaths, includeIgnore); + } + var textGuide = el.getTextGuideLine(); + if (textGuide) { + this._updateAndAddDisplayable(textGuide, clipPaths, includeIgnore); + } + var textEl = el.getTextContent(); + if (textEl) { + this._updateAndAddDisplayable(textEl, clipPaths, includeIgnore); + } + }; + Storage.prototype.addRoot = function (el) { + if (el.__zr && el.__zr.storage === this) { + return; + } + this._roots.push(el); + }; + Storage.prototype.delRoot = function (el) { + if (el instanceof Array) { + for (var i = 0, l = el.length; i < l; i++) { + this.delRoot(el[i]); + } + return; + } + var idx = indexOf(this._roots, el); + if (idx >= 0) { + this._roots.splice(idx, 1); + } + }; + Storage.prototype.delAllRoots = function () { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + return; + }; + Storage.prototype.getRoots = function () { + return this._roots; + }; + Storage.prototype.dispose = function () { + this._displayList = null; + this._roots = null; + }; + return Storage; + }()); + + var requestAnimationFrame; + requestAnimationFrame = (typeof window !== 'undefined' + && ((window.requestAnimationFrame && window.requestAnimationFrame.bind(window)) + || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window)) + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame)) || function (func) { + return setTimeout(func, 16); + }; + var requestAnimationFrame$1 = requestAnimationFrame; + + var Animation = (function (_super) { + __extends(Animation, _super); + function Animation(opts) { + var _this = _super.call(this) || this; + _this._running = false; + _this._time = 0; + _this._pausedTime = 0; + _this._pauseStart = 0; + _this._paused = false; + opts = opts || {}; + _this.stage = opts.stage || {}; + _this.onframe = opts.onframe || function () { }; + return _this; + } + Animation.prototype.addClip = function (clip) { + if (clip.animation) { + this.removeClip(clip); + } + if (!this._clipsHead) { + this._clipsHead = this._clipsTail = clip; + } + else { + this._clipsTail.next = clip; + clip.prev = this._clipsTail; + clip.next = null; + this._clipsTail = clip; + } + clip.animation = this; + }; + Animation.prototype.addAnimator = function (animator) { + animator.animation = this; + var clip = animator.getClip(); + if (clip) { + this.addClip(clip); + } + }; + Animation.prototype.removeClip = function (clip) { + if (!clip.animation) { + return; + } + var prev = clip.prev; + var next = clip.next; + if (prev) { + prev.next = next; + } + else { + this._clipsHead = next; + } + if (next) { + next.prev = prev; + } + else { + this._clipsTail = prev; + } + clip.next = clip.prev = clip.animation = null; + }; + Animation.prototype.removeAnimator = function (animator) { + var clip = animator.getClip(); + if (clip) { + this.removeClip(clip); + } + animator.animation = null; + }; + Animation.prototype.update = function (notTriggerFrameAndStageUpdate) { + var time = new Date().getTime() - this._pausedTime; + var delta = time - this._time; + var clip = this._clipsHead; + while (clip) { + var nextClip = clip.next; + var finished = clip.step(time, delta); + if (finished) { + clip.ondestroy && clip.ondestroy(); + this.removeClip(clip); + clip = nextClip; + } + else { + clip = nextClip; + } + } + this._time = time; + if (!notTriggerFrameAndStageUpdate) { + this.onframe(delta); + this.trigger('frame', delta); + this.stage.update && this.stage.update(); + } + }; + Animation.prototype._startLoop = function () { + var self = this; + this._running = true; + function step() { + if (self._running) { + requestAnimationFrame$1(step); + !self._paused && self.update(); + } + } + requestAnimationFrame$1(step); + }; + Animation.prototype.start = function () { + if (this._running) { + return; + } + this._time = new Date().getTime(); + this._pausedTime = 0; + this._startLoop(); + }; + Animation.prototype.stop = function () { + this._running = false; + }; + Animation.prototype.pause = function () { + if (!this._paused) { + this._pauseStart = new Date().getTime(); + this._paused = true; + } + }; + Animation.prototype.resume = function () { + if (this._paused) { + this._pausedTime += (new Date().getTime()) - this._pauseStart; + this._paused = false; + } + }; + Animation.prototype.clear = function () { + var clip = this._clipsHead; + while (clip) { + var nextClip = clip.next; + clip.prev = clip.next = clip.animation = null; + clip = nextClip; + } + this._clipsHead = this._clipsTail = null; + }; + Animation.prototype.isFinished = function () { + return this._clipsHead == null; + }; + Animation.prototype.animate = function (target, options) { + options = options || {}; + this.start(); + var animator = new Animator(target, options.loop); + this.addAnimator(animator); + return animator; + }; + return Animation; + }(Eventful)); + + var TOUCH_CLICK_DELAY = 300; + var globalEventSupported = env.domSupported; + var localNativeListenerNames = (function () { + var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' + ]; + var pointerEventNameMap = { + pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1 + }; + var pointerHandlerNames = map(mouseHandlerNames, function (name) { + var nm = name.replace('mouse', 'pointer'); + return pointerEventNameMap.hasOwnProperty(nm) ? nm : name; + }); + return { + mouse: mouseHandlerNames, + touch: touchHandlerNames, + pointer: pointerHandlerNames + }; + })(); + var globalNativeListenerNames = { + mouse: ['mousemove', 'mouseup'], + pointer: ['pointermove', 'pointerup'] + }; + var wheelEventSupported = false; + function isPointerFromTouch(event) { + var pointerType = event.pointerType; + return pointerType === 'pen' || pointerType === 'touch'; + } + function setTouchTimer(scope) { + scope.touching = true; + if (scope.touchTimer != null) { + clearTimeout(scope.touchTimer); + scope.touchTimer = null; + } + scope.touchTimer = setTimeout(function () { + scope.touching = false; + scope.touchTimer = null; + }, 700); + } + function markTouch(event) { + event && (event.zrByTouch = true); + } + function normalizeGlobalEvent(instance, event) { + return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true); + } + function isLocalEl(instance, el) { + var elTmp = el; + var isLocal = false; + while (elTmp && elTmp.nodeType !== 9 + && !(isLocal = elTmp.domBelongToZr + || (elTmp !== el && elTmp === instance.painterRoot))) { + elTmp = elTmp.parentNode; + } + return isLocal; + } + var FakeGlobalEvent = (function () { + function FakeGlobalEvent(instance, event) { + this.stopPropagation = noop; + this.stopImmediatePropagation = noop; + this.preventDefault = noop; + this.type = event.type; + this.target = this.currentTarget = instance.dom; + this.pointerType = event.pointerType; + this.clientX = event.clientX; + this.clientY = event.clientY; + } + return FakeGlobalEvent; + }()); + var localDOMHandlers = { + mousedown: function (event) { + event = normalizeEvent(this.dom, event); + this.__mayPointerCapture = [event.zrX, event.zrY]; + this.trigger('mousedown', event); + }, + mousemove: function (event) { + event = normalizeEvent(this.dom, event); + var downPoint = this.__mayPointerCapture; + if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) { + this.__togglePointerCapture(true); + } + this.trigger('mousemove', event); + }, + mouseup: function (event) { + event = normalizeEvent(this.dom, event); + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + }, + mouseout: function (event) { + event = normalizeEvent(this.dom, event); + var element = event.toElement || event.relatedTarget; + if (!isLocalEl(this, element)) { + if (this.__pointerCapturing) { + event.zrEventControl = 'no_globalout'; + } + this.trigger('mouseout', event); + } + }, + wheel: function (event) { + wheelEventSupported = true; + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + mousewheel: function (event) { + if (wheelEventSupported) { + return; + } + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + touchstart: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.__lastTouchMoment = new Date(); + this.handler.processGesture(event, 'start'); + localDOMHandlers.mousemove.call(this, event); + localDOMHandlers.mousedown.call(this, event); + }, + touchmove: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'change'); + localDOMHandlers.mousemove.call(this, event); + }, + touchend: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'end'); + localDOMHandlers.mouseup.call(this, event); + if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) { + localDOMHandlers.click.call(this, event); + } + }, + pointerdown: function (event) { + localDOMHandlers.mousedown.call(this, event); + }, + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + localDOMHandlers.mouseup.call(this, event); + }, + pointerout: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mouseout.call(this, event); + } + } + }; + each(['click', 'dblclick', 'contextmenu'], function (name) { + localDOMHandlers[name] = function (event) { + event = normalizeEvent(this.dom, event); + this.trigger(name, event); + }; + }); + var globalDOMHandlers = { + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + globalDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + globalDOMHandlers.mouseup.call(this, event); + }, + mousemove: function (event) { + this.trigger('mousemove', event); + }, + mouseup: function (event) { + var pointerCaptureReleasing = this.__pointerCapturing; + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + if (pointerCaptureReleasing) { + event.zrEventControl = 'only_globalout'; + this.trigger('mouseout', event); + } + } + }; + function mountLocalDOMEventListeners(instance, scope) { + var domHandlers = scope.domHandlers; + if (env.pointerEventsSupported) { + each(localNativeListenerNames.pointer, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + }); + }); + } + else { + if (env.touchEventsSupported) { + each(localNativeListenerNames.touch, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + setTouchTimer(scope); + }); + }); + } + each(localNativeListenerNames.mouse, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + event = getNativeEvent(event); + if (!scope.touching) { + domHandlers[nativeEventName].call(instance, event); + } + }); + }); + } + } + function mountGlobalDOMEventListeners(instance, scope) { + if (env.pointerEventsSupported) { + each(globalNativeListenerNames.pointer, mount); + } + else if (!env.touchEventsSupported) { + each(globalNativeListenerNames.mouse, mount); + } + function mount(nativeEventName) { + function nativeEventListener(event) { + event = getNativeEvent(event); + if (!isLocalEl(instance, event.target)) { + event = normalizeGlobalEvent(instance, event); + scope.domHandlers[nativeEventName].call(instance, event); + } + } + mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true }); + } + } + function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) { + scope.mounted[nativeEventName] = listener; + scope.listenerOpts[nativeEventName] = opt; + addEventListener(scope.domTarget, nativeEventName, listener, opt); + } + function unmountDOMEventListeners(scope) { + var mounted = scope.mounted; + for (var nativeEventName in mounted) { + if (mounted.hasOwnProperty(nativeEventName)) { + removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]); + } + } + scope.mounted = {}; + } + var DOMHandlerScope = (function () { + function DOMHandlerScope(domTarget, domHandlers) { + this.mounted = {}; + this.listenerOpts = {}; + this.touching = false; + this.domTarget = domTarget; + this.domHandlers = domHandlers; + } + return DOMHandlerScope; + }()); + var HandlerDomProxy = (function (_super) { + __extends(HandlerDomProxy, _super); + function HandlerDomProxy(dom, painterRoot) { + var _this = _super.call(this) || this; + _this.__pointerCapturing = false; + _this.dom = dom; + _this.painterRoot = painterRoot; + _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers); + if (globalEventSupported) { + _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers); + } + mountLocalDOMEventListeners(_this, _this._localHandlerScope); + return _this; + } + HandlerDomProxy.prototype.dispose = function () { + unmountDOMEventListeners(this._localHandlerScope); + if (globalEventSupported) { + unmountDOMEventListeners(this._globalHandlerScope); + } + }; + HandlerDomProxy.prototype.setCursor = function (cursorStyle) { + this.dom.style && (this.dom.style.cursor = cursorStyle || 'default'); + }; + HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) { + this.__mayPointerCapture = null; + if (globalEventSupported + && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) { + this.__pointerCapturing = isPointerCapturing; + var globalHandlerScope = this._globalHandlerScope; + isPointerCapturing + ? mountGlobalDOMEventListeners(this, globalHandlerScope) + : unmountDOMEventListeners(globalHandlerScope); + } + }; + return HandlerDomProxy; + }(Eventful)); + + var Group = (function (_super) { + __extends(Group, _super); + function Group(opts) { + var _this = _super.call(this) || this; + _this.isGroup = true; + _this._children = []; + _this.attr(opts); + return _this; + } + Group.prototype.childrenRef = function () { + return this._children; + }; + Group.prototype.children = function () { + return this._children.slice(); + }; + Group.prototype.childAt = function (idx) { + return this._children[idx]; + }; + Group.prototype.childOfName = function (name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }; + Group.prototype.childCount = function () { + return this._children.length; + }; + Group.prototype.add = function (child) { + if (child) { + if (child !== this && child.parent !== this) { + this._children.push(child); + this._doAdd(child); + } + if (child.__hostTarget) { + throw 'This elemenet has been used as an attachment'; + } + } + return this; + }; + Group.prototype.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; + }; + Group.prototype.replaceAt = function (child, index) { + var children = this._children; + var old = children[index]; + if (child && child !== this && child.parent !== this && child !== old) { + children[index] = child; + old.parent = null; + var zr = this.__zr; + if (zr) { + old.removeSelfFromZr(zr); + } + this._doAdd(child); + } + return this; + }; + Group.prototype._doAdd = function (child) { + if (child.parent) { + child.parent.remove(child); + } + child.parent = this; + var zr = this.__zr; + if (zr && zr !== child.__zr) { + child.addSelfToZr(zr); + } + zr && zr.refresh(); + }; + Group.prototype.remove = function (child) { + var zr = this.__zr; + var children = this._children; + var idx = indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + child.parent = null; + if (zr) { + child.removeSelfFromZr(zr); + } + zr && zr.refresh(); + return this; + }; + Group.prototype.removeAll = function () { + var children = this._children; + var zr = this.__zr; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (zr) { + child.removeSelfFromZr(zr); + } + child.parent = null; + } + children.length = 0; + return this; + }; + Group.prototype.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; + }; + Group.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + var stopped = cb.call(context, child); + if (child.isGroup && !stopped) { + child.traverse(cb, context); + } + } + return this; + }; + Group.prototype.addSelfToZr = function (zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.addSelfToZr(zr); + } + }; + Group.prototype.removeSelfFromZr = function (zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.removeSelfFromZr(zr); + } + }; + Group.prototype.getBoundingRect = function (includeChildren) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + var rect = null; + 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) { + BoundingRect.applyTransform(tmpRect, childRect, transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + }; + return Group; + }(Element)); + Group.prototype.type = 'group'; + + /*! + * 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 + */ + var useVML = !env.canvasSupported; + var painterCtors = {}; + var instances = {}; + function delInstance(id) { + delete instances[id]; + } + function isDarkMode(backgroundColor) { + if (!backgroundColor) { + return false; + } + if (typeof backgroundColor === 'string') { + return lum(backgroundColor, 1) < DARK_MODE_THRESHOLD; + } + else if (backgroundColor.colorStops) { + var colorStops = backgroundColor.colorStops; + var totalLum = 0; + var len = colorStops.length; + for (var i = 0; i < len; i++) { + totalLum += lum(colorStops[i].color, 1); + } + totalLum /= len; + return totalLum < DARK_MODE_THRESHOLD; + } + return false; + } + var ZRender = (function () { + function ZRender(id, dom, opts) { + var _this = this; + this._sleepAfterStill = 10; + this._stillFrameAccum = 0; + this._needsRefresh = true; + this._needsRefreshHover = true; + this._darkMode = false; + opts = opts || {}; + this.dom = dom; + this.id = id; + var storage = new Storage(); + var rendererType = opts.renderer || 'canvas'; + if (useVML) { + throw new Error('IE8 support has been dropped since 5.0'); + } + if (!painterCtors[rendererType]) { + rendererType = keys(painterCtors)[0]; + } + if (!painterCtors[rendererType]) { + throw new Error("Renderer '" + rendererType + "' is not imported. Please import it first."); + } + opts.useDirtyRect = opts.useDirtyRect == null + ? false + : opts.useDirtyRect; + var painter = new painterCtors[rendererType](dom, storage, opts, id); + this.storage = storage; + this.painter = painter; + var handerProxy = (!env.node && !env.worker) + ? new HandlerDomProxy(painter.getViewportRoot(), painter.root) + : null; + this.handler = new Handler(storage, painter, handerProxy, painter.root); + this.animation = new Animation({ + stage: { + update: function () { return _this._flush(true); } + } + }); + this.animation.start(); + } + ZRender.prototype.add = function (el) { + if (!el) { + return; + } + this.storage.addRoot(el); + el.addSelfToZr(this); + this.refresh(); + }; + ZRender.prototype.remove = function (el) { + if (!el) { + return; + } + this.storage.delRoot(el); + el.removeSelfFromZr(this); + this.refresh(); + }; + ZRender.prototype.configLayer = function (zLevel, config) { + if (this.painter.configLayer) { + this.painter.configLayer(zLevel, config); + } + this.refresh(); + }; + ZRender.prototype.setBackgroundColor = function (backgroundColor) { + if (this.painter.setBackgroundColor) { + this.painter.setBackgroundColor(backgroundColor); + } + this.refresh(); + this._backgroundColor = backgroundColor; + this._darkMode = isDarkMode(backgroundColor); + }; + ZRender.prototype.getBackgroundColor = function () { + return this._backgroundColor; + }; + ZRender.prototype.setDarkMode = function (darkMode) { + this._darkMode = darkMode; + }; + ZRender.prototype.isDarkMode = function () { + return this._darkMode; + }; + ZRender.prototype.refreshImmediately = function (fromInside) { + if (!fromInside) { + this.animation.update(true); + } + this._needsRefresh = false; + this.painter.refresh(); + this._needsRefresh = false; + }; + ZRender.prototype.refresh = function () { + this._needsRefresh = true; + this.animation.start(); + }; + ZRender.prototype.flush = function () { + this._flush(false); + }; + ZRender.prototype._flush = function (fromInside) { + var triggerRendered; + var start = new Date().getTime(); + if (this._needsRefresh) { + triggerRendered = true; + this.refreshImmediately(fromInside); + } + if (this._needsRefreshHover) { + triggerRendered = true; + this.refreshHoverImmediately(); + } + var end = new Date().getTime(); + if (triggerRendered) { + this._stillFrameAccum = 0; + this.trigger('rendered', { + elapsedTime: end - start + }); + } + else if (this._sleepAfterStill > 0) { + this._stillFrameAccum++; + if (this._stillFrameAccum > this._sleepAfterStill) { + this.animation.stop(); + } + } + }; + ZRender.prototype.setSleepAfterStill = function (stillFramesCount) { + this._sleepAfterStill = stillFramesCount; + }; + ZRender.prototype.wakeUp = function () { + this.animation.start(); + this._stillFrameAccum = 0; + }; + ZRender.prototype.addHover = function (el) { + }; + ZRender.prototype.removeHover = function (el) { + }; + ZRender.prototype.clearHover = function () { + }; + ZRender.prototype.refreshHover = function () { + this._needsRefreshHover = true; + }; + ZRender.prototype.refreshHoverImmediately = function () { + this._needsRefreshHover = false; + if (this.painter.refreshHover && this.painter.getType() === 'canvas') { + this.painter.refreshHover(); + } + }; + ZRender.prototype.resize = function (opts) { + opts = opts || {}; + this.painter.resize(opts.width, opts.height); + this.handler.resize(); + }; + ZRender.prototype.clearAnimation = function () { + this.animation.clear(); + }; + ZRender.prototype.getWidth = function () { + return this.painter.getWidth(); + }; + ZRender.prototype.getHeight = function () { + return this.painter.getHeight(); + }; + ZRender.prototype.pathToImage = function (e, dpr) { + if (this.painter.pathToImage) { + return this.painter.pathToImage(e, dpr); + } + }; + ZRender.prototype.setCursorStyle = function (cursorStyle) { + this.handler.setCursorStyle(cursorStyle); + }; + ZRender.prototype.findHover = function (x, y) { + return this.handler.findHover(x, y); + }; + ZRender.prototype.on = function (eventName, eventHandler, context) { + this.handler.on(eventName, eventHandler, context); + return this; + }; + ZRender.prototype.off = function (eventName, eventHandler) { + this.handler.off(eventName, eventHandler); + }; + ZRender.prototype.trigger = function (eventName, event) { + this.handler.trigger(eventName, event); + }; + ZRender.prototype.clear = function () { + var roots = this.storage.getRoots(); + for (var i = 0; i < roots.length; i++) { + if (roots[i] instanceof Group) { + roots[i].removeSelfFromZr(this); + } + } + this.storage.delAllRoots(); + this.painter.clear(); + }; + ZRender.prototype.dispose = function () { + this.animation.stop(); + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler.dispose(); + this.animation = + this.storage = + this.painter = + this.handler = null; + delInstance(this.id); + }; + return ZRender; + }()); + function init(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances[zr.id] = zr; + return zr; + } + function dispose(zr) { + zr.dispose(); + } + function disposeAll() { + for (var key in instances) { + if (instances.hasOwnProperty(key)) { + instances[key].dispose(); + } + } + instances = {}; + } + function getInstance(id) { + return instances[id]; + } + function registerPainter(name, Ctor) { + painterCtors[name] = Ctor; + } + var version = '5.0.4'; + + var zrender = /*#__PURE__*/Object.freeze({ + __proto__: null, + init: init, + dispose: dispose, + disposeAll: disposeAll, + getInstance: getInstance, + registerPainter: registerPainter, + version: version + }); + + var RADIAN_EPSILON = 1e-4; + + function _trim(str) { + return str.replace(/^\s+|\s+$/g, ''); + } + /** + * Linear mapping a value from domain to range + * @param val + * @param domain Domain extent domain[0] can be bigger than domain[1] + * @param range Range extent range[0] can be bigger than range[1] + * @param clamp Default to be false + */ + + + function linearMap(val, domain, range, clamp) { + var subDomain = domain[1] - domain[0]; + var subRange = range[1] - range[0]; + + if (subDomain === 0) { + return subRange === 0 ? range[0] : (range[0] + range[1]) / 2; + } // Avoid accuracy problem in edge, such as + // 146.39 - 62.83 === 83.55999999999999. + // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError + // It is a little verbose for efficiency considering this method + // is a hotspot. + + + if (clamp) { + if (subDomain > 0) { + if (val <= domain[0]) { + return range[0]; + } else if (val >= domain[1]) { + return range[1]; + } + } else { + if (val >= domain[0]) { + return range[0]; + } else if (val <= domain[1]) { + return range[1]; + } + } + } else { + if (val === domain[0]) { + return range[0]; + } + + if (val === domain[1]) { + return range[1]; + } + } + + return (val - domain[0]) / subDomain * subRange + range[0]; + } + /** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + */ + + function parsePercent$1(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; + } + function round(x, precision, returnStr) { + if (precision == null) { + precision = 10; + } // Avoid range error + + + precision = Math.min(Math.max(0, precision), 20); + x = (+x).toFixed(precision); + return returnStr ? x : +x; + } + /** + * Inplacd asc sort arr. + * The input arr will be modified. + */ + + function asc(arr) { + arr.sort(function (a, b) { + return a - b; + }); + return arr; + } + /** + * Get precision + */ + + function getPrecision(val) { + val = +val; + + if (isNaN(val)) { + return 0; + } // It is much faster than methods converting number to string as follows + // let 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; + } + /** + * Get precision with slow but safe method + */ + + function getPrecisionSafe(val) { + var str = val.toString(); // Consider scientific notation: '3.4e-12' '3.4e+12' + + var eIndex = str.indexOf('e'); + + if (eIndex > 0) { + var precision = +str.slice(eIndex + 1); + return precision < 0 ? -precision : 0; + } else { + var dotIndex = str.indexOf('.'); + return dotIndex < 0 ? 0 : str.length - 1 - dotIndex; + } + } + /** + * Minimal dicernible data precisioin according to a single pixel. + */ + + function getPixelPrecision(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); // toFixed() digits argument must be between 0 and 20. + + var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20); + return !isFinite(precision) ? 20 : precision; + } + /** + * Get a data of given precision, assuring the sum of percentages + * in valueList is 1. + * The largest remainer method is used. + * https://en.wikipedia.org/wiki/Largest_remainder_method + * + * @param valueList a list of all data + * @param idx index of the data to be processed in valueList + * @param precision integer number showing digits of precision + * @return percent ranging from 0 to 100 + */ + + function getPercentWithPrecision(valueList, idx, precision) { + if (!valueList[idx]) { + return 0; + } + + var sum = reduce(valueList, function (acc, val) { + return acc + (isNaN(val) ? 0 : val); + }, 0); + + if (sum === 0) { + return 0; + } + + var digits = Math.pow(10, precision); + var votesPerQuota = map(valueList, function (val) { + return (isNaN(val) ? 0 : val) / sum * digits * 100; + }); + var targetSeats = digits * 100; + var seats = map(votesPerQuota, function (votes) { + // Assign automatic seats. + return Math.floor(votes); + }); + var currentSum = reduce(seats, function (acc, val) { + return acc + val; + }, 0); + var remainder = map(votesPerQuota, function (votes, idx) { + return votes - seats[idx]; + }); // Has remainding votes. + + while (currentSum < targetSeats) { + // Find next largest remainder. + var max = Number.NEGATIVE_INFINITY; + var maxId = null; + + for (var i = 0, len = remainder.length; i < len; ++i) { + if (remainder[i] > max) { + max = remainder[i]; + maxId = i; + } + } // Add a vote to max remainder. + + + ++seats[maxId]; + remainder[maxId] = 0; + ++currentSum; + } + + return seats[idx] / digits; + } // Number.MAX_SAFE_INTEGER, ie do not support. + + var MAX_SAFE_INTEGER = 9007199254740991; + /** + * To 0 - 2 * PI, considering negative radian. + */ + + function remRadian(radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; + } + /** + * @param {type} radian + * @return {boolean} + */ + + function isRadianAroundZero(val) { + return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; + } // eslint-disable-next-line + + var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line + + /** + * @param value valid type: number | string | Date, otherwise return `new Date(NaN)` + * These values can be accepted: + * + An instance of Date, represent a time in its own time zone. + * + Or string in a subset of ISO 8601, only including: + * + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06', + * + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123', + * + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00', + * all of which will be treated as local time if time zone is not specified + * (see ). + * + Or other string format, including (all of which will be treated as loacal time): + * '2012', '2012-3-1', '2012/3/1', '2012/03/01', + * '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123' + * + a timestamp, which represent a time in UTC. + * @return date Never be null/undefined. If invalid, return `new Date(NaN)`. + */ + + function parseDate(value) { + if (value instanceof Date) { + return value; + } else if (typeof value === 'string') { + // Different browsers parse date in different way, so we parse it manually. + // Some other issues: + // new Date('1970-01-01') is UTC, + // new Date('1970/01/01') and new Date('1970-1-01') is local. + // See issue #3623 + var match = TIME_REG.exec(value); + + if (!match) { + // return Invalid Date. + return new Date(NaN); + } // Use local time when no timezone offset specifed. + + + if (!match[8]) { + // match[n] can only be string or undefined. + // But take care of '12' + 1 => '121'. + return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, +match[7] || 0); + } // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time, + // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment). + // For example, system timezone is set as "Time Zone: America/Toronto", + // then these code will get different result: + // `new Date(1478411999999).getTimezoneOffset(); // get 240` + // `new Date(1478412000000).getTimezoneOffset(); // get 300` + // So we should not use `new Date`, but use `Date.UTC`. + else { + var hour = +match[4] || 0; + + if (match[8].toUpperCase() !== 'Z') { + hour -= +match[8].slice(0, 3); + } + + return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, +match[7] || 0)); + } + } else if (value == null) { + return new Date(NaN); + } + + return new Date(Math.round(value)); + } + /** + * Quantity of a number. e.g. 0.1, 1, 10, 100 + * + * @param val + * @return + */ + + function quantity(val) { + return Math.pow(10, quantityExponent(val)); + } + /** + * Exponent of the quantity of a number + * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3 + * + * @param val non-negative value + * @return + */ + + function quantityExponent(val) { + if (val === 0) { + return 0; + } + + var exp = Math.floor(Math.log(val) / Math.LN10); + /** + * exp is expected to be the rounded-down result of the base-10 log of val. + * But due to the precision loss with Math.log(val), we need to restore it + * using 10^exp to make sure we can get val back from exp. #11249 + */ + + if (val / Math.pow(10, exp) >= 10) { + exp++; + } + + return exp; + } + /** + * 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. + * + * See "Nice Numbers for Graph Labels" of Graphic Gems. + * + * @param val Non-negative value. + * @param round + * @return Niced number + */ + + function nice(val, round) { + var exponent = quantityExponent(val); + var exp10 = Math.pow(10, exponent); + var f = val / exp10; // 1 <= f < 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; + } + } + + val = nf * exp10; // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754). + // 20 is the uppper bound of toFixed. + + return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val; + } + /** + * This code was copied from "d3.js" + * . + * See the license statement at the head of this file. + * @param ascArr + */ + + function quantile(ascArr, p) { + var H = (ascArr.length - 1) * p + 1; + var h = Math.floor(H); + var v = +ascArr[h - 1]; + var e = H - h; + return e ? v + e * (ascArr[h] - v) : v; + } + /** + * Order intervals asc, and split them when overlap. + * expect(numberUtil.reformIntervals([ + * {interval: [18, 62], close: [1, 1]}, + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [1, 1]}, + * {interval: [62, 150], close: [1, 1]}, + * {interval: [106, 150], close: [1, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ])).toEqual([ + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [0, 1]}, + * {interval: [18, 62], close: [0, 1]}, + * {interval: [62, 150], close: [0, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ]); + * @param list, where `close` mean open or close + * of the interval, and Infinity can be used. + * @return The origin list, which has been reformed. + */ + + function reformIntervals(list) { + list.sort(function (a, b) { + return littleThan(a, b, 0) ? -1 : 1; + }); + var curr = -Infinity; + var currClose = 1; + + for (var i = 0; i < list.length;) { + var interval = list[i].interval; + var close_1 = list[i].close; + + for (var lg = 0; lg < 2; lg++) { + if (interval[lg] <= curr) { + interval[lg] = curr; + close_1[lg] = !lg ? 1 - currClose : 1; + } + + curr = interval[lg]; + currClose = close_1[lg]; + } + + if (interval[0] === interval[1] && close_1[0] * close_1[1] !== 1) { + list.splice(i, 1); + } else { + i++; + } + } + + return list; + + function littleThan(a, b, lg) { + return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1)); + } + } + /** + * [Numberic is defined as]: + * `parseFloat(val) == val` + * For example: + * numeric: + * typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity, + * and they rounded by white-spaces or line-terminal like ' -123 \n ' (see es spec) + * not-numeric: + * null, undefined, [], {}, true, false, 'NaN', NaN, '123ab', + * empty string, string with only white-spaces or line-terminal (see es spec), + * 0x12, '0x12', '-0x12', 012, '012', '-012', + * non-string, ... + * + * @test See full test cases in `test/ut/spec/util/number.js`. + * @return Must be a typeof number. If not numeric, return NaN. + */ + + function numericToNumber(val) { + var valFloat = parseFloat(val); + return valFloat == val // eslint-disable-line eqeqeq + && (valFloat !== 0 || typeof val !== 'string' || val.indexOf('x') <= 0) // For case ' 0x0 '. + ? valFloat : NaN; + } + /** + * Definition of "numeric": see `numericToNumber`. + */ + + function isNumeric(val) { + return !isNaN(numericToNumber(val)); + } + /** + * Use random base to prevent users hard code depending on + * this auto generated marker id. + * @return An positive integer. + */ + + function getRandomIdBase() { + return Math.round(Math.random() * 9); + } + /** + * Get the greatest common dividor + * + * @param {number} a one number + * @param {number} b the other number + */ + + function getGreatestCommonDividor(a, b) { + if (b === 0) { + return a; + } + + return getGreatestCommonDividor(b, a % b); + } + /** + * Get the least common multiple + * + * @param {number} a one number + * @param {number} b the other number + */ + + function getLeastCommonMultiple(a, b) { + if (a == null) { + return b; + } + + if (b == null) { + return a; + } + + return a * b / getGreatestCommonDividor(a, b); + } + + var ECHARTS_PREFIX = '[ECharts] '; + var storedLogs = {}; + var hasConsole = typeof console !== 'undefined' // eslint-disable-next-line + && console.warn && console.log; + function warn(str) { + if (hasConsole) { + console.warn(ECHARTS_PREFIX + str); + } + } + function error(str) { + if (hasConsole) { + console.error(ECHARTS_PREFIX + str); + } + } + function deprecateLog(str) { + if ("development" !== 'production') { + if (storedLogs[str]) { + // Not display duplicate message. + return; + } + + if (hasConsole) { + storedLogs[str] = true; + console.warn(ECHARTS_PREFIX + 'DEPRECATED: ' + str); + } + } + } + function deprecateReplaceLog(oldOpt, newOpt, scope) { + if ("development" !== 'production') { + deprecateLog((scope ? "[" + scope + "]" : '') + (oldOpt + " is deprecated, use " + newOpt + " instead.")); + } + } + function consoleLog() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + if ("development" !== 'production') { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && console.log) { + console.log.apply(console, args); + } + /* eslint-enable no-console */ + + } + } + /** + * If in __DEV__ environment, get console printable message for users hint. + * Parameters are separated by ' '. + * @usuage + * makePrintable('This is an error on', someVar, someObj); + * + * @param hintInfo anything about the current execution context to hint users. + * @throws Error + */ + + function makePrintable() { + var hintInfo = []; + + for (var _i = 0; _i < arguments.length; _i++) { + hintInfo[_i] = arguments[_i]; + } + + var msg = ''; + + if ("development" !== 'production') { + // Fuzzy stringify for print. + // This code only exist in dev environment. + var makePrintableStringIfPossible_1 = function (val) { + return val === void 0 ? 'undefined' : val === Infinity ? 'Infinity' : val === -Infinity ? '-Infinity' : eqNaN(val) ? 'NaN' : val instanceof Date ? 'Date(' + val.toISOString() + ')' : isFunction(val) ? 'function () { ... }' : isRegExp(val) ? val + '' : null; + }; + + msg = map(hintInfo, function (arg) { + if (isString(arg)) { + // Print without quotation mark for some statement. + return arg; + } else { + var printableStr = makePrintableStringIfPossible_1(arg); + + if (printableStr != null) { + return printableStr; + } else if (typeof JSON !== 'undefined' && JSON.stringify) { + try { + return JSON.stringify(arg, function (n, val) { + var printableStr = makePrintableStringIfPossible_1(val); + return printableStr == null ? val : printableStr; + }); // In most cases the info object is small, so do not line break. + } catch (err) { + return '?'; + } + } else { + return '?'; + } + } + }).join(' '); + } + + return msg; + } + /** + * @throws Error + */ + + function throwError(msg) { + throw new Error(msg); + } + + /** + * Make the name displayable. But we should + * make sure it is not duplicated with user + * specified name, so use '\0'; + */ + + var DUMMY_COMPONENT_NAME_PREFIX = 'series\0'; + var INTERNAL_COMPONENT_ID_PREFIX = '\0_ec_\0'; + /** + * If value is not array, then translate it to array. + * @param {*} value + * @return {Array} [value] or value + */ + + function normalizeToArray(value) { + return value instanceof Array ? value : value == null ? [] : [value]; + } + /** + * Sync default option between normal and emphasis like `position` and `show` + * In case some one will write code like + * label: { + * show: false, + * position: 'outside', + * fontSize: 18 + * }, + * emphasis: { + * label: { show: true } + * } + */ + + function defaultEmphasis(opt, key, subOpts) { + // Caution: performance sensitive. + if (opt) { + opt[key] = opt[key] || {}; + opt.emphasis = opt.emphasis || {}; + opt.emphasis[key] = opt.emphasis[key] || {}; // Default emphasis option from normal + + for (var i = 0, len = subOpts.length; i < len; i++) { + var subOptName = subOpts[i]; + + if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) { + opt.emphasis[key][subOptName] = opt[key][subOptName]; + } + } + } + } + var TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding']; // modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([ + // 'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter', + // 'fontStyle', 'fontWeight', 'fontSize', 'fontFamily', + // // FIXME: deprecated, check and remove it. + // 'textStyle' + // ]); + + /** + * The method do not ensure performance. + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method retieves value from data. + */ + + function getDataItemValue(dataItem) { + return isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem; + } + /** + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method determine if dataItem has extra option besides value + */ + + function isDataItemOption(dataItem) { + return isObject(dataItem) && !(dataItem instanceof Array); // // markLine data can be array + // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array)); + } + /** + * Mapping to existings for merge. + * + * Mode "normalMege": + * The mapping result (merge result) will keep the order of the existing + * component, rather than the order of new option. Because we should ensure + * some specified index reference (like xAxisIndex) keep work. + * And in most cases, "merge option" is used to update partial option but not + * be expected to change the order. + * + * Mode "replaceMege": + * (1) Only the id mapped components will be merged. + * (2) Other existing components (except internal compoonets) will be removed. + * (3) Other new options will be used to create new component. + * (4) The index of the existing compoents will not be modified. + * That means their might be "hole" after the removal. + * The new components are created first at those available index. + * + * Mode "replaceAll": + * This mode try to support that reproduce an echarts instance from another + * echarts instance (via `getOption`) in some simple cases. + * In this senario, the `result` index are exactly the consistent with the `newCmptOptions`, + * which ensures the compoennt index referring (like `xAxisIndex: ?`) corrent. That is, + * the "hole" in `newCmptOptions` will also be kept. + * On the contrary, other modes try best to eliminate holes. + * PENDING: This is an experimental mode yet. + * + * @return See the comment of . + */ + + function mappingToExists(existings, newCmptOptions, mode) { + var isNormalMergeMode = mode === 'normalMerge'; + var isReplaceMergeMode = mode === 'replaceMerge'; + var isReplaceAllMode = mode === 'replaceAll'; + existings = existings || []; + newCmptOptions = (newCmptOptions || []).slice(); + var existingIdIdxMap = createHashMap(); // Validate id and name on user input option. + + each(newCmptOptions, function (cmptOption, index) { + if (!isObject(cmptOption)) { + newCmptOptions[index] = null; + return; + } + + if ("development" !== 'production') { + // There is some legacy case that name is set as `false`. + // But should work normally rather than throw error. + if (cmptOption.id != null && !isValidIdOrName(cmptOption.id)) { + warnInvalidateIdOrName(cmptOption.id); + } + + if (cmptOption.name != null && !isValidIdOrName(cmptOption.name)) { + warnInvalidateIdOrName(cmptOption.name); + } + } + }); + var result = prepareResult(existings, existingIdIdxMap, mode); + + if (isNormalMergeMode || isReplaceMergeMode) { + mappingById(result, existings, existingIdIdxMap, newCmptOptions); + } + + if (isNormalMergeMode) { + mappingByName(result, newCmptOptions); + } + + if (isNormalMergeMode || isReplaceMergeMode) { + mappingByIndex(result, newCmptOptions, isReplaceMergeMode); + } else if (isReplaceAllMode) { + mappingInReplaceAllMode(result, newCmptOptions); + } + + makeIdAndName(result); // The array `result` MUST NOT contain elided items, otherwise the + // forEach will ommit those items and result in incorrect result. + + return result; + } + + function prepareResult(existings, existingIdIdxMap, mode) { + var result = []; + + if (mode === 'replaceAll') { + return result; + } // Do not use native `map` to in case that the array `existings` + // contains elided items, which will be ommited. + + + for (var index = 0; index < existings.length; index++) { + var existing = existings[index]; // Because of replaceMerge, `existing` may be null/undefined. + + if (existing && existing.id != null) { + existingIdIdxMap.set(existing.id, index); + } // For non-internal-componnets: + // Mode "normalMerge": all existings kept. + // Mode "replaceMerge": all existing removed unless mapped by id. + // For internal-components: + // go with "replaceMerge" approach in both mode. + + + result.push({ + existing: mode === 'replaceMerge' || isComponentIdInternal(existing) ? null : existing, + newOption: null, + keyInfo: null, + brandNew: null + }); + } + + return result; + } + + function mappingById(result, existings, existingIdIdxMap, newCmptOptions) { + // Mapping by id if specified. + each(newCmptOptions, function (cmptOption, index) { + if (!cmptOption || cmptOption.id == null) { + return; + } + + var optionId = makeComparableKey(cmptOption.id); + var existingIdx = existingIdIdxMap.get(optionId); + + if (existingIdx != null) { + var resultItem = result[existingIdx]; + assert(!resultItem.newOption, 'Duplicated option on id "' + optionId + '".'); + resultItem.newOption = cmptOption; // In both mode, if id matched, new option will be merged to + // the existings rather than creating new component model. + + resultItem.existing = existings[existingIdx]; + newCmptOptions[index] = null; + } + }); + } + + function mappingByName(result, newCmptOptions) { + // Mapping by name if specified. + each(newCmptOptions, function (cmptOption, index) { + if (!cmptOption || cmptOption.name == null) { + return; + } + + for (var i = 0; i < result.length; i++) { + var existing = result[i].existing; + + if (!result[i].newOption // Consider name: two map to one. + // Can not match when both ids existing but different. + && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual('name', existing, cmptOption)) { + result[i].newOption = cmptOption; + newCmptOptions[index] = null; + return; + } + } + }); + } + + function mappingByIndex(result, newCmptOptions, brandNew) { + each(newCmptOptions, function (cmptOption) { + if (!cmptOption) { + return; + } // Find the first place that not mapped by id and not internal component (consider the "hole"). + + + var resultItem; + var nextIdx = 0; + + while ( // Be `!resultItem` only when `nextIdx >= result.length`. + (resultItem = result[nextIdx]) && ( // (1) Existing models that already have id should be able to mapped to. Because + // after mapping performed, model will always be assigned with an id if user not given. + // After that all models have id. + // (2) If new option has id, it can only set to a hole or append to the last. It should + // not be merged to the existings with different id. Because id should not be overwritten. + // (3) Name can be overwritten, because axis use name as 'show label text'. + resultItem.newOption || isComponentIdInternal(resultItem.existing) || // In mode "replaceMerge", here no not-mapped-non-internal-existing. + resultItem.existing && cmptOption.id != null && !keyExistAndEqual('id', cmptOption, resultItem.existing))) { + nextIdx++; + } + + if (resultItem) { + resultItem.newOption = cmptOption; + resultItem.brandNew = brandNew; + } else { + result.push({ + newOption: cmptOption, + brandNew: brandNew, + existing: null, + keyInfo: null + }); + } + + nextIdx++; + }); + } + + function mappingInReplaceAllMode(result, newCmptOptions) { + each(newCmptOptions, function (cmptOption) { + // The feature "reproduce" requires "hole" will also reproduced + // in case that compoennt index referring are broken. + result.push({ + newOption: cmptOption, + brandNew: true, + existing: null, + keyInfo: null + }); + }); + } + /** + * Make id and name for mapping result (result of mappingToExists) + * into `keyInfo` field. + */ + + + function makeIdAndName(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 = createHashMap(); + each(mapResult, function (item) { + var existing = item.existing; + existing && idMap.set(existing.id, item); + }); + each(mapResult, function (item) { + var opt = item.newOption; // Force ensure id not duplicated. + + assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id)); + opt && opt.id != null && idMap.set(opt.id, item); + !item.keyInfo && (item.keyInfo = {}); + }); // Make name and id. + + each(mapResult, function (item, index) { + var existing = item.existing; + var opt = item.newOption; + 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 ? makeComparableKey(opt.name) : existing ? existing.name // Avoid diffferent series has the same name, + // because name may be used like in color pallet. + : DUMMY_COMPONENT_NAME_PREFIX + index; + + if (existing) { + keyInfo.id = makeComparableKey(existing.id); + } else if (opt.id != null) { + keyInfo.id = makeComparableKey(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.get(keyInfo.id)); + } + + idMap.set(keyInfo.id, item); + }); + } + + function keyExistAndEqual(attr, obj1, obj2) { + var key1 = convertOptionIdName(obj1[attr], null); + var key2 = convertOptionIdName(obj2[attr], null); // See `MappingExistingItem`. `id` and `name` trade string equals to number. + + return key1 != null && key2 != null && key1 === key2; + } + /** + * @return return null if not exist. + */ + + + function makeComparableKey(val) { + if ("development" !== 'production') { + if (val == null) { + throw new Error(); + } + } + + return convertOptionIdName(val, ''); + } + + function convertOptionIdName(idOrName, defaultValue) { + if (idOrName == null) { + return defaultValue; + } + + var type = typeof idOrName; + return type === 'string' ? idOrName : type === 'number' || isStringSafe(idOrName) ? idOrName + '' : defaultValue; + } + + function warnInvalidateIdOrName(idOrName) { + if ("development" !== 'production') { + warn('`' + idOrName + '` is invalid id or name. Must be a string or number.'); + } + } + + function isValidIdOrName(idOrName) { + return isStringSafe(idOrName) || isNumeric(idOrName); + } + + function isNameSpecified(componentModel) { + var name = componentModel.name; // Is specified when `indexOf` get -1 or > 0. + + return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX)); + } + /** + * @public + * @param {Object} cmptOption + * @return {boolean} + */ + + function isComponentIdInternal(cmptOption) { + return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0; + } + function makeInternalComponentId(idSuffix) { + return INTERNAL_COMPONENT_ID_PREFIX + idSuffix; + } + function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) { + // Set mainType and complete subType. + each(mappingResult, function (item) { + var newOption = item.newOption; + + if (isObject(newOption)) { + item.keyInfo.mainType = mainType; + item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor); + } + }); + } + + function determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) { + var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType // Use determineSubType only when there is no existComponent. + : componentModelCtor.determineSubType(mainType, newCmptOption); // tooltip, markline, markpoint may always has no subType + + return subType; + } + /** + * A helper for removing duplicate items between batchA and batchB, + * and in themselves, and categorize by series. + * + * @param batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @param batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @return result: [resultBatchA, resultBatchB] + */ + + + function compressBatches(batchA, batchB) { + var mapA = {}; + var mapB = {}; + makeMap(batchA || [], mapA); + makeMap(batchB || [], mapB, mapA); + return [mapToArray(mapA), mapToArray(mapB)]; + + function makeMap(sourceBatch, map, otherMap) { + for (var i = 0, len = sourceBatch.length; i < len; i++) { + var seriesId = convertOptionIdName(sourceBatch[i].seriesId, null); + + if (seriesId == null) { + return; + } + + var dataIndices = normalizeToArray(sourceBatch[i].dataIndex); + var otherDataIndices = otherMap && otherMap[seriesId]; + + for (var j = 0, lenj = dataIndices.length; j < lenj; j++) { + var dataIndex = dataIndices[j]; + + if (otherDataIndices && otherDataIndices[dataIndex]) { + otherDataIndices[dataIndex] = null; + } else { + (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1; + } + } + } + } + + function mapToArray(map, isData) { + var result = []; + + for (var i in map) { + if (map.hasOwnProperty(i) && map[i] != null) { + if (isData) { + result.push(+i); + } else { + var dataIndices = mapToArray(map[i], true); + dataIndices.length && result.push({ + seriesId: i, + dataIndex: dataIndices + }); + } + } + } + + return result; + } + } + /** + * @param payload Contains dataIndex (means rawIndex) / dataIndexInside / name + * each of which can be Array or primary type. + * @return dataIndex If not found, return undefined/null. + */ + + function queryDataIndex(data, payload) { + if (payload.dataIndexInside != null) { + return payload.dataIndexInside; + } else if (payload.dataIndex != null) { + return isArray(payload.dataIndex) ? map(payload.dataIndex, function (value) { + return data.indexOfRawIndex(value); + }) : data.indexOfRawIndex(payload.dataIndex); + } else if (payload.name != null) { + return isArray(payload.name) ? map(payload.name, function (value) { + return data.indexOfName(value); + }) : data.indexOfName(payload.name); + } + } + /** + * Enable property storage to any host object. + * Notice: Serialization is not supported. + * + * For example: + * let inner = zrUitl.makeInner(); + * + * function some1(hostObj) { + * inner(hostObj).someProperty = 1212; + * ... + * } + * function some2() { + * let fields = inner(this); + * fields.someProperty1 = 1212; + * fields.someProperty2 = 'xx'; + * ... + * } + * + * @return {Function} + */ + + function makeInner() { + var key = '__ec_inner_' + innerUniqueIndex++; + return function (hostObj) { + return hostObj[key] || (hostObj[key] = {}); + }; + } + var innerUniqueIndex = getRandomIdBase(); + /** + * The same behavior as `component.getReferringComponents`. + */ + + function parseFinder(ecModel, finderInput, opt) { + var finder; + + if (isString(finderInput)) { + var obj = {}; + obj[finderInput + 'Index'] = 0; + finder = obj; + } else { + finder = finderInput; + } + + var queryOptionMap = createHashMap(); + var result = {}; + var mainTypeSpecified = false; + each(finder, function (value, key) { + // Exclude 'dataIndex' and other illgal keys. + if (key === 'dataIndex' || key === 'dataIndexInside') { + result[key] = value; + return; + } + + var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || []; + var mainType = parsedKey[1]; + var queryType = (parsedKey[2] || '').toLowerCase(); + + if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) { + return; + } + + mainTypeSpecified = mainTypeSpecified || !!mainType; + var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {}); + queryOption[queryType] = value; + }); + var defaultMainType = opt ? opt.defaultMainType : null; + + if (!mainTypeSpecified && defaultMainType) { + queryOptionMap.set(defaultMainType, {}); + } + + queryOptionMap.each(function (queryOption, mainType) { + var queryResult = queryReferringComponents(ecModel, mainType, queryOption, { + useDefault: defaultMainType === mainType, + enableAll: opt && opt.enableAll != null ? opt.enableAll : true, + enableNone: opt && opt.enableNone != null ? opt.enableNone : true + }); + result[mainType + 'Models'] = queryResult.models; + result[mainType + 'Model'] = queryResult.models[0]; + }); + return result; + } + var SINGLE_REFERRING = { + useDefault: true, + enableAll: false, + enableNone: false + }; + var MULTIPLE_REFERRING = { + useDefault: false, + enableAll: true, + enableNone: true + }; + function queryReferringComponents(ecModel, mainType, userOption, opt) { + opt = opt || SINGLE_REFERRING; + var indexOption = userOption.index; + var idOption = userOption.id; + var nameOption = userOption.name; + var result = { + models: null, + specified: indexOption != null || idOption != null || nameOption != null + }; + + if (!result.specified) { + // Use the first as default if `useDefault`. + var firstCmpt = void 0; + result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : []; + return result; + } + + if (indexOption === 'none' || indexOption === false) { + assert(opt.enableNone, '`"none"` or `false` is not a valid value on index option.'); + result.models = []; + return result; + } // `queryComponents` will return all components if + // both all of index/id/name are null/undefined. + + + if (indexOption === 'all') { + assert(opt.enableAll, '`"all"` is not a valid value on index option.'); + indexOption = idOption = nameOption = null; + } + + result.models = ecModel.queryComponents({ + mainType: mainType, + index: indexOption, + id: idOption, + name: nameOption + }); + return result; + } + function setAttribute(dom, key, value) { + dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value; + } + function getAttribute(dom, key) { + return dom.getAttribute ? dom.getAttribute(key) : dom[key]; + } + function getTooltipRenderMode(renderModeOption) { + if (renderModeOption === 'auto') { + // Using html when `document` exists, use richText otherwise + return env.domSupported ? 'html' : 'richText'; + } else { + return renderModeOption || 'html'; + } + } + /** + * Group a list by key. + */ + + function groupData(array, getKey // return key + ) { + var buckets = createHashMap(); + var keys = []; + each(array, function (item) { + var key = getKey(item); + (buckets.get(key) || (keys.push(key), buckets.set(key, []))).push(item); + }); + return { + keys: keys, + buckets: buckets + }; + } + /** + * Interpolate raw values of a series with percent + * + * @param data data + * @param labelModel label model of the text element + * @param sourceValue start value. May be null/undefined when init. + * @param targetValue end value + * @param percent 0~1 percentage; 0 uses start value while 1 uses end value + * @return interpolated values + * If `sourceValue` and `targetValue` are `number`, return `number`. + * If `sourceValue` and `targetValue` are `string`, return `string`. + * If `sourceValue` and `targetValue` are `(string | number)[]`, return `(string | number)[]`. + * Other cases do not supported. + */ + + function interpolateRawValues(data, precision, sourceValue, targetValue, percent) { + var isAutoPrecision = precision == null || precision === 'auto'; + + if (targetValue == null) { + return targetValue; + } + + if (typeof targetValue === 'number') { + var value = interpolateNumber(sourceValue || 0, targetValue, percent); + return round(value, isAutoPrecision ? Math.max(getPrecisionSafe(sourceValue || 0), getPrecisionSafe(targetValue)) : precision); + } else if (typeof targetValue === 'string') { + return percent < 1 ? sourceValue : targetValue; + } else { + var interpolated = []; + var leftArr = sourceValue; + var rightArr = targetValue; + var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length); + + for (var i = 0; i < length_1; ++i) { + var info = data.getDimensionInfo(i); // Don't interpolate ordinal dims + + if (info.type === 'ordinal') { + // In init, there is no `sourceValue`, but should better not to get undefined result. + interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i]; + } else { + var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0; + var rightVal = rightArr[i]; + var value = interpolateNumber(leftVal, rightVal, percent); + interpolated[i] = round(value, isAutoPrecision ? Math.max(getPrecisionSafe(leftVal), getPrecisionSafe(rightVal)) : precision); + } + } + + return interpolated; + } + } + + var TYPE_DELIMITER = '.'; + var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___'; + var IS_EXTENDED_CLASS = '___EC__EXTENDED_CLASS___'; + /** + * Notice, parseClassType('') should returns {main: '', sub: ''} + * @public + */ + + function parseClassType(componentType) { + var ret = { + main: '', + sub: '' + }; + + if (componentType) { + var typeArr = componentType.split(TYPE_DELIMITER); + ret.main = typeArr[0] || ''; + ret.sub = typeArr[1] || ''; + } + + return ret; + } + /** + * @public + */ + + function checkClassType(componentType) { + assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType "' + componentType + '" illegal'); + } + + function isExtendedClass(clz) { + return !!(clz && clz[IS_EXTENDED_CLASS]); + } + /** + * Implements `ExtendableConstructor` for `rootClz`. + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & ExtendableConstructor + * enableClassExtend(Xxx as XxxConstructor); + * ``` + */ + + function enableClassExtend(rootClz, mandatoryMethods) { + rootClz.$constructor = rootClz; // FIXME: not necessary? + + rootClz.extend = function (proto) { + if ("development" !== 'production') { + each(mandatoryMethods, function (method) { + if (!proto[method]) { + console.warn('Method `' + method + '` should be implemented' + (proto.type ? ' in ' + proto.type : '') + '.'); + } + }); + } + + var superClass = this; // For backward compat, we both support ts class inheritance and this + // "extend" approach. + // The constructor should keep the same behavior as ts class inheritance: + // If this constructor/$constructor is not declared, auto invoke the super + // constructor. + // If this constructor/$constructor is declared, it is responsible for + // calling the super constructor. + + function ExtendedClass() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + if (!proto.$constructor) { + if (!isESClass(superClass)) { + // Will throw error if superClass is an es6 native class. + superClass.apply(this, arguments); + } else { + var ins = createObject( // @ts-ignore + ExtendedClass.prototype, new (superClass.bind.apply(superClass, __spreadArrays([void 0], args)))()); + return ins; + } + } else { + proto.$constructor.apply(this, arguments); + } + } + + ExtendedClass[IS_EXTENDED_CLASS] = true; + extend(ExtendedClass.prototype, proto); + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + inherits(ExtendedClass, this); + ExtendedClass.superClass = superClass; + return ExtendedClass; + }; + } + + function isESClass(fn) { + return typeof fn === 'function' && /^class\s/.test(Function.prototype.toString.call(fn)); + } + /** + * A work around to both support ts extend and this extend mechanism. + * on sub-class. + * @usage + * ```ts + * class Component { ... } + * classUtil.enableClassExtend(Component); + * classUtil.enableClassManagement(Component, {registerWhenExtend: true}); + * + * class Series extends Component { ... } + * // Without calling `markExtend`, `registerWhenExtend` will not work. + * Component.markExtend(Series); + * ``` + */ + + + function mountExtend(SubClz, SupperClz) { + SubClz.extend = SupperClz.extend; + } // A random offset. + + var classBase = Math.round(Math.random() * 10); + /** + * Implements `CheckableConstructor` for `target`. + * Can not use instanceof, consider different scope by + * cross domain or es module import in ec extensions. + * Mount a method "isInstance()" to Clz. + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & CheckableConstructor; + * enableClassCheck(Xxx as XxxConstructor) + * ``` + */ + + function enableClassCheck(target) { + var classAttr = ['__\0is_clz', classBase++].join('_'); + target.prototype[classAttr] = true; + + if ("development" !== 'production') { + assert(!target.isInstance, 'The method "is" can not be defined.'); + } + + target.isInstance = function (obj) { + return !!(obj && obj[classAttr]); + }; + } // 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 = []; + + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + + return this.superClass.prototype[methodName].apply(context, args); + } + + function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); + } + /** + * Implements `ClassManager` for `target` + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & ClassManager + * enableClassManagement(Xxx as XxxConstructor); + * ``` + */ + + + function enableClassManagement(target) { + /** + * Component model classes + * key: componentType, + * value: + * componentClass, when componentType is 'xxx' + * or Object., when componentType is 'xxx.yy' + */ + var storage = {}; + + target.registerClass = function (clz) { + // `type` should not be a "instance memeber". + // If using TS class, should better declared as `static type = 'series.pie'`. + // otherwise users have to mount `type` on prototype manually. + // For backward compat and enable instance visit type via `this.type`, + // we stil support fetch `type` from prototype. + var componentFullType = clz.type || clz.prototype.type; + + if (componentFullType) { + checkClassType(componentFullType); // If only static type declared, we assign it to prototype mandatorily. + + clz.prototype.type = componentFullType; + var componentTypeInfo = parseClassType(componentFullType); + + if (!componentTypeInfo.sub) { + if ("development" !== 'production') { + if (storage[componentTypeInfo.main]) { + console.warn(componentTypeInfo.main + ' exists.'); + } + } + + storage[componentTypeInfo.main] = clz; + } else if (componentTypeInfo.sub !== IS_CONTAINER) { + var container = makeContainer(componentTypeInfo); + container[componentTypeInfo.sub] = clz; + } + } + + return clz; + }; + + target.getClass = function (mainType, subType, throwWhenNotFound) { + var clz = storage[mainType]; + + if (clz && clz[IS_CONTAINER]) { + clz = subType ? clz[subType] : null; + } + + if (throwWhenNotFound && !clz) { + throw new Error(!subType ? mainType + '.' + 'type should be specified.' : 'Component ' + mainType + '.' + (subType || '') + ' not exists. Load it first.'); + } + + return clz; + }; + + target.getClassesByMainType = function (componentType) { + var componentTypeInfo = parseClassType(componentType); + var result = []; + var obj = storage[componentTypeInfo.main]; + + if (obj && obj[IS_CONTAINER]) { + each(obj, function (o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } else { + result.push(obj); + } + + return result; + }; + + target.hasClass = function (componentType) { + // Just consider componentType.main. + var componentTypeInfo = parseClassType(componentType); + return !!storage[componentTypeInfo.main]; + }; + /** + * @return Like ['aa', 'bb'], but can not be ['aa.xx'] + */ + + + target.getAllClassMainTypes = function () { + var types = []; + each(storage, function (obj, type) { + types.push(type); + }); + return types; + }; + /** + * If a main type is container and has sub types + */ + + + target.hasSubTypes = function (componentType) { + var componentTypeInfo = parseClassType(componentType); + var obj = storage[componentTypeInfo.main]; + return obj && obj[IS_CONTAINER]; + }; + + function makeContainer(componentTypeInfo) { + var container = storage[componentTypeInfo.main]; + + if (!container || !container[IS_CONTAINER]) { + container = storage[componentTypeInfo.main] = {}; + container[IS_CONTAINER] = true; + } + + return container; + } + } // /** + // * @param {string|Array.} properties + // */ + // export function setReadOnly(obj, properties) { + // FIXME It seems broken in IE8 simulation of IE11 + // if (!zrUtil.isArray(properties)) { + // properties = properties != null ? [properties] : []; + // } + // zrUtil.each(properties, function (prop) { + // let value = obj[prop]; + // Object.defineProperty + // && Object.defineProperty(obj, prop, { + // value: value, writable: false + // }); + // zrUtil.isArray(obj[prop]) + // && Object.freeze + // && Object.freeze(obj[prop]); + // }); + // } + + function makeStyleMapper(properties, ignoreParent) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + + ignoreParent = ignoreParent || false; + return function (model, excludes, includes) { + var style = {}; + + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + + if (excludes && indexOf(excludes, propName) >= 0 || includes && indexOf(includes, propName) < 0) { + continue; + } + + var val = model.getShallow(propName, ignoreParent); + + if (val != null) { + style[properties[i][0]] = val; + } + } // TODO Text or image? + + + return style; + }; + } + + var AREA_STYLE_KEY_MAP = [['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getAreaStyle = makeStyleMapper(AREA_STYLE_KEY_MAP); + + var AreaStyleMixin = + /** @class */ + function () { + function AreaStyleMixin() {} + + AreaStyleMixin.prototype.getAreaStyle = function (excludes, includes) { + return getAreaStyle(this, excludes, includes); + }; + + return AreaStyleMixin; + }(); + + var globalImageCache = new LRU(50); + function findExistImage(newImageOrSrc) { + if (typeof newImageOrSrc === 'string') { + var cachedImgObj = globalImageCache.get(newImageOrSrc); + return cachedImgObj && cachedImgObj.image; + } + else { + return newImageOrSrc; + } + } + function createOrUpdateImage(newImageOrSrc, image, hostEl, onload, cbPayload) { + if (!newImageOrSrc) { + return image; + } + else if (typeof newImageOrSrc === 'string') { + if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) { + return image; + } + var cachedImgObj = globalImageCache.get(newImageOrSrc); + var pendingWrap = { hostEl: hostEl, cb: onload, cbPayload: cbPayload }; + if (cachedImgObj) { + image = cachedImgObj.image; + !isImageReady(image) && cachedImgObj.pending.push(pendingWrap); + } + else { + image = new Image(); + image.onload = image.onerror = imageOnLoad; + globalImageCache.put(newImageOrSrc, image.__cachedImgObj = { + image: image, + pending: [pendingWrap] + }); + image.src = image.__zrImageSrc = newImageOrSrc; + } + return image; + } + else { + return newImageOrSrc; + } + } + function imageOnLoad() { + var cachedImgObj = this.__cachedImgObj; + this.onload = this.onerror = this.__cachedImgObj = null; + for (var i = 0; i < cachedImgObj.pending.length; i++) { + var pendingWrap = cachedImgObj.pending[i]; + var cb = pendingWrap.cb; + cb && cb(this, pendingWrap.cbPayload); + pendingWrap.hostEl.dirty(); + } + cachedImgObj.pending.length = 0; + } + function isImageReady(image) { + return image && image.width && image.height; + } + + var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g; + function truncateText(text, containerWidth, font, ellipsis, options) { + if (!containerWidth) { + return ''; + } + var textLines = (text + '').split('\n'); + options = prepareTruncateOptions(containerWidth, font, ellipsis, options); + for (var i = 0, len = textLines.length; i < len; i++) { + textLines[i] = truncateSingleLine(textLines[i], options); + } + return textLines.join('\n'); + } + function prepareTruncateOptions(containerWidth, font, ellipsis, options) { + options = options || {}; + var preparedOpts = extend({}, options); + preparedOpts.font = font; + ellipsis = retrieve2(ellipsis, '...'); + preparedOpts.maxIterations = retrieve2(options.maxIterations, 2); + var minChar = preparedOpts.minChar = retrieve2(options.minChar, 0); + preparedOpts.cnCharWidth = getWidth('国', font); + var ascCharWidth = preparedOpts.ascCharWidth = getWidth('a', font); + preparedOpts.placeholder = retrieve2(options.placeholder, ''); + var contentWidth = containerWidth = Math.max(0, containerWidth - 1); + for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) { + contentWidth -= ascCharWidth; + } + var ellipsisWidth = getWidth(ellipsis, font); + if (ellipsisWidth > contentWidth) { + ellipsis = ''; + ellipsisWidth = 0; + } + contentWidth = containerWidth - ellipsisWidth; + preparedOpts.ellipsis = ellipsis; + preparedOpts.ellipsisWidth = ellipsisWidth; + preparedOpts.contentWidth = contentWidth; + preparedOpts.containerWidth = containerWidth; + return preparedOpts; + } + function truncateSingleLine(textLine, options) { + var containerWidth = options.containerWidth; + var font = options.font; + var contentWidth = options.contentWidth; + if (!containerWidth) { + return ''; + } + var lineWidth = getWidth(textLine, font); + if (lineWidth <= containerWidth) { + return textLine; + } + for (var j = 0;; j++) { + if (lineWidth <= contentWidth || j >= options.maxIterations) { + textLine += options.ellipsis; + break; + } + var subLength = j === 0 + ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth) + : lineWidth > 0 + ? Math.floor(textLine.length * contentWidth / lineWidth) + : 0; + textLine = textLine.substr(0, subLength); + lineWidth = getWidth(textLine, font); + } + if (textLine === '') { + textLine = options.placeholder; + } + return textLine; + } + function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < contentWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth; + } + return i; + } + function parsePlainText(text, style) { + text != null && (text += ''); + var overflow = style.overflow; + var padding = style.padding; + var font = style.font; + var truncate = overflow === 'truncate'; + var calculatedLineHeight = getLineHeight(font); + var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight); + var truncateLineOverflow = style.lineOverflow === 'truncate'; + var width = style.width; + var lines; + if (width != null && overflow === 'break' || overflow === 'breakAll') { + lines = text ? wrapText(text, style.font, width, overflow === 'breakAll', 0).lines : []; + } + else { + lines = text ? text.split('\n') : []; + } + var contentHeight = lines.length * lineHeight; + var height = retrieve2(style.height, contentHeight); + if (contentHeight > height && truncateLineOverflow) { + var lineCount = Math.floor(height / lineHeight); + lines = lines.slice(0, lineCount); + } + var outerHeight = height; + var outerWidth = width; + if (padding) { + outerHeight += padding[0] + padding[2]; + if (outerWidth != null) { + outerWidth += padding[1] + padding[3]; + } + } + if (text && truncate && outerWidth != null) { + var options = prepareTruncateOptions(width, font, style.ellipsis, { + minChar: style.truncateMinChar, + placeholder: style.placeholder + }); + for (var i = 0; i < lines.length; i++) { + lines[i] = truncateSingleLine(lines[i], options); + } + } + if (width == null) { + var maxWidth = 0; + for (var i = 0; i < lines.length; i++) { + maxWidth = Math.max(getWidth(lines[i], font), maxWidth); + } + width = maxWidth; + } + return { + lines: lines, + height: height, + outerHeight: outerHeight, + lineHeight: lineHeight, + calculatedLineHeight: calculatedLineHeight, + contentHeight: contentHeight, + width: width + }; + } + var RichTextToken = (function () { + function RichTextToken() { + } + return RichTextToken; + }()); + var RichTextLine = (function () { + function RichTextLine(tokens) { + this.tokens = []; + if (tokens) { + this.tokens = tokens; + } + } + return RichTextLine; + }()); + var RichTextContentBlock = (function () { + function RichTextContentBlock() { + this.width = 0; + this.height = 0; + this.contentWidth = 0; + this.contentHeight = 0; + this.outerWidth = 0; + this.outerHeight = 0; + this.lines = []; + } + return RichTextContentBlock; + }()); + function parseRichText(text, style) { + var contentBlock = new RichTextContentBlock(); + text != null && (text += ''); + if (!text) { + return contentBlock; + } + var topWidth = style.width; + var topHeight = style.height; + var overflow = style.overflow; + var wrapInfo = (overflow === 'break' || overflow === 'breakAll') && topWidth != null + ? { width: topWidth, accumWidth: 0, breakAll: overflow === 'breakAll' } + : null; + var lastIndex = STYLE_REG.lastIndex = 0; + var result; + while ((result = STYLE_REG.exec(text)) != null) { + var matchedIndex = result.index; + if (matchedIndex > lastIndex) { + pushTokens(contentBlock, text.substring(lastIndex, matchedIndex), style, wrapInfo); + } + pushTokens(contentBlock, result[2], style, wrapInfo, result[1]); + lastIndex = STYLE_REG.lastIndex; + } + if (lastIndex < text.length) { + pushTokens(contentBlock, text.substring(lastIndex, text.length), style, wrapInfo); + } + var pendingList = []; + var calculatedHeight = 0; + var calculatedWidth = 0; + var stlPadding = style.padding; + var truncate = overflow === 'truncate'; + var truncateLine = style.lineOverflow === 'truncate'; + function finishLine(line, lineWidth, lineHeight) { + line.width = lineWidth; + line.lineHeight = lineHeight; + calculatedHeight += lineHeight; + calculatedWidth = Math.max(calculatedWidth, lineWidth); + } + outer: for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var lineHeight = 0; + var lineWidth = 0; + for (var j = 0; j < line.tokens.length; j++) { + var token = line.tokens[j]; + var tokenStyle = token.styleName && style.rich[token.styleName] || {}; + var textPadding = token.textPadding = tokenStyle.padding; + var paddingH = textPadding ? textPadding[1] + textPadding[3] : 0; + var font = token.font = tokenStyle.font || style.font; + token.contentHeight = getLineHeight(font); + var tokenHeight = retrieve2(tokenStyle.height, token.contentHeight); + token.innerHeight = tokenHeight; + textPadding && (tokenHeight += textPadding[0] + textPadding[2]); + token.height = tokenHeight; + token.lineHeight = retrieve3(tokenStyle.lineHeight, style.lineHeight, tokenHeight); + token.align = tokenStyle && tokenStyle.align || style.align; + token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle'; + if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) { + if (j > 0) { + line.tokens = line.tokens.slice(0, j); + finishLine(line, lineWidth, lineHeight); + contentBlock.lines = contentBlock.lines.slice(0, i + 1); + } + else { + contentBlock.lines = contentBlock.lines.slice(0, i); + } + break outer; + } + var styleTokenWidth = tokenStyle.width; + var tokenWidthNotSpecified = styleTokenWidth == null || styleTokenWidth === 'auto'; + if (typeof styleTokenWidth === 'string' && styleTokenWidth.charAt(styleTokenWidth.length - 1) === '%') { + token.percentWidth = styleTokenWidth; + pendingList.push(token); + token.contentWidth = getWidth(token.text, font); + } + else { + if (tokenWidthNotSpecified) { + var textBackgroundColor = tokenStyle.backgroundColor; + var bgImg = textBackgroundColor && textBackgroundColor.image; + if (bgImg) { + bgImg = findExistImage(bgImg); + if (isImageReady(bgImg)) { + token.width = Math.max(token.width, bgImg.width * tokenHeight / bgImg.height); + } + } + } + var remainTruncWidth = truncate && topWidth != null + ? topWidth - lineWidth : null; + if (remainTruncWidth != null && remainTruncWidth < token.width) { + if (!tokenWidthNotSpecified || remainTruncWidth < paddingH) { + token.text = ''; + token.width = token.contentWidth = 0; + } + else { + token.text = truncateText(token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar }); + token.width = token.contentWidth = getWidth(token.text, font); + } + } + else { + token.contentWidth = getWidth(token.text, font); + } + } + token.width += paddingH; + lineWidth += token.width; + tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight)); + } + finishLine(line, lineWidth, lineHeight); + } + contentBlock.outerWidth = contentBlock.width = retrieve2(topWidth, calculatedWidth); + contentBlock.outerHeight = contentBlock.height = retrieve2(topHeight, calculatedHeight); + contentBlock.contentHeight = calculatedHeight; + contentBlock.contentWidth = calculatedWidth; + if (stlPadding) { + contentBlock.outerWidth += stlPadding[1] + stlPadding[3]; + contentBlock.outerHeight += stlPadding[0] + stlPadding[2]; + } + for (var i = 0; i < pendingList.length; i++) { + var token = pendingList[i]; + var percentWidth = token.percentWidth; + token.width = parseInt(percentWidth, 10) / 100 * contentBlock.width; + } + return contentBlock; + } + function pushTokens(block, str, style, wrapInfo, styleName) { + var isEmptyStr = str === ''; + var tokenStyle = styleName && style.rich[styleName] || {}; + var lines = block.lines; + var font = tokenStyle.font || style.font; + var newLine = false; + var strLines; + var linesWidths; + if (wrapInfo) { + var tokenPadding = tokenStyle.padding; + var tokenPaddingH = tokenPadding ? tokenPadding[1] + tokenPadding[3] : 0; + if (tokenStyle.width != null && tokenStyle.width !== 'auto') { + var outerWidth_1 = parsePercent$2(tokenStyle.width, wrapInfo.width) + tokenPaddingH; + if (lines.length > 0) { + if (outerWidth_1 + wrapInfo.accumWidth > wrapInfo.width) { + strLines = str.split('\n'); + newLine = true; + } + } + wrapInfo.accumWidth = outerWidth_1; + } + else { + var res = wrapText(str, font, wrapInfo.width, wrapInfo.breakAll, wrapInfo.accumWidth); + wrapInfo.accumWidth = res.accumWidth + tokenPaddingH; + linesWidths = res.linesWidths; + strLines = res.lines; + } + } + else { + strLines = str.split('\n'); + } + for (var i = 0; i < strLines.length; i++) { + var text = strLines[i]; + var token = new RichTextToken(); + token.styleName = styleName; + token.text = text; + token.isLineHolder = !text && !isEmptyStr; + if (typeof tokenStyle.width === 'number') { + token.width = tokenStyle.width; + } + else { + token.width = linesWidths + ? linesWidths[i] + : getWidth(text, font); + } + if (!i && !newLine) { + var tokens = (lines[lines.length - 1] || (lines[0] = new RichTextLine())).tokens; + var tokensLen = tokens.length; + (tokensLen === 1 && tokens[0].isLineHolder) + ? (tokens[0] = token) + : ((text || !tokensLen || isEmptyStr) && tokens.push(token)); + } + else { + lines.push(new RichTextLine([token])); + } + } + } + function isLatin(ch) { + var code = ch.charCodeAt(0); + return code >= 0x21 && code <= 0xFF; + } + var breakCharMap = reduce(',&?/;] '.split(''), function (obj, ch) { + obj[ch] = true; + return obj; + }, {}); + function isWordBreakChar(ch) { + if (isLatin(ch)) { + if (breakCharMap[ch]) { + return true; + } + return false; + } + return true; + } + function wrapText(text, font, lineWidth, isBreakAll, lastAccumWidth) { + var lines = []; + var linesWidths = []; + var line = ''; + var currentWord = ''; + var currentWordWidth = 0; + var accumWidth = 0; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch === '\n') { + if (currentWord) { + line += currentWord; + accumWidth += currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ''; + currentWord = ''; + currentWordWidth = 0; + accumWidth = 0; + continue; + } + var chWidth = getWidth(ch, font); + var inWord = isBreakAll ? false : !isWordBreakChar(ch); + if (!lines.length + ? lastAccumWidth + accumWidth + chWidth > lineWidth + : accumWidth + chWidth > lineWidth) { + if (!accumWidth) { + if (inWord) { + lines.push(currentWord); + linesWidths.push(currentWordWidth); + currentWord = ch; + currentWordWidth = chWidth; + } + else { + lines.push(ch); + linesWidths.push(chWidth); + } + } + else if (line || currentWord) { + if (inWord) { + if (!line) { + line = currentWord; + currentWord = ''; + currentWordWidth = 0; + accumWidth = currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth - currentWordWidth); + currentWord += ch; + currentWordWidth += chWidth; + line = ''; + accumWidth = currentWordWidth; + } + else { + if (currentWord) { + line += currentWord; + accumWidth += currentWordWidth; + currentWord = ''; + currentWordWidth = 0; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ch; + accumWidth = chWidth; + } + } + continue; + } + accumWidth += chWidth; + if (inWord) { + currentWord += ch; + currentWordWidth += chWidth; + } + else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + line += ch; + } + } + if (!lines.length && !line) { + line = text; + currentWord = ''; + currentWordWidth = 0; + } + if (currentWord) { + line += currentWord; + } + if (line) { + lines.push(line); + linesWidths.push(accumWidth); + } + if (lines.length === 1) { + accumWidth += lastAccumWidth; + } + return { + accumWidth: accumWidth, + lines: lines, + linesWidths: linesWidths + }; + } + function parsePercent$2(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + } + + var STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10)); + var DEFAULT_COMMON_STYLE = { + shadowBlur: 0, + shadowOffsetX: 0, + shadowOffsetY: 0, + shadowColor: '#000', + opacity: 1, + blend: 'source-over' + }; + var DEFAULT_COMMON_ANIMATION_PROPS = { + style: { + shadowBlur: true, + shadowOffsetX: true, + shadowOffsetY: true, + shadowColor: true, + opacity: true + } + }; + DEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true; + var PRIMARY_STATES_KEYS$1 = ['z', 'z2', 'invisible']; + var Displayable = (function (_super) { + __extends(Displayable, _super); + function Displayable(props) { + return _super.call(this, props) || this; + } + Displayable.prototype._init = function (props) { + var keysArr = keys(props); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if (key === 'style') { + this.useStyle(props[key]); + } + else { + _super.prototype.attrKV.call(this, key, props[key]); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Displayable.prototype.beforeBrush = function () { }; + Displayable.prototype.afterBrush = function () { }; + Displayable.prototype.innerBeforeBrush = function () { }; + Displayable.prototype.innerAfterBrush = function () { }; + Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) { + var m = this.transform; + if (this.ignore + || this.invisible + || this.style.opacity === 0 + || (this.culling + && isDisplayableCulled(this, viewWidth, viewHeight)) + || (m && !m[0] && !m[3])) { + return false; + } + if (considerClipPath && this.__clipPaths) { + for (var i = 0; i < this.__clipPaths.length; ++i) { + if (this.__clipPaths[i].isZeroArea()) { + return false; + } + } + } + if (considerAncestors && this.parent) { + var parent_1 = this.parent; + while (parent_1) { + if (parent_1.ignore) { + return false; + } + parent_1 = parent_1.parent; + } + } + return true; + }; + Displayable.prototype.contain = function (x, y) { + return this.rectContain(x, y); + }; + Displayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + Displayable.prototype.rectContain = function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }; + Displayable.prototype.getPaintRect = function () { + var rect = this._paintRect; + if (!this._paintRect || this.__dirty) { + var transform = this.transform; + var elRect = this.getBoundingRect(); + var style = this.style; + var shadowSize = style.shadowBlur || 0; + var shadowOffsetX = style.shadowOffsetX || 0; + var shadowOffsetY = style.shadowOffsetY || 0; + rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0)); + if (transform) { + BoundingRect.applyTransform(rect, elRect, transform); + } + else { + rect.copy(elRect); + } + if (shadowSize || shadowOffsetX || shadowOffsetY) { + rect.width += shadowSize * 2 + Math.abs(shadowOffsetX); + rect.height += shadowSize * 2 + Math.abs(shadowOffsetY); + rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize); + rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize); + } + var tolerance = this.dirtyRectTolerance; + if (!rect.isZero()) { + rect.x = Math.floor(rect.x - tolerance); + rect.y = Math.floor(rect.y - tolerance); + rect.width = Math.ceil(rect.width + 1 + tolerance * 2); + rect.height = Math.ceil(rect.height + 1 + tolerance * 2); + } + } + return rect; + }; + Displayable.prototype.setPrevPaintRect = function (paintRect) { + if (paintRect) { + this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0); + this._prevPaintRect.copy(paintRect); + } + else { + this._prevPaintRect = null; + } + }; + Displayable.prototype.getPrevPaintRect = function () { + return this._prevPaintRect; + }; + Displayable.prototype.animateStyle = function (loop) { + return this.animate('style', loop); + }; + Displayable.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } + else { + this.markRedraw(); + } + }; + Displayable.prototype.attrKV = function (key, value) { + if (key !== 'style') { + _super.prototype.attrKV.call(this, key, value); + } + else { + if (!this.style) { + this.useStyle(value); + } + else { + this.setStyle(value); + } + } + }; + Displayable.prototype.setStyle = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.style[keyOrObj] = value; + } + else { + extend(this.style, keyOrObj); + } + this.dirtyStyle(); + return this; + }; + Displayable.prototype.dirtyStyle = function () { + this.markRedraw(); + this.__dirty |= Displayable.STYLE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + }; + Displayable.prototype.dirty = function () { + this.dirtyStyle(); + }; + Displayable.prototype.styleChanged = function () { + return !!(this.__dirty & Displayable.STYLE_CHANGED_BIT); + }; + Displayable.prototype.styleUpdated = function () { + this.__dirty &= ~Displayable.STYLE_CHANGED_BIT; + }; + Displayable.prototype.createStyle = function (obj) { + return createObject(DEFAULT_COMMON_STYLE, obj); + }; + Displayable.prototype.useStyle = function (obj) { + if (!obj[STYLE_MAGIC_KEY]) { + obj = this.createStyle(obj); + } + if (this.__inHover) { + this.__hoverStyle = obj; + } + else { + this.style = obj; + } + this.dirtyStyle(); + }; + Displayable.prototype.isStyleObject = function (obj) { + return obj[STYLE_MAGIC_KEY]; + }; + Displayable.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.style && !normalState.style) { + normalState.style = this._mergeStyle(this.createStyle(), this.style); + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS$1); + }; + Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetStyle; + if (state && state.style) { + if (transition) { + if (keepCurrentStates) { + targetStyle = state.style; + } + else { + targetStyle = this._mergeStyle(this.createStyle(), normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } + else { + targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } + else if (needsRestoreToNormal) { + targetStyle = normalState.style; + } + if (targetStyle) { + if (transition) { + var sourceStyle = this.style; + this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle); + if (needsRestoreToNormal) { + var changedKeys = keys(sourceStyle); + for (var i = 0; i < changedKeys.length; i++) { + var key = changedKeys[i]; + if (key in targetStyle) { + targetStyle[key] = targetStyle[key]; + this.style[key] = sourceStyle[key]; + } + } + } + var targetKeys = keys(targetStyle); + for (var i = 0; i < targetKeys.length; i++) { + var key = targetKeys[i]; + this.style[key] = this.style[key]; + } + this._transitionState(stateName, { + style: targetStyle + }, animationCfg, this.getAnimationStyleProps()); + } + else { + this.useStyle(targetStyle); + } + } + for (var i = 0; i < PRIMARY_STATES_KEYS$1.length; i++) { + var key = PRIMARY_STATES_KEYS$1[i]; + if (state && state[key] != null) { + this[key] = state[key]; + } + else if (needsRestoreToNormal) { + if (normalState[key] != null) { + this[key] = normalState[key]; + } + } + } + }; + Displayable.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedStyle; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.style) { + mergedStyle = mergedStyle || {}; + this._mergeStyle(mergedStyle, state.style); + } + } + if (mergedStyle) { + mergedState.style = mergedStyle; + } + return mergedState; + }; + Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) { + extend(targetStyle, sourceStyle); + return targetStyle; + }; + Displayable.prototype.getAnimationStyleProps = function () { + return DEFAULT_COMMON_ANIMATION_PROPS; + }; + Displayable.STYLE_CHANGED_BIT = 2; + Displayable.initDefaultProps = (function () { + var dispProto = Displayable.prototype; + dispProto.type = 'displayable'; + dispProto.invisible = false; + dispProto.z = 0; + dispProto.z2 = 0; + dispProto.zlevel = 0; + dispProto.culling = false; + dispProto.cursor = 'pointer'; + dispProto.rectHover = false; + dispProto.incremental = false; + dispProto._rect = null; + dispProto.dirtyRectTolerance = 0; + dispProto.__dirty = Element.REDARAW_BIT | Displayable.STYLE_CHANGED_BIT; + })(); + return Displayable; + }(Element)); + 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); + } + + var mathPow = Math.pow; + var mathSqrt = Math.sqrt; + var EPSILON$1 = 1e-8; + var EPSILON_NUMERIC = 1e-4; + var THREE_SQRT = mathSqrt(3); + var ONE_THIRD = 1 / 3; + var _v0 = create(); + var _v1 = create(); + var _v2 = create(); + function isAroundZero(val) { + return val > -EPSILON$1 && val < EPSILON$1; + } + function isNotAroundZero$1(val) { + return val > EPSILON$1 || val < -EPSILON$1; + } + 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); + } + 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); + } + function cubicRootAt(p0, p1, p2, p3, val, roots) { + 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; + 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; + var t2 = -K / 2; + 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; + } + 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$1(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; + } + 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; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + _v0[0] = x; + _v0[1] = y; + 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 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + if (out) { + out[0] = cubicAt(x0, x1, x2, x3, t); + out[1] = cubicAt(y0, y1, y2, y3, t); + } + return mathSqrt(d); + } + function cubicLength(x0, y0, x1, y1, x2, y2, x3, y3, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = cubicAt(x0, x1, x2, x3, t); + var y = cubicAt(y0, y1, y2, y3, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; + } + function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + 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$1(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; + } + function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + return 0.5; + } + else { + return (p0 - p1) / divider; + } + } + 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; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p012; + out[4] = p12; + out[5] = p2; + } + function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + _v0[0] = x; + _v0[1] = y; + 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 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + var d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + if (out) { + out[0] = quadraticAt(x0, x1, x2, t); + out[1] = quadraticAt(y0, y1, y2, t); + } + return mathSqrt(d); + } + function quadraticLength(x0, y0, x1, y1, x2, y2, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = quadraticAt(x0, x1, x2, t); + var y = quadraticAt(y0, y1, y2, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; + } + + var mathMin$1 = Math.min; + var mathMax$1 = Math.max; + var mathSin = Math.sin; + var mathCos = Math.cos; + var PI2 = Math.PI * 2; + var start = create(); + var end = create(); + var extremity = create(); + function fromPoints(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]; + for (var i = 1; i < points.length; i++) { + p = points[i]; + left = mathMin$1(left, p[0]); + right = mathMax$1(right, p[0]); + top = mathMin$1(top, p[1]); + bottom = mathMax$1(bottom, p[1]); + } + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + } + function fromLine(x0, y0, x1, y1, min, max) { + min[0] = mathMin$1(x0, x1); + min[1] = mathMin$1(y0, y1); + max[0] = mathMax$1(x0, x1); + max[1] = mathMax$1(y0, y1); + } + var xDim = []; + var yDim = []; + function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) { + var cubicExtrema$1 = cubicExtrema; + var cubicAt$1 = cubicAt; + var n = cubicExtrema$1(x0, x1, x2, x3, xDim); + min[0] = Infinity; + min[1] = Infinity; + max[0] = -Infinity; + max[1] = -Infinity; + for (var i = 0; i < n; i++) { + var x = cubicAt$1(x0, x1, x2, x3, xDim[i]); + min[0] = mathMin$1(x, min[0]); + max[0] = mathMax$1(x, max[0]); + } + n = cubicExtrema$1(y0, y1, y2, y3, yDim); + for (var i = 0; i < n; i++) { + var y = cubicAt$1(y0, y1, y2, y3, yDim[i]); + min[1] = mathMin$1(y, min[1]); + max[1] = mathMax$1(y, max[1]); + } + min[0] = mathMin$1(x0, min[0]); + max[0] = mathMax$1(x0, max[0]); + min[0] = mathMin$1(x3, min[0]); + max[0] = mathMax$1(x3, max[0]); + min[1] = mathMin$1(y0, min[1]); + max[1] = mathMax$1(y0, max[1]); + min[1] = mathMin$1(y3, min[1]); + max[1] = mathMax$1(y3, max[1]); + } + function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) { + var quadraticExtremum$1 = quadraticExtremum; + var quadraticAt$1 = quadraticAt; + var tx = mathMax$1(mathMin$1(quadraticExtremum$1(x0, x1, x2), 1), 0); + var ty = mathMax$1(mathMin$1(quadraticExtremum$1(y0, y1, y2), 1), 0); + var x = quadraticAt$1(x0, x1, x2, tx); + var y = quadraticAt$1(y0, y1, y2, ty); + min[0] = mathMin$1(x0, x2, x); + min[1] = mathMin$1(y0, y2, y); + max[0] = mathMax$1(x0, x2, x); + max[1] = mathMax$1(y0, y2, y); + } + function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min$1, max$1) { + var vec2Min = min; + var vec2Max = max; + var diff = Math.abs(startAngle - endAngle); + if (diff % PI2 < 1e-4 && diff > 1e-4) { + min$1[0] = x - rx; + min$1[1] = y - ry; + max$1[0] = x + rx; + max$1[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$1, start, end); + vec2Max(max$1, start, end); + 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; + } + 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$1, extremity, min$1); + vec2Max(max$1, extremity, max$1); + } + } + } + + var CMD = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + R: 7 + }; + var tmpOutX = []; + var tmpOutY = []; + var min$1 = []; + var max$1 = []; + var min2 = []; + var max2 = []; + var mathMin$2 = Math.min; + var mathMax$2 = Math.max; + var mathCos$1 = Math.cos; + var mathSin$1 = Math.sin; + var mathSqrt$1 = Math.sqrt; + var mathAbs = Math.abs; + var PI = Math.PI; + var PI2$1 = PI * 2; + var hasTypedArray = typeof Float32Array !== 'undefined'; + var tmpAngles = []; + function modPI2(radian) { + var n = Math.round(radian / PI * 1e8) / 1e8; + return (n % 2) * PI; + } + function normalizeArcAngles(angles, anticlockwise) { + var newStartAngle = modPI2(angles[0]); + if (newStartAngle < 0) { + newStartAngle += PI2$1; + } + var delta = newStartAngle - angles[0]; + var newEndAngle = angles[1]; + newEndAngle += delta; + if (!anticlockwise && newEndAngle - newStartAngle >= PI2$1) { + newEndAngle = newStartAngle + PI2$1; + } + else if (anticlockwise && newStartAngle - newEndAngle >= PI2$1) { + newEndAngle = newStartAngle - PI2$1; + } + else if (!anticlockwise && newStartAngle > newEndAngle) { + newEndAngle = newStartAngle + + (PI2$1 - modPI2(newStartAngle - newEndAngle)); + } + else if (anticlockwise && newStartAngle < newEndAngle) { + newEndAngle = newStartAngle - + (PI2$1 - modPI2(newEndAngle - newStartAngle)); + } + angles[0] = newStartAngle; + angles[1] = newEndAngle; + } + var PathProxy = (function () { + function PathProxy(notSaveData) { + this.dpr = 1; + this._version = 0; + this._xi = 0; + this._yi = 0; + this._x0 = 0; + this._y0 = 0; + this._len = 0; + if (notSaveData) { + this._saveData = false; + } + if (this._saveData) { + this.data = []; + } + } + PathProxy.prototype.increaseVersion = function () { + this._version++; + }; + PathProxy.prototype.getVersion = function () { + return this._version; + }; + PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) { + segmentIgnoreThreshold = segmentIgnoreThreshold || 0; + if (segmentIgnoreThreshold > 0) { + this._ux = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sx) || 0; + this._uy = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sy) || 0; + } + }; + PathProxy.prototype.setDPR = function (dpr) { + this.dpr = dpr; + }; + PathProxy.prototype.setContext = function (ctx) { + this._ctx = ctx; + }; + PathProxy.prototype.getContext = function () { + return this._ctx; + }; + PathProxy.prototype.beginPath = function () { + this._ctx && this._ctx.beginPath(); + this.reset(); + return this; + }; + PathProxy.prototype.reset = function () { + if (this._saveData) { + this._len = 0; + } + if (this._lineDash) { + this._lineDash = null; + this._dashOffset = 0; + } + if (this._pathSegLen) { + this._pathSegLen = null; + this._pathLen = 0; + } + this._version++; + }; + PathProxy.prototype.moveTo = function (x, y) { + this.addData(CMD.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + this._x0 = x; + this._y0 = y; + this._xi = x; + this._yi = y; + return this; + }; + PathProxy.prototype.lineTo = function (x, y) { + var exceedUnit = mathAbs(x - this._xi) > this._ux + || mathAbs(y - this._yi) > this._uy + || this._len < 5; + this.addData(CMD.L, x, y); + if (this._ctx && exceedUnit) { + this._needsDash ? this._dashedLineTo(x, y) + : this._ctx.lineTo(x, y); + } + if (exceedUnit) { + this._xi = x; + this._yi = y; + } + return this; + }; + PathProxy.prototype.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; + }; + PathProxy.prototype.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; + }; + PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + tmpAngles[0] = startAngle; + tmpAngles[1] = endAngle; + normalizeArcAngles(tmpAngles, anticlockwise); + startAngle = tmpAngles[0]; + endAngle = tmpAngles[1]; + var delta = endAngle - startAngle; + this.addData(CMD.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + this._xi = mathCos$1(endAngle) * r + cx; + this._yi = mathSin$1(endAngle) * r + cy; + return this; + }; + PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) { + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }; + PathProxy.prototype.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; + }; + PathProxy.prototype.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; + }; + PathProxy.prototype.fill = function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }; + PathProxy.prototype.stroke = function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }; + PathProxy.prototype.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; + this._needsDash = true; + } + else { + this._lineDash = null; + this._needsDash = false; + } + return this; + }; + PathProxy.prototype.setLineDashOffset = function (offset) { + this._dashOffset = offset; + return this; + }; + PathProxy.prototype.len = function () { + return this._len; + }; + PathProxy.prototype.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; + }; + PathProxy.prototype.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; + }; + PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) { + if (!this._saveData) { + return; + } + var data = this.data; + if (this._len + arguments.length > data.length) { + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + }; + PathProxy.prototype._expandData = function () { + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }; + PathProxy.prototype._dashedLineTo = function (x1, y1) { + var dashSum = this._dashSum; + var lineDash = this._lineDash; + var ctx = this._ctx; + var offset = this._dashOffset; + var x0 = this._xi; + var y0 = this._yi; + var dx = x1 - x0; + var dy = y1 - y0; + var dist = mathSqrt$1(dx * dx + dy * dy); + var x = x0; + var y = y0; + var nDash = lineDash.length; + var dash; + var idx; + dx /= dist; + dy /= dist; + if (offset < 0) { + offset = dashSum + offset; + } + offset %= dashSum; + x -= offset * dx; + y -= offset * dy; + while ((dx > 0 && x <= x1) || (dx < 0 && x >= x1) + || (dx === 0 && ((dy > 0 && y <= y1) || (dy < 0 && y >= y1)))) { + idx = this._dashIdx; + dash = lineDash[idx]; + x += dx * dash; + y += dy * dash; + this._dashIdx = (idx + 1) % nDash; + if ((dx > 0 && x < x0) || (dx < 0 && x > x0) || (dy > 0 && y < y0) || (dy < 0 && y > y0)) { + continue; + } + ctx[idx % 2 ? 'moveTo' : 'lineTo'](dx >= 0 ? mathMin$2(x, x1) : mathMax$2(x, x1), dy >= 0 ? mathMin$2(y, y1) : mathMax$2(y, y1)); + } + dx = x - x1; + dy = y - y1; + this._dashOffset = -mathSqrt$1(dx * dx + dy * dy); + }; + PathProxy.prototype._dashedBezierTo = function (x1, y1, x2, y2, x3, y3) { + var ctx = this._ctx; + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var x0 = this._xi; + var y0 = this._yi; + var bezierLen = 0; + var idx = this._dashIdx; + var nDash = lineDash.length; + var t; + var dx; + var dy; + var x; + var y; + var tmpLen = 0; + if (offset < 0) { + offset = dashSum + offset; + } + offset %= dashSum; + 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$1(dx * dx + dy * dy); + } + 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); + idx % 2 ? ctx.moveTo(x, y) + : ctx.lineTo(x, y); + t += lineDash[idx] / bezierLen; + idx = (idx + 1) % nDash; + } + (idx % 2 !== 0) && ctx.lineTo(x3, y3); + dx = x3 - x; + dy = y3 - y; + this._dashOffset = -mathSqrt$1(dx * dx + dy * dy); + }; + PathProxy.prototype._dashedQuadraticTo = function (x1, y1, x2, y2) { + 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); + }; + PathProxy.prototype.toStatic = function () { + if (!this._saveData) { + return; + } + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray && this._len > 11) { + this.data = new Float32Array(data); + } + } + }; + PathProxy.prototype.getBoundingRect = function () { + min$1[0] = min$1[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max$1[0] = max$1[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var i; + for (i = 0; i < this._len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD.L: + fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + 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: + fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + 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; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2); + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD.Z: + xi = x0; + yi = y0; + break; + } + min(min$1, min$1, min2); + max(max$1, max$1, max2); + } + if (i === 0) { + min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0; + } + return new BoundingRect(min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1]); + }; + PathProxy.prototype._calculateLength = function () { + var data = this.data; + var len = this._len; + var ux = this._ux; + var uy = this._uy; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + if (!this._pathSegLen) { + this._pathSegLen = []; + } + var pathSegLen = this._pathSegLen; + var pathTotalLen = 0; + var segCount = 0; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + var l = -1; + switch (cmd) { + case CMD.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + break; + case CMD.L: { + var x2 = data[i++]; + var y2 = data[i++]; + var dx = x2 - xi; + var dy = y2 - yi; + if (mathAbs(dx) > ux || mathAbs(dy) > uy || i === len - 1) { + l = Math.sqrt(dx * dx + dy * dy); + xi = x2; + yi = y2; + } + break; + } + case CMD.C: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + var x3 = data[i++]; + var y3 = data[i++]; + l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10); + xi = x3; + yi = y3; + break; + } + case CMD.Q: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + l = quadraticLength(xi, yi, x1, y1, x2, y2, 10); + xi = x2; + yi = y2; + break; + } + case CMD.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var delta = data[i++]; + var endAngle = delta + startAngle; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + l = mathMax$2(rx, ry) * mathMin$2(PI2$1, Math.abs(delta)); + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: { + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + l = width * 2 + height * 2; + break; + } + case CMD.Z: { + var dx = x0 - xi; + var dy = y0 - yi; + l = Math.sqrt(dx * dx + dy * dy); + xi = x0; + yi = y0; + break; + } + } + if (l >= 0) { + pathSegLen[segCount++] = l; + pathTotalLen += l; + } + } + this._pathLen = pathTotalLen; + return pathTotalLen; + }; + PathProxy.prototype.rebuildPath = function (ctx, percent) { + var d = this.data; + var ux = this._ux; + var uy = this._uy; + var len = this._len; + var x0; + var y0; + var xi; + var yi; + var x; + var y; + var drawPart = percent < 1; + var pathSegLen; + var pathTotalLen; + var accumLength = 0; + var segCount = 0; + var displayedLength; + if (drawPart) { + if (!this._pathSegLen) { + this._calculateLength(); + } + pathSegLen = this._pathSegLen; + pathTotalLen = this._pathLen; + displayedLength = percent * pathTotalLen; + if (!displayedLength) { + return; + } + } + lo: for (var i = 0; i < len;) { + var cmd = d[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = d[i]; + yi = d[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD.M: + x0 = xi = d[i++]; + y0 = yi = d[i++]; + ctx.moveTo(xi, yi); + break; + case CMD.L: { + x = d[i++]; + y = d[i++]; + if (mathAbs(x - xi) > ux || mathAbs(y - yi) > uy || i === len - 1) { + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t); + break lo; + } + accumLength += l; + } + ctx.lineTo(x, y); + xi = x; + yi = y; + } + break; + } + case CMD.C: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + var x3 = d[i++]; + var y3 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + cubicSubdivide(xi, x1, x2, x3, t, tmpOutX); + cubicSubdivide(yi, y1, y2, y3, t, tmpOutY); + ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]); + break lo; + } + accumLength += l; + } + ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + xi = x3; + yi = y3; + break; + } + case CMD.Q: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + quadraticSubdivide(xi, x1, x2, t, tmpOutX); + quadraticSubdivide(yi, y1, y2, t, tmpOutY); + ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]); + break lo; + } + accumLength += l; + } + ctx.quadraticCurveTo(x1, y1, x2, y2); + xi = x2; + yi = y2; + break; + } + case CMD.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var startAngle = d[i++]; + var delta = d[i++]; + var psi = d[i++]; + var anticlockwise = !d[i++]; + var r = (rx > ry) ? rx : ry; + var isEllipse = mathAbs(rx - ry) > 1e-3; + var endAngle = startAngle + delta; + var breakBuild = false; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + endAngle = startAngle + delta * (displayedLength - accumLength) / l; + breakBuild = true; + } + accumLength += l; + } + if (isEllipse && ctx.ellipse) { + ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise); + } + else { + ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + } + if (breakBuild) { + break lo; + } + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = d[i]; + y0 = yi = d[i + 1]; + x = d[i++]; + y = d[i++]; + var width = d[i++]; + var height = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var d_1 = displayedLength - accumLength; + ctx.moveTo(x, y); + ctx.lineTo(x + mathMin$2(d_1, width), y); + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x + width, y + mathMin$2(d_1, height)); + } + d_1 -= height; + if (d_1 > 0) { + ctx.lineTo(x + mathMax$2(width - d_1, 0), y + height); + } + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x, y + mathMax$2(height - d_1, 0)); + } + break lo; + } + accumLength += l; + } + ctx.rect(x, y, width, height); + break; + case CMD.Z: + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t); + break lo; + } + accumLength += l; + } + ctx.closePath(); + xi = x0; + yi = y0; + } + } + }; + PathProxy.CMD = CMD; + PathProxy.initDefaultProps = (function () { + var proto = PathProxy.prototype; + proto._saveData = true; + proto._needsDash = false; + proto._dashOffset = 0; + proto._dashIdx = 0; + proto._dashSum = 0; + proto._ux = 0; + proto._uy = 0; + })(); + return PathProxy; + }()); + + function containStroke(x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + 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; + } + + function containStroke$1(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + 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 = cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null); + return d <= _l / 2; + } + + function containStroke$2(x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + 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 = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null); + return d <= _l / 2; + } + + var PI2$2 = Math.PI * 2; + function normalizeRadian(angle) { + angle %= PI2$2; + if (angle < 0) { + angle += PI2$2; + } + return angle; + } + + var PI2$3 = Math.PI * 2; + function containStroke$3(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$3 < 1e-4) { + 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$3; + } + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2$3; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2$3 >= startAngle && angle + PI2$3 <= endAngle); + } + + 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 t = (y - y0) / (y1 - y0); + var dir = y1 < y0 ? 1 : -1; + if (t === 1 || t === 0) { + dir = y1 < y0 ? 0.5 : -0.5; + } + var x_ = t * (x1 - x0) + x0; + return x_ === x ? Infinity : x_ > x ? dir : 0; + } + + var CMD$1 = PathProxy.CMD; + var PI2$4 = Math.PI * 2; + var EPSILON$2 = 1e-4; + function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON$2; + } + 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) { + if ((y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3)) { + return 0; + } + var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var w = 0; + var nExtrema = -1; + var y0_ = void 0; + var y1_ = void 0; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var unit = (t === 0 || t === 1) ? 0.5 : 1; + var x_ = cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { + continue; + } + if (nExtrema < 0) { + nExtrema = cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema === 2) { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else if (t < extrema[1]) { + w += y1_ < y0_ ? unit : -unit; + } + else { + w += y3 < y1_ ? unit : -unit; + } + } + else { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else { + w += y3 < y0_ ? unit : -unit; + } + } + } + return w; + } + } + function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + if ((y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2)) { + return 0; + } + var nRoots = quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var t = quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? unit : -unit; + } + else { + w += y2 < y_ ? unit : -unit; + } + } + return w; + } + else { + var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { + return 0; + } + return y2 < y0 ? unit : -unit; + } + } + } + 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 dTheta = Math.abs(startAngle - endAngle); + if (dTheta < 1e-4) { + return 0; + } + if (dTheta >= PI2$4 - 1e-4) { + startAngle = 0; + endAngle = PI2$4; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } + else { + return 0; + } + } + if (startAngle > endAngle) { + var tmp_1 = startAngle; + startAngle = endAngle; + endAngle = tmp_1; + } + if (startAngle < 0) { + startAngle += PI2$4; + endAngle += PI2$4; + } + 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$4 + angle; + } + if ((angle >= startAngle && angle <= endAngle) + || (angle + PI2$4 >= startAngle && angle + PI2$4 <= endAngle)) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; + } + function containPath(path, lineWidth, isStroke, x, y) { + var data = path.data; + var len = path.len(); + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (cmd === CMD$1.M && i > 1) { + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + } + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD$1.M: + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD$1.L: + if (isStroke) { + if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.C: + if (isStroke) { + if (containStroke$1(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$1.Q: + if (isStroke) { + if (containStroke$2(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$1.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; + if (!isFirst) { + w += windingLine(xi, yi, x1, y1, x, y); + } + else { + x0 = x1; + y0 = y1; + } + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (containStroke$3(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$1.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + x1 = x0 + width; + 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, x0, y0, lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD$1.Z: + if (isStroke) { + if (containStroke(xi, yi, x0, y0, lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(xi, yi, x0, y0, x, y); + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; + } + function contain(pathProxy, x, y) { + return containPath(pathProxy, 0, false, x, y); + } + function containStroke$4(pathProxy, lineWidth, x, y) { + return containPath(pathProxy, lineWidth, true, x, y); + } + + var DEFAULT_PATH_STYLE = defaults({ + fill: '#000', + stroke: null, + strokePercent: 1, + fillOpacity: 1, + strokeOpacity: 1, + lineDashOffset: 0, + lineWidth: 1, + lineCap: 'butt', + miterLimit: 10, + strokeNoScale: false, + strokeFirst: false + }, DEFAULT_COMMON_STYLE); + var DEFAULT_PATH_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + strokePercent: true, + fillOpacity: true, + strokeOpacity: true, + lineDashOffset: true, + lineWidth: true, + miterLimit: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + var pathCopyParams = [ + 'x', 'y', 'rotation', 'scaleX', 'scaleY', 'originX', 'originY', 'invisible', + 'culling', 'z', 'z2', 'zlevel', 'parent' + ]; + var Path = (function (_super) { + __extends(Path, _super); + function Path(opts) { + return _super.call(this, opts) || this; + } + Path.prototype.update = function () { + var _this = this; + _super.prototype.update.call(this); + var style = this.style; + if (style.decal) { + var decalEl = this._decalEl + = this._decalEl || new Path(); + if (decalEl.buildPath === Path.prototype.buildPath) { + decalEl.buildPath = function (ctx) { + _this.buildPath(ctx, _this.shape); + }; + } + decalEl.silent = true; + var decalElStyle = decalEl.style; + for (var key in style) { + if (decalElStyle[key] !== style[key]) { + decalElStyle[key] = style[key]; + } + } + decalElStyle.fill = style.fill ? style.decal : null; + decalElStyle.decal = null; + decalElStyle.shadowColor = null; + style.strokeFirst && (decalElStyle.stroke = null); + for (var i = 0; i < pathCopyParams.length; ++i) { + decalEl[pathCopyParams[i]] = this[pathCopyParams[i]]; + } + decalEl.__dirty |= Element.REDARAW_BIT; + } + else if (this._decalEl) { + this._decalEl = null; + } + }; + Path.prototype.getDecalElement = function () { + return this._decalEl; + }; + Path.prototype._init = function (props) { + var keysArr = keys(props); + this.shape = this.getDefaultShape(); + var defaultStyle = this.getDefaultStyle(); + if (defaultStyle) { + this.useStyle(defaultStyle); + } + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + var value = props[key]; + if (key === 'style') { + if (!this.style) { + this.useStyle(value); + } + else { + extend(this.style, value); + } + } + else if (key === 'shape') { + extend(this.shape, value); + } + else { + _super.prototype.attrKV.call(this, key, value); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Path.prototype.getDefaultStyle = function () { + return null; + }; + Path.prototype.getDefaultShape = function () { + return {}; + }; + Path.prototype.canBeInsideText = function () { + return this.hasFill(); + }; + Path.prototype.getInsideTextFill = function () { + var pathFill = this.style.fill; + if (pathFill !== 'none') { + if (isString(pathFill)) { + var fillLum = lum(pathFill, 0); + if (fillLum > 0.5) { + return DARK_LABEL_COLOR; + } + else if (fillLum > 0.2) { + return LIGHTER_LABEL_COLOR; + } + return LIGHT_LABEL_COLOR; + } + else if (pathFill) { + return LIGHT_LABEL_COLOR; + } + } + return DARK_LABEL_COLOR; + }; + Path.prototype.getInsideTextStroke = function (textFill) { + var pathFill = this.style.fill; + if (isString(pathFill)) { + var zr = this.__zr; + var isDarkMode = !!(zr && zr.isDarkMode()); + var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD; + if (isDarkMode === isDarkLabel) { + return pathFill; + } + } + }; + Path.prototype.buildPath = function (ctx, shapeCfg, inBundle) { }; + Path.prototype.pathUpdated = function () { + this.__dirty &= ~Path.SHAPE_CHANGED_BIT; + }; + Path.prototype.createPathProxy = function () { + this.path = new PathProxy(false); + }; + Path.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + }; + Path.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + Path.prototype.getBoundingRect = function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var firstInvoke = false; + if (!this.path) { + firstInvoke = true; + this.createPathProxy(); + } + var path = this.path; + if (firstInvoke || (this.__dirty & Path.SHAPE_CHANGED_BIT)) { + path.beginPath(); + this.buildPath(path, this.shape, false); + this.pathUpdated(); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + if (this.hasStroke() && this.path && this.path.len() > 0) { + var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone()); + if (this.__dirty || needsUpdateRect) { + rectWithStroke.copy(rect); + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + var w = style.lineWidth; + if (!this.hasFill()) { + var strokeContainThreshold = this.strokeContainThreshold; + w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold); + } + if (lineScale > 1e-10) { + rectWithStroke.width += w / lineScale; + rectWithStroke.height += w / lineScale; + rectWithStroke.x -= w / lineScale / 2; + rectWithStroke.y -= w / lineScale / 2; + } + } + return rectWithStroke; + } + return rect; + }; + Path.prototype.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 pathProxy = this.path; + if (this.hasStroke()) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + if (lineScale > 1e-10) { + if (!this.hasFill()) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (containStroke$4(pathProxy, lineWidth / lineScale, x, y)) { + return true; + } + } + } + if (this.hasFill()) { + return contain(pathProxy, x, y); + } + } + return false; + }; + Path.prototype.dirtyShape = function () { + this.__dirty |= Path.SHAPE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + if (this._decalEl) { + this._decalEl.dirtyShape(); + } + this.markRedraw(); + }; + Path.prototype.dirty = function () { + this.dirtyStyle(); + this.dirtyShape(); + }; + Path.prototype.animateShape = function (loop) { + return this.animate('shape', loop); + }; + Path.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } + else if (targetKey === 'shape') { + this.dirtyShape(); + } + else { + this.markRedraw(); + } + }; + Path.prototype.attrKV = function (key, value) { + if (key === 'shape') { + this.setShape(value); + } + else { + _super.prototype.attrKV.call(this, key, value); + } + }; + Path.prototype.setShape = function (keyOrObj, value) { + var shape = this.shape; + if (!shape) { + shape = this.shape = {}; + } + if (typeof keyOrObj === 'string') { + shape[keyOrObj] = value; + } + else { + extend(shape, keyOrObj); + } + this.dirtyShape(); + return this; + }; + Path.prototype.shapeChanged = function () { + return !!(this.__dirty & Path.SHAPE_CHANGED_BIT); + }; + Path.prototype.createStyle = function (obj) { + return createObject(DEFAULT_PATH_STYLE, obj); + }; + Path.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.shape && !normalState.shape) { + normalState.shape = extend({}, this.shape); + } + }; + Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetShape; + if (state && state.shape) { + if (transition) { + if (keepCurrentStates) { + targetShape = state.shape; + } + else { + targetShape = extend({}, normalState.shape); + extend(targetShape, state.shape); + } + } + else { + targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape); + extend(targetShape, state.shape); + } + } + else if (needsRestoreToNormal) { + targetShape = normalState.shape; + } + if (targetShape) { + if (transition) { + this.shape = extend({}, this.shape); + var targetShapePrimaryProps = {}; + var shapeKeys = keys(targetShape); + for (var i = 0; i < shapeKeys.length; i++) { + var key = shapeKeys[i]; + if (typeof targetShape[key] === 'object') { + this.shape[key] = targetShape[key]; + } + else { + targetShapePrimaryProps[key] = targetShape[key]; + } + } + this._transitionState(stateName, { + shape: targetShapePrimaryProps + }, animationCfg); + } + else { + this.shape = targetShape; + this.dirtyShape(); + } + } + }; + Path.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedShape; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.shape) { + mergedShape = mergedShape || {}; + this._mergeStyle(mergedShape, state.shape); + } + } + if (mergedShape) { + mergedState.shape = mergedShape; + } + return mergedState; + }; + Path.prototype.getAnimationStyleProps = function () { + return DEFAULT_PATH_ANIMATION_PROPS; + }; + Path.prototype.isZeroArea = function () { + return false; + }; + Path.extend = function (defaultProps) { + var Sub = (function (_super) { + __extends(Sub, _super); + function Sub(opts) { + var _this = _super.call(this, opts) || this; + defaultProps.init && defaultProps.init.call(_this, opts); + return _this; + } + Sub.prototype.getDefaultStyle = function () { + return clone(defaultProps.style); + }; + Sub.prototype.getDefaultShape = function () { + return clone(defaultProps.shape); + }; + return Sub; + }(Path)); + for (var key in defaultProps) { + if (typeof defaultProps[key] === 'function') { + Sub.prototype[key] = defaultProps[key]; + } + } + return Sub; + }; + Path.SHAPE_CHANGED_BIT = 4; + Path.initDefaultProps = (function () { + var pathProto = Path.prototype; + pathProto.type = 'path'; + pathProto.strokeContainThreshold = 5; + pathProto.segmentIgnoreThreshold = 0; + pathProto.subPixelOptimize = false; + pathProto.autoBatch = false; + pathProto.__dirty = Element.REDARAW_BIT | Displayable.STYLE_CHANGED_BIT | Path.SHAPE_CHANGED_BIT; + })(); + return Path; + }(Displayable)); + + var DEFAULT_TSPAN_STYLE = defaults({ + strokeFirst: true, + font: DEFAULT_FONT, + x: 0, + y: 0, + textAlign: 'left', + textBaseline: 'top', + miterLimit: 2 + }, DEFAULT_PATH_STYLE); + var TSpan = (function (_super) { + __extends(TSpan, _super); + function TSpan() { + return _super !== null && _super.apply(this, arguments) || this; + } + TSpan.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return stroke != null && stroke !== 'none' && style.lineWidth > 0; + }; + TSpan.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + TSpan.prototype.createStyle = function (obj) { + return createObject(DEFAULT_TSPAN_STYLE, obj); + }; + TSpan.prototype.setBoundingRect = function (rect) { + this._rect = rect; + }; + TSpan.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + var text = style.text; + text != null ? (text += '') : (text = ''); + var rect = getBoundingRect(text, style.font, style.textAlign, style.textBaseline); + rect.x += style.x || 0; + rect.y += style.y || 0; + if (this.hasStroke()) { + var w = style.lineWidth; + rect.x -= w / 2; + rect.y -= w / 2; + rect.width += w; + rect.height += w; + } + this._rect = rect; + } + return this._rect; + }; + TSpan.initDefaultProps = (function () { + var tspanProto = TSpan.prototype; + tspanProto.dirtyRectTolerance = 10; + })(); + return TSpan; + }(Displayable)); + TSpan.prototype.type = 'tspan'; + + var DEFAULT_IMAGE_STYLE = defaults({ + x: 0, + y: 0 + }, DEFAULT_COMMON_STYLE); + var DEFAULT_IMAGE_ANIMATION_PROPS = { + style: defaults({ + x: true, + y: true, + width: true, + height: true, + sx: true, + sy: true, + sWidth: true, + sHeight: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + function isImageLike(source) { + return !!(source + && typeof source !== 'string' + && source.width && source.height); + } + var ZRImage = (function (_super) { + __extends(ZRImage, _super); + function ZRImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZRImage.prototype.createStyle = function (obj) { + return createObject(DEFAULT_IMAGE_STYLE, obj); + }; + ZRImage.prototype._getSize = function (dim) { + var style = this.style; + var size = style[dim]; + if (size != null) { + return size; + } + var imageSource = isImageLike(style.image) + ? style.image : this.__image; + if (!imageSource) { + return 0; + } + var otherDim = dim === 'width' ? 'height' : 'width'; + var otherDimSize = style[otherDim]; + if (otherDimSize == null) { + return imageSource[dim]; + } + else { + return imageSource[dim] / imageSource[otherDim] * otherDimSize; + } + }; + ZRImage.prototype.getWidth = function () { + return this._getSize('width'); + }; + ZRImage.prototype.getHeight = function () { + return this._getSize('height'); + }; + ZRImage.prototype.getAnimationStyleProps = function () { + return DEFAULT_IMAGE_ANIMATION_PROPS; + }; + ZRImage.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + this._rect = new BoundingRect(style.x || 0, style.y || 0, this.getWidth(), this.getHeight()); + } + return this._rect; + }; + return ZRImage; + }(Displayable)); + ZRImage.prototype.type = 'image'; + + function buildPath(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; + 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.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5); + } + + var round$1 = Math.round; + function subPixelOptimizeLine(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var x1 = inputShape.x1; + var x2 = inputShape.x2; + var y1 = inputShape.y1; + var y2 = inputShape.y2; + outputShape.x1 = x1; + outputShape.x2 = x2; + outputShape.y1 = y1; + outputShape.y2 = y2; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + if (round$1(x1 * 2) === round$1(x2 * 2)) { + outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true); + } + if (round$1(y1 * 2) === round$1(y2 * 2)) { + outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true); + } + return outputShape; + } + function subPixelOptimizeRect(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var originX = inputShape.x; + var originY = inputShape.y; + var originWidth = inputShape.width; + var originHeight = inputShape.height; + outputShape.x = originX; + outputShape.y = originY; + outputShape.width = originWidth; + outputShape.height = originHeight; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + outputShape.x = subPixelOptimize(originX, lineWidth, true); + outputShape.y = subPixelOptimize(originY, lineWidth, true); + outputShape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1); + outputShape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1); + return outputShape; + } + function subPixelOptimize(position, lineWidth, positiveOrNegative) { + if (!lineWidth) { + return position; + } + var doubledPosition = round$1(position * 2); + return (doubledPosition + round$1(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; + } + + var RectShape = (function () { + function RectShape() { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + } + return RectShape; + }()); + var subPixelOptimizeOutputShape = {}; + var Rect = (function (_super) { + __extends(Rect, _super); + function Rect(opts) { + return _super.call(this, opts) || this; + } + Rect.prototype.getDefaultShape = function () { + return new RectShape(); + }; + Rect.prototype.buildPath = function (ctx, shape) { + var x; + var y; + var width; + var height; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeRect(subPixelOptimizeOutputShape, shape, this.style); + x = optimizedShape.x; + y = optimizedShape.y; + width = optimizedShape.width; + height = optimizedShape.height; + optimizedShape.r = shape.r; + shape = optimizedShape; + } + else { + x = shape.x; + y = shape.y; + width = shape.width; + height = shape.height; + } + if (!shape.r) { + ctx.rect(x, y, width, height); + } + else { + buildPath(ctx, shape); + } + }; + Rect.prototype.isZeroArea = function () { + return !this.shape.width || !this.shape.height; + }; + return Rect; + }(Path)); + Rect.prototype.type = 'rect'; + + var DEFAULT_RICH_TEXT_COLOR = { + fill: '#000' + }; + var DEFAULT_STROKE_LINE_WIDTH = 2; + var DEFAULT_TEXT_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + fillOpacity: true, + strokeOpacity: true, + lineWidth: true, + fontSize: true, + lineHeight: true, + width: true, + height: true, + textShadowColor: true, + textShadowBlur: true, + textShadowOffsetX: true, + textShadowOffsetY: true, + backgroundColor: true, + padding: true, + borderColor: true, + borderWidth: true, + borderRadius: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + var ZRText = (function (_super) { + __extends(ZRText, _super); + function ZRText(opts) { + var _this = _super.call(this) || this; + _this.type = 'text'; + _this._children = []; + _this._defaultStyle = DEFAULT_RICH_TEXT_COLOR; + _this.attr(opts); + return _this; + } + ZRText.prototype.childrenRef = function () { + return this._children; + }; + ZRText.prototype.update = function () { + if (this.styleChanged()) { + this._updateSubTexts(); + } + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.zlevel = this.zlevel; + child.z = this.z; + child.z2 = this.z2; + child.culling = this.culling; + child.cursor = this.cursor; + child.invisible = this.invisible; + } + var attachedTransform = this.attachedTransform; + if (attachedTransform) { + attachedTransform.updateTransform(); + var m = attachedTransform.transform; + if (m) { + this.transform = this.transform || []; + copy$1(this.transform, m); + } + else { + this.transform = null; + } + } + else { + _super.prototype.update.call(this); + } + }; + ZRText.prototype.getComputedTransform = function () { + if (this.__hostTarget) { + this.__hostTarget.getComputedTransform(); + this.__hostTarget.updateInnerText(true); + } + return this.attachedTransform ? this.attachedTransform.getComputedTransform() + : _super.prototype.getComputedTransform.call(this); + }; + ZRText.prototype._updateSubTexts = function () { + this._childCursor = 0; + normalizeTextStyle(this.style); + this.style.rich + ? this._updateRichTexts() + : this._updatePlainTexts(); + this._children.length = this._childCursor; + this.styleUpdated(); + }; + ZRText.prototype.addSelfToZr = function (zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = zr; + } + }; + ZRText.prototype.removeSelfFromZr = function (zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = null; + } + }; + ZRText.prototype.getBoundingRect = function () { + if (this.styleChanged()) { + this._updateSubTexts(); + } + if (!this._rect) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + 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); + } + } + this._rect = rect || tmpRect; + } + return this._rect; + }; + ZRText.prototype.setDefaultTextStyle = function (defaultTextStyle) { + this._defaultStyle = defaultTextStyle || DEFAULT_RICH_TEXT_COLOR; + }; + ZRText.prototype.setTextContent = function (textContent) { + throw new Error('Can\'t attach text on another text'); + }; + ZRText.prototype._mergeStyle = function (targetStyle, sourceStyle) { + if (!sourceStyle) { + return targetStyle; + } + var sourceRich = sourceStyle.rich; + var targetRich = targetStyle.rich || (sourceRich && {}); + extend(targetStyle, sourceStyle); + if (sourceRich && targetRich) { + this._mergeRich(targetRich, sourceRich); + targetStyle.rich = targetRich; + } + else if (targetRich) { + targetStyle.rich = targetRich; + } + return targetStyle; + }; + ZRText.prototype._mergeRich = function (targetRich, sourceRich) { + var richNames = keys(sourceRich); + for (var i = 0; i < richNames.length; i++) { + var richName = richNames[i]; + targetRich[richName] = targetRich[richName] || {}; + extend(targetRich[richName], sourceRich[richName]); + } + }; + ZRText.prototype.getAnimationStyleProps = function () { + return DEFAULT_TEXT_ANIMATION_PROPS; + }; + ZRText.prototype._getOrCreateChild = function (Ctor) { + var child = this._children[this._childCursor]; + if (!child || !(child instanceof Ctor)) { + child = new Ctor(); + } + this._children[this._childCursor++] = child; + child.__zr = this.__zr; + child.parent = this; + return child; + }; + ZRText.prototype._updatePlainTexts = function () { + var style = this.style; + var textFont = style.font || DEFAULT_FONT; + var textPadding = style.padding; + var text = getStyleText(style); + var contentBlock = parsePlainText(text, style); + var needDrawBg = needDrawBackground(style); + var bgColorDrawn = !!(style.backgroundColor); + var outerHeight = contentBlock.outerHeight; + var textLines = contentBlock.lines; + var lineHeight = contentBlock.lineHeight; + var defaultStyle = this._defaultStyle; + var baseX = style.x || 0; + var baseY = style.y || 0; + var textAlign = style.align || defaultStyle.align || 'left'; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign || 'top'; + var textX = baseX; + var textY = adjustTextY(baseY, contentBlock.contentHeight, verticalAlign); + if (needDrawBg || textPadding) { + var outerWidth_1 = contentBlock.width; + textPadding && (outerWidth_1 += textPadding[1] + textPadding[3]); + var boxX = adjustTextX(baseX, outerWidth_1, textAlign); + var boxY = adjustTextY(baseY, outerHeight, verticalAlign); + needDrawBg && this._renderBackground(style, style, boxX, boxY, outerWidth_1, outerHeight); + } + textY += lineHeight / 2; + if (textPadding) { + textX = getTextXForPadding(baseX, textAlign, textPadding); + if (verticalAlign === 'top') { + textY += textPadding[0]; + } + else if (verticalAlign === 'bottom') { + textY -= textPadding[2]; + } + } + var defaultLineWidth = 0; + var useDefaultFill = false; + var textFill = getFill('fill' in style + ? style.fill + : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke('stroke' in style + ? style.stroke + : (!bgColorDrawn + && (!defaultStyle.autoStroke || useDefaultFill)) + ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) + : null); + var hasShadow = style.textShadowBlur > 0; + var fixedBoundingRect = style.width != null + && (style.overflow === 'truncate' || style.overflow === 'break' || style.overflow === 'breakAll'); + var calculatedLineHeight = contentBlock.calculatedLineHeight; + for (var i = 0; i < textLines.length; i++) { + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + subElStyle.text = textLines[i]; + subElStyle.x = textX; + subElStyle.y = textY; + if (textAlign) { + subElStyle.textAlign = textAlign; + } + subElStyle.textBaseline = 'middle'; + subElStyle.opacity = style.opacity; + subElStyle.strokeFirst = true; + if (hasShadow) { + subElStyle.shadowBlur = style.textShadowBlur || 0; + subElStyle.shadowColor = style.textShadowColor || 'transparent'; + subElStyle.shadowOffsetX = style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = style.textShadowOffsetY || 0; + } + if (textStroke) { + subElStyle.stroke = textStroke; + subElStyle.lineWidth = style.lineWidth || defaultLineWidth; + subElStyle.lineDash = style.lineDash; + subElStyle.lineDashOffset = style.lineDashOffset || 0; + } + if (textFill) { + subElStyle.fill = textFill; + } + subElStyle.font = textFont; + textY += lineHeight; + if (fixedBoundingRect) { + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, style.width, subElStyle.textAlign), adjustTextY(subElStyle.y, calculatedLineHeight, subElStyle.textBaseline), style.width, calculatedLineHeight)); + } + } + }; + ZRText.prototype._updateRichTexts = function () { + var style = this.style; + var text = getStyleText(style); + var contentBlock = parseRichText(text, style); + var contentWidth = contentBlock.width; + var outerWidth = contentBlock.outerWidth; + var outerHeight = contentBlock.outerHeight; + var textPadding = style.padding; + var baseX = style.x || 0; + var baseY = style.y || 0; + var defaultStyle = this._defaultStyle; + var textAlign = style.align || defaultStyle.align; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign; + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY(baseY, outerHeight, verticalAlign); + var xLeft = boxX; + var lineTop = boxY; + if (textPadding) { + xLeft += textPadding[3]; + lineTop += textPadding[0]; + } + var xRight = xLeft + contentWidth; + if (needDrawBackground(style)) { + this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + var bgColorDrawn = !!(style.backgroundColor); + for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var tokens = line.tokens; + var tokenCount = tokens.length; + var lineHeight = line.lineHeight; + var remainedWidth = line.width; + var leftIndex = 0; + var lineXLeft = xLeft; + var lineXRight = xRight; + var rightIndex = tokenCount - 1; + var token = void 0; + while (leftIndex < tokenCount + && (token = tokens[leftIndex], !token.align || token.align === 'left')) { + this._placeToken(token, style, lineHeight, lineTop, lineXLeft, 'left', bgColorDrawn); + remainedWidth -= token.width; + lineXLeft += token.width; + leftIndex++; + } + while (rightIndex >= 0 + && (token = tokens[rightIndex], token.align === 'right')) { + this._placeToken(token, style, lineHeight, lineTop, lineXRight, 'right', bgColorDrawn); + remainedWidth -= token.width; + lineXRight -= token.width; + rightIndex--; + } + lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - remainedWidth) / 2; + while (leftIndex <= rightIndex) { + token = tokens[leftIndex]; + this._placeToken(token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center', bgColorDrawn); + lineXLeft += token.width; + leftIndex++; + } + lineTop += lineHeight; + } + }; + ZRText.prototype._placeToken = function (token, style, lineHeight, lineTop, x, textAlign, parentBgColorDrawn) { + var tokenStyle = style.rich[token.styleName] || {}; + tokenStyle.text = token.text; + var verticalAlign = token.verticalAlign; + var y = lineTop + lineHeight / 2; + if (verticalAlign === 'top') { + y = lineTop + token.height / 2; + } + else if (verticalAlign === 'bottom') { + y = lineTop + lineHeight - token.height / 2; + } + var needDrawBg = !token.isLineHolder && needDrawBackground(tokenStyle); + needDrawBg && this._renderBackground(tokenStyle, style, textAlign === 'right' + ? x - token.width + : textAlign === 'center' + ? x - token.width / 2 + : x, y - token.height / 2, token.width, token.height); + var bgColorDrawn = !!tokenStyle.backgroundColor; + var textPadding = token.textPadding; + if (textPadding) { + x = getTextXForPadding(x, textAlign, textPadding); + y -= token.height / 2 - textPadding[0] - token.innerHeight / 2; + } + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + var defaultStyle = this._defaultStyle; + var useDefaultFill = false; + var defaultLineWidth = 0; + var textFill = getStroke('fill' in tokenStyle ? tokenStyle.fill + : 'fill' in style ? style.fill + : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke('stroke' in tokenStyle ? tokenStyle.stroke + : 'stroke' in style ? style.stroke + : (!bgColorDrawn + && !parentBgColorDrawn + && (!defaultStyle.autoStroke || useDefaultFill)) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) + : null); + var hasShadow = tokenStyle.textShadowBlur > 0 + || style.textShadowBlur > 0; + subElStyle.text = token.text; + subElStyle.x = x; + subElStyle.y = y; + if (hasShadow) { + subElStyle.shadowBlur = tokenStyle.textShadowBlur || style.textShadowBlur || 0; + subElStyle.shadowColor = tokenStyle.textShadowColor || style.textShadowColor || 'transparent'; + subElStyle.shadowOffsetX = tokenStyle.textShadowOffsetX || style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = tokenStyle.textShadowOffsetY || style.textShadowOffsetY || 0; + } + subElStyle.textAlign = textAlign; + subElStyle.textBaseline = 'middle'; + subElStyle.font = token.font || DEFAULT_FONT; + subElStyle.opacity = retrieve3(tokenStyle.opacity, style.opacity, 1); + if (textStroke) { + subElStyle.lineWidth = retrieve3(tokenStyle.lineWidth, style.lineWidth, defaultLineWidth); + subElStyle.lineDash = retrieve2(tokenStyle.lineDash, style.lineDash); + subElStyle.lineDashOffset = style.lineDashOffset || 0; + subElStyle.stroke = textStroke; + } + if (textFill) { + subElStyle.fill = textFill; + } + var textWidth = token.contentWidth; + var textHeight = token.contentHeight; + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, textWidth, subElStyle.textAlign), adjustTextY(subElStyle.y, textHeight, subElStyle.textBaseline), textWidth, textHeight)); + }; + ZRText.prototype._renderBackground = function (style, topStyle, x, y, width, height) { + var textBackgroundColor = style.backgroundColor; + var textBorderWidth = style.borderWidth; + var textBorderColor = style.borderColor; + var isPlainBg = isString(textBackgroundColor); + var textBorderRadius = style.borderRadius; + var self = this; + var rectEl; + var imgEl; + if (isPlainBg || (textBorderWidth && textBorderColor)) { + rectEl = this._getOrCreateChild(Rect); + rectEl.useStyle(rectEl.createStyle()); + rectEl.style.fill = null; + var rectShape = rectEl.shape; + rectShape.x = x; + rectShape.y = y; + rectShape.width = width; + rectShape.height = height; + rectShape.r = textBorderRadius; + rectEl.dirtyShape(); + } + if (isPlainBg) { + var rectStyle = rectEl.style; + rectStyle.fill = textBackgroundColor || null; + rectStyle.fillOpacity = retrieve2(style.fillOpacity, 1); + } + else if (textBackgroundColor && textBackgroundColor.image) { + imgEl = this._getOrCreateChild(ZRImage); + imgEl.onload = function () { + self.dirtyStyle(); + }; + var imgStyle = imgEl.style; + imgStyle.image = textBackgroundColor.image; + imgStyle.x = x; + imgStyle.y = y; + imgStyle.width = width; + imgStyle.height = height; + } + if (textBorderWidth && textBorderColor) { + var rectStyle = rectEl.style; + rectStyle.lineWidth = textBorderWidth; + rectStyle.stroke = textBorderColor; + rectStyle.strokeOpacity = retrieve2(style.strokeOpacity, 1); + rectStyle.lineDash = style.borderDash; + rectStyle.lineDashOffset = style.borderDashOffset || 0; + rectEl.strokeContainThreshold = 0; + if (rectEl.hasFill() && rectEl.hasStroke()) { + rectStyle.strokeFirst = true; + rectStyle.lineWidth *= 2; + } + } + var commonStyle = (rectEl || imgEl).style; + commonStyle.shadowBlur = style.shadowBlur || 0; + commonStyle.shadowColor = style.shadowColor || 'transparent'; + commonStyle.shadowOffsetX = style.shadowOffsetX || 0; + commonStyle.shadowOffsetY = style.shadowOffsetY || 0; + commonStyle.opacity = retrieve3(style.opacity, topStyle.opacity, 1); + }; + ZRText.makeFont = function (style) { + var font = ''; + if (style.fontSize || style.fontFamily || style.fontWeight) { + var fontSize = ''; + if (typeof style.fontSize === 'string' + && (style.fontSize.indexOf('px') !== -1 + || style.fontSize.indexOf('rem') !== -1 + || style.fontSize.indexOf('em') !== -1)) { + fontSize = style.fontSize; + } + else if (!isNaN(+style.fontSize)) { + fontSize = style.fontSize + 'px'; + } + else { + fontSize = '12px'; + } + font = [ + style.fontStyle, + style.fontWeight, + fontSize, + style.fontFamily || 'sans-serif' + ].join(' '); + } + return font && trim(font) || style.textFont || style.font; + }; + return ZRText; + }(Displayable)); + var VALID_TEXT_ALIGN = { left: true, right: 1, center: 1 }; + var VALID_TEXT_VERTICAL_ALIGN = { top: 1, bottom: 1, middle: 1 }; + function normalizeTextStyle(style) { + normalizeStyle(style); + each(style.rich, normalizeStyle); + return style; + } + function normalizeStyle(style) { + if (style) { + style.font = ZRText.makeFont(style); + var textAlign = style.align; + textAlign === 'middle' && (textAlign = 'center'); + style.align = (textAlign == null || VALID_TEXT_ALIGN[textAlign]) ? textAlign : 'left'; + var verticalAlign = style.verticalAlign; + verticalAlign === 'center' && (verticalAlign = 'middle'); + style.verticalAlign = (verticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[verticalAlign]) ? verticalAlign : 'top'; + var textPadding = style.padding; + if (textPadding) { + style.padding = normalizeCssArray(style.padding); + } + } + } + function getStroke(stroke, lineWidth) { + return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none') + ? null + : (stroke.image || stroke.colorStops) + ? '#000' + : stroke; + } + function getFill(fill) { + return (fill == null || fill === 'none') + ? null + : (fill.image || fill.colorStops) + ? '#000' + : fill; + } + function getTextXForPadding(x, textAlign, textPadding) { + return textAlign === 'right' + ? (x - textPadding[1]) + : textAlign === 'center' + ? (x + textPadding[3] / 2 - textPadding[1] / 2) + : (x + textPadding[3]); + } + function getStyleText(style) { + var text = style.text; + text != null && (text += ''); + return text; + } + function needDrawBackground(style) { + return !!(style.backgroundColor + || (style.borderWidth && style.borderColor)); + } + + var getECData = makeInner(); + + var _highlightNextDigit = 1; + var _highlightKeyMap = {}; + var getSavedStates = makeInner(); + var HOVER_STATE_NORMAL = 0; + var HOVER_STATE_BLUR = 1; + var HOVER_STATE_EMPHASIS = 2; + var SPECIAL_STATES = ['emphasis', 'blur', 'select']; + var DISPLAY_STATES = ['normal', 'emphasis', 'blur', 'select']; + var Z2_EMPHASIS_LIFT = 10; + var Z2_SELECT_LIFT = 9; + var HIGHLIGHT_ACTION_TYPE = 'highlight'; + var DOWNPLAY_ACTION_TYPE = 'downplay'; + var SELECT_ACTION_TYPE = 'select'; + var UNSELECT_ACTION_TYPE = 'unselect'; + var TOGGLE_SELECT_ACTION_TYPE = 'toggleSelect'; + + function hasFillOrStroke(fillOrStroke) { + return fillOrStroke != null && fillOrStroke !== 'none'; + } // Most lifted color are duplicated. + + + var liftedColorCache = new LRU(100); + + function liftColor(color$1) { + if (typeof color$1 !== 'string') { + return color$1; + } + + var liftedColor = liftedColorCache.get(color$1); + + if (!liftedColor) { + liftedColor = lift(color$1, -0.1); + liftedColorCache.put(color$1, liftedColor); + } + + return liftedColor; + } + + function doChangeHoverState(el, stateName, hoverStateEnum) { + if (el.onHoverStateChange && (el.hoverState || 0) !== hoverStateEnum) { + el.onHoverStateChange(stateName); + } + + el.hoverState = hoverStateEnum; + } + + function singleEnterEmphasis(el) { + // Only mark the flag. + // States will be applied in the echarts.ts in next frame. + doChangeHoverState(el, 'emphasis', HOVER_STATE_EMPHASIS); + } + + function singleLeaveEmphasis(el) { + // Only mark the flag. + // States will be applied in the echarts.ts in next frame. + if (el.hoverState === HOVER_STATE_EMPHASIS) { + doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL); + } + } + + function singleEnterBlur(el) { + doChangeHoverState(el, 'blur', HOVER_STATE_BLUR); + } + + function singleLeaveBlur(el) { + if (el.hoverState === HOVER_STATE_BLUR) { + doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL); + } + } + + function singleEnterSelect(el) { + el.selected = true; + } + + function singleLeaveSelect(el) { + el.selected = false; + } + + function updateElementState(el, updater, commonParam) { + updater(el, commonParam); + } + + function traverseUpdateState(el, updater, commonParam) { + updateElementState(el, updater, commonParam); + el.isGroup && el.traverse(function (child) { + updateElementState(child, updater, commonParam); + }); + } + + function setStatesFlag(el, stateName) { + switch (stateName) { + case 'emphasis': + el.hoverState = HOVER_STATE_EMPHASIS; + break; + + case 'normal': + el.hoverState = HOVER_STATE_NORMAL; + break; + + case 'blur': + el.hoverState = HOVER_STATE_BLUR; + break; + + case 'select': + el.selected = true; + } + } + + function getFromStateStyle(el, props, toStateName, defaultValue) { + var style = el.style; + var fromState = {}; + + for (var i = 0; i < props.length; i++) { + var propName = props[i]; + var val = style[propName]; + fromState[propName] = val == null ? defaultValue && defaultValue[propName] : val; + } + + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + + if (animator.__fromStateTransition // Dont consider the animation to emphasis state. + && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === 'style') { + animator.saveFinalToTarget(fromState, props); + } + } + + return fromState; + } + + function createEmphasisDefaultState(el, stateName, targetStates, state) { + var hasSelect = targetStates && indexOf(targetStates, 'select') >= 0; + var cloned = false; + + if (el instanceof Path) { + var store = getSavedStates(el); + var fromFill = hasSelect ? store.selectFill || store.normalFill : store.normalFill; + var fromStroke = hasSelect ? store.selectStroke || store.normalStroke : store.normalStroke; + + if (hasFillOrStroke(fromFill) || hasFillOrStroke(fromStroke)) { + state = state || {}; // Apply default color lift + + var emphasisStyle = state.style || {}; + + if (!hasFillOrStroke(emphasisStyle.fill) && hasFillOrStroke(fromFill)) { + cloned = true; // Not modify the original value. + + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); // Already being applied 'emphasis'. DON'T lift color multiple times. + + emphasisStyle.fill = liftColor(fromFill); + } // Not highlight stroke if fill has been highlighted. + else if (!hasFillOrStroke(emphasisStyle.stroke) && hasFillOrStroke(fromStroke)) { + if (!cloned) { + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + } + + emphasisStyle.stroke = liftColor(fromStroke); + } + + state.style = emphasisStyle; + } + } + + if (state) { + // TODO Share with textContent? + if (state.z2 == null) { + if (!cloned) { + state = extend({}, state); + } + + var z2EmphasisLift = el.z2EmphasisLift; + state.z2 = el.z2 + (z2EmphasisLift != null ? z2EmphasisLift : Z2_EMPHASIS_LIFT); + } + } + + return state; + } + + function createSelectDefaultState(el, stateName, state) { + // const hasSelect = indexOf(el.currentStates, stateName) >= 0; + if (state) { + // TODO Share with textContent? + if (state.z2 == null) { + state = extend({}, state); + var z2SelectLift = el.z2SelectLift; + state.z2 = el.z2 + (z2SelectLift != null ? z2SelectLift : Z2_SELECT_LIFT); + } + } + + return state; + } + + function createBlurDefaultState(el, stateName, state) { + var hasBlur = indexOf(el.currentStates, stateName) >= 0; + var currentOpacity = el.style.opacity; + var fromState = !hasBlur ? getFromStateStyle(el, ['opacity'], stateName, { + opacity: 1 + }) : null; + state = state || {}; + var blurStyle = state.style || {}; + + if (blurStyle.opacity == null) { + // clone state + state = extend({}, state); + blurStyle = extend({ + // Already being applied 'emphasis'. DON'T mul opacity multiple times. + opacity: hasBlur ? currentOpacity : fromState.opacity * 0.1 + }, blurStyle); + state.style = blurStyle; + } + + return state; + } + + function elementStateProxy(stateName, targetStates) { + var state = this.states[stateName]; + + if (this.style) { + if (stateName === 'emphasis') { + return createEmphasisDefaultState(this, stateName, targetStates, state); + } else if (stateName === 'blur') { + return createBlurDefaultState(this, stateName, state); + } else if (stateName === 'select') { + return createSelectDefaultState(this, stateName, state); + } + } + + return state; + } + /**FI + * Set hover style (namely "emphasis style") of element. + * @param el Should not be `zrender/graphic/Group`. + * @param focus 'self' | 'selfInSeries' | 'series' + */ + + + function setDefaultStateProxy(el) { + el.stateProxy = elementStateProxy; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + + if (textContent) { + textContent.stateProxy = elementStateProxy; + } + + if (textGuide) { + textGuide.stateProxy = elementStateProxy; + } + } + function enterEmphasisWhenMouseOver(el, e) { + !shouldSilent(el, e) // "emphasis" event highlight has higher priority than mouse highlight. + && !el.__highByOuter && traverseUpdateState(el, singleEnterEmphasis); + } + function leaveEmphasisWhenMouseOut(el, e) { + !shouldSilent(el, e) // "emphasis" event highlight has higher priority than mouse highlight. + && !el.__highByOuter && traverseUpdateState(el, singleLeaveEmphasis); + } + function enterEmphasis(el, highlightDigit) { + el.__highByOuter |= 1 << (highlightDigit || 0); + traverseUpdateState(el, singleEnterEmphasis); + } + function leaveEmphasis(el, highlightDigit) { + !(el.__highByOuter &= ~(1 << (highlightDigit || 0))) && traverseUpdateState(el, singleLeaveEmphasis); + } + function enterBlur(el) { + traverseUpdateState(el, singleEnterBlur); + } + function leaveBlur(el) { + traverseUpdateState(el, singleLeaveBlur); + } + function enterSelect(el) { + traverseUpdateState(el, singleEnterSelect); + } + function leaveSelect(el) { + traverseUpdateState(el, singleLeaveSelect); + } + + function shouldSilent(el, e) { + return el.__highDownSilentOnTouch && e.zrByTouch; + } + + function allLeaveBlur(api) { + var model = api.getModel(); + model.eachComponent(function (componentType, componentModel) { + var view = componentType === 'series' ? api.getViewOfSeriesModel(componentModel) : api.getViewOfComponentModel(componentModel); // Leave blur anyway + + view.group.traverse(function (child) { + singleLeaveBlur(child); + }); + }); + } + + function toggleSeriesBlurState(targetSeriesIndex, focus, blurScope, api, isBlur) { + var ecModel = api.getModel(); + blurScope = blurScope || 'coordinateSystem'; + + function leaveBlurOfIndices(data, dataIndices) { + for (var i = 0; i < dataIndices.length; i++) { + var itemEl = data.getItemGraphicEl(dataIndices[i]); + itemEl && leaveBlur(itemEl); + } + } + + if (!isBlur) { + allLeaveBlur(api); + return; + } + + if (targetSeriesIndex == null) { + return; + } + + if (!focus || focus === 'none') { + return; + } + + var targetSeriesModel = ecModel.getSeriesByIndex(targetSeriesIndex); + var targetCoordSys = targetSeriesModel.coordinateSystem; + + if (targetCoordSys && targetCoordSys.master) { + targetCoordSys = targetCoordSys.master; + } + + var blurredSeries = []; + ecModel.eachSeries(function (seriesModel) { + var sameSeries = targetSeriesModel === seriesModel; + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.master) { + coordSys = coordSys.master; + } + + var sameCoordSys = coordSys && targetCoordSys ? coordSys === targetCoordSys : sameSeries; // If there is no coordinate system. use sameSeries instead. + + if (!( // Not blur other series if blurScope series + blurScope === 'series' && !sameSeries // Not blur other coordinate system if blurScope is coordinateSystem + || blurScope === 'coordinateSystem' && !sameCoordSys // Not blur self series if focus is series. + || focus === 'series' && sameSeries // TODO blurScope: coordinate system + )) { + var view = api.getViewOfSeriesModel(seriesModel); + view.group.traverse(function (child) { + singleEnterBlur(child); + }); + + if (isArrayLike(focus)) { + leaveBlurOfIndices(seriesModel.getData(), focus); + } else if (isObject(focus)) { + var dataTypes = keys(focus); + + for (var d = 0; d < dataTypes.length; d++) { + leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), focus[dataTypes[d]]); + } + } + + blurredSeries.push(seriesModel); + } + }); + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType === 'series') { + return; + } + + var view = api.getViewOfComponentModel(componentModel); + + if (view && view.blurSeries) { + view.blurSeries(blurredSeries, ecModel); + } + }); + } + function toggleSeriesBlurStateFromPayload(seriesModel, payload, api) { + if (!isHighDownPayload(payload)) { + return; + } + + var isHighlight = payload.type === HIGHLIGHT_ACTION_TYPE; + var seriesIndex = seriesModel.seriesIndex; + var data = seriesModel.getData(payload.dataType); + var dataIndex = queryDataIndex(data, payload); // Pick the first one if there is multiple/none exists. + + dataIndex = (isArray(dataIndex) ? dataIndex[0] : dataIndex) || 0; + var el = data.getItemGraphicEl(dataIndex); + + if (!el) { + var count = data.count(); + var current = 0; // If data on dataIndex is NaN. + + while (!el && current < count) { + el = data.getItemGraphicEl(current++); + } + } + + if (el) { + var ecData = getECData(el); + toggleSeriesBlurState(seriesIndex, ecData.focus, ecData.blurScope, api, isHighlight); + } else { + // If there is no element put on the data. Try getting it from raw option + // TODO Should put it on seriesModel? + var focus_1 = seriesModel.get(['emphasis', 'focus']); + var blurScope = seriesModel.get(['emphasis', 'blurScope']); + + if (focus_1 != null) { + toggleSeriesBlurState(seriesIndex, focus_1, blurScope, api, isHighlight); + } + } + } + function toggleSelectionFromPayload(seriesModel, payload, api) { + if (!isSelectChangePayload(payload)) { + return; + } + + var dataType = payload.dataType; + var data = seriesModel.getData(dataType); + var dataIndex = queryDataIndex(data, payload); + + if (!isArray(dataIndex)) { + dataIndex = [dataIndex]; + } + + seriesModel[payload.type === TOGGLE_SELECT_ACTION_TYPE ? 'toggleSelect' : payload.type === SELECT_ACTION_TYPE ? 'select' : 'unselect'](dataIndex, dataType); + } + function updateSeriesElementSelection(seriesModel) { + var allData = seriesModel.getAllData(); + each(allData, function (_a) { + var data = _a.data, + type = _a.type; + data.eachItemGraphicEl(function (el, idx) { + seriesModel.isSelected(idx, type) ? enterSelect(el) : leaveSelect(el); + }); + }); + } + function getAllSelectedIndices(ecModel) { + var ret = []; + ecModel.eachSeries(function (seriesModel) { + var allData = seriesModel.getAllData(); + each(allData, function (_a) { + var data = _a.data, + type = _a.type; + var dataIndices = seriesModel.getSelectedDataIndices(); + + if (dataIndices.length > 0) { + var item = { + dataIndex: dataIndices, + seriesIndex: seriesModel.seriesIndex + }; + + if (type != null) { + item.dataType = type; + } + + ret.push(item); + } + }); + }); + return ret; + } + /** + * Enable the function that mouseover will trigger the emphasis state. + * + * NOTE: + * This function should be used on the element with dataIndex, seriesIndex. + * + */ + + function enableHoverEmphasis(el, focus, blurScope) { + setAsHighDownDispatcher(el, true); + traverseUpdateState(el, setDefaultStateProxy); + enableHoverFocus(el, focus, blurScope); + } + function enableHoverFocus(el, focus, blurScope) { + var ecData = getECData(el); + + if (focus != null) { + // TODO dataIndex may be set after this function. This check is not useful. + // if (ecData.dataIndex == null) { + // if (__DEV__) { + // console.warn('focus can only been set on element with dataIndex'); + // } + // } + // else { + ecData.focus = focus; + ecData.blurScope = blurScope; // } + } else if (ecData.focus) { + ecData.focus = null; + } + } + var OTHER_STATES = ['emphasis', 'blur', 'select']; + var defaultStyleGetterMap = { + itemStyle: 'getItemStyle', + lineStyle: 'getLineStyle', + areaStyle: 'getAreaStyle' + }; + /** + * Set emphasis/blur/selected states of element. + */ + + function setStatesStylesFromModel(el, itemModel, styleType, // default itemStyle + getter) { + styleType = styleType || 'itemStyle'; + + for (var i = 0; i < OTHER_STATES.length; i++) { + var stateName = OTHER_STATES[i]; + var model = itemModel.getModel([stateName, styleType]); + var state = el.ensureState(stateName); // Let it throw error if getterType is not found. + + state.style = getter ? getter(model) : model[defaultStyleGetterMap[styleType]](); + } + } + /** + * @parame el + * @param el.highDownSilentOnTouch + * In touch device, mouseover event will be trigger on touchstart event + * (see module:zrender/dom/HandlerProxy). By this mechanism, we can + * conveniently use hoverStyle when tap on touch screen without additional + * code for compatibility. + * But if the chart/component has select feature, which usually also use + * hoverStyle, there might be conflict between 'select-highlight' and + * 'hover-highlight' especially when roam is enabled (see geo for example). + * In this case, `highDownSilentOnTouch` should be used to disable + * hover-highlight on touch device. + * @param asDispatcher If `false`, do not set as "highDownDispatcher". + */ + + function setAsHighDownDispatcher(el, asDispatcher) { + var disable = asDispatcher === false; + var extendedEl = el; // Make `highDownSilentOnTouch` and `onStateChange` only work after + // `setAsHighDownDispatcher` called. Avoid it is modified by user unexpectedly. + + if (el.highDownSilentOnTouch) { + extendedEl.__highDownSilentOnTouch = el.highDownSilentOnTouch; + } // Simple optimize, since this method might be + // called for each elements of a group in some cases. + + + if (!disable || extendedEl.__highDownDispatcher) { + // Emphasis, normal can be triggered manually by API or other components like hover link. + // el[method]('emphasis', onElementEmphasisEvent)[method]('normal', onElementNormalEvent); + // Also keep previous record. + extendedEl.__highByOuter = extendedEl.__highByOuter || 0; + extendedEl.__highDownDispatcher = !disable; + } + } + function isHighDownDispatcher(el) { + return !!(el && el.__highDownDispatcher); + } + /** + * Support hightlight/downplay record on each elements. + * For the case: hover highlight/downplay (legend, visualMap, ...) and + * user triggerred hightlight/downplay should not conflict. + * Only all of the highlightDigit cleared, return to normal. + * @param {string} highlightKey + * @return {number} highlightDigit + */ + + function getHighlightDigit(highlightKey) { + var highlightDigit = _highlightKeyMap[highlightKey]; + + if (highlightDigit == null && _highlightNextDigit <= 32) { + highlightDigit = _highlightKeyMap[highlightKey] = _highlightNextDigit++; + } + + return highlightDigit; + } + function isSelectChangePayload(payload) { + var payloadType = payload.type; + return payloadType === SELECT_ACTION_TYPE || payloadType === UNSELECT_ACTION_TYPE || payloadType === TOGGLE_SELECT_ACTION_TYPE; + } + function isHighDownPayload(payload) { + var payloadType = payload.type; + return payloadType === HIGHLIGHT_ACTION_TYPE || payloadType === DOWNPLAY_ACTION_TYPE; + } + function savePathStates(el) { + var store = getSavedStates(el); + store.normalFill = el.style.fill; + store.normalStroke = el.style.stroke; + var selectState = el.states.select || {}; + store.selectFill = selectState.style && selectState.style.fill || null; + store.selectStroke = selectState.style && selectState.style.stroke || null; + } + + var CMD$2 = PathProxy.CMD; + var points = [[], [], []]; + var mathSqrt$2 = Math.sqrt; + var mathAtan2 = Math.atan2; + function transformPath(path, m) { + var data = path.data; + var len = path.len(); + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + var M = CMD$2.M; + var C = CMD$2.C; + var L = CMD$2.L; + var R = CMD$2.R; + var A = CMD$2.A; + var Q = CMD$2.Q; + for (i = 0, j = 0; i < len;) { + 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$2(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt$2(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + data[i] *= sx; + data[i++] += x; + data[i] *= sy; + data[i++] += y; + data[i++] *= sx; + data[i++] *= sy; + data[i++] += angle; + data[i++] += angle; + i += 2; + j = i; + break; + case R: + p[0] = data[i++]; + p[1] = data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + p[0] += data[i++]; + p[1] += data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + for (k = 0; k < nPoint; k++) { + var p_1 = points[k]; + p_1[0] = data[i++]; + p_1[1] = data[i++]; + applyTransform(p_1, p_1, m); + data[j++] = p_1[0]; + data[j++] = p_1[1]; + } + } + path.increaseVersion(); + } + + var mathSqrt$3 = Math.sqrt; + var mathSin$2 = Math.sin; + var mathCos$2 = Math.cos; + var PI$1 = Math.PI; + function vMag(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); + } + function vRatio(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); + } + function vAngle(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$1 / 180.0); + var xp = mathCos$2(psi) * (x1 - x2) / 2.0 + + mathSin$2(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin$2(psi) * (x1 - x2) / 2.0 + + mathCos$2(psi) * (y1 - y2) / 2.0; + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + if (lambda > 1) { + rx *= mathSqrt$3(lambda); + ry *= mathSqrt$3(lambda); + } + var f = (fa === fs ? -1 : 1) + * mathSqrt$3((((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$2(psi) * cxp + - mathSin$2(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin$2(psi) * cxp + + mathCos$2(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$1; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (dTheta < 0) { + var n = Math.round(dTheta / PI$1 * 1e6) / 1e6; + dTheta = PI$1 * 2 + (n % 2) * PI$1; + } + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); + } + var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig; + var numberReg = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + function createPathProxyFromString(data) { + var path = new PathProxy(); + if (!data) { + return path; + } + var cpx = 0; + var cpy = 0; + var subpathX = cpx; + var subpathY = cpy; + var prevCmd; + var CMD = PathProxy.CMD; + var cmdList = data.match(commandReg); + if (!cmdList) { + return path; + } + for (var l = 0; l < cmdList.length; l++) { + var cmdText = cmdList[l]; + var cmdStr = cmdText.charAt(0); + var cmd = void 0; + var p = cmdText.match(numberReg) || []; + var pLen = p.length; + for (var i = 0; i < pLen; i++) { + p[i] = parseFloat(p[i]); + } + var off = 0; + while (off < pLen) { + var ctlPtx = void 0; + var ctlPty = void 0; + var rx = void 0; + var ry = void 0; + var psi = void 0; + var fa = void 0; + var fs = void 0; + var x1 = cpx; + var y1 = cpy; + var len = void 0; + var pathData = void 0; + switch (cmdStr) { + 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); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = '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; + len = path.len(); + 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; + len = path.len(); + 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; + len = path.len(); + 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; + len = path.len(); + 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 (cmdStr === 'z' || cmdStr === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + cpx = subpathX; + cpy = subpathY; + } + prevCmd = cmd; + } + path.toStatic(); + return path; + } + var SVGPath = (function (_super) { + __extends(SVGPath, _super); + function SVGPath() { + return _super !== null && _super.apply(this, arguments) || this; + } + SVGPath.prototype.applyTransform = function (m) { }; + return SVGPath; + }(Path)); + function isPathProxy(path) { + return path.setData != null; + } + function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + var innerOpts = extend({}, opts); + innerOpts.buildPath = function (path) { + if (isPathProxy(path)) { + path.setData(pathProxy.data); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + else { + var ctx = path; + pathProxy.rebuildPath(ctx, 1); + } + }; + innerOpts.applyTransform = function (m) { + transformPath(pathProxy, m); + this.dirtyShape(); + }; + return innerOpts; + } + function createFromString(str, opts) { + return new SVGPath(createPathOptions(str, opts)); + } + function extendFromString(str, defaultOpts) { + var innerOpts = createPathOptions(str, defaultOpts); + var Sub = (function (_super) { + __extends(Sub, _super); + function Sub(opts) { + var _this = _super.call(this, opts) || this; + _this.applyTransform = innerOpts.applyTransform; + _this.buildPath = innerOpts.buildPath; + return _this; + } + return Sub; + }(SVGPath)); + return Sub; + } + function mergePath(pathEls, opts) { + var pathList = []; + var len = pathEls.length; + for (var i = 0; i < len; i++) { + var pathEl = pathEls[i]; + if (!pathEl.path) { + pathEl.createPathProxy(); + } + if (pathEl.shapeChanged()) { + pathEl.buildPath(pathEl.path, pathEl.shape, true); + } + pathList.push(pathEl.path); + } + var pathBundle = new Path(opts); + pathBundle.createPathProxy(); + pathBundle.buildPath = function (path) { + if (isPathProxy(path)) { + path.appendPath(pathList); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + }; + return pathBundle; + } + + var CircleShape = (function () { + function CircleShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + } + return CircleShape; + }()); + var Circle = (function (_super) { + __extends(Circle, _super); + function Circle(opts) { + return _super.call(this, opts) || this; + } + Circle.prototype.getDefaultShape = function () { + return new CircleShape(); + }; + Circle.prototype.buildPath = function (ctx, shape, inBundle) { + if (inBundle) { + ctx.moveTo(shape.cx + shape.r, shape.cy); + } + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2); + }; + return Circle; + }(Path)); + Circle.prototype.type = 'circle'; + + var EllipseShape = (function () { + function EllipseShape() { + this.cx = 0; + this.cy = 0; + this.rx = 0; + this.ry = 0; + } + return EllipseShape; + }()); + var Ellipse = (function (_super) { + __extends(Ellipse, _super); + function Ellipse(opts) { + return _super.call(this, opts) || this; + } + Ellipse.prototype.getDefaultShape = function () { + return new EllipseShape(); + }; + Ellipse.prototype.buildPath = function (ctx, shape) { + var k = 0.5522848; + var x = shape.cx; + var y = shape.cy; + var a = shape.rx; + var b = shape.ry; + var ox = a * k; + var oy = b * k; + ctx.moveTo(x - a, y); + ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b); + ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y); + ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b); + ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y); + ctx.closePath(); + }; + return Ellipse; + }(Path)); + Ellipse.prototype.type = 'ellipse'; + + var PI$2 = Math.PI; + var PI2$5 = PI$2 * 2; + var mathSin$3 = Math.sin; + var mathCos$3 = Math.cos; + var mathACos = Math.acos; + var mathATan2 = Math.atan2; + var mathAbs$1 = Math.abs; + var mathSqrt$4 = Math.sqrt; + var mathMax$3 = Math.max; + var mathMin$3 = Math.min; + var e = 1e-4; + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0; + var y10 = y1 - y0; + var x32 = x3 - x2; + var y32 = y3 - y2; + var t = y32 * x10 - x32 * y10; + if (t * t < e) { + return; + } + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; + } + function computeCornerTangents(x0, y0, x1, y1, radius, cr, clockwise) { + var x01 = x0 - x1; + var y01 = y0 - y1; + var lo = (clockwise ? cr : -cr) / mathSqrt$4(x01 * x01 + y01 * y01); + var ox = lo * y01; + var oy = -lo * x01; + var x11 = x0 + ox; + var y11 = y0 + oy; + var x10 = x1 + ox; + var y10 = y1 + oy; + var x00 = (x11 + x10) / 2; + var y00 = (y11 + y10) / 2; + var dx = x10 - x11; + var dy = y10 - y11; + var d2 = dx * dx + dy * dy; + var r = radius - cr; + var s = x11 * y10 - x10 * y11; + var d = (dy < 0 ? -1 : 1) * mathSqrt$4(mathMax$3(0, r * r * d2 - s * s)); + var cx0 = (s * dy - dx * d) / d2; + var cy0 = (-s * dx - dy * d) / d2; + var cx1 = (s * dy + dx * d) / d2; + var cy1 = (-s * dx + dy * d) / d2; + var dx0 = cx0 - x00; + var dy0 = cy0 - y00; + var dx1 = cx1 - x00; + var dy1 = cy1 - y00; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) { + cx0 = cx1; + cy0 = cy1; + } + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (radius / r - 1), + y11: cy0 * (radius / r - 1) + }; + } + function buildPath$1(ctx, shape) { + var radius = mathMax$3(shape.r, 0); + var innerRadius = mathMax$3(shape.r0 || 0, 0); + var hasRadius = radius > 0; + var hasInnerRadius = innerRadius > 0; + if (!hasRadius && !hasInnerRadius) { + return; + } + if (!hasRadius) { + radius = innerRadius; + innerRadius = 0; + } + if (innerRadius > radius) { + var tmp = radius; + radius = innerRadius; + innerRadius = tmp; + } + var clockwise = !!shape.clockwise; + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var arc; + if (startAngle === endAngle) { + arc = 0; + } + else { + var tmpAngles = [startAngle, endAngle]; + normalizeArcAngles(tmpAngles, !clockwise); + arc = mathAbs$1(tmpAngles[0] - tmpAngles[1]); + } + var x = shape.cx; + var y = shape.cy; + var cornerRadius = shape.cornerRadius || 0; + var innerCornerRadius = shape.innerCornerRadius || 0; + if (!(radius > e)) { + ctx.moveTo(x, y); + } + else if (arc > PI2$5 - e) { + ctx.moveTo(x + radius * mathCos$3(startAngle), y + radius * mathSin$3(startAngle)); + ctx.arc(x, y, radius, startAngle, endAngle, !clockwise); + if (innerRadius > e) { + ctx.moveTo(x + innerRadius * mathCos$3(endAngle), y + innerRadius * mathSin$3(endAngle)); + ctx.arc(x, y, innerRadius, endAngle, startAngle, clockwise); + } + } + else { + var halfRd = mathAbs$1(radius - innerRadius) / 2; + var cr = mathMin$3(halfRd, cornerRadius); + var icr = mathMin$3(halfRd, innerCornerRadius); + var cr0 = icr; + var cr1 = cr; + var xrs = radius * mathCos$3(startAngle); + var yrs = radius * mathSin$3(startAngle); + var xire = innerRadius * mathCos$3(endAngle); + var yire = innerRadius * mathSin$3(endAngle); + var xre = void 0; + var yre = void 0; + var xirs = void 0; + var yirs = void 0; + if (cr > e || icr > e) { + xre = radius * mathCos$3(endAngle); + yre = radius * mathSin$3(endAngle); + xirs = innerRadius * mathCos$3(startAngle); + yirs = innerRadius * mathSin$3(startAngle); + if (arc < PI$2) { + var it_1 = intersect(xrs, yrs, xirs, yirs, xre, yre, xire, yire); + if (it_1) { + var x0 = xrs - it_1[0]; + var y0 = yrs - it_1[1]; + var x1 = xre - it_1[0]; + var y1 = yre - it_1[1]; + var a = 1 / mathSin$3(mathACos((x0 * x1 + y0 * y1) / (mathSqrt$4(x0 * x0 + y0 * y0) * mathSqrt$4(x1 * x1 + y1 * y1))) / 2); + var b = mathSqrt$4(it_1[0] * it_1[0] + it_1[1] * it_1[1]); + cr0 = mathMin$3(icr, (innerRadius - b) / (a - 1)); + cr1 = mathMin$3(cr, (radius - b) / (a + 1)); + } + } + } + if (!(arc > e)) { + ctx.moveTo(x + xrs, y + yrs); + } + else if (cr1 > e) { + var ct0 = computeCornerTangents(xirs, yirs, xrs, yrs, radius, cr1, clockwise); + var ct1 = computeCornerTangents(xre, yre, xire, yire, radius, cr1, clockwise); + ctx.moveTo(x + ct0.cx + ct0.x01, y + ct0.cy + ct0.y01); + if (cr1 < cr) { + ctx.arc(x + ct0.cx, y + ct0.cy, cr1, mathATan2(ct0.y01, ct0.x01), mathATan2(ct1.y01, ct1.x01), !clockwise); + } + else { + ctx.arc(x + ct0.cx, y + ct0.cy, cr1, mathATan2(ct0.y01, ct0.x01), mathATan2(ct0.y11, ct0.x11), !clockwise); + ctx.arc(x, y, radius, mathATan2(ct0.cy + ct0.y11, ct0.cx + ct0.x11), mathATan2(ct1.cy + ct1.y11, ct1.cx + ct1.x11), !clockwise); + ctx.arc(x + ct1.cx, y + ct1.cy, cr1, mathATan2(ct1.y11, ct1.x11), mathATan2(ct1.y01, ct1.x01), !clockwise); + } + } + else { + ctx.moveTo(x + xrs, y + yrs); + ctx.arc(x, y, radius, startAngle, endAngle, !clockwise); + } + if (!(innerRadius > e) || !(arc > e)) { + ctx.lineTo(x + xire, y + yire); + } + else if (cr0 > e) { + var ct0 = computeCornerTangents(xire, yire, xre, yre, innerRadius, -cr0, clockwise); + var ct1 = computeCornerTangents(xrs, yrs, xirs, yirs, innerRadius, -cr0, clockwise); + ctx.lineTo(x + ct0.cx + ct0.x01, y + ct0.cy + ct0.y01); + if (cr0 < icr) { + ctx.arc(x + ct0.cx, y + ct0.cy, cr0, mathATan2(ct0.y01, ct0.x01), mathATan2(ct1.y01, ct1.x01), !clockwise); + } + else { + ctx.arc(x + ct0.cx, y + ct0.cy, cr0, mathATan2(ct0.y01, ct0.x01), mathATan2(ct0.y11, ct0.x11), !clockwise); + ctx.arc(x, y, innerRadius, mathATan2(ct0.cy + ct0.y11, ct0.cx + ct0.x11), mathATan2(ct1.cy + ct1.y11, ct1.cx + ct1.x11), clockwise); + ctx.arc(x + ct1.cx, y + ct1.cy, cr0, mathATan2(ct1.y11, ct1.x11), mathATan2(ct1.y01, ct1.x01), !clockwise); + } + } + else { + ctx.lineTo(x + xire, y + yire); + ctx.arc(x, y, innerRadius, endAngle, startAngle, clockwise); + } + } + ctx.closePath(); + } + + var SectorShape = (function () { + function SectorShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + this.cornerRadius = 0; + this.innerCornerRadius = 0; + } + return SectorShape; + }()); + var Sector = (function (_super) { + __extends(Sector, _super); + function Sector(opts) { + return _super.call(this, opts) || this; + } + Sector.prototype.getDefaultShape = function () { + return new SectorShape(); + }; + Sector.prototype.buildPath = function (ctx, shape) { + buildPath$1(ctx, shape); + }; + Sector.prototype.isZeroArea = function () { + return this.shape.startAngle === this.shape.endAngle + || this.shape.r === this.shape.r0; + }; + return Sector; + }(Path)); + Sector.prototype.type = 'sector'; + + var RingShape = (function () { + function RingShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.r0 = 0; + } + return RingShape; + }()); + var Ring = (function (_super) { + __extends(Ring, _super); + function Ring(opts) { + return _super.call(this, opts) || this; + } + Ring.prototype.getDefaultShape = function () { + return new RingShape(); + }; + Ring.prototype.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); + }; + return Ring; + }(Path)); + Ring.prototype.type = 'ring'; + + 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; + } + function smoothSpline(points, isLoop) { + var len = points.length; + var ret = []; + var distance$1 = 0; + for (var i = 1; i < len; i++) { + distance$1 += distance(points[i - 1], points[i]); + } + var segs = distance$1 / 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 = void 0; + var p1 = points[idx % len]; + var p2 = void 0; + var p3 = void 0; + 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; + } + + function smoothBezier(points, smooth, isLoop, constraint) { + var cps = []; + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + var min$1; + var max$1; + if (constraint) { + min$1 = [Infinity, Infinity]; + max$1 = [-Infinity, -Infinity]; + for (var i = 0, len = points.length; i < len; i++) { + min(min$1, min$1, points[i]); + max(max$1, max$1, points[i]); + } + min(min$1, min$1, constraint[0]); + max(max$1, max$1, 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(clone$1(points[i])); + continue; + } + else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + sub(v, nextPoint, prevPoint); + scale(v, v, smooth); + var d0 = distance(point, prevPoint); + var d1 = distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + scale(v1, v, -d0); + scale(v2, v, d1); + var cp0 = add([], point, v1); + var cp1 = add([], point, v2); + if (constraint) { + max(cp0, cp0, min$1); + min(cp0, cp0, max$1); + max(cp1, cp1, min$1); + min(cp1, cp1, max$1); + } + cps.push(cp0); + cps.push(cp1); + } + if (isLoop) { + cps.push(cps.shift()); + } + return cps; + } + + function buildPath$2(ctx, shape, closePath) { + var smooth = shape.smooth; + var points = shape.points; + 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(); + } + } + + var PolygonShape = (function () { + function PolygonShape() { + this.points = null; + this.smooth = 0; + this.smoothConstraint = null; + } + return PolygonShape; + }()); + var Polygon = (function (_super) { + __extends(Polygon, _super); + function Polygon(opts) { + return _super.call(this, opts) || this; + } + Polygon.prototype.getDefaultShape = function () { + return new PolygonShape(); + }; + Polygon.prototype.buildPath = function (ctx, shape) { + buildPath$2(ctx, shape, true); + }; + return Polygon; + }(Path)); + Polygon.prototype.type = 'polygon'; + + var PolylineShape = (function () { + function PolylineShape() { + this.points = null; + this.percent = 1; + this.smooth = 0; + this.smoothConstraint = null; + } + return PolylineShape; + }()); + var Polyline = (function (_super) { + __extends(Polyline, _super); + function Polyline(opts) { + return _super.call(this, opts) || this; + } + Polyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Polyline.prototype.getDefaultShape = function () { + return new PolylineShape(); + }; + Polyline.prototype.buildPath = function (ctx, shape) { + buildPath$2(ctx, shape, false); + }; + return Polyline; + }(Path)); + Polyline.prototype.type = 'polyline'; + + var subPixelOptimizeOutputShape$1 = {}; + var LineShape = (function () { + function LineShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + return LineShape; + }()); + var Line = (function (_super) { + __extends(Line, _super); + function Line(opts) { + return _super.call(this, opts) || this; + } + Line.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Line.prototype.getDefaultShape = function () { + return new LineShape(); + }; + Line.prototype.buildPath = function (ctx, shape) { + var x1; + var y1; + var x2; + var y2; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeLine(subPixelOptimizeOutputShape$1, shape, this.style); + x1 = optimizedShape.x1; + y1 = optimizedShape.y1; + x2 = optimizedShape.x2; + y2 = optimizedShape.y2; + } + else { + x1 = shape.x1; + y1 = shape.y1; + x2 = shape.x2; + 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); + }; + Line.prototype.pointAt = function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + }; + return Line; + }(Path)); + Line.prototype.type = 'line'; + + var out = []; + var BezierCurveShape = (function () { + function BezierCurveShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.percent = 1; + } + return BezierCurveShape; + }()); + function someVectorAt(shape, t, isTangent) { + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 === null || cpy2 === null) { + return [ + (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t), + (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t) + ]; + } + else { + return [ + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t), + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t) + ]; + } + } + var BezierCurve = (function (_super) { + __extends(BezierCurve, _super); + function BezierCurve(opts) { + return _super.call(this, opts) || this; + } + BezierCurve.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + BezierCurve.prototype.getDefaultShape = function () { + return new BezierCurveShape(); + }; + BezierCurve.prototype.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); + } + }; + BezierCurve.prototype.pointAt = function (t) { + return someVectorAt(this.shape, t, false); + }; + BezierCurve.prototype.tangentAt = function (t) { + var p = someVectorAt(this.shape, t, true); + return normalize(p, p); + }; + return BezierCurve; + }(Path)); + BezierCurve.prototype.type = 'bezier-curve'; + + var ArcShape = (function () { + function ArcShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + return ArcShape; + }()); + var Arc = (function (_super) { + __extends(Arc, _super); + function Arc(opts) { + return _super.call(this, opts) || this; + } + Arc.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Arc.prototype.getDefaultShape = function () { + return new ArcShape(); + }; + Arc.prototype.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); + }; + return Arc; + }(Path)); + Arc.prototype.type = 'arc'; + + var CompoundPath = (function (_super) { + __extends(CompoundPath, _super); + function CompoundPath() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'compound'; + return _this; + } + CompoundPath.prototype._updatePathDirty = function () { + var paths = this.shape.paths; + var dirtyPath = this.shapeChanged(); + for (var i = 0; i < paths.length; i++) { + dirtyPath = dirtyPath || paths[i].shapeChanged(); + } + if (dirtyPath) { + this.dirtyShape(); + } + }; + CompoundPath.prototype.beforeBrush = function () { + this._updatePathDirty(); + var paths = this.shape.paths || []; + var scale = this.getGlobalScale(); + for (var i = 0; i < paths.length; i++) { + if (!paths[i].path) { + paths[i].createPathProxy(); + } + paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold); + } + }; + CompoundPath.prototype.buildPath = function (ctx, shape) { + var paths = shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].buildPath(ctx, paths[i].shape, true); + } + }; + CompoundPath.prototype.afterBrush = function () { + var paths = this.shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].pathUpdated(); + } + }; + CompoundPath.prototype.getBoundingRect = function () { + this._updatePathDirty.call(this); + return Path.prototype.getBoundingRect.call(this); + }; + return CompoundPath; + }(Path)); + + var Gradient = (function () { + function Gradient(colorStops) { + this.colorStops = colorStops || []; + } + Gradient.prototype.addColorStop = function (offset, color) { + this.colorStops.push({ + offset: offset, + color: color + }); + }; + return Gradient; + }()); + + var LinearGradient = (function (_super) { + __extends(LinearGradient, _super); + function LinearGradient(x, y, x2, y2, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0 : x; + _this.y = y == null ? 0 : y; + _this.x2 = x2 == null ? 1 : x2; + _this.y2 = y2 == null ? 0 : y2; + _this.type = 'linear'; + _this.global = globalCoord || false; + return _this; + } + return LinearGradient; + }(Gradient)); + + var RadialGradient = (function (_super) { + __extends(RadialGradient, _super); + function RadialGradient(x, y, r, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0.5 : x; + _this.y = y == null ? 0.5 : y; + _this.r = r == null ? 0.5 : r; + _this.type = 'radial'; + _this.global = globalCoord || false; + return _this; + } + return RadialGradient; + }(Gradient)); + + var extent = [0, 0]; + var extent2 = [0, 0]; + var minTv$1 = new Point(); + var maxTv$1 = new Point(); + var OrientedBoundingRect = (function () { + function OrientedBoundingRect(rect, transform) { + this._corners = []; + this._axes = []; + this._origin = [0, 0]; + for (var i = 0; i < 4; i++) { + this._corners[i] = new Point(); + } + for (var i = 0; i < 2; i++) { + this._axes[i] = new Point(); + } + if (rect) { + this.fromBoundingRect(rect, transform); + } + } + OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) { + var corners = this._corners; + var axes = this._axes; + var x = rect.x; + var y = rect.y; + var x2 = x + rect.width; + var y2 = y + rect.height; + corners[0].set(x, y); + corners[1].set(x2, y); + corners[2].set(x2, y2); + corners[3].set(x, y2); + if (transform) { + for (var i = 0; i < 4; i++) { + corners[i].transform(transform); + } + } + Point.sub(axes[0], corners[1], corners[0]); + Point.sub(axes[1], corners[3], corners[0]); + axes[0].normalize(); + axes[1].normalize(); + for (var i = 0; i < 2; i++) { + this._origin[i] = axes[i].dot(corners[0]); + } + }; + OrientedBoundingRect.prototype.intersect = function (other, mtv) { + var overlapped = true; + var noMtv = !mtv; + minTv$1.set(Infinity, Infinity); + maxTv$1.set(0, 0); + if (!this._intersectCheckOneSide(this, other, minTv$1, maxTv$1, noMtv, 1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!this._intersectCheckOneSide(other, this, minTv$1, maxTv$1, noMtv, -1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!noMtv) { + Point.copy(mtv, overlapped ? minTv$1 : maxTv$1); + } + return overlapped; + }; + OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) { + var overlapped = true; + for (var i = 0; i < 2; i++) { + var axis = this._axes[i]; + this._getProjMinMaxOnAxis(i, self._corners, extent); + this._getProjMinMaxOnAxis(i, other._corners, extent2); + if (extent[1] < extent2[0] || extent[0] > extent2[1]) { + overlapped = false; + if (noMtv) { + return overlapped; + } + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) > maxTv.len()) { + if (dist0 < dist1) { + Point.scale(maxTv, axis, -dist0 * inverse); + } + else { + Point.scale(maxTv, axis, dist1 * inverse); + } + } + } + else if (minTv) { + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) < minTv.len()) { + if (dist0 < dist1) { + Point.scale(minTv, axis, dist0 * inverse); + } + else { + Point.scale(minTv, axis, -dist1 * inverse); + } + } + } + } + return overlapped; + }; + OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) { + var axis = this._axes[dim]; + var origin = this._origin; + var proj = corners[0].dot(axis) + origin[dim]; + var min = proj; + var max = proj; + for (var i = 1; i < corners.length; i++) { + var proj_1 = corners[i].dot(axis) + origin[dim]; + min = Math.min(proj_1, min); + max = Math.max(proj_1, max); + } + out[0] = min; + out[1] = max; + }; + return OrientedBoundingRect; + }()); + + var m = []; + var IncrementalDisplayable = (function (_super) { + __extends(IncrementalDisplayable, _super); + function IncrementalDisplayable() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.notClear = true; + _this.incremental = true; + _this._displayables = []; + _this._temporaryDisplayables = []; + _this._cursor = 0; + return _this; + } + IncrementalDisplayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + IncrementalDisplayable.prototype.useStyle = function () { + this.style = {}; + }; + IncrementalDisplayable.prototype.getCursor = function () { + return this._cursor; + }; + IncrementalDisplayable.prototype.innerAfterBrush = function () { + this._cursor = this._displayables.length; + }; + IncrementalDisplayable.prototype.clearDisplaybles = function () { + this._displayables = []; + this._temporaryDisplayables = []; + this._cursor = 0; + this.markRedraw(); + this.notClear = false; + }; + IncrementalDisplayable.prototype.clearTemporalDisplayables = function () { + this._temporaryDisplayables = []; + }; + IncrementalDisplayable.prototype.addDisplayable = function (displayable, notPersistent) { + if (notPersistent) { + this._temporaryDisplayables.push(displayable); + } + else { + this._displayables.push(displayable); + } + this.markRedraw(); + }; + IncrementalDisplayable.prototype.addDisplayables = function (displayables, notPersistent) { + notPersistent = notPersistent || false; + for (var i = 0; i < displayables.length; i++) { + this.addDisplayable(displayables[i], notPersistent); + } + }; + IncrementalDisplayable.prototype.getDisplayables = function () { + return this._displayables; + }; + IncrementalDisplayable.prototype.getTemporalDisplayables = function () { + return this._temporaryDisplayables; + }; + IncrementalDisplayable.prototype.eachPendingDisplayable = function (cb) { + for (var i = this._cursor; i < this._displayables.length; i++) { + cb && cb(this._displayables[i]); + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + cb && cb(this._temporaryDisplayables[i]); + } + }; + IncrementalDisplayable.prototype.update = function () { + this.updateTransform(); + for (var i = this._cursor; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + var displayable = this._temporaryDisplayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + }; + IncrementalDisplayable.prototype.getBoundingRect = function () { + if (!this._rect) { + var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity); + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + var childRect = displayable.getBoundingRect().clone(); + if (displayable.needLocalTransform()) { + childRect.applyTransform(displayable.getLocalTransform(m)); + } + rect.union(childRect); + } + this._rect = rect; + } + return this._rect; + }; + IncrementalDisplayable.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + if (rect.contain(localPos[0], localPos[1])) { + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + if (displayable.contain(x, y)) { + return true; + } + } + } + return false; + }; + return IncrementalDisplayable; + }(Displayable)); + + var mathMax$4 = Math.max; + var mathMin$4 = Math.min; + var _customShapeMap = {}; + /** + * Extend shape with parameters + */ + + function extendShape(opts) { + return Path.extend(opts); + } + var extendPathFromString = extendFromString; + /** + * Extend path + */ + + function extendPath(pathData, opts) { + return extendPathFromString(pathData, opts); + } + /** + * Register a user defined shape. + * The shape class can be fetched by `getShapeClass` + * This method will overwrite the registered shapes, including + * the registered built-in shapes, if using the same `name`. + * The shape can be used in `custom series` and + * `graphic component` by declaring `{type: name}`. + * + * @param name + * @param ShapeClass Can be generated by `extendShape`. + */ + + function registerShape(name, ShapeClass) { + _customShapeMap[name] = ShapeClass; + } + /** + * Find shape class registered by `registerShape`. Usually used in + * fetching user defined shape. + * + * [Caution]: + * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared + * to use user registered shapes. + * Because the built-in shape (see `getBuiltInShape`) will be registered by + * `registerShape` by default. That enables users to get both built-in + * shapes as well as the shapes belonging to themsleves. But users can overwrite + * the built-in shapes by using names like 'circle', 'rect' via calling + * `registerShape`. So the echarts inner featrues should not fetch shapes from here + * in case that it is overwritten by users, except that some features, like + * `custom series`, `graphic component`, do it deliberately. + * + * (2) In the features like `custom series`, `graphic component`, the user input + * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic + * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names + * are reserved names, that is, if some user register a shape named `'image'`, + * the shape will not be used. If we intending to add some more reserved names + * in feature, that might bring break changes (disable some existing user shape + * names). But that case probably rearly happen. So we dont make more mechanism + * to resolve this issue here. + * + * @param name + * @return The shape class. If not found, return nothing. + */ + + function getShapeClass(name) { + if (_customShapeMap.hasOwnProperty(name)) { + return _customShapeMap[name]; + } + } + /** + * Create a path element from path data string + * @param pathData + * @param opts + * @param rect + * @param layout 'center' or 'cover' default to be cover + */ + + function makePath(pathData, opts, rect, layout) { + var path = createFromString(pathData, opts); + + if (rect) { + if (layout === 'center') { + rect = centerGraphic(rect, path.getBoundingRect()); + } + + resizePath(path, rect); + } + + return path; + } + /** + * Create a image element from image url + * @param imageUrl image url + * @param opts options + * @param rect constrain rect + * @param layout 'center' or 'cover'. Default to be 'cover' + */ + + function makeImage(imageUrl, rect, layout) { + var zrImg = new ZRImage({ + style: { + image: imageUrl, + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + onload: function (img) { + if (layout === 'center') { + var boundingRect = { + width: img.width, + height: img.height + }; + zrImg.setStyle(centerGraphic(rect, boundingRect)); + } + } + }); + return zrImg; + } + /** + * Get position of centered element in bounding box. + * + * @param rect element local bounding box + * @param boundingRect constraint bounding box + * @return element position containing x, y, width, and height + */ + + function centerGraphic(rect, boundingRect) { + // Set rect to center, keep width / height ratio. + var aspect = boundingRect.width / boundingRect.height; + 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; + return { + x: cx - width / 2, + y: cy - height / 2, + width: width, + height: height + }; + } + + var mergePath$1 = mergePath; + /** + * Resize a path to fit the rect + * @param path + * @param rect + */ + + function resizePath(path, rect) { + if (!path.applyTransform) { + return; + } + + var pathRect = path.getBoundingRect(); + var m = pathRect.calculateTransform(rect); + path.applyTransform(m); + } + /** + * Sub pixel optimize line for canvas + */ + + function subPixelOptimizeLine$1(param) { + subPixelOptimizeLine(param.shape, param.shape, param.style); + return param; + } + /** + * Sub pixel optimize rect for canvas + */ + + function subPixelOptimizeRect$1(param) { + subPixelOptimizeRect(param.shape, param.shape, param.style); + return param; + } + /** + * Sub pixel optimize for canvas + * + * @param position Coordinate, such as x, y + * @param lineWidth Should be nonnegative integer. + * @param positiveOrNegative Default false (negative). + * @return Optimized position. + */ + + var subPixelOptimize$1 = subPixelOptimize; + + function animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) { + var isFrom = false; + var removeOpt; + + if (typeof dataIndex === 'function') { + during = cb; + cb = dataIndex; + dataIndex = null; + } else if (isObject(dataIndex)) { + cb = dataIndex.cb; + during = dataIndex.during; + isFrom = dataIndex.isFrom; + removeOpt = dataIndex.removeOpt; + dataIndex = dataIndex.dataIndex; + } + + var isUpdate = animationType === 'update'; + var isRemove = animationType === 'remove'; + var animationPayload; // Check if there is global animation configuration from dataZoom/resize can override the config in option. + // If animation is enabled. Will use this animation config in payload. + // If animation is disabled. Just ignore it. + + if (animatableModel && animatableModel.ecModel) { + var updatePayload = animatableModel.ecModel.getUpdatePayload(); + animationPayload = updatePayload && updatePayload.animation; + } + + var animationEnabled = animatableModel && animatableModel.isAnimationEnabled(); + + if (!isRemove) { + // Must stop the remove animation. + el.stopAnimation('remove'); + } + + if (animationEnabled) { + var duration = void 0; + var animationEasing = void 0; + var animationDelay = void 0; + + if (animationPayload) { + duration = animationPayload.duration || 0; + animationEasing = animationPayload.easing || 'cubicOut'; + animationDelay = animationPayload.delay || 0; + } else if (isRemove) { + removeOpt = removeOpt || {}; + duration = retrieve2(removeOpt.duration, 200); + animationEasing = retrieve2(removeOpt.easing, 'cubicOut'); + animationDelay = 0; + } else { + duration = animatableModel.getShallow(isUpdate ? 'animationDurationUpdate' : 'animationDuration'); + animationEasing = animatableModel.getShallow(isUpdate ? 'animationEasingUpdate' : 'animationEasing'); + animationDelay = animatableModel.getShallow(isUpdate ? 'animationDelayUpdate' : 'animationDelay'); + } + + if (typeof animationDelay === 'function') { + animationDelay = animationDelay(dataIndex, animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null); + } + + if (typeof duration === 'function') { + duration = duration(dataIndex); + } + + duration > 0 ? isFrom ? el.animateFrom(props, { + duration: duration, + delay: animationDelay || 0, + easing: animationEasing, + done: cb, + force: !!cb || !!during, + scope: animationType, + during: during + }) : el.animateTo(props, { + duration: duration, + delay: animationDelay || 0, + easing: animationEasing, + done: cb, + force: !!cb || !!during, + setToFinal: true, + scope: animationType, + during: during + }) : ( // FIXME: + // If `duration` is 0, only the animation on props + // can be stoped, other animation should be continued? + // But at present using duration 0 in `animateTo`, `animateFrom` + // might cause unexpected behavior. + el.stopAnimation(), // If `isFrom`, the props is the "from" props. + !isFrom && el.attr(props), cb && cb()); + } else { + el.stopAnimation(); + !isFrom && el.attr(props); // Call during once. + + during && during(1); + cb && cb(); + } + } + /** + * Update graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + * @example + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, dataIndex, function () { console.log('Animation done!'); }); + * // Or + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, function () { console.log('Animation done!'); }); + */ + + + function updateProps(el, props, // TODO: TYPE AnimatableModel + animatableModel, dataIndex, cb, during) { + animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during); + } + /** + * Init graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + */ + + function initProps(el, props, animatableModel, dataIndex, cb, during) { + animateOrSetProps('init', el, props, animatableModel, dataIndex, cb, during); + } + /** + * Remove graphic element + */ + + function removeElement(el, props, animatableModel, dataIndex, cb, during) { + // Don't do remove animation twice. + if (isElementRemoved(el)) { + return; + } + + animateOrSetProps('remove', el, props, animatableModel, dataIndex, cb, during); + } + + function fadeOutDisplayable(el, animatableModel, dataIndex, done) { + el.removeTextContent(); + el.removeTextGuideLine(); + removeElement(el, { + style: { + opacity: 0 + } + }, animatableModel, dataIndex, done); + } + + function removeElementWithFadeOut(el, animatableModel, dataIndex) { + function doRemove() { + el.parent && el.parent.remove(el); + } // Hide label and labelLine first + // TODO Also use fade out animation? + + + if (!el.isGroup) { + fadeOutDisplayable(el, animatableModel, dataIndex, doRemove); + } else { + el.traverse(function (disp) { + if (!disp.isGroup) { + // Can invoke doRemove multiple times. + fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove); + } + }); + } + } + /** + * If element is removed. + * It can determine if element is having remove animation. + */ + + function isElementRemoved(el) { + if (!el.__zr) { + return true; + } + + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + + if (animator.scope === 'remove') { + return true; + } + } + + return false; + } + /** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param target + * @param [ancestor] + */ + + function getTransform(target, ancestor) { + var mat = identity([]); + + while (target && target !== ancestor) { + mul$1(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + return mat; + } + /** + * Apply transform to an vertex. + * @param target [x, y] + * @param transform Can be: + * + Transform matrix: like [1, 0, 0, 1, 0, 0] + * + {position, rotation, scale}, the same as `zrender/Transformable`. + * @param invert Whether use invert matrix. + * @return [x, y] + */ + + function applyTransform$1(target, transform, invert$1) { + if (transform && !isArrayLike(transform)) { + transform = Transformable.getLocalTransform(transform); + } + + if (invert$1) { + transform = invert([], transform); + } + + return applyTransform([], target, transform); + } + /** + * @param direction 'left' 'right' 'top' 'bottom' + * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param invert Whether use invert matrix. + * @return Transformed direction. 'left' 'right' 'top' 'bottom' + */ + + function transformDirection(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 = applyTransform$1(vertex, transform, invert); + return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top'; + } + + function isNotGroup(el) { + return !el.isGroup; + } + + function isPath(el) { + return el.shape != null; + } + /** + * Apply group transition animation from g1 to g2. + * If no animatableModel, no animation. + */ + + + function groupTransition(g1, g2, animatableModel) { + if (!g1 || !g2) { + return; + } + + function getElMap(g) { + var elMap = {}; + g.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + elMap[el.anid] = el; + } + }); + return elMap; + } + + function getAnimatableProps(el) { + var obj = { + x: el.x, + y: el.y, + rotation: el.rotation + }; + + if (isPath(el)) { + obj.shape = extend({}, el.shape); + } + + return obj; + } + + var elMap1 = getElMap(g1); + g2.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + var oldEl = elMap1[el.anid]; + + if (oldEl) { + var newProp = getAnimatableProps(el); + el.attr(getAnimatableProps(oldEl)); + updateProps(el, newProp, animatableModel, getECData(el).dataIndex); + } + } + }); + } + function clipPointsByRect(points, rect) { + // FIXME: this way migth be incorrect when grpahic clipped by a corner. + // and when element have border. + return map(points, function (point) { + var x = point[0]; + x = mathMax$4(x, rect.x); + x = mathMin$4(x, rect.x + rect.width); + var y = point[1]; + y = mathMax$4(y, rect.y); + y = mathMin$4(y, rect.y + rect.height); + return [x, y]; + }); + } + /** + * Return a new clipped rect. If rect size are negative, return undefined. + */ + + function clipRectByRect(targetRect, rect) { + var x = mathMax$4(targetRect.x, rect.x); + var x2 = mathMin$4(targetRect.x + targetRect.width, rect.x + rect.width); + var y = mathMax$4(targetRect.y, rect.y); + var y2 = mathMin$4(targetRect.y + targetRect.height, rect.y + rect.height); // If the total rect is cliped, nothing, including the border, + // should be painted. So return undefined. + + if (x2 >= x && y2 >= y) { + return { + x: x, + y: y, + width: x2 - x, + height: y2 - y + }; + } + } + function createIcon(iconStr, // Support 'image://' or 'path://' or direct svg path. + opt, rect) { + var innerOpts = extend({ + rectHover: true + }, opt); + var style = innerOpts.style = { + strokeNoScale: true + }; + rect = rect || { + x: -1, + y: -1, + width: 2, + height: 2 + }; + + if (iconStr) { + return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace('path://', ''), innerOpts, rect, 'center'); + } + } + /** + * Return `true` if the given line (line `a`) and the given polygon + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ + + function linePolygonIntersect(a1x, a1y, a2x, a2y, points) { + for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) { + var p = points[i]; + + if (lineLineIntersect(a1x, a1y, a2x, a2y, p[0], p[1], p2[0], p2[1])) { + return true; + } + + p2 = p; + } + } + /** + * Return `true` if the given two lines (line `a` and line `b`) + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ + + function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + // let `vec_m` to be `vec_a2 - vec_a1` and `vec_n` to be `vec_b2 - vec_b1`. + var mx = a2x - a1x; + var my = a2y - a1y; + var nx = b2x - b1x; + var ny = b2y - b1y; // `vec_m` and `vec_n` are parallel iff + // exising `k` such that `vec_m = k · vec_n`, equivalent to `vec_m X vec_n = 0`. + + var nmCrossProduct = crossProduct2d(nx, ny, mx, my); + + if (nearZero(nmCrossProduct)) { + return false; + } // `vec_m` and `vec_n` are intersect iff + // existing `p` and `q` in [0, 1] such that `vec_a1 + p * vec_m = vec_b1 + q * vec_n`, + // such that `q = ((vec_a1 - vec_b1) X vec_m) / (vec_n X vec_m)` + // and `p = ((vec_a1 - vec_b1) X vec_n) / (vec_n X vec_m)`. + + + var b1a1x = a1x - b1x; + var b1a1y = a1y - b1y; + var q = crossProduct2d(b1a1x, b1a1y, mx, my) / nmCrossProduct; + + if (q < 0 || q > 1) { + return false; + } + + var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct; + + if (p < 0 || p > 1) { + return false; + } + + return true; + } + /** + * Cross product of 2-dimension vector. + */ + + function crossProduct2d(x1, y1, x2, y2) { + return x1 * y2 - x2 * y1; + } + + function nearZero(val) { + return val <= 1e-6 && val >= -1e-6; + } // Register built-in shapes. These shapes might be overwirtten + // by users, although we do not recommend that. + + + registerShape('circle', Circle); + registerShape('ellipse', Ellipse); + registerShape('sector', Sector); + registerShape('ring', Ring); + registerShape('polygon', Polygon); + registerShape('polyline', Polyline); + registerShape('rect', Rect); + registerShape('line', Line); + registerShape('bezierCurve', BezierCurve); + registerShape('arc', Arc); + + var graphic = /*#__PURE__*/Object.freeze({ + __proto__: null, + extendShape: extendShape, + extendPath: extendPath, + registerShape: registerShape, + getShapeClass: getShapeClass, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath$1, + resizePath: resizePath, + subPixelOptimizeLine: subPixelOptimizeLine$1, + subPixelOptimizeRect: subPixelOptimizeRect$1, + subPixelOptimize: subPixelOptimize$1, + updateProps: updateProps, + initProps: initProps, + removeElement: removeElement, + removeElementWithFadeOut: removeElementWithFadeOut, + isElementRemoved: isElementRemoved, + getTransform: getTransform, + applyTransform: applyTransform$1, + transformDirection: transformDirection, + groupTransition: groupTransition, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + createIcon: createIcon, + linePolygonIntersect: linePolygonIntersect, + lineLineIntersect: lineLineIntersect, + Group: Group, + Image: ZRImage, + Text: ZRText, + Circle: Circle, + Ellipse: Ellipse, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayable, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect, + OrientedBoundingRect: OrientedBoundingRect, + Point: Point, + Path: Path + }); + + var EMPTY_OBJ = {}; + function setLabelText(label, labelTexts) { + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var text = labelTexts[stateName]; + var state = label.ensureState(stateName); + state.style = state.style || {}; + state.style.text = text; + } + + var oldStates = label.currentStates.slice(); + label.clearStates(true); + label.setStyle({ + text: labelTexts.normal + }); + label.useStates(oldStates, true); + } + + function getLabelText(opt, stateModels, interpolatedValue) { + var labelFetcher = opt.labelFetcher; + var labelDataIndex = opt.labelDataIndex; + var labelDimIndex = opt.labelDimIndex; + var normalModel = stateModels.normal; + var baseText; + + if (labelFetcher) { + baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex, normalModel && normalModel.get('formatter'), interpolatedValue != null ? { + interpolatedValue: interpolatedValue + } : null); + } + + if (baseText == null) { + baseText = isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt, interpolatedValue) : opt.defaultText; + } + + var statesText = { + normal: baseText + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = stateModels[stateName]; + statesText[stateName] = retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, stateName, null, labelDimIndex, stateModel && stateModel.get('formatter')) : null, baseText); + } + + return statesText; + } + + function setLabelStyle(targetEl, labelStatesModels, opt, stateSpecified // TODO specified position? + ) { + opt = opt || EMPTY_OBJ; + var isSetOnText = targetEl instanceof ZRText; + var needsCreateText = false; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateModel = labelStatesModels[DISPLAY_STATES[i]]; + + if (stateModel && stateModel.getShallow('show')) { + needsCreateText = true; + break; + } + } + + var textContent = isSetOnText ? targetEl : targetEl.getTextContent(); + + if (needsCreateText) { + if (!isSetOnText) { + // Reuse the previous + if (!textContent) { + textContent = new ZRText(); + targetEl.setTextContent(textContent); + } // Use same state proxy + + + if (targetEl.stateProxy) { + textContent.stateProxy = targetEl.stateProxy; + } + } + + var labelStatesTexts = getLabelText(opt, labelStatesModels); + var normalModel = labelStatesModels.normal; + var showNormal = !!normalModel.getShallow('show'); + var normalStyle = createTextStyle(normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText); + normalStyle.text = labelStatesTexts.normal; + + if (!isSetOnText) { + // Always create new + targetEl.setTextConfig(createTextConfig(normalModel, opt, false)); + } + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = labelStatesModels[stateName]; + + if (stateModel) { + var stateObj = textContent.ensureState(stateName); + var stateShow = !!retrieve2(stateModel.getShallow('show'), showNormal); + + if (stateShow !== showNormal) { + stateObj.ignore = !stateShow; + } + + stateObj.style = createTextStyle(stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText); + stateObj.style.text = labelStatesTexts[stateName]; + + if (!isSetOnText) { + var targetElEmphasisState = targetEl.ensureState(stateName); + targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true); + } + } + } // PENDING: if there is many requirements that emphasis position + // need to be different from normal position, we might consider + // auto slient is those cases. + + + textContent.silent = !!normalModel.getShallow('silent'); // Keep x and y + + if (textContent.style.x != null) { + normalStyle.x = textContent.style.x; + } + + if (textContent.style.y != null) { + normalStyle.y = textContent.style.y; + } + + textContent.ignore = !showNormal; // Always create new style. + + textContent.useStyle(normalStyle); + textContent.dirty(); + + if (opt.enableTextSetter) { + labelInner(textContent).setLabelText = function (interpolatedValue) { + var labelStatesTexts = getLabelText(opt, labelStatesModels, interpolatedValue); + setLabelText(textContent, labelStatesTexts); + }; + } + } else if (textContent) { + // Not display rich text. + textContent.ignore = true; + } + + targetEl.dirty(); + } + function getLabelStatesModels(itemModel, labelName) { + labelName = labelName || 'label'; + var statesModels = { + normal: itemModel.getModel(labelName) + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelName]); + } + + return statesModels; + } + /** + * Set basic textStyle properties. + */ + + function createTextStyle(textStyleModel, specifiedTextStyle, // Fixed style in the code. Can't be set by model. + opt, isNotNormal, isAttached // If text is attached on an element. If so, auto color will handling in zrender. + ) { + var textStyle = {}; + setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached); + specifiedTextStyle && extend(textStyle, specifiedTextStyle); // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false); + + return textStyle; + } + function createTextConfig(textStyleModel, opt, isNotNormal) { + opt = opt || {}; + var textConfig = {}; + var labelPosition; + var labelRotate = textStyleModel.getShallow('rotate'); + var labelDistance = retrieve2(textStyleModel.getShallow('distance'), isNotNormal ? null : 5); + var labelOffset = textStyleModel.getShallow('offset'); + labelPosition = textStyleModel.getShallow('position') || (isNotNormal ? null : 'inside'); // 'outside' is not a valid zr textPostion value, but used + // in bar series, and magric type should be considered. + + labelPosition === 'outside' && (labelPosition = opt.defaultOutsidePosition || 'top'); + + if (labelPosition != null) { + textConfig.position = labelPosition; + } + + if (labelOffset != null) { + textConfig.offset = labelOffset; + } + + if (labelRotate != null) { + labelRotate *= Math.PI / 180; + textConfig.rotation = labelRotate; + } + + if (labelDistance != null) { + textConfig.distance = labelDistance; + } // fill and auto is determined by the color of path fill if it's not specified by developers. + + + textConfig.outsideFill = textStyleModel.get('color') === 'inherit' ? opt.inheritColor || null : 'auto'; + return textConfig; + } + /** + * The uniform entry of set text style, that is, retrieve style definitions + * from `model` and set to `textStyle` object. + * + * Never in merge mode, but in overwrite mode, that is, all of the text style + * properties will be set. (Consider the states of normal and emphasis and + * default value can be adopted, merge would make the logic too complicated + * to manage.) + */ + + function setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) { + // Consider there will be abnormal when merge hover style to normal style if given default value. + opt = opt || EMPTY_OBJ; + var ecModel = textStyleModel.ecModel; + var globalTextStyle = ecModel && ecModel.option.textStyle; // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + + var richItemNames = getRichItemNames(textStyleModel); + var richResult; + + if (richItemNames) { + richResult = {}; + + for (var name_1 in richItemNames) { + if (richItemNames.hasOwnProperty(name_1)) { + // Cascade is supported in rich. + var richTextStyle = textStyleModel.getModel(['rich', name_1]); // In rich, never `disableBox`. + // FIXME: consider `label: {formatter: '{a|xx}', color: 'blue', rich: {a: {}}}`, + // the default color `'blue'` will not be adopted if no color declared in `rich`. + // That might confuses users. So probably we should put `textStyleModel` as the + // root ancestor of the `richTextStyle`. But that would be a break change. + + setTokenTextStyle(richResult[name_1] = {}, richTextStyle, globalTextStyle, opt, isNotNormal, isAttached, false, true); + } + } + } + + if (richResult) { + textStyle.rich = richResult; + } + + var overflow = textStyleModel.get('overflow'); + + if (overflow) { + textStyle.overflow = overflow; + } + + var margin = textStyleModel.get('minMargin'); + + if (margin != null) { + textStyle.margin = margin; + } + + setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, true, false); + } // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + // TODO TextStyleModel + + + function getRichItemNames(textStyleModel) { + // Use object to remove duplicated names. + var richItemNameMap; + + while (textStyleModel && textStyleModel !== textStyleModel.ecModel) { + var rich = (textStyleModel.option || EMPTY_OBJ).rich; + + if (rich) { + richItemNameMap = richItemNameMap || {}; + var richKeys = keys(rich); + + for (var i = 0; i < richKeys.length; i++) { + var richKey = richKeys[i]; + richItemNameMap[richKey] = 1; + } + } + + textStyleModel = textStyleModel.parentModel; + } + + return richItemNameMap; + } + + var TEXT_PROPS_WITH_GLOBAL = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY']; + var TEXT_PROPS_SELF = ['align', 'lineHeight', 'width', 'height', 'tag', 'verticalAlign']; + var TEXT_PROPS_BOX = ['padding', 'borderWidth', 'borderRadius', 'borderDashOffset', 'backgroundColor', 'borderColor', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + + function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, isBlock, inRich) { + // In merge mode, default value should not be given. + globalTextStyle = !isNotNormal && globalTextStyle || EMPTY_OBJ; + var inheritColor = opt && opt.inheritColor; + var fillColor = textStyleModel.getShallow('color'); + var strokeColor = textStyleModel.getShallow('textBorderColor'); + var opacity = retrieve2(textStyleModel.getShallow('opacity'), globalTextStyle.opacity); + + if (fillColor === 'inherit' || fillColor === 'auto') { + if ("development" !== 'production') { + if (fillColor === 'auto') { + deprecateReplaceLog('color: \'auto\'', 'color: \'inherit\''); + } + } + + if (inheritColor) { + fillColor = inheritColor; + } else { + fillColor = null; + } + } + + if (strokeColor === 'inherit' || strokeColor === 'auto') { + if ("development" !== 'production') { + if (strokeColor === 'auto') { + deprecateReplaceLog('color: \'auto\'', 'color: \'inherit\''); + } + } + + if (inheritColor) { + strokeColor = inheritColor; + } else { + strokeColor = null; + } + } + + if (!isAttached) { + // Only use default global textStyle.color if text is individual. + // Otherwise it will use the strategy of attached text color because text may be on a path. + fillColor = fillColor || globalTextStyle.color; + strokeColor = strokeColor || globalTextStyle.textBorderColor; + } + + if (fillColor != null) { + textStyle.fill = fillColor; + } + + if (strokeColor != null) { + textStyle.stroke = strokeColor; + } + + var textBorderWidth = retrieve2(textStyleModel.getShallow('textBorderWidth'), globalTextStyle.textBorderWidth); + + if (textBorderWidth != null) { + textStyle.lineWidth = textBorderWidth; + } + + var textBorderType = retrieve2(textStyleModel.getShallow('textBorderType'), globalTextStyle.textBorderType); + + if (textBorderType != null) { + textStyle.lineDash = textBorderType; + } + + var textBorderDashOffset = retrieve2(textStyleModel.getShallow('textBorderDashOffset'), globalTextStyle.textBorderDashOffset); + + if (textBorderDashOffset != null) { + textStyle.lineDashOffset = textBorderDashOffset; + } + + if (!isNotNormal && opacity == null && !inRich) { + opacity = opt && opt.defaultOpacity; + } + + if (opacity != null) { + textStyle.opacity = opacity; + } // TODO + + + if (!isNotNormal && !isAttached) { + // Set default finally. + if (textStyle.fill == null && opt.inheritColor) { + textStyle.fill = opt.inheritColor; + } + } // Do not use `getFont` here, because merge should be supported, where + // part of these properties may be changed in emphasis style, and the + // others should remain their original value got from normal style. + + + for (var i = 0; i < TEXT_PROPS_WITH_GLOBAL.length; i++) { + var key = TEXT_PROPS_WITH_GLOBAL[i]; + var val = retrieve2(textStyleModel.getShallow(key), globalTextStyle[key]); + + if (val != null) { + textStyle[key] = val; + } + } + + for (var i = 0; i < TEXT_PROPS_SELF.length; i++) { + var key = TEXT_PROPS_SELF[i]; + var val = textStyleModel.getShallow(key); + + if (val != null) { + textStyle[key] = val; + } + } + + if (textStyle.verticalAlign == null) { + var baseline = textStyleModel.getShallow('baseline'); + + if (baseline != null) { + textStyle.verticalAlign = baseline; + } + } + + if (!isBlock || !opt.disableBox) { + for (var i = 0; i < TEXT_PROPS_BOX.length; i++) { + var key = TEXT_PROPS_BOX[i]; + var val = textStyleModel.getShallow(key); + + if (val != null) { + textStyle[key] = val; + } + } + + var borderType = textStyleModel.getShallow('borderType'); + + if (borderType != null) { + textStyle.borderDash = borderType; + } + + if ((textStyle.backgroundColor === 'auto' || textStyle.backgroundColor === 'inherit') && inheritColor) { + if ("development" !== 'production') { + if (textStyle.backgroundColor === 'auto') { + deprecateReplaceLog('backgroundColor: \'auto\'', 'backgroundColor: \'inherit\''); + } + } + + textStyle.backgroundColor = inheritColor; + } + + if ((textStyle.borderColor === 'auto' || textStyle.borderColor === 'inherit') && inheritColor) { + if ("development" !== 'production') { + if (textStyle.borderColor === 'auto') { + deprecateReplaceLog('borderColor: \'auto\'', 'borderColor: \'inherit\''); + } + } + + textStyle.borderColor = inheritColor; + } + } + } + + function getFont(opt, ecModel) { + var gTextStyleModel = ecModel && ecModel.getModel('textStyle'); + return trim([// FIXME in node-canvas fontWeight is before fontStyle + opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'].join(' ')); + } + var labelInner = makeInner(); + function setLabelValueAnimation(label, labelStatesModels, value, getDefaultText) { + if (!label) { + return; + } + + var obj = labelInner(label); + obj.prevValue = obj.value; + obj.value = value; + var normalLabelModel = labelStatesModels.normal; + obj.valueAnimation = normalLabelModel.get('valueAnimation'); + + if (obj.valueAnimation) { + obj.precision = normalLabelModel.get('precision'); + obj.defaultInterpolatedText = getDefaultText; + obj.statesModels = labelStatesModels; + } + } + function animateLabelValue(textEl, dataIndex, data, animatableModel, labelFetcher) { + var labelInnerStore = labelInner(textEl); + + if (!labelInnerStore.valueAnimation) { + return; + } + + var defaultInterpolatedText = labelInnerStore.defaultInterpolatedText; // Consider the case that being animating, do not use the `obj.value`, + // Otherwise it will jump to the `obj.value` when this new animation started. + + var currValue = retrieve2(labelInnerStore.interpolatedValue, labelInnerStore.prevValue); + var targetValue = labelInnerStore.value; + + function during(percent) { + var interpolated = interpolateRawValues(data, labelInnerStore.precision, currValue, targetValue, percent); + labelInnerStore.interpolatedValue = percent === 1 ? null : interpolated; + var labelText = getLabelText({ + labelDataIndex: dataIndex, + labelFetcher: labelFetcher, + defaultText: defaultInterpolatedText ? defaultInterpolatedText(interpolated) : interpolated + '' + }, labelInnerStore.statesModels, interpolated); + setLabelText(textEl, labelText); + } + + (currValue == null ? initProps : updateProps)(textEl, {}, animatableModel, dataIndex, null, during); + } + + var PATH_COLOR = ['textStyle', 'color']; // TODO Performance improvement? + + var tmpRichText = new ZRText(); + + var TextStyleMixin = + /** @class */ + function () { + function TextStyleMixin() {} + /** + * Get color property or get color from option.textStyle.color + */ + // TODO Callback + + + TextStyleMixin.prototype.getTextColor = function (isEmphasis) { + var ecModel = this.ecModel; + return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null); + }; + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + + + TextStyleMixin.prototype.getFont = function () { + return getFont({ + fontStyle: this.getShallow('fontStyle'), + fontWeight: this.getShallow('fontWeight'), + fontSize: this.getShallow('fontSize'), + fontFamily: this.getShallow('fontFamily') + }, this.ecModel); + }; + + TextStyleMixin.prototype.getTextRect = function (text) { + tmpRichText.useStyle({ + text: text, + fontStyle: this.getShallow('fontStyle'), + fontWeight: this.getShallow('fontWeight'), + fontSize: this.getShallow('fontSize'), + fontFamily: this.getShallow('fontFamily'), + verticalAlign: this.getShallow('verticalAlign') || this.getShallow('baseline'), + padding: this.getShallow('padding'), + lineHeight: this.getShallow('lineHeight'), + rich: this.getShallow('rich') + }); + tmpRichText.update(); + return tmpRichText.getBoundingRect(); + }; + + return TextStyleMixin; + }(); + + var LINE_STYLE_KEY_MAP = [['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'type'], ['lineDashOffset', 'dashOffset'], ['lineCap', 'cap'], ['lineJoin', 'join'], ['miterLimit'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getLineStyle = makeStyleMapper(LINE_STYLE_KEY_MAP); + + var LineStyleMixin = + /** @class */ + function () { + function LineStyleMixin() {} + + LineStyleMixin.prototype.getLineStyle = function (excludes) { + return getLineStyle(this, excludes); + }; + + return LineStyleMixin; + }(); + + var ITEM_STYLE_KEY_MAP = [['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'borderType'], ['lineDashOffset', 'borderDashOffset'], ['lineCap', 'borderCap'], ['lineJoin', 'borderJoin'], ['miterLimit', 'borderMiterLimit'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getItemStyle = makeStyleMapper(ITEM_STYLE_KEY_MAP); + + var ItemStyleMixin = + /** @class */ + function () { + function ItemStyleMixin() {} + + ItemStyleMixin.prototype.getItemStyle = function (excludes, includes) { + return getItemStyle(this, excludes, includes); + }; + + return ItemStyleMixin; + }(); + + var Model = + /** @class */ + function () { + function Model(option, parentModel, ecModel) { + this.parentModel = parentModel; + this.ecModel = ecModel; + 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.init = function (option, parentModel, ecModel) { + var rest = []; + + for (var _i = 3; _i < arguments.length; _i++) { + rest[_i - 3] = arguments[_i]; + } + }; + /** + * Merge the input option to me. + */ + + + Model.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + }; // `path` can be 'xxx.yyy.zzz', so the return value type have to be `ModelOption` + // TODO: TYPE strict key check? + // get(path: string | string[], ignoreParent?: boolean): ModelOption; + + + Model.prototype.get = function (path, ignoreParent) { + if (path == null) { + return this.option; + } + + return this._doGet(this.parsePath(path), !ignoreParent && this.parentModel); + }; + + Model.prototype.getShallow = function (key, ignoreParent) { + var option = this.option; + var val = option == null ? option : option[key]; + + if (val == null && !ignoreParent) { + var parentModel = this.parentModel; + + if (parentModel) { + // FIXME:TS do not know how to make it works + val = parentModel.getShallow(key); + } + } + + return val; + }; // `path` can be 'xxx.yyy.zzz', so the return value type have to be `Model` + // getModel(path: string | string[], parentModel?: Model): Model; + // TODO 'xxx.yyy.zzz' is deprecated + + + Model.prototype.getModel = function (path, parentModel) { + var hasPath = path != null; + var pathFinal = hasPath ? this.parsePath(path) : null; + var obj = hasPath ? this._doGet(pathFinal) : this.option; + parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal)); + return new Model(obj, parentModel, this.ecModel); + }; + /** + * Squash option stack into one. + * parentModel will be removed after squashed. + * + * NOTE: resolveParentPath will not be applied here for simplicity. DON'T use this function + * if resolveParentPath is modified. + * + * @param deepMerge If do deep merge. Default to be false. + */ + // squash( + // deepMerge?: boolean, + // handleCallback?: (func: () => object) => object + // ) { + // const optionStack = []; + // let model: Model = this; + // while (model) { + // if (model.option) { + // optionStack.push(model.option); + // } + // model = model.parentModel; + // } + // const newOption = {} as Opt; + // let option; + // while (option = optionStack.pop()) { // Top down merge + // if (isFunction(option) && handleCallback) { + // option = handleCallback(option); + // } + // if (deepMerge) { + // merge(newOption, option); + // } + // else { + // extend(newOption, option); + // } + // } + // // Remove parentModel + // this.option = newOption; + // this.parentModel = null; + // } + + /** + * If model has option + */ + + + Model.prototype.isEmpty = function () { + return this.option == null; + }; + + Model.prototype.restoreData = function () {}; // Pending + + + Model.prototype.clone = function () { + var Ctor = this.constructor; + return new Ctor(clone(this.option)); + }; // setReadOnly(properties): void { + // clazzUtil.setReadOnly(this, properties); + // } + // If path is null/undefined, return null/undefined. + + + Model.prototype.parsePath = function (path) { + if (typeof path === 'string') { + return path.split('.'); + } + + return path; + }; // Resolve path for parent. Perhaps useful when parent use a different property. + // Default to be a identity resolver. + // Can be modified to a different resolver. + + + Model.prototype.resolveParentPath = function (path) { + return path; + }; // FIXME:TS check whether put this method here + + + Model.prototype.isAnimationEnabled = function () { + if (!env.node && this.option) { + if (this.option.animation != null) { + return !!this.option.animation; + } else if (this.parentModel) { + return this.parentModel.isAnimationEnabled(); + } + } + }; + + Model.prototype._doGet = function (pathArr, parentModel) { + var obj = this.option; + + if (!pathArr) { + return obj; + } + + for (var i = 0; i < pathArr.length; i++) { + // Ignore empty + if (!pathArr[i]) { + continue; + } // obj could be number/string/... (like 0) + + + obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null; + + if (obj == null) { + break; + } + } + + if (obj == null && parentModel) { + obj = parentModel._doGet(this.resolveParentPath(pathArr), parentModel.parentModel); + } + + return obj; + }; + + return Model; + }(); + + enableClassExtend(Model); + enableClassCheck(Model); + mixin(Model, LineStyleMixin); + mixin(Model, ItemStyleMixin); + mixin(Model, AreaStyleMixin); + mixin(Model, TextStyleMixin); + + var base = Math.round(Math.random() * 10); + /** + * @public + * @param {string} type + * @return {string} + */ + + function getUID(type) { + // Considering the case of crossing js context, + // use Math.random to make id as unique as possible. + return [type || '', base++].join('_'); + } + /** + * Implements `SubTypeDefaulterManager` for `target`. + */ + + function enableSubTypeDefaulter(target) { + var subTypeDefaulters = {}; + + target.registerSubTypeDefaulter = function (componentType, defaulter) { + var componentTypeInfo = parseClassType(componentType); + subTypeDefaulters[componentTypeInfo.main] = defaulter; + }; + + target.determineSubType = function (componentType, option) { + var type = option.type; + + if (!type) { + var componentTypeMain = parseClassType(componentType).main; + + if (target.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + + return type; + }; + } + /** + * Implements `TopologicalTravelable` for `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. + */ + + function enableTopologicalTravel(entity, dependencyGetter) { + /** + * @param targetNameList Target Component type list. + * Can be ['aa', 'bb', 'aa.xx'] + * @param fullNameList By which we can build dependency graph. + * @param callback Params: componentType, dependencies. + * @param context Scope of callback. + */ + entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var noEntryList = result.noEntryList; + var targetNameSet = {}; + each(targetNameList, function (name) { + targetNameSet[name] = true; + }); + + while (noEntryList.length) { + var currComponentType = noEntryList.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + + each(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge); + } + + each(targetNameSet, function () { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('Circle dependency may exists: ', targetNameSet, targetNameList, fullNameList); + } + + throw new Error(errMsg); + }); + + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + + if (graph[succComponentType].entryCount === 0) { + noEntryList.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); + } + }; + + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + 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); + } + + each(availableDeps, function (dependentName) { + if (indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + + var thatItem = createDependencyGraphItem(graph, dependentName); + + if (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 = []; + each(originalDeps, function (dep) { + indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } + } + function inheritDefaultOption(superOption, subOption) { + // See also `model/Component.ts#getDefaultOption` + return merge(merge({}, superOption, true), subOption, true); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * Language: English. + */ + var langEN = { + time: { + month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + monthAbbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayOfWeek: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayOfWeekAbbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] + }, + legend: { + selector: { + all: 'All', + inverse: 'Inv' + } + }, + toolbox: { + brush: { + title: { + rect: 'Box Select', + polygon: 'Lasso Select', + lineX: 'Horizontally Select', + lineY: 'Vertically Select', + keep: 'Keep Selections', + clear: 'Clear Selections' + } + }, + dataView: { + title: 'Data View', + lang: ['Data View', 'Close', 'Refresh'] + }, + dataZoom: { + title: { + zoom: 'Zoom', + back: 'Zoom Reset' + } + }, + magicType: { + title: { + line: 'Switch to Line Chart', + bar: 'Switch to Bar Chart', + stack: 'Stack', + tiled: 'Tile' + } + }, + restore: { + title: 'Restore' + }, + saveAsImage: { + title: 'Save as Image', + lang: ['Right Click to Save Image'] + } + }, + series: { + typeNames: { + pie: 'Pie chart', + bar: 'Bar chart', + line: 'Line chart', + scatter: 'Scatter plot', + effectScatter: 'Ripple scatter plot', + radar: 'Radar chart', + tree: 'Tree', + treemap: 'Treemap', + boxplot: 'Boxplot', + candlestick: 'Candlestick', + k: 'K line chart', + heatmap: 'Heat map', + map: 'Map', + parallel: 'Parallel coordinate map', + lines: 'Line graph', + graph: 'Relationship graph', + sankey: 'Sankey diagram', + funnel: 'Funnel chart', + gauge: 'Guage', + pictorialBar: 'Pictorial bar', + themeRiver: 'Theme River Map', + sunburst: 'Sunburst' + } + }, + aria: { + general: { + withTitle: 'This is a chart about "{title}"', + withoutTitle: 'This is a chart' + }, + series: { + single: { + prefix: '', + withName: ' with type {seriesType} named {seriesName}.', + withoutName: ' with type {seriesType}.' + }, + multiple: { + prefix: '. It consists of {seriesCount} series count.', + withName: ' The {seriesId} series is a {seriesType} representing {seriesName}.', + withoutName: ' The {seriesId} series is a {seriesType}.', + separator: { + middle: '', + end: '' + } + } + }, + data: { + allData: 'The data is as follows: ', + partialData: 'The first {displayCnt} items are: ', + withName: 'the data for {name} is {value}', + withoutName: '{value}', + separator: { + middle: ', ', + end: '. ' + } + } + } + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var langZH = { + time: { + month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + monthAbbr: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + dayOfWeek: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + dayOfWeekAbbr: ['日', '一', '二', '三', '四', '五', '六'] + }, + legend: { + selector: { + all: '全选', + inverse: '反选' + } + }, + toolbox: { + brush: { + title: { + rect: '矩形选择', + polygon: '圈选', + lineX: '横向选择', + lineY: '纵向选择', + keep: '保持选择', + clear: '清除选择' + } + }, + dataView: { + title: '数据视图', + lang: ['数据视图', '关闭', '刷新'] + }, + dataZoom: { + title: { + zoom: '区域缩放', + back: '区域缩放还原' + } + }, + magicType: { + title: { + line: '切换为折线图', + bar: '切换为柱状图', + stack: '切换为堆叠', + tiled: '切换为平铺' + } + }, + restore: { + title: '还原' + }, + saveAsImage: { + title: '保存为图片', + lang: ['右键另存为图片'] + } + }, + series: { + typeNames: { + pie: '饼图', + bar: '柱状图', + line: '折线图', + scatter: '散点图', + effectScatter: '涟漪散点图', + radar: '雷达图', + tree: '树图', + treemap: '矩形树图', + boxplot: '箱型图', + candlestick: 'K线图', + k: 'K线图', + heatmap: '热力图', + map: '地图', + parallel: '平行坐标图', + lines: '线图', + graph: '关系图', + sankey: '桑基图', + funnel: '漏斗图', + gauge: '仪表盘图', + pictorialBar: '象形柱图', + themeRiver: '主题河流图', + sunburst: '旭日图' + } + }, + aria: { + general: { + withTitle: '这是一个关于“{title}”的图表。', + withoutTitle: '这是一个图表,' + }, + series: { + single: { + prefix: '', + withName: '图表类型是{seriesType},表示{seriesName}。', + withoutName: '图表类型是{seriesType}。' + }, + multiple: { + prefix: '它由{seriesCount}个图表系列组成。', + withName: '第{seriesId}个系列是一个表示{seriesName}的{seriesType},', + withoutName: '第{seriesId}个系列是一个{seriesType},', + separator: { + middle: ';', + end: '。' + } + } + }, + data: { + allData: '其数据是——', + partialData: '其中,前{displayCnt}项是——', + withName: '{name}的数据是{value}', + withoutName: '{value}', + separator: { + middle: ',', + end: '' + } + } + } + }; + + var LOCALE_ZH = 'ZH'; + var LOCALE_EN = 'EN'; + var DEFAULT_LOCALE = LOCALE_EN; + var localeStorage = {}; + var localeModels = {}; + var SYSTEM_LANG = !env.domSupported ? DEFAULT_LOCALE : function () { + var langStr = ( + /* eslint-disable-next-line */ + document.documentElement.lang || navigator.language || navigator.browserLanguage).toUpperCase(); + return langStr.indexOf(LOCALE_ZH) > -1 ? LOCALE_ZH : DEFAULT_LOCALE; + }(); + function registerLocale(locale, localeObj) { + locale = locale.toUpperCase(); + localeModels[locale] = new Model(localeObj); + localeStorage[locale] = localeObj; + } // export function getLocale(locale: string) { + // return localeStorage[locale]; + // } + + function createLocaleObject(locale) { + if (isString(locale)) { + var localeObj = localeStorage[locale.toUpperCase()] || {}; + + if (locale === LOCALE_ZH || locale === LOCALE_EN) { + return clone(localeObj); + } else { + return merge(clone(localeObj), clone(localeStorage[DEFAULT_LOCALE]), false); + } + } else { + return merge(clone(locale), clone(localeStorage[DEFAULT_LOCALE]), false); + } + } + function getLocaleModel(lang) { + return localeModels[lang]; + } + function getDefaultLocaleModel() { + return localeModels[DEFAULT_LOCALE]; + } // Default locale + + registerLocale(LOCALE_EN, langEN); + registerLocale(LOCALE_ZH, langZH); + + var ONE_SECOND = 1000; + var ONE_MINUTE = ONE_SECOND * 60; + var ONE_HOUR = ONE_MINUTE * 60; + var ONE_DAY = ONE_HOUR * 24; + var ONE_YEAR = ONE_DAY * 365; + var defaultLeveledFormatter = { + year: '{yyyy}', + month: '{MMM}', + day: '{d}', + hour: '{HH}:{mm}', + minute: '{HH}:{mm}', + second: '{HH}:{mm}:{ss}', + millisecond: '{hh}:{mm}:{ss} {SSS}', + none: '{yyyy}-{MM}-{dd} {hh}:{mm}:{ss} {SSS}' + }; + var fullDayFormatter = '{yyyy}-{MM}-{dd}'; + var fullLeveledFormatter = { + year: '{yyyy}', + month: '{yyyy}-{MM}', + day: fullDayFormatter, + hour: fullDayFormatter + ' ' + defaultLeveledFormatter.hour, + minute: fullDayFormatter + ' ' + defaultLeveledFormatter.minute, + second: fullDayFormatter + ' ' + defaultLeveledFormatter.second, + millisecond: defaultLeveledFormatter.none + }; + var primaryTimeUnits = ['year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond']; + var timeUnits = ['year', 'half-year', 'quarter', 'month', 'week', 'half-week', 'day', 'half-day', 'quarter-day', 'hour', 'minute', 'second', 'millisecond']; + function pad(str, len) { + str += ''; + return '0000'.substr(0, len - str.length) + str; + } + function getPrimaryTimeUnit(timeUnit) { + switch (timeUnit) { + case 'half-year': + case 'quarter': + return 'month'; + + case 'week': + case 'half-week': + return 'day'; + + case 'half-day': + case 'quarter-day': + return 'hour'; + + default: + // year, minutes, second, milliseconds + return timeUnit; + } + } + function isPrimaryTimeUnit(timeUnit) { + return timeUnit === getPrimaryTimeUnit(timeUnit); + } + function getDefaultFormatPrecisionOfInterval(timeUnit) { + switch (timeUnit) { + case 'year': + case 'month': + return 'day'; + + case 'millisecond': + return 'millisecond'; + + default: + // Also for day, hour, minute, second + return 'second'; + } + } + function format( // Note: The result based on `isUTC` are totally different, which can not be just simply + // substituted by the result without `isUTC`. So we make the param `isUTC` mandatory. + time, template, isUTC, lang) { + var date = parseDate(time); + var y = date[fullYearGetterName(isUTC)](); + var M = date[monthGetterName(isUTC)]() + 1; + var q = Math.floor((M - 1) / 4) + 1; + var d = date[dateGetterName(isUTC)](); + var e = date['get' + (isUTC ? 'UTC' : '') + 'Day'](); + var H = date[hoursGetterName(isUTC)](); + var h = (H - 1) % 12 + 1; + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var localeModel = lang instanceof Model ? lang : getLocaleModel(lang || SYSTEM_LANG) || getDefaultLocaleModel(); + var timeModel = localeModel.getModel('time'); + var month = timeModel.get('month'); + var monthAbbr = timeModel.get('monthAbbr'); + var dayOfWeek = timeModel.get('dayOfWeek'); + var dayOfWeekAbbr = timeModel.get('dayOfWeekAbbr'); + return (template || '').replace(/{yyyy}/g, y + '').replace(/{yy}/g, y % 100 + '').replace(/{Q}/g, q + '').replace(/{MMMM}/g, month[M - 1]).replace(/{MMM}/g, monthAbbr[M - 1]).replace(/{MM}/g, pad(M, 2)).replace(/{M}/g, M + '').replace(/{dd}/g, pad(d, 2)).replace(/{d}/g, d + '').replace(/{eeee}/g, dayOfWeek[e]).replace(/{ee}/g, dayOfWeekAbbr[e]).replace(/{e}/g, e + '').replace(/{HH}/g, pad(H, 2)).replace(/{H}/g, H + '').replace(/{hh}/g, pad(h + '', 2)).replace(/{h}/g, h + '').replace(/{mm}/g, pad(m, 2)).replace(/{m}/g, m + '').replace(/{ss}/g, pad(s, 2)).replace(/{s}/g, s + '').replace(/{SSS}/g, pad(S, 3)).replace(/{S}/g, S + ''); + } + function leveledFormat(tick, idx, formatter, lang, isUTC) { + var template = null; + + if (typeof formatter === 'string') { + // Single formatter for all units at all levels + template = formatter; + } else if (typeof formatter === 'function') { + // Callback formatter + template = formatter(tick.value, idx, { + level: tick.level + }); + } else { + var defaults$1 = extend({}, defaultLeveledFormatter); + + if (tick.level > 0) { + for (var i = 0; i < primaryTimeUnits.length; ++i) { + defaults$1[primaryTimeUnits[i]] = "{primary|" + defaults$1[primaryTimeUnits[i]] + "}"; + } + } + + var mergedFormatter = formatter ? formatter.inherit === false ? formatter // Use formatter with bigger units + : defaults(formatter, defaults$1) : defaults$1; + var unit = getUnitFromValue(tick.value, isUTC); + + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + } else if (mergedFormatter.inherit) { + // Unit formatter is not defined and should inherit from bigger units + var targetId = timeUnits.indexOf(unit); + + for (var i = targetId - 1; i >= 0; --i) { + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + break; + } + } + + template = template || defaults$1.none; + } + + if (isArray(template)) { + var levelId = tick.level == null ? 0 : tick.level >= 0 ? tick.level : template.length + tick.level; + levelId = Math.min(levelId, template.length - 1); + template = template[levelId]; + } + } + + return format(new Date(tick.value), template, isUTC, lang); + } + function getUnitFromValue(value, isUTC) { + var date = parseDate(value); + var M = date[monthGetterName(isUTC)]() + 1; + var d = date[dateGetterName(isUTC)](); + var h = date[hoursGetterName(isUTC)](); + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var isSecond = S === 0; + var isMinute = isSecond && s === 0; + var isHour = isMinute && m === 0; + var isDay = isHour && h === 0; + var isMonth = isDay && d === 1; + var isYear = isMonth && M === 1; + + if (isYear) { + return 'year'; + } else if (isMonth) { + return 'month'; + } else if (isDay) { + return 'day'; + } else if (isHour) { + return 'hour'; + } else if (isMinute) { + return 'minute'; + } else if (isSecond) { + return 'second'; + } else { + return 'millisecond'; + } + } + function getUnitValue(value, unit, isUTC) { + var date = typeof value === 'number' ? parseDate(value) : value; + unit = unit || getUnitFromValue(value, isUTC); + + switch (unit) { + case 'year': + return date[fullYearGetterName(isUTC)](); + + case 'half-year': + return date[monthGetterName(isUTC)]() >= 6 ? 1 : 0; + + case 'quarter': + return Math.floor((date[monthGetterName(isUTC)]() + 1) / 4); + + case 'month': + return date[monthGetterName(isUTC)](); + + case 'day': + return date[dateGetterName(isUTC)](); + + case 'half-day': + return date[hoursGetterName(isUTC)]() / 24; + + case 'hour': + return date[hoursGetterName(isUTC)](); + + case 'minute': + return date[minutesGetterName(isUTC)](); + + case 'second': + return date[secondsGetterName(isUTC)](); + + case 'millisecond': + return date[millisecondsGetterName(isUTC)](); + } + } + function fullYearGetterName(isUTC) { + return isUTC ? 'getUTCFullYear' : 'getFullYear'; + } + function monthGetterName(isUTC) { + return isUTC ? 'getUTCMonth' : 'getMonth'; + } + function dateGetterName(isUTC) { + return isUTC ? 'getUTCDate' : 'getDate'; + } + function hoursGetterName(isUTC) { + return isUTC ? 'getUTCHours' : 'getHours'; + } + function minutesGetterName(isUTC) { + return isUTC ? 'getUTCMinutes' : 'getMinutes'; + } + function secondsGetterName(isUTC) { + return isUTC ? 'getUTCSeconds' : 'getSeconds'; + } + function millisecondsGetterName(isUTC) { + return isUTC ? 'getUTCSeconds' : 'getSeconds'; + } + function fullYearSetterName(isUTC) { + return isUTC ? 'setUTCFullYear' : 'setFullYear'; + } + function monthSetterName(isUTC) { + return isUTC ? 'setUTCMonth' : 'setMonth'; + } + function dateSetterName(isUTC) { + return isUTC ? 'setUTCDate' : 'setDate'; + } + function hoursSetterName(isUTC) { + return isUTC ? 'setUTCHours' : 'setHours'; + } + function minutesSetterName(isUTC) { + return isUTC ? 'setUTCMinutes' : 'setMinutes'; + } + function secondsSetterName(isUTC) { + return isUTC ? 'setUTCSeconds' : 'setSeconds'; + } + function millisecondsSetterName(isUTC) { + return isUTC ? 'setUTCSeconds' : 'setSeconds'; + } + + function getTextRect(text, font, align, verticalAlign, padding, rich, truncate, lineHeight) { + deprecateLog('getTextRect is deprecated.'); + var textEl = new ZRText({ + style: { + text: text, + font: font, + align: align, + verticalAlign: verticalAlign, + padding: padding, + rich: rich, + overflow: truncate ? 'truncate' : null, + lineHeight: lineHeight + } + }); + return textEl.getBoundingRect(); + } + + /** + * Add a comma each three digit. + */ + + function addCommas(x) { + if (!isNumeric(x)) { + return isString(x) ? x : '-'; + } + + var parts = (x + '').split('.'); + return parts[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,') + (parts.length > 1 ? '.' + parts[1] : ''); + } + function toCamelCase(str, upperCaseFirst) { + str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) { + return group1.toUpperCase(); + }); + + if (upperCaseFirst && str) { + str = str.charAt(0).toUpperCase() + str.slice(1); + } + + return str; + } + var normalizeCssArray$1 = normalizeCssArray; + var replaceReg = /([&<>"'])/g; + var replaceMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' + }; + function encodeHTML(source) { + return source == null ? '' : (source + '').replace(replaceReg, function (str, c) { + return replaceMap[c]; + }); + } + /** + * Make value user readable for tooltip and label. + * "User readable": + * Try to not print programmer-specific text like NaN, Infinity, null, undefined. + * Avoid to display an empty string, which users can not recognize there is + * a value and it might look like a bug. + */ + + function makeValueReadable(value, valueType, useUTC) { + var USER_READABLE_DEFUALT_TIME_PATTERN = 'yyyy-MM-dd hh:mm:ss'; + + function stringToUserReadable(str) { + return str && trim(str) ? str : '-'; + } + + function isNumberUserReadable(num) { + return !!(num != null && !isNaN(num) && isFinite(num)); + } + + var isTypeTime = valueType === 'time'; + var isValueDate = value instanceof Date; + + if (isTypeTime || isValueDate) { + var date = isTypeTime ? parseDate(value) : value; + + if (!isNaN(+date)) { + return format(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC); + } else if (isValueDate) { + return '-'; + } // In other cases, continue to try to display the value in the following code. + + } + + if (valueType === 'ordinal') { + return isStringSafe(value) ? stringToUserReadable(value) : isNumber(value) ? isNumberUserReadable(value) ? value + '' : '-' : '-'; + } // By default. + + + var numericResult = numericToNumber(value); + return isNumberUserReadable(numericResult) ? addCommas(numericResult) : isStringSafe(value) ? stringToUserReadable(value) : '-'; + } + var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + + var wrapVar = function (varName, seriesIdx) { + return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}'; + }; + /** + * Template formatter + * @param {Array.|Object} paramsList + */ + + + function formatTpl(tpl, paramsList, encode) { + if (!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++) { + var val = paramsList[seriesIdx][$vars[k]]; + tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val); + } + } + + return tpl; + } + /** + * simple Template formatter + */ + + function formatTplSimple(tpl, param, encode) { + each(param, function (value, key) { + tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value); + }); + return tpl; + } + function getTooltipMarker(inOpt, extraCssText) { + var opt = isString(inOpt) ? { + color: inOpt, + extraCssText: extraCssText + } : inOpt || {}; + var color = opt.color; + var type = opt.type; + extraCssText = opt.extraCssText; + var renderMode = opt.renderMode || 'html'; + + if (!color) { + return ''; + } + + if (renderMode === 'html') { + return type === 'subItem' ? '' : ''; + } else { + // Should better not to auto generate style name by auto-increment number here. + // Because this util is usually called in tooltip formatter, which is probably + // called repeatly when mouse move and the auto-increment number increases fast. + // Users can make their own style name by theirselves, make it unique and readable. + var markerId = opt.markerId || 'markerX'; + return { + renderMode: renderMode, + content: '{' + markerId + '|} ', + style: type === 'subItem' ? { + width: 4, + height: 4, + borderRadius: 2, + backgroundColor: color + } : { + width: 10, + height: 10, + borderRadius: 5, + backgroundColor: color + } + }; + } + } + /** + * @deprecated Use `time/format` instead. + * ISO Date format + * @param {string} tpl + * @param {number} value + * @param {boolean} [isUTC=false] Default in local time. + * see `module:echarts/scale/Time` + * and `module:echarts/util/number#parseDate`. + * @inner + */ + + function formatTime(tpl, value, isUTC) { + if ("development" !== 'production') { + deprecateReplaceLog('echarts.format.formatTime', 'echarts.time.format'); + } + + if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') { + tpl = 'MM-dd\nyyyy'; + } + + var date = parseDate(value); + var utc = isUTC ? 'UTC' : ''; + var y = date['get' + utc + 'FullYear'](); + var M = date['get' + utc + 'Month']() + 1; + var d = date['get' + utc + 'Date'](); + var h = date['get' + utc + 'Hours'](); + var m = date['get' + utc + 'Minutes'](); + var s = date['get' + utc + 'Seconds'](); + var S = date['get' + utc + 'Milliseconds'](); + tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', y % 100 + '').replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3)); + return tpl; + } + /** + * Capital first + * @param {string} str + * @return {string} + */ + + function capitalFirst(str) { + return str ? str.charAt(0).toUpperCase() + str.substr(1) : str; + } + /** + * @return Never be null/undefined. + */ + + function convertToColorString(color, defaultColor) { + defaultColor = defaultColor || 'transparent'; + return isString(color) ? color : isObject(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor; + } + /** + * open new tab + * @param link url + * @param target blank or self + */ + + function windowOpen(link, target) { + /* global window */ + if (target === '_blank' || target === 'blank') { + var blank = window.open(); + blank.opener = null; + blank.location.href = link; + } else { + window.open(link, target); + } + } + + var each$1 = each; + /** + * @public + */ + + var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height']; + /** + * @public + */ + + var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']]; + + 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 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 + // FIXME compare before adding gap? + + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } else { + // FIXME: consider rect.y is not `0`? + 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; + } + + child.x = x; + child.y = y; + child.markRedraw(); + orient === 'horizontal' ? x = nextX + gap : y = nextY + gap; + }); + } + /** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + + var box = boxLayout; + /** + * VBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + var vbox = curry(boxLayout, 'vertical'); + /** + * HBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + var hbox = 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. + */ + + function getAvailableSize(positionInfo, containerRect, margin) { + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var x = parsePercent$1(positionInfo.left, containerWidth); + var y = parsePercent$1(positionInfo.top, containerHeight); + var x2 = parsePercent$1(positionInfo.right, containerWidth); + var y2 = parsePercent$1(positionInfo.bottom, containerHeight); + (isNaN(x) || isNaN(parseFloat(positionInfo.left))) && (x = 0); + (isNaN(x2) || isNaN(parseFloat(positionInfo.right))) && (x2 = containerWidth); + (isNaN(y) || isNaN(parseFloat(positionInfo.top))) && (y = 0); + (isNaN(y2) || isNaN(parseFloat(positionInfo.bottom))) && (y2 = containerHeight); + margin = normalizeCssArray$1(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. + */ + + function getLayoutRect(positionInfo, containerRect, margin) { + margin = normalizeCssArray$1(margin || 0); + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var left = parsePercent$1(positionInfo.left, containerWidth); + var top = parsePercent$1(positionInfo.top, containerHeight); + var right = parsePercent$1(positionInfo.right, containerWidth); + var bottom = parsePercent$1(positionInfo.bottom, containerHeight); + var width = parsePercent$1(positionInfo.width, containerWidth); + var height = parsePercent$1(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 (aspect != null) { + // 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 + // FIXME + // Margin is not considered, because there is no case that both + // using margin and aspect so far. + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } else { + height = containerHeight * 0.8; + } + } // 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 - horizontalMargin - left - (right || 0); + } + + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - verticalMargin - top - (bottom || 0); + } + + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; + } + /** + * Position a zr element in viewport + * Group position is specified by either + * {left, top}, {right, bottom} + * If all properties exists, right and bottom will be igonred. + * + * Logic: + * 1. Scale (against origin point in parent coord) + * 2. Rotate (against origin point in parent coord) + * 3. Traslate (with el.position by this method) + * So this method only fixes the last step 'Traslate', which does not affect + * scaling and rotating. + * + * If be called repeatly with the same input el, the same result will be gotten. + * + * @param el Should have `getBoundingRect` method. + * @param positionInfo + * @param positionInfo.left + * @param positionInfo.top + * @param positionInfo.right + * @param positionInfo.bottom + * @param positionInfo.width Only for opt.boundingModel: 'raw' + * @param positionInfo.height Only for opt.boundingModel: 'raw' + * @param containerRect + * @param margin + * @param opt + * @param opt.hv Only horizontal or only vertical. Default to be [1, 1] + * @param opt.boundingMode + * Specify how to calculate boundingRect when locating. + * 'all': Position the boundingRect that is transformed and uioned + * both itself and its descendants. + * This mode simplies confine the elements in the bounding + * of their container (e.g., using 'right: 0'). + * 'raw': Position the boundingRect that is not transformed and only itself. + * This mode is useful when you want a element can overflow its + * container. (Consider a rotated circle needs to be located in a corner.) + * In this mode positionInfo.width/height can only be number. + */ + + function positionElement(el, positionInfo, containerRect, margin, opt) { + var h = !opt || !opt.hv || opt.hv[0]; + var v = !opt || !opt.hv || opt.hv[1]; + var boundingMode = opt && opt.boundingMode || 'all'; + + if (!h && !v) { + return; + } + + var rect; + + if (boundingMode === 'raw') { + rect = el.type === 'group' ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect(); + } else { + rect = el.getBoundingRect(); + + if (el.needLocalTransform()) { + var transform = el.getLocalTransform(); // Notice: raw rect may be inner object of el, + // which should not be modified. + + rect = rect.clone(); + rect.applyTransform(transform); + } + } // The real width and height can not be specified but calculated by the given el. + + + var layoutRect = getLayoutRect(defaults({ + width: rect.width, + height: rect.height + }, positionInfo), containerRect, margin); // Because 'tranlate' is the last step in transform + // (see zrender/core/Transformable#getLocalTransform), + // we can just only modify el.position to get final result. + + var dx = h ? layoutRect.x - rect.x : 0; + var dy = v ? layoutRect.y - rect.y : 0; + + if (boundingMode === 'raw') { + el.x = dx; + el.y = dy; + } else { + el.x += dx; + el.y += dy; + } + + el.markRedraw(); + } + /** + * @param option Contains some of the properties in HV_NAMES. + * @param hvIdx 0: horizontal; 1: vertical. + */ + + function sizeCalculable(option, hvIdx) { + return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null; + } + function fetchLayoutMode(ins) { + var layoutMode = ins.layoutMode || ins.constructor.layoutMode; + return isObject(layoutMode) ? layoutMode : layoutMode ? { + type: layoutMode + } : null; + } + /** + * Consider Case: + * When default 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 () { + * ... + * let inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param targetOption + * @param newOption + * @param opt + */ + + function mergeLayoutParam(targetOption, newOption, opt) { + var ignoreSize = opt && opt.ignoreSize; + !isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]); + var hResult = merge(HV_NAMES[0], 0); + var vResult = merge(HV_NAMES[1], 1); + copy(HV_NAMES[0], targetOption, hResult); + copy(HV_NAMES[1], targetOption, vResult); + + function merge(names, hvIdx) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = 2; + each$1(names, function (name) { + merged[name] = targetOption[name]; + }); + each$1(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++; + }); + + if (ignoreSize[hvIdx]) { + // Only one of left/right is premitted to exist. + if (hasValue(newOption, names[1])) { + merged[names[2]] = null; + } else if (hasValue(newOption, names[2])) { + merged[names[1]] = null; + } + + return merged; + } // 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. + for (var i = 0; i < names.length; i++) { + var name_1 = names[i]; + + if (!hasProp(newParams, name_1) && hasProp(targetOption, name_1)) { + newParams[name_1] = targetOption[name_1]; + 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$1(names, function (name) { + target[name] = source[name]; + }); + } + } + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + */ + + function getLayoutParams(source) { + return copyLayoutParams({}, source); + } + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + + function copyLayoutParams(target, source) { + source && target && each$1(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; + } + + var inner = makeInner(); + + var ComponentModel = + /** @class */ + function (_super) { + __extends(ComponentModel, _super); + + function ComponentModel(option, parentModel, ecModel) { + var _this = _super.call(this, option, parentModel, ecModel) || this; + + _this.uid = getUID('ec_cpt_model'); + return _this; + } + + ComponentModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + + ComponentModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(this.mainType)); + merge(option, this.getDefaultOption()); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + ComponentModel.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + var layoutMode = fetchLayoutMode(this); + + if (layoutMode) { + mergeLayoutParam(this.option, option, layoutMode); + } + }; + /** + * Called immediately after `init` or `mergeOption` of this instance called. + */ + + + ComponentModel.prototype.optionUpdated = function (newCptOption, isInit) {}; + /** + * [How to declare defaultOption]: + * + * (A) If using class declaration in typescript (since echarts 5): + * ```ts + * import {ComponentOption} from '../model/option'; + * export interface XxxOption extends ComponentOption { + * aaa: number + * } + * export class XxxModel extends Component { + * static type = 'xxx'; + * static defaultOption: XxxOption = { + * aaa: 123 + * } + * } + * Component.registerClass(XxxModel); + * ``` + * ```ts + * import {inheritDefaultOption} from '../util/component'; + * import {XxxModel, XxxOption} from './XxxModel'; + * export interface XxxSubOption extends XxxOption { + * bbb: number + * } + * class XxxSubModel extends XxxModel { + * static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, { + * bbb: 456 + * }) + * fn() { + * let opt = this.getDefaultOption(); + * // opt is {aaa: 123, bbb: 456} + * } + * } + * ``` + * + * (B) If using class extend (previous approach in echarts 3 & 4): + * ```js + * let XxxComponent = Component.extend({ + * defaultOption: { + * xx: 123 + * } + * }) + * ``` + * ```js + * let XxxSubComponent = XxxComponent.extend({ + * defaultOption: { + * yy: 456 + * }, + * fn: function () { + * let opt = this.getDefaultOption(); + * // opt is {xx: 123, yy: 456} + * } + * }) + * ``` + */ + + + ComponentModel.prototype.getDefaultOption = function () { + var ctor = this.constructor; // If using class declaration, it is different to travel super class + // in legacy env and auto merge defaultOption. So if using class + // declaration, defaultOption should be merged manually. + + if (!isExtendedClass(ctor)) { + // When using ts class, defaultOption must be declared as static. + return ctor.defaultOption; + } // FIXME: remove this approach? + + + var fields = inner(this); + + if (!fields.defaultOption) { + var optList = []; + var clz = ctor; + + while (clz) { + var opt = clz.prototype.defaultOption; + opt && optList.push(opt); + clz = clz.superClass; + } + + var defaultOption = {}; + + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = merge(defaultOption, optList[i], true); + } + + fields.defaultOption = defaultOption; + } + + return fields.defaultOption; + }; + /** + * Notice: always force to input param `useDefault` in case that forget to consider it. + * The same behavior as `modelUtil.parseFinder`. + * + * @param useDefault In many cases like series refer axis and axis refer grid, + * If axis index / axis id not specified, use the first target as default. + * In other cases like dataZoom refer axis, if not specified, measn no refer. + */ + + + ComponentModel.prototype.getReferringComponents = function (mainType, opt) { + var indexKey = mainType + 'Index'; + var idKey = mainType + 'Id'; + return queryReferringComponents(this.ecModel, mainType, { + index: this.get(indexKey, true), + id: this.get(idKey, true) + }, opt); + }; + + ComponentModel.prototype.getBoxLayoutParams = function () { + // Consider itself having box layout configs. + var boxLayoutModel = this; + return { + left: boxLayoutModel.get('left'), + top: boxLayoutModel.get('top'), + right: boxLayoutModel.get('right'), + bottom: boxLayoutModel.get('bottom'), + width: boxLayoutModel.get('width'), + height: boxLayoutModel.get('height') + }; + }; + + ComponentModel.protoInitialize = function () { + var proto = ComponentModel.prototype; + proto.type = 'component'; + proto.id = ''; + proto.name = ''; + proto.mainType = ''; + proto.subType = ''; + proto.componentIndex = 0; + }(); + + return ComponentModel; + }(Model); + + mountExtend(ComponentModel, Model); + enableClassManagement(ComponentModel); + enableSubTypeDefaulter(ComponentModel); + enableTopologicalTravel(ComponentModel, getDependencies); + + function getDependencies(componentType) { + var deps = []; + each(ComponentModel.getClassesByMainType(componentType), function (clz) { + deps = deps.concat(clz.dependencies || clz.prototype.dependencies || []); + }); // Ensure main type. + + deps = map(deps, function (type) { + return parseClassType(type).main; + }); // Hack dataset for convenience. + + if (componentType !== 'dataset' && indexOf(deps, 'dataset') <= 0) { + deps.unshift('dataset'); + } + + return deps; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var platform = ''; // Navigator not exists in node + + if (typeof navigator !== 'undefined') { + /* global navigator */ + platform = navigator.platform || ''; + } + + var decalColor = 'rgba(0, 0, 0, 0.2)'; + var globalDefault = { + darkMode: 'auto', + // backgroundColor: 'rgba(0,0,0,0)', + // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization + // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'], + // Light colors: + // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'], + // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'], + // Dark colors: + // color: [ + // '#c23531', '#2f4554', '#61a0a8', '#d48265', '#91c7ae', '#749f83', + // '#ca8622', '#bda29a', '#6e7074', '#546570', '#c4ccd3' + // ], + color: [// '#51689b', '#ce5c5c', '#fbc357', '#8fbf8f', '#659d84', '#fb8e6a', '#c77288', '#786090', '#91c4c5', '#6890ba' + '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'], + gradientColor: ['#f6efa6', '#d88273', '#bf444c'], + aria: { + decal: { + decals: [{ + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [2, 5], + symbolSize: 1, + rotation: Math.PI / 6 + }, { + color: decalColor, + symbol: 'circle', + dashArrayX: [[8, 8], [0, 8, 8, 0]], + dashArrayY: [6, 0], + symbolSize: 0.8 + }, { + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [4, 3], + rotation: -Math.PI / 4 + }, { + color: decalColor, + dashArrayX: [[6, 6], [0, 6, 6, 0]], + dashArrayY: [6, 0] + }, { + color: decalColor, + dashArrayX: [[1, 0], [1, 6]], + dashArrayY: [1, 0, 6, 0], + rotation: Math.PI / 4 + }, { + color: decalColor, + symbol: 'triangle', + dashArrayX: [[9, 9], [0, 9, 9, 0]], + dashArrayY: [7, 2], + symbolSize: 0.75 + }] + } + }, + // If xAxis and yAxis declared, grid is created by default. + // 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' + }, + // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/ + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation + // Default is source-over + blendMode: null, + stateAnimation: { + duration: 300, + easing: 'cubicOut' + }, + animation: 'auto', + animationDuration: 1000, + animationDurationUpdate: 500, + animationEasing: 'cubicInOut', + animationEasingUpdate: 'cubicInOut', + animationThreshold: 2000, + // Configuration for progressive/incremental rendering + progressiveThreshold: 3000, + progressive: 400, + // Threshold of if use single hover layer to optimize. + // It is recommended that `hoverLayerThreshold` is equivalent to or less than + // `progressiveThreshold`, otherwise hover will cause restart of progressive, + // which is unexpected. + // see example . + hoverLayerThreshold: 3000, + // See: module:echarts/scale/Time + useUTC: false + }; + + var VISUAL_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'seriesName']); + var SOURCE_FORMAT_ORIGINAL = 'original'; + var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows'; + var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows'; + var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns'; + var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray'; + var SOURCE_FORMAT_UNKNOWN = 'unknown'; + var SERIES_LAYOUT_BY_COLUMN = 'column'; + var SERIES_LAYOUT_BY_ROW = 'row'; + + var BE_ORDINAL = { + Must: 1, + Might: 2, + Not: 3 // Other cases + + }; + var innerGlobalModel = makeInner(); + /** + * MUST be called before mergeOption of all series. + */ + + function resetSourceDefaulter(ecModel) { + // `datasetMap` is used to make default encode. + innerGlobalModel(ecModel).datasetMap = createHashMap(); + } + /** + * [The strategy of the arrengment of data dimensions for dataset]: + * "value way": all axes are non-category axes. So series one by one take + * several (the number is coordSysDims.length) dimensions from dataset. + * The result of data arrengment of data dimensions like: + * | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y | + * "category way": at least one axis is category axis. So the the first data + * dimension is always mapped to the first category axis and shared by + * all of the series. The other data dimensions are taken by series like + * "value way" does. + * The result of data arrengment of data dimensions like: + * | ser_shared_x | ser0_y | ser1_y | ser2_y | + * + * @return encode Never be `null/undefined`. + */ + + function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); // Currently only make default when using dataset, util more reqirements occur. + + if (!datasetModel || !coordDimensions) { + return encode; + } + + var encodeItemName = []; + var encodeSeriesName = []; + var ecModel = seriesModel.ecModel; + var datasetMap = innerGlobalModel(ecModel).datasetMap; + var key = datasetModel.uid + '_' + source.seriesLayoutBy; + var baseCategoryDimIndex; + var categoryWayValueDimStart; + coordDimensions = coordDimensions.slice(); + each(coordDimensions, function (coordDimInfoLoose, coordDimIdx) { + var coordDimInfo = isObject(coordDimInfoLoose) ? coordDimInfoLoose : coordDimensions[coordDimIdx] = { + name: coordDimInfoLoose + }; + + if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) { + baseCategoryDimIndex = coordDimIdx; + categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo); + } + + encode[coordDimInfo.name] = []; + }); + var datasetRecord = datasetMap.get(key) || datasetMap.set(key, { + categoryWayDim: categoryWayValueDimStart, + valueWayDim: 0 + }); // TODO + // Auto detect first time axis and do arrangement. + + each(coordDimensions, function (coordDimInfo, coordDimIdx) { + var coordDimName = coordDimInfo.name; + var count = getDataDimCountOnCoordDim(coordDimInfo); // In value way. + + if (baseCategoryDimIndex == null) { + var start = datasetRecord.valueWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.valueWayDim += count; // ??? TODO give a better default series name rule? + // especially when encode x y specified. + // consider: when mutiple series share one dimension + // category axis, series name should better use + // the other dimsion name. On the other hand, use + // both dimensions name. + } // In category way, the first category axis. + else if (baseCategoryDimIndex === coordDimIdx) { + pushDim(encode[coordDimName], 0, count); + pushDim(encodeItemName, 0, count); + } // In category way, the other axis. + else { + var start = datasetRecord.categoryWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.categoryWayDim += count; + } + }); + + function pushDim(dimIdxArr, idxFrom, idxCount) { + for (var i = 0; i < idxCount; i++) { + dimIdxArr.push(idxFrom + i); + } + } + + function getDataDimCountOnCoordDim(coordDimInfo) { + var dimsDef = coordDimInfo.dimsDef; + return dimsDef ? dimsDef.length : 1; + } + + encodeItemName.length && (encode.itemName = encodeItemName); + encodeSeriesName.length && (encode.seriesName = encodeSeriesName); + return encode; + } + /** + * Work for data like [{name: ..., value: ...}, ...]. + * + * @return encode Never be `null/undefined`. + */ + + function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); // Currently only make default when using dataset, util more reqirements occur. + + if (!datasetModel) { + return encode; + } + + var sourceFormat = source.sourceFormat; + var dimensionsDefine = source.dimensionsDefine; + var potentialNameDimIndex; + + if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + each(dimensionsDefine, function (dim, idx) { + if ((isObject(dim) ? dim.name : dim) === 'name') { + potentialNameDimIndex = idx; + } + }); + } + + var idxResult = function () { + var idxRes0 = {}; + var idxRes1 = {}; + var guessRecords = []; // 5 is an experience value. + + for (var i = 0, len = Math.min(5, dimCount); i < len; i++) { + var guessResult = doGuessOrdinal(source.data, sourceFormat, source.seriesLayoutBy, dimensionsDefine, source.startIndex, i); + guessRecords.push(guessResult); + var isPureNumber = guessResult === BE_ORDINAL.Not; // [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim, + // and then find a name dim with the priority: + // "BE_ORDINAL.Might|BE_ORDINAL.Must" > "other dim" > "the value dim itself". + + if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) { + idxRes0.v = i; + } + + if (idxRes0.n == null || idxRes0.n === idxRes0.v || !isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not) { + idxRes0.n = i; + } + + if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) { + return idxRes0; + } // [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not), + // find the first BE_ORDINAL.Might as the value dim, + // and then find a name dim with the priority: + // "other dim" > "the value dim itself". + // That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be + // treated as number. + + + if (!isPureNumber) { + if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) { + idxRes1.v = i; + } + + if (idxRes1.n == null || idxRes1.n === idxRes1.v) { + idxRes1.n = i; + } + } + } + + function fulfilled(idxResult) { + return idxResult.v != null && idxResult.n != null; + } + + return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null; + }(); + + if (idxResult) { + encode.value = [idxResult.v]; // `potentialNameDimIndex` has highest priority. + + var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n; // By default, label use itemName in charts. + // So we dont set encodeLabel here. + + encode.itemName = [nameDimIndex]; + encode.seriesName = [nameDimIndex]; + } + + return encode; + } + /** + * @return If return null/undefined, indicate that should not use datasetModel. + */ + + function querySeriesUpstreamDatasetModel(seriesModel) { + // Caution: consider the scenario: + // A dataset is declared and a series is not expected to use the dataset, + // and at the beginning `setOption({series: { noData })` (just prepare other + // option but no data), then `setOption({series: {data: [...]}); In this case, + // the user should set an empty array to avoid that dataset is used by default. + var thisData = seriesModel.get('data', true); + + if (!thisData) { + return queryReferringComponents(seriesModel.ecModel, 'dataset', { + index: seriesModel.get('datasetIndex', true), + id: seriesModel.get('datasetId', true) + }, SINGLE_REFERRING).models[0]; + } + } + /** + * @return Always return an array event empty. + */ + + function queryDatasetUpstreamDatasetModels(datasetModel) { + // Only these attributes declared, we by defualt reference to `datasetIndex: 0`. + // Otherwise, no reference. + if (!datasetModel.get('transform', true) && !datasetModel.get('fromTransformResult', true)) { + return []; + } + + return queryReferringComponents(datasetModel.ecModel, 'dataset', { + index: datasetModel.get('fromDatasetIndex', true), + id: datasetModel.get('fromDatasetId', true) + }, SINGLE_REFERRING).models; + } + /** + * The rule should not be complex, otherwise user might not + * be able to known where the data is wrong. + * The code is ugly, but how to make it neat? + */ + + function guessOrdinal(source, dimIndex) { + return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex); + } // dimIndex may be overflow source data. + // return {BE_ORDINAL} + + function doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) { + var result; // Experience value. + + var maxLoop = 5; + + if (isTypedArray(data)) { + return BE_ORDINAL.Not; + } // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine + // always exists in source. + + + var dimName; + var dimType; + + if (dimensionsDefine) { + var dimDefItem = dimensionsDefine[dimIndex]; + + if (isObject(dimDefItem)) { + dimName = dimDefItem.name; + dimType = dimDefItem.type; + } else if (isString(dimDefItem)) { + dimName = dimDefItem; + } + } + + if (dimType != null) { + return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; + + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + var sample = dataArrayRows[dimIndex]; + + for (var i = 0; i < (sample || []).length && i < maxLoop; i++) { + if ((result = detectValue(sample[startIndex + i])) != null) { + return result; + } + } + } else { + for (var i = 0; i < dataArrayRows.length && i < maxLoop; i++) { + var row = dataArrayRows[startIndex + i]; + + if (row && (result = detectValue(row[dimIndex])) != null) { + return result; + } + } + } + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var dataObjectRows = data; + + if (!dimName) { + return BE_ORDINAL.Not; + } + + for (var i = 0; i < dataObjectRows.length && i < maxLoop; i++) { + var item = dataObjectRows[i]; + + if (item && (result = detectValue(item[dimName])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + var dataKeyedColumns = data; + + if (!dimName) { + return BE_ORDINAL.Not; + } + + var sample = dataKeyedColumns[dimName]; + + if (!sample || isTypedArray(sample)) { + return BE_ORDINAL.Not; + } + + for (var i = 0; i < sample.length && i < maxLoop; i++) { + if ((result = detectValue(sample[i])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var dataOriginal = data; + + for (var i = 0; i < dataOriginal.length && i < maxLoop; i++) { + var item = dataOriginal[i]; + var val = getDataItemValue(item); + + if (!isArray(val)) { + return BE_ORDINAL.Not; + } + + if ((result = detectValue(val[dimIndex])) != null) { + return result; + } + } + } + + function detectValue(val) { + var beStr = isString(val); // Consider usage convenience, '1', '2' will be treated as "number". + // `isFinit('')` get `true`. + + if (val != null && isFinite(val) && val !== '') { + return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not; + } else if (beStr && val !== '-') { + return BE_ORDINAL.Must; + } + } + + return BE_ORDINAL.Not; + } + + var internalOptionCreatorMap = createHashMap(); + function registerInternalOptionCreator(mainType, creator) { + assert(internalOptionCreatorMap.get(mainType) == null && creator); + internalOptionCreatorMap.set(mainType, creator); + } + function concatInternalOptions(ecModel, mainType, newCmptOptionList) { + var internalOptionCreator = internalOptionCreatorMap.get(mainType); + + if (!internalOptionCreator) { + return newCmptOptionList; + } + + var internalOptions = internalOptionCreator(ecModel); + + if (!internalOptions) { + return newCmptOptionList; + } + + if ("development" !== 'production') { + for (var i = 0; i < internalOptions.length; i++) { + assert(isComponentIdInternal(internalOptions[i])); + } + } + + return newCmptOptionList.concat(internalOptions); + } + + var innerColor = makeInner(); + var innerDecal = makeInner(); + + var PaletteMixin = + /** @class */ + function () { + function PaletteMixin() {} + + PaletteMixin.prototype.getColorFromPalette = function (name, scope, requestNum) { + var defaultPalette = normalizeToArray(this.get('color', true)); + var layeredPalette = this.get('colorLayer', true); + return getFromPalette(this, innerColor, defaultPalette, layeredPalette, name, scope, requestNum); + }; + + PaletteMixin.prototype.clearColorPalette = function () { + clearPalette(this, innerColor); + }; + + return PaletteMixin; + }(); + + function getDecalFromPalette(ecModel, name, scope, requestNum) { + var defaultDecals = normalizeToArray(ecModel.get(['aria', 'decal', 'decals'])); + return getFromPalette(ecModel, innerDecal, defaultDecals, null, name, scope, requestNum); + } + + function getNearestPalette(palettes, requestColorNum) { + var paletteNum = palettes.length; // TODO palettes must be in order + + for (var i = 0; i < paletteNum; i++) { + if (palettes[i].length > requestColorNum) { + return palettes[i]; + } + } + + return palettes[paletteNum - 1]; + } + /** + * @param name MUST NOT be null/undefined. Otherwise call this function + * twise with the same parameters will get different result. + * @param scope default this. + * @return Can be null/undefined + */ + + + function getFromPalette(that, inner, defaultPalette, layeredPalette, name, scope, requestNum) { + scope = scope || that; + var scopeFields = inner(scope); + var paletteIdx = scopeFields.paletteIdx || 0; + var paletteNameMap = scopeFields.paletteNameMap = scopeFields.paletteNameMap || {}; // Use `hasOwnProperty` to avoid conflict with Object.prototype. + + if (paletteNameMap.hasOwnProperty(name)) { + return paletteNameMap[name]; + } + + var palette = requestNum == null || !layeredPalette ? defaultPalette : getNearestPalette(layeredPalette, requestNum); // In case can't find in layered color palette. + + palette = palette || defaultPalette; + + if (!palette || !palette.length) { + return; + } + + var pickedPaletteItem = palette[paletteIdx]; + + if (name) { + paletteNameMap[name] = pickedPaletteItem; + } + + scopeFields.paletteIdx = (paletteIdx + 1) % palette.length; + return pickedPaletteItem; + } + + function clearPalette(that, inner) { + inner(that).paletteIdx = 0; + inner(that).paletteNameMap = {}; + } + + // Internal method names: + // ----------------------- + + var reCreateSeriesIndices; + var assertSeriesInitialized; + var initBase; + var OPTION_INNER_KEY = '\0_ec_inner'; + var OPTION_INNER_VALUE = 1; + + var GlobalModel = + /** @class */ + function (_super) { + __extends(GlobalModel, _super); + + function GlobalModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + GlobalModel.prototype.init = function (option, parentModel, ecModel, theme, locale, optionManager) { + theme = theme || {}; + this.option = null; // Mark as not initialized. + + this._theme = new Model(theme); + this._locale = new Model(locale); + this._optionManager = optionManager; + }; + + GlobalModel.prototype.setOption = function (option, opts, optionPreprocessorFuncs) { + if ("development" !== 'production') { + assert(option != null, 'option is null/undefined'); + assert(option[OPTION_INNER_KEY] !== OPTION_INNER_VALUE, 'please use chart.getOption()'); + } + + var innerOpt = normalizeSetOptionInput(opts); + + this._optionManager.setOption(option, optionPreprocessorFuncs, innerOpt); + + this._resetOption(null, innerOpt); + }; + /** + * @param type null/undefined: reset all. + * 'recreate': force recreate all. + * 'timeline': only reset timeline option + * 'media': only reset media query option + * @return Whether option changed. + */ + + + GlobalModel.prototype.resetOption = function (type, opt) { + return this._resetOption(type, normalizeSetOptionInput(opt)); + }; + + GlobalModel.prototype._resetOption = function (type, opt) { + var optionChanged = false; + var optionManager = this._optionManager; + + if (!type || type === 'recreate') { + var baseOption = optionManager.mountOption(type === 'recreate'); + + if (!this.option || type === 'recreate') { + initBase(this, baseOption); + } else { + this.restoreData(); + + this._mergeOption(baseOption, opt); + } + + optionChanged = true; + } + + if (type === 'timeline' || type === 'media') { + this.restoreData(); + } // By design, if `setOption(option2)` at the second time, and `option2` is a `ECUnitOption`, + // it should better not have the same props with `MediaUnit['option']`. + // Becuase either `option2` or `MediaUnit['option']` will be always merged to "current option" + // rather than original "baseOption". If they both override a prop, the result might be + // unexpected when media state changed after `setOption` called. + // If we really need to modify a props in each `MediaUnit['option']`, use the full version + // (`{baseOption, media}`) in `setOption`. + // For `timeline`, the case is the same. + + + if (!type || type === 'recreate' || type === 'timeline') { + var timelineOption = optionManager.getTimelineOption(this); + + if (timelineOption) { + optionChanged = true; + + this._mergeOption(timelineOption, opt); + } + } + + if (!type || type === 'recreate' || type === 'media') { + var mediaOptions = optionManager.getMediaOption(this); + + if (mediaOptions.length) { + each(mediaOptions, function (mediaOption) { + optionChanged = true; + + this._mergeOption(mediaOption, opt); + }, this); + } + } + + return optionChanged; + }; + + GlobalModel.prototype.mergeOption = function (option) { + this._mergeOption(option, null); + }; + + GlobalModel.prototype._mergeOption = function (newOption, opt) { + var option = this.option; + var componentsMap = this._componentsMap; + var componentsCount = this._componentsCount; + var newCmptTypes = []; + var newCmptTypeMap = createHashMap(); + var replaceMergeMainTypeMap = opt && opt.replaceMergeMainTypeMap; + resetSourceDefaulter(this); // If no component class, merge directly. + // For example: color, animaiton options, etc. + + each(newOption, function (componentOption, mainType) { + if (componentOption == null) { + return; + } + + if (!ComponentModel.hasClass(mainType)) { + // globalSettingTask.dirty(); + option[mainType] = option[mainType] == null ? clone(componentOption) : merge(option[mainType], componentOption, true); + } else if (mainType) { + newCmptTypes.push(mainType); + newCmptTypeMap.set(mainType, true); + } + }); + + if (replaceMergeMainTypeMap) { + // If there is a mainType `xxx` in `replaceMerge` but not declared in option, + // we trade it as it is declared in option as `{xxx: []}`. Because: + // (1) for normal merge, `{xxx: null/undefined}` are the same meaning as `{xxx: []}`. + // (2) some preprocessor may convert some of `{xxx: null/undefined}` to `{xxx: []}`. + replaceMergeMainTypeMap.each(function (val, mainTypeInReplaceMerge) { + if (ComponentModel.hasClass(mainTypeInReplaceMerge) && !newCmptTypeMap.get(mainTypeInReplaceMerge)) { + newCmptTypes.push(mainTypeInReplaceMerge); + newCmptTypeMap.set(mainTypeInReplaceMerge, true); + } + }); + } + + ComponentModel.topologicalTravel(newCmptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this); + + function visitComponent(mainType) { + var newCmptOptionList = concatInternalOptions(this, mainType, normalizeToArray(newOption[mainType])); + var oldCmptList = componentsMap.get(mainType); + var mergeMode = // `!oldCmptList` means init. See the comment in `mappingToExists` + !oldCmptList ? 'replaceAll' : replaceMergeMainTypeMap && replaceMergeMainTypeMap.get(mainType) ? 'replaceMerge' : 'normalMerge'; + var mappingResult = mappingToExists(oldCmptList, newCmptOptionList, mergeMode); // Set mainType and complete subType. + + setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel); // Empty it before the travel, in order to prevent `this._componentsMap` + // from being used in the `init`/`mergeOption`/`optionUpdated` of some + // components, which is probably incorrect logic. + + option[mainType] = null; + componentsMap.set(mainType, null); + componentsCount.set(mainType, 0); + var optionsByMainType = []; + var cmptsByMainType = []; + var cmptsCountByMainType = 0; + each(mappingResult, function (resultItem, index) { + var componentModel = resultItem.existing; + var newCmptOption = resultItem.newOption; + + if (!newCmptOption) { + if (componentModel) { + // Consider where is no new option and should be merged using {}, + // see removeEdgeAndAdd in topologicalTravel and + // ComponentModel.getAllClassMainTypes. + componentModel.mergeOption({}, this); + componentModel.optionUpdated({}, false); + } // If no both `resultItem.exist` and `resultItem.option`, + // either it is in `replaceMerge` and not matched by any id, + // or it has been removed in previous `replaceMerge` and left a "hole" in this component index. + + } else { + var ComponentModelClass = ComponentModel.getClass(mainType, resultItem.keyInfo.subType, true); + + if (componentModel && componentModel.constructor === ComponentModelClass) { + componentModel.name = resultItem.keyInfo.name; // componentModel.settingTask && componentModel.settingTask.dirty(); + + componentModel.mergeOption(newCmptOption, this); + componentModel.optionUpdated(newCmptOption, false); + } else { + // PENDING Global as parent ? + var extraOpt = extend({ + componentIndex: index + }, resultItem.keyInfo); + componentModel = new ComponentModelClass(newCmptOption, this, this, extraOpt); // Assign `keyInfo` + + extend(componentModel, extraOpt); + + if (resultItem.brandNew) { + componentModel.__requireNewView = true; + } + + componentModel.init(newCmptOption, this, this); // Call optionUpdated after init. + // newCmptOption has been used as componentModel.option + // and may be merged with theme and default, so pass null + // to avoid confusion. + + componentModel.optionUpdated(null, true); + } + } + + if (componentModel) { + optionsByMainType.push(componentModel.option); + cmptsByMainType.push(componentModel); + cmptsCountByMainType++; + } else { + // Always do assign to avoid elided item in array. + optionsByMainType.push(void 0); + cmptsByMainType.push(void 0); + } + }, this); + option[mainType] = optionsByMainType; + componentsMap.set(mainType, cmptsByMainType); + componentsCount.set(mainType, cmptsCountByMainType); // Backup series for filtering. + + if (mainType === 'series') { + reCreateSeriesIndices(this); + } + } // If no series declared, ensure `_seriesIndices` initialized. + + + if (!this._seriesIndices) { + reCreateSeriesIndices(this); + } + }; + /** + * Get option for output (cloned option and inner info removed) + */ + + + GlobalModel.prototype.getOption = function () { + var option = clone(this.option); + each(option, function (optInMainType, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = normalizeToArray(optInMainType); // Inner cmpts need to be removed. + // Inner cmpts might not be at last since ec5.0, but still + // compatible for users: if inner cmpt at last, splice the returned array. + + var realLen = opts.length; + var metNonInner = false; + + for (var i = realLen - 1; i >= 0; i--) { + // Remove options with inner id. + if (opts[i] && !isComponentIdInternal(opts[i])) { + metNonInner = true; + } else { + opts[i] = null; + !metNonInner && realLen--; + } + } + + opts.length = realLen; + option[mainType] = opts; + } + }); + delete option[OPTION_INNER_KEY]; + return option; + }; + + GlobalModel.prototype.getTheme = function () { + return this._theme; + }; + + GlobalModel.prototype.getLocaleModel = function () { + return this._locale; + }; + + GlobalModel.prototype.getLocale = function (localePosition) { + var locale = this.getLocaleModel(); + return locale.get(localePosition); + }; + + GlobalModel.prototype.setUpdatePayload = function (payload) { + this._payload = payload; + }; + + GlobalModel.prototype.getUpdatePayload = function () { + return this._payload; + }; + /** + * @param idx If not specified, return the first one. + */ + + + GlobalModel.prototype.getComponent = function (mainType, idx) { + var list = this._componentsMap.get(mainType); + + if (list) { + var cmpt = list[idx || 0]; + + if (cmpt) { + return cmpt; + } else if (idx == null) { + for (var i = 0; i < list.length; i++) { + if (list[i]) { + return list[i]; + } + } + } + } + }; + /** + * @return Never be null/undefined. + */ + + + GlobalModel.prototype.queryComponents = function (condition) { + var mainType = condition.mainType; + + if (!mainType) { + return []; + } + + var index = condition.index; + var id = condition.id; + var name = condition.name; + + var cmpts = this._componentsMap.get(mainType); + + if (!cmpts || !cmpts.length) { + return []; + } + + var result; + + if (index != null) { + result = []; + each(normalizeToArray(index), function (idx) { + cmpts[idx] && result.push(cmpts[idx]); + }); + } else if (id != null) { + result = queryByIdOrName('id', id, cmpts); + } else if (name != null) { + result = queryByIdOrName('name', name, cmpts); + } else { + // Return all non-empty components in that mainType + result = filter(cmpts, function (cmpt) { + return !!cmpt; + }); + } + + return filterBySubType(result, condition); + }; + /** + * The interface is different from queryComponents, + * which is convenient for inner usage. + * + * @usage + * let result = findComponents( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}} + * ); + * let result = findComponents( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}} + * ); + * let result = findComponents( + * {mainType: 'series', + * filter: function (model, index) {...}} + * ); + * // result like [component0, componnet1, ...] + */ + + + GlobalModel.prototype.findComponents = function (condition) { + var query = condition.query; + var mainType = condition.mainType; + var queryCond = getQueryCond(query); + var result = queryCond ? this.queryComponents(queryCond) // Retrieve all non-empty components. + : filter(this._componentsMap.get(mainType), function (cmpt) { + return !!cmpt; + }); + return doFilter(filterBySubType(result, condition)); + + function getQueryCond(q) { + var indexAttr = mainType + 'Index'; + var idAttr = mainType + 'Id'; + var nameAttr = mainType + 'Name'; + return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? { + 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; + } + }; + + GlobalModel.prototype.eachComponent = function (mainType, cb, context) { + var componentsMap = this._componentsMap; + + if (isFunction(mainType)) { + var ctxForAll_1 = cb; + var cbForAll_1 = mainType; + componentsMap.each(function (cmpts, componentType) { + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cbForAll_1.call(ctxForAll_1, componentType, cmpt, cmpt.componentIndex); + } + }); + } else { + var cmpts = isString(mainType) ? componentsMap.get(mainType) : isObject(mainType) ? this.findComponents(mainType) : null; + + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cb.call(context, cmpt, cmpt.componentIndex); + } + } + }; + /** + * Get series list before filtered by name. + */ + + + GlobalModel.prototype.getSeriesByName = function (name) { + var nameStr = convertOptionIdName(name, null); + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries && nameStr != null && oneSeries.name === nameStr; + }); + }; + /** + * Get series list before filtered by index. + */ + + + GlobalModel.prototype.getSeriesByIndex = function (seriesIndex) { + return this._componentsMap.get('series')[seriesIndex]; + }; + /** + * Get series list before filtered by type. + * FIXME: rename to getRawSeriesByType? + */ + + + GlobalModel.prototype.getSeriesByType = function (subType) { + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries && oneSeries.subType === subType; + }); + }; + /** + * Get all series before filtered. + */ + + + GlobalModel.prototype.getSeries = function () { + return filter(this._componentsMap.get('series').slice(), function (oneSeries) { + return !!oneSeries; + }); + }; + /** + * Count series before filtered. + */ + + + GlobalModel.prototype.getSeriesCount = function () { + return this._componentsCount.get('series'); + }; + /** + * After filtering, series may be different + * frome raw series. + */ + + + GlobalModel.prototype.eachSeries = function (cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + + cb.call(context, series, rawSeriesIndex); + }, this); + }; + /** + * Iterate raw series before filtered. + * + * @param {Function} cb + * @param {*} context + */ + + + GlobalModel.prototype.eachRawSeries = function (cb, context) { + each(this._componentsMap.get('series'), function (series) { + series && cb.call(context, series, series.componentIndex); + }); + }; + /** + * After filtering, series may be different. + * frome raw series. + */ + + + GlobalModel.prototype.eachSeriesByType = function (subType, cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }; + /** + * Iterate raw series before filtered of given type. + */ + + + GlobalModel.prototype.eachRawSeriesByType = function (subType, cb, context) { + return each(this.getSeriesByType(subType), cb, context); + }; + + GlobalModel.prototype.isSeriesFiltered = function (seriesModel) { + assertSeriesInitialized(this); + return this._seriesIndicesMap.get(seriesModel.componentIndex) == null; + }; + + GlobalModel.prototype.getCurrentSeriesIndices = function () { + return (this._seriesIndices || []).slice(); + }; + + GlobalModel.prototype.filterSeries = function (cb, context) { + assertSeriesInitialized(this); + var newSeriesIndices = []; + each(this._seriesIndices, function (seriesRawIdx) { + var series = this._componentsMap.get('series')[seriesRawIdx]; + + cb.call(context, series, seriesRawIdx) && newSeriesIndices.push(seriesRawIdx); + }, this); + this._seriesIndices = newSeriesIndices; + this._seriesIndicesMap = createHashMap(newSeriesIndices); + }; + + GlobalModel.prototype.restoreData = function (payload) { + reCreateSeriesIndices(this); + var componentsMap = this._componentsMap; + var componentTypes = []; + componentsMap.each(function (components, componentType) { + if (ComponentModel.hasClass(componentType)) { + componentTypes.push(componentType); + } + }); + ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function (componentType) { + each(componentsMap.get(componentType), function (component) { + if (component && (componentType !== 'series' || !isNotTargetSeries(component, payload))) { + component.restoreData(); + } + }); + }); + }; + + GlobalModel.internalField = function () { + reCreateSeriesIndices = function (ecModel) { + var seriesIndices = ecModel._seriesIndices = []; + each(ecModel._componentsMap.get('series'), function (series) { + // series may have been removed by `replaceMerge`. + series && seriesIndices.push(series.componentIndex); + }); + ecModel._seriesIndicesMap = createHashMap(seriesIndices); + }; + + assertSeriesInitialized = function (ecModel) { + // Components that use _seriesIndices should depends on series component, + // which make sure that their initialization is after series. + if ("development" !== 'production') { + if (!ecModel._seriesIndices) { + throw new Error('Option should contains series.'); + } + } + }; + + initBase = function (ecModel, baseOption) { + // Using OPTION_INNER_KEY to mark that this option can not be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbiden. + ecModel.option = {}; + ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE; // Init with series: [], in case of calling findSeries method + // before series initialized. + + ecModel._componentsMap = createHashMap({ + series: [] + }); + ecModel._componentsCount = createHashMap(); // If user spefied `option.aria`, aria will be enable. This detection should be + // performed before theme and globalDefault merge. + + var airaOption = baseOption.aria; + + if (isObject(airaOption) && airaOption.enabled == null) { + airaOption.enabled = true; + } + + mergeTheme(baseOption, ecModel._theme.option); // TODO Needs clone when merging to the unexisted property + + merge(baseOption, globalDefault, false); + + ecModel._mergeOption(baseOption, null); + }; + }(); + + return GlobalModel; + }(Model); + + function isNotTargetSeries(seriesModel, payload) { + if (payload) { + var index = payload.seriesIndex; + var id = payload.seriesId; + var name_1 = payload.seriesName; + return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name_1 != null && seriesModel.name !== name_1; + } + } + + function mergeTheme(option, theme) { + // PENDING + // NOT use `colorLayer` in theme if option has `color` + var notMergeColorLayer = option.color && !option.colorLayer; + each(theme, function (themeItem, name) { + if (name === 'colorLayer' && notMergeColorLayer) { + return; + } // If it is component model mainType, the model handles that merge later. + // otherwise, merge them here. + + + if (!ComponentModel.hasClass(name)) { + if (typeof themeItem === 'object') { + option[name] = !option[name] ? clone(themeItem) : merge(option[name], themeItem, false); + } else { + if (option[name] == null) { + option[name] = themeItem; + } + } + } + }); + } + + function queryByIdOrName(attr, idOrName, cmpts) { + // Here is a break from echarts4: string and number are + // treated as equal. + if (isArray(idOrName)) { + var keyMap_1 = createHashMap(); + each(idOrName, function (idOrNameItem) { + if (idOrNameItem != null) { + var idName = convertOptionIdName(idOrNameItem, null); + idName != null && keyMap_1.set(idOrNameItem, true); + } + }); + return filter(cmpts, function (cmpt) { + return cmpt && keyMap_1.get(cmpt[attr]); + }); + } else { + var idName_1 = convertOptionIdName(idOrName, null); + return filter(cmpts, function (cmpt) { + return cmpt && idName_1 != null && cmpt[attr] === idName_1; + }); + } + } + + function filterBySubType(components, condition) { + // Using hasOwnProperty for restrict. Consider + // subType is undefined in user payload. + return condition.hasOwnProperty('subType') ? filter(components, function (cmpt) { + return cmpt && cmpt.subType === condition.subType; + }) : components; + } + + function normalizeSetOptionInput(opts) { + var replaceMergeMainTypeMap = createHashMap(); + opts && each(normalizeToArray(opts.replaceMerge), function (mainType) { + if ("development" !== 'production') { + assert(ComponentModel.hasClass(mainType), '"' + mainType + '" is not valid component main type in "replaceMerge"'); + } + + replaceMergeMainTypeMap.set(mainType, true); + }); + return { + replaceMergeMainTypeMap: replaceMergeMainTypeMap + }; + } + + mixin(GlobalModel, PaletteMixin); + + var availableMethods = ['getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed', 'on', 'off', 'getDataURL', 'getConnectedDataURL', // 'getModel', + 'getOption', // 'getViewOfComponentModel', + // 'getViewOfSeriesModel', + 'getId', 'updateLabelLayout']; + + var ExtensionAPI = + /** @class */ + function () { + function ExtensionAPI(ecInstance) { + each(availableMethods, function (methodName) { + this[methodName] = bind(ecInstance[methodName], ecInstance); + }, this); + } + + return ExtensionAPI; + }(); + + var coordinateSystemCreators = {}; + + var CoordinateSystemManager = + /** @class */ + function () { + function CoordinateSystemManager() { + this._coordinateSystems = []; + } + + CoordinateSystemManager.prototype.create = function (ecModel, api) { + var coordinateSystems = []; + each(coordinateSystemCreators, function (creater, type) { + var list = creater.create(ecModel, api); + coordinateSystems = coordinateSystems.concat(list || []); + }); + this._coordinateSystems = coordinateSystems; + }; + + CoordinateSystemManager.prototype.update = function (ecModel, api) { + each(this._coordinateSystems, function (coordSys) { + coordSys.update && coordSys.update(ecModel, api); + }); + }; + + CoordinateSystemManager.prototype.getCoordinateSystems = function () { + return this._coordinateSystems.slice(); + }; + + CoordinateSystemManager.register = function (type, creator) { + coordinateSystemCreators[type] = creator; + }; + + CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; + }; + + return CoordinateSystemManager; + }(); + + var QUERY_REG = /^(min|max)?(.+)$/; // Key: mainType + // type FakeComponentsMap = HashMap<(MappingExistingItem & { subType: string })[]>; + + /** + * TERM EXPLANATIONS: + * See `ECOption` and `ECUnitOption` in `src/util/types.ts`. + */ + + var OptionManager = + /** @class */ + function () { + // 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); + function OptionManager(api) { + this._timelineOptions = []; + this._mediaList = []; + /** + * -1, means default. + * empty means no media. + */ + + this._currentMediaIndices = []; + this._api = api; + } + + OptionManager.prototype.setOption = function (rawOption, optionPreprocessorFuncs, opt) { + if (rawOption) { + // That set dat primitive is dangerous if user reuse the data when setOption again. + each(normalizeToArray(rawOption.series), function (series) { + series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data); + }); + each(normalizeToArray(rawOption.dataset), function (dataset) { + dataset && dataset.source && isTypedArray(dataset.source) && setAsPrimitive(dataset.source); + }); + } // Caution: some series modify option data, if do not clone, + // it should ensure that the repeat modify correctly + // (create a new object when modify itself). + + + rawOption = clone(rawOption); // FIXME + // If some property is set in timeline options or media option but + // not set in baseOption, a warning should be given. + + var optionBackup = this._optionBackup; + var newParsedOption = parseRawOption(rawOption, optionPreprocessorFuncs, !optionBackup); + this._newBaseOption = newParsedOption.baseOption; // For setOption at second time (using merge mode); + + if (optionBackup) { + // FIXME + // the restore merge solution is essentially incorrect. + // the mapping can not be 100% consistent with ecModel, which probably brings + // potential bug! + // The first merge is delayed, becuase in most cases, users do not call `setOption` twice. + // let fakeCmptsMap = this._fakeCmptsMap; + // if (!fakeCmptsMap) { + // fakeCmptsMap = this._fakeCmptsMap = createHashMap(); + // mergeToBackupOption(fakeCmptsMap, null, optionBackup.baseOption, null); + // } + // mergeToBackupOption( + // fakeCmptsMap, optionBackup.baseOption, newParsedOption.baseOption, opt + // ); + // For simplicity, timeline options and media options do not support merge, + // that is, if you `setOption` twice and both has timeline options, the latter + // timeline opitons will not be merged to the formers, but just substitude them. + if (newParsedOption.timelineOptions.length) { + optionBackup.timelineOptions = newParsedOption.timelineOptions; + } + + if (newParsedOption.mediaList.length) { + optionBackup.mediaList = newParsedOption.mediaList; + } + + if (newParsedOption.mediaDefault) { + optionBackup.mediaDefault = newParsedOption.mediaDefault; + } + } else { + this._optionBackup = newParsedOption; + } + }; + + OptionManager.prototype.mountOption = function (isRecreate) { + var optionBackup = this._optionBackup; + this._timelineOptions = optionBackup.timelineOptions; + this._mediaList = optionBackup.mediaList; + this._mediaDefault = optionBackup.mediaDefault; + this._currentMediaIndices = []; + return clone(isRecreate // this._optionBackup.baseOption, which is created at the first `setOption` + // called, and is merged into every new option by inner method `mergeToBackupOption` + // each time `setOption` called, can be only used in `isRecreate`, because + // its reliability is under suspicion. In other cases option merge is + // performed by `model.mergeOption`. + ? optionBackup.baseOption : this._newBaseOption); + }; + + OptionManager.prototype.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( // FIXME:TS as TimelineModel or quivlant interface + timelineOptions[timelineModel.getCurrentIndex()]); + } + } + + return option; + }; + + OptionManager.prototype.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 + // Whether mediaDefault should force users to provide? Otherwise + // the change by media query can not be recorvered. + + + 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; + }; + + return OptionManager; + }(); + /** + * [RAW_OPTION_PATTERNS] + * (Note: "series: []" represents all other props in `ECUnitOption`) + * + * (1) No prop "baseOption" declared: + * Root option is used as "baseOption" (except prop "options" and "media"). + * ```js + * option = { + * series: [], + * timeline: {}, + * options: [], + * }; + * option = { + * series: [], + * media: {}, + * }; + * option = { + * series: [], + * timeline: {}, + * options: [], + * media: {}, + * } + * ``` + * + * (2) Prop "baseOption" declared: + * If "baseOption" declared, `ECUnitOption` props can only be declared + * inside "baseOption" except prop "timeline" (compat ec2). + * ```js + * option = { + * baseOption: { + * timeline: {}, + * series: [], + * }, + * options: [] + * }; + * option = { + * baseOption: { + * series: [], + * }, + * media: [] + * }; + * option = { + * baseOption: { + * timeline: {}, + * series: [], + * }, + * options: [] + * media: [] + * }; + * option = { + * // ec3 compat ec2: allow (only) `timeline` declared + * // outside baseOption. Keep this setting for compat. + * timeline: {}, + * baseOption: { + * series: [], + * }, + * options: [], + * media: [] + * }; + * ``` + */ + + + function parseRawOption( // `rawOption` May be modified + rawOption, optionPreprocessorFuncs, isNew) { + var mediaList = []; + var mediaDefault; + var baseOption; + var declaredBaseOption = rawOption.baseOption; // Compatible with ec2, [RAW_OPTION_PATTERNS] above. + + var timelineOnRoot = rawOption.timeline; + var timelineOptionsOnRoot = rawOption.options; + var mediaOnRoot = rawOption.media; + var hasMedia = !!rawOption.media; + var hasTimeline = !!(timelineOptionsOnRoot || timelineOnRoot || declaredBaseOption && declaredBaseOption.timeline); + + if (declaredBaseOption) { + baseOption = declaredBaseOption; // For merge option. + + if (!baseOption.timeline) { + baseOption.timeline = timelineOnRoot; + } + } // For convenience, enable to use the root option as the `baseOption`: + // `{ ...normalOptionProps, media: [{ ... }, { ... }] }` + else { + if (hasTimeline || hasMedia) { + rawOption.options = rawOption.media = null; + } + + baseOption = rawOption; + } + + if (hasMedia) { + if (isArray(mediaOnRoot)) { + each(mediaOnRoot, function (singleMedia) { + if ("development" !== 'production') { + // Real case of wrong config. + if (singleMedia && !singleMedia.option && isObject(singleMedia.query) && isObject(singleMedia.query.option)) { + error('Illegal media option. Must be like { media: [ { query: {}, option: {} } ] }'); + } + } + + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } else if (!mediaDefault) { + // Use the first media default. + mediaDefault = singleMedia; + } + } + }); + } else { + if ("development" !== 'production') { + // Real case of wrong config. + error('Illegal media option. Must be an array. Like { media: [ {...}, {...} ] }'); + } + } + } + + doPreprocess(baseOption); + each(timelineOptionsOnRoot, function (option) { + return doPreprocess(option); + }); + each(mediaList, function (media) { + return doPreprocess(media.option); + }); + + function doPreprocess(option) { + each(optionPreprocessorFuncs, function (preProcess) { + preProcess(option, isNew); + }); + } + + return { + baseOption: baseOption, + timelineOptions: timelineOptionsOnRoot || [], + 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; + 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(','); + } + + var each$2 = each; + var isObject$1 = isObject; + var POSSIBLE_STYLES = ['areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', 'chordStyle', 'label', 'labelLine']; + + function compatEC2ItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + + if (!itemStyleOpt) { + return; + } + + for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) { + var styleName = POSSIBLE_STYLES[i]; + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + if ("development" !== 'production') { + deprecateReplaceLog("itemStyle.normal." + styleName, styleName); + } + + opt[styleName] = opt[styleName] || {}; + + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } else { + merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + + normalItemStyleOpt[styleName] = null; + } + + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + if ("development" !== 'production') { + deprecateReplaceLog("itemStyle.emphasis." + styleName, "emphasis." + styleName); + } + + opt[styleName] = opt[styleName] || {}; + + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } else { + merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + + emphasisItemStyleOpt[styleName] = null; + } + } + } + + function convertNormalEmphasis(opt, optType, useExtend) { + if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) { + var normalOpt = opt[optType].normal; + var emphasisOpt = opt[optType].emphasis; + + if (normalOpt) { + if ("development" !== 'production') { + // eslint-disable-next-line max-len + deprecateLog("'normal' hierarchy in " + optType + " has been removed since 4.0. All style properties are configured in " + optType + " directly now."); + } // Timeline controlStyle has other properties besides normal and emphasis + + + if (useExtend) { + opt[optType].normal = opt[optType].emphasis = null; + defaults(opt[optType], normalOpt); + } else { + opt[optType] = normalOpt; + } + } + + if (emphasisOpt) { + if ("development" !== 'production') { + deprecateLog(optType + ".emphasis has been changed to emphasis." + optType + " since 4.0"); + } + + opt.emphasis = opt.emphasis || {}; + opt.emphasis[optType] = emphasisOpt; // Also compat the case user mix the style and focus together in ec3 style + // for example: { itemStyle: { normal: {}, emphasis: {focus, shadowBlur} } } + + if (emphasisOpt.focus) { + opt.emphasis.focus = emphasisOpt.focus; + } + + if (emphasisOpt.blurScope) { + opt.emphasis.blurScope = emphasisOpt.blurScope; + } + } + } + } + + function removeEC3NormalStatus(opt) { + convertNormalEmphasis(opt, 'itemStyle'); + convertNormalEmphasis(opt, 'lineStyle'); + convertNormalEmphasis(opt, 'areaStyle'); + convertNormalEmphasis(opt, 'label'); + convertNormalEmphasis(opt, 'labelLine'); // treemap + + convertNormalEmphasis(opt, 'upperLabel'); // graph + + convertNormalEmphasis(opt, 'edgeLabel'); + } + + function compatTextStyle(opt, propName) { + // Check whether is not object (string\null\undefined ...) + var labelOptSingle = isObject$1(opt) && opt[propName]; + var textStyle = isObject$1(labelOptSingle) && labelOptSingle.textStyle; + + if (textStyle) { + if ("development" !== 'production') { + // eslint-disable-next-line max-len + deprecateLog("textStyle hierarchy in " + propName + " has been removed since 4.0. All textStyle properties are configured in " + propName + " directly now."); + } + + for (var i = 0, len = TEXT_STYLE_OPTIONS.length; i < len; i++) { + var textPropName = TEXT_STYLE_OPTIONS[i]; + + if (textStyle.hasOwnProperty(textPropName)) { + labelOptSingle[textPropName] = textStyle[textPropName]; + } + } + } + } + + function compatEC3CommonStyles(opt) { + if (opt) { + removeEC3NormalStatus(opt); + compatTextStyle(opt, 'label'); + opt.emphasis && compatTextStyle(opt.emphasis, 'label'); + } + } + + function processSeries(seriesOpt) { + if (!isObject$1(seriesOpt)) { + return; + } + + compatEC2ItemStyle(seriesOpt); + removeEC3NormalStatus(seriesOpt); + compatTextStyle(seriesOpt, 'label'); // treemap + + compatTextStyle(seriesOpt, 'upperLabel'); // graph + + compatTextStyle(seriesOpt, 'edgeLabel'); + + if (seriesOpt.emphasis) { + compatTextStyle(seriesOpt.emphasis, 'label'); // treemap + + compatTextStyle(seriesOpt.emphasis, 'upperLabel'); // graph + + compatTextStyle(seriesOpt.emphasis, 'edgeLabel'); + } + + var markPoint = seriesOpt.markPoint; + + if (markPoint) { + compatEC2ItemStyle(markPoint); + compatEC3CommonStyles(markPoint); + } + + var markLine = seriesOpt.markLine; + + if (markLine) { + compatEC2ItemStyle(markLine); + compatEC3CommonStyles(markLine); + } + + var markArea = seriesOpt.markArea; + + if (markArea) { + compatEC3CommonStyles(markArea); + } + + var data = seriesOpt.data; // Break with ec3: if `setOption` again, there may be no `type` in option, + // then the backward compat based on option type will not be performed. + + if (seriesOpt.type === 'graph') { + data = data || seriesOpt.nodes; + var edgeData = seriesOpt.links || seriesOpt.edges; + + if (edgeData && !isTypedArray(edgeData)) { + for (var i = 0; i < edgeData.length; i++) { + compatEC3CommonStyles(edgeData[i]); + } + } + + each(seriesOpt.categories, function (opt) { + removeEC3NormalStatus(opt); + }); + } + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatEC3CommonStyles(data[i]); + } + } // mark point data + + + markPoint = seriesOpt.markPoint; + + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + + for (var i = 0; i < mpData.length; i++) { + compatEC3CommonStyles(mpData[i]); + } + } // mark line data + + + markLine = seriesOpt.markLine; + + if (markLine && markLine.data) { + var mlData = markLine.data; + + for (var i = 0; i < mlData.length; i++) { + if (isArray(mlData[i])) { + compatEC3CommonStyles(mlData[i][0]); + compatEC3CommonStyles(mlData[i][1]); + } else { + compatEC3CommonStyles(mlData[i]); + } + } + } // Series + + + if (seriesOpt.type === 'gauge') { + compatTextStyle(seriesOpt, 'axisLabel'); + compatTextStyle(seriesOpt, 'title'); + compatTextStyle(seriesOpt, 'detail'); + } else if (seriesOpt.type === 'treemap') { + convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle'); + each(seriesOpt.levels, function (opt) { + removeEC3NormalStatus(opt); + }); + } else if (seriesOpt.type === 'tree') { + removeEC3NormalStatus(seriesOpt.leaves); + } // sunburst starts from ec4, so it does not need to compat levels. + + } + + function toArr(o) { + return isArray(o) ? o : o ? [o] : []; + } + + function toObj(o) { + return (isArray(o) ? o[0] : o) || {}; + } + + function globalCompatStyle(option, isTheme) { + each$2(toArr(option.series), function (seriesOpt) { + isObject$1(seriesOpt) && processSeries(seriesOpt); + }); + var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar']; + isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis'); + each$2(axes, function (axisName) { + each$2(toArr(option[axisName]), function (axisOpt) { + if (axisOpt) { + compatTextStyle(axisOpt, 'axisLabel'); + compatTextStyle(axisOpt.axisPointer, 'label'); + } + }); + }); + each$2(toArr(option.parallel), function (parallelOpt) { + var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault; + compatTextStyle(parallelAxisDefault, 'axisLabel'); + compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, 'label'); + }); + each$2(toArr(option.calendar), function (calendarOpt) { + convertNormalEmphasis(calendarOpt, 'itemStyle'); + compatTextStyle(calendarOpt, 'dayLabel'); + compatTextStyle(calendarOpt, 'monthLabel'); + compatTextStyle(calendarOpt, 'yearLabel'); + }); // radar.name.textStyle + + each$2(toArr(option.radar), function (radarOpt) { + compatTextStyle(radarOpt, 'name'); // Use axisName instead of name because component has name property + + if (radarOpt.name && radarOpt.axisName == null) { + radarOpt.axisName = radarOpt.name; + delete radarOpt.name; + + if ("development" !== 'production') { + deprecateLog('name property in radar component has been changed to axisName'); + } + } + + if (radarOpt.nameGap != null && radarOpt.axisNameGap == null) { + radarOpt.axisNameGap = radarOpt.nameGap; + delete radarOpt.nameGap; + + if ("development" !== 'production') { + deprecateLog('nameGap property in radar component has been changed to axisNameGap'); + } + } + }); + each$2(toArr(option.geo), function (geoOpt) { + if (isObject$1(geoOpt)) { + compatEC3CommonStyles(geoOpt); + each$2(toArr(geoOpt.regions), function (regionObj) { + compatEC3CommonStyles(regionObj); + }); + } + }); + each$2(toArr(option.timeline), function (timelineOpt) { + compatEC3CommonStyles(timelineOpt); + convertNormalEmphasis(timelineOpt, 'label'); + convertNormalEmphasis(timelineOpt, 'itemStyle'); + convertNormalEmphasis(timelineOpt, 'controlStyle', true); + var data = timelineOpt.data; + isArray(data) && each(data, function (item) { + if (isObject(item)) { + convertNormalEmphasis(item, 'label'); + convertNormalEmphasis(item, 'itemStyle'); + } + }); + }); + each$2(toArr(option.toolbox), function (toolboxOpt) { + convertNormalEmphasis(toolboxOpt, 'iconStyle'); + each$2(toolboxOpt.feature, function (featureOpt) { + convertNormalEmphasis(featureOpt, 'iconStyle'); + }); + }); + compatTextStyle(toObj(option.axisPointer), 'label'); + compatTextStyle(toObj(option.tooltip).axisPointer, 'label'); // Clean logs + // storedLogs = {}; + } + + function get(opt, path) { + var pathArr = path.split(','); + var obj = opt; + + for (var i = 0; i < pathArr.length; i++) { + obj = obj && obj[pathArr[i]]; + + if (obj == null) { + break; + } + } + + return obj; + } + + function set$1(opt, path, val, overwrite) { + var pathArr = path.split(','); + var obj = opt; + var key; + var i = 0; + + for (; i < pathArr.length - 1; i++) { + key = pathArr[i]; + + if (obj[key] == null) { + obj[key] = {}; + } + + obj = obj[key]; + } + + if (overwrite || obj[pathArr[i]] == null) { + obj[pathArr[i]] = val; + } + } + + function compatLayoutProperties(option) { + 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 BAR_ITEM_STYLE_MAP = [['borderRadius', 'barBorderRadius'], ['borderColor', 'barBorderColor'], ['borderWidth', 'barBorderWidth']]; + + function compatBarItemStyle(option) { + var itemStyle = option && option.itemStyle; + + if (itemStyle) { + for (var i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) { + var oldName = BAR_ITEM_STYLE_MAP[i][1]; + var newName = BAR_ITEM_STYLE_MAP[i][0]; + + if (itemStyle[oldName] != null) { + itemStyle[newName] = itemStyle[oldName]; + + if ("development" !== 'production') { + deprecateReplaceLog(oldName, newName); + } + } + } + } + } + + function compatPieLabel(option) { + if (!option) { + return; + } + + if (option.alignTo === 'edge' && option.margin != null && option.edgeDistance == null) { + if ("development" !== 'production') { + deprecateReplaceLog('label.margin', 'label.edgeDistance', 'pie'); + } + + option.edgeDistance = option.margin; + } + } + + function compatSunburstState(option) { + if (!option) { + return; + } + + if (option.downplay && !option.blur) { + option.blur = option.downplay; + + if ("development" !== 'production') { + deprecateReplaceLog('downplay', 'blur', 'sunburst'); + } + } + } + + function compatGraphFocus(option) { + if (!option) { + return; + } + + if (option.focusNodeAdjacency != null) { + option.emphasis = option.emphasis || {}; + + if (option.emphasis.focus == null) { + if ("development" !== 'production') { + deprecateReplaceLog('focusNodeAdjacency', 'emphasis: { focus: \'adjacency\'}', 'graph/sankey'); + } + + option.emphasis.focus = 'adjacency'; + } + } + } + + function traverseTree(data, cb) { + if (data) { + for (var i = 0; i < data.length; i++) { + cb(data[i]); + data[i] && traverseTree(data[i].children, cb); + } + } + } + + function globalBackwardCompat(option, isTheme) { + globalCompatStyle(option, isTheme); // Make sure series array for model initialization. + + option.series = normalizeToArray(option.series); + each(option.series, function (seriesOpt) { + if (!isObject(seriesOpt)) { + return; + } + + var seriesType = seriesOpt.type; + + if (seriesType === 'line') { + if (seriesOpt.clipOverflow != null) { + seriesOpt.clip = seriesOpt.clipOverflow; + + if ("development" !== 'production') { + deprecateReplaceLog('clipOverflow', 'clip', 'line'); + } + } + } else if (seriesType === 'pie' || seriesType === 'gauge') { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + + if ("development" !== 'production') { + deprecateReplaceLog('clockWise', 'clockwise'); + } + } + + compatPieLabel(seriesOpt.label); + var data = seriesOpt.data; + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatPieLabel(data[i]); + } + } + + if (seriesOpt.hoverOffset != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (seriesOpt.emphasis.scaleSize = null) { + if ("development" !== 'production') { + deprecateReplaceLog('hoverOffset', 'emphasis.scaleSize'); + } + + seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset; + } + } + } else if (seriesType === 'gauge') { + var pointerColor = get(seriesOpt, 'pointer.color'); + pointerColor != null && set$1(seriesOpt, 'itemStyle.color', pointerColor); + } else if (seriesType === 'bar') { + compatBarItemStyle(seriesOpt); + compatBarItemStyle(seriesOpt.backgroundStyle); + compatBarItemStyle(seriesOpt.emphasis); + var data = seriesOpt.data; + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + if (typeof data[i] === 'object') { + compatBarItemStyle(data[i]); + compatBarItemStyle(data[i] && data[i].emphasis); + } + } + } + } else if (seriesType === 'sunburst') { + var highlightPolicy = seriesOpt.highlightPolicy; + + if (highlightPolicy) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (!seriesOpt.emphasis.focus) { + seriesOpt.emphasis.focus = highlightPolicy; + + if ("development" !== 'production') { + deprecateReplaceLog('highlightPolicy', 'emphasis.focus', 'sunburst'); + } + } + } + + compatSunburstState(seriesOpt); + traverseTree(seriesOpt.data, compatSunburstState); + } else if (seriesType === 'graph' || seriesType === 'sankey') { + compatGraphFocus(seriesOpt); // TODO nodes, edges? + } else if (seriesType === 'map') { + if (seriesOpt.mapType && !seriesOpt.map) { + if ("development" !== 'production') { + deprecateReplaceLog('mapType', 'map', 'map'); + } + + seriesOpt.map = seriesOpt.mapType; + } + + if (seriesOpt.mapLocation) { + if ("development" !== 'production') { + deprecateLog('`mapLocation` is not used anymore.'); + } + + defaults(seriesOpt, seriesOpt.mapLocation); + } + } + + if (seriesOpt.hoverAnimation != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) { + if ("development" !== 'production') { + deprecateReplaceLog('hoverAnimation', 'emphasis.scale'); + } + + seriesOpt.emphasis.scale = seriesOpt.hoverAnimation; + } + } + + compatLayoutProperties(seriesOpt); + }); // dataRange has changed to visualMap + + if (option.dataRange) { + option.visualMap = option.dataRange; + } + + each(COMPATITABLE_COMPONENTS, function (componentName) { + var options = option[componentName]; + + if (options) { + if (!isArray(options)) { + options = [options]; + } + + each(options, function (option) { + compatLayoutProperties(option); + }); + } + }); + } + + // data processing stage is blocked in stream. + // See + // (2) Only register once when import repeatly. + // Should be executed after series filtered and before stack calculation. + + function dataStack(ecModel) { + var stackInfoMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var stack = seriesModel.get('stack'); // Compatibal: when `stack` is set as '', do not stack. + + if (stack) { + var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []); + var data = seriesModel.getData(); + var stackInfo = { + // Used for calculate axis extent automatically. + // TODO: Type getCalculationInfo return more specific type? + stackResultDimension: data.getCalculationInfo('stackResultDimension'), + stackedOverDimension: data.getCalculationInfo('stackedOverDimension'), + stackedDimension: data.getCalculationInfo('stackedDimension'), + stackedByDimension: data.getCalculationInfo('stackedByDimension'), + isStackedByIndex: data.getCalculationInfo('isStackedByIndex'), + data: data, + seriesModel: seriesModel + }; // If stacked on axis that do not support data stack. + + if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) { + return; + } + + stackInfoList.length && data.setCalculationInfo('stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel); + stackInfoList.push(stackInfo); + } + }); + stackInfoMap.each(calculateStack); + } + + function calculateStack(stackInfoList) { + each(stackInfoList, function (targetStackInfo, idxInStack) { + var resultVal = []; + var resultNaN = [NaN, NaN]; + var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension]; + var targetData = targetStackInfo.data; + var isStackedByIndex = targetStackInfo.isStackedByIndex; // Should not write on raw data, because stack series model list changes + // depending on legend selection. + + var newData = targetData.map(dims, function (v0, v1, dataIndex) { + var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex); // Consider `connectNulls` of line area, if value is NaN, stackedOver + // should also be NaN, to draw a appropriate belt area. + + if (isNaN(sum)) { + return resultNaN; + } + + var byValue; + var stackedDataRawIndex; + + if (isStackedByIndex) { + stackedDataRawIndex = targetData.getRawIndex(dataIndex); + } else { + byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex); + } // If stackOver is NaN, chart view will render point on value start. + + + var stackedOver = NaN; + + for (var j = idxInStack - 1; j >= 0; j--) { + var stackInfo = stackInfoList[j]; // Has been optimized by inverted indices on `stackedByDimension`. + + if (!isStackedByIndex) { + stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue); + } + + if (stackedDataRawIndex >= 0) { + var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); // Considering positive stack, negative stack and empty data + + if (sum >= 0 && val > 0 || // Positive stack + sum <= 0 && val < 0 // Negative stack + ) { + sum += val; + stackedOver = val; + break; + } + } + } + + resultVal[0] = sum; + resultVal[1] = stackedOver; + return resultVal; + }); + targetData.hostModel.setData(newData); // Update for consequent calculation + + targetStackInfo.data = newData; + }); + } + + var SourceImpl = + /** @class */ + function () { + // readonly frozen: boolean; + function SourceImpl(fields) { + this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []); + this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN; // Visit config + + this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN; + this.startIndex = fields.startIndex || 0; + this.dimensionsDefine = fields.dimensionsDefine; + this.dimensionsDetectedCount = fields.dimensionsDetectedCount; + this.encodeDefine = fields.encodeDefine; + this.metaRawOption = fields.metaRawOption; + } + + return SourceImpl; + }(); + + function isSourceInstance(val) { + return val instanceof SourceImpl; + } + function createSource(sourceData, thisMetaRawOption, // can be null. If not provided, auto detect it from `sourceData`. + sourceFormat, encodeDefine // can be null + ) { + sourceFormat = sourceFormat || detectSourceFormat(sourceData); + var seriesLayoutBy = thisMetaRawOption.seriesLayoutBy; + var determined = determineSourceDimensions(sourceData, sourceFormat, seriesLayoutBy, thisMetaRawOption.sourceHeader, thisMetaRawOption.dimensions); + var source = new SourceImpl({ + data: sourceData, + sourceFormat: sourceFormat, + seriesLayoutBy: seriesLayoutBy, + dimensionsDefine: determined.dimensionsDefine, + startIndex: determined.startIndex, + dimensionsDetectedCount: determined.dimensionsDetectedCount, + encodeDefine: makeEncodeDefine(encodeDefine), + metaRawOption: clone(thisMetaRawOption) + }); + return source; + } + /** + * Wrap original series data for some compatibility cases. + */ + + function createSourceFromSeriesDataOption(data) { + return new SourceImpl({ + data: data, + sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL + }); + } + /** + * Clone source but excludes source data. + */ + + function cloneSourceShallow(source) { + return new SourceImpl({ + data: source.data, + sourceFormat: source.sourceFormat, + seriesLayoutBy: source.seriesLayoutBy, + dimensionsDefine: clone(source.dimensionsDefine), + startIndex: source.startIndex, + dimensionsDetectedCount: source.dimensionsDetectedCount, + encodeDefine: makeEncodeDefine(source.encodeDefine) + }); + } + + function makeEncodeDefine(encodeDefine) { + // null means user not specify `series.encode`. + return encodeDefine ? createHashMap(encodeDefine) : null; + } + /** + * Note: An empty array will be detected as `SOURCE_FORMAT_ARRAY_ROWS`. + */ + + + function detectSourceFormat(data) { + var sourceFormat = SOURCE_FORMAT_UNKNOWN; + + if (isTypedArray(data)) { + sourceFormat = SOURCE_FORMAT_TYPED_ARRAY; + } else if (isArray(data)) { + // FIXME Whether tolerate null in top level array? + if (data.length === 0) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + } + + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i]; + + if (item == null) { + continue; + } else if (isArray(item)) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + break; + } else if (isObject(item)) { + sourceFormat = SOURCE_FORMAT_OBJECT_ROWS; + break; + } + } + } else if (isObject(data)) { + for (var key in data) { + if (hasOwn(data, key) && isArrayLike(data[key])) { + sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS; + break; + } + } + } + + return sourceFormat; + } + /** + * Determine the source definitions from data standalone dimensions definitions + * are not specified. + */ + + function determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader, // standalone raw dimensions definition, like: + // { + // dimensions: ['aa', 'bb', { name: 'cc', type: 'time' }] + // } + // in `dataset` or `series` + dimensionsDefine) { + var dimensionsDetectedCount; + var startIndex; // PEDING: could data be null/undefined here? + // currently, if `dataset.source` not specified, error thrown. + // if `series.data` not specified, nothing rendered without error thrown. + // Should test these cases. + + if (!data) { + return { + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + startIndex: startIndex, + dimensionsDetectedCount: dimensionsDetectedCount + }; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; // Rule: Most of the first line are string: it is header. + // Caution: consider a line with 5 string and 1 number, + // it still can not be sure it is a head, because the + // 5 string may be 5 values of category columns. + + if (sourceHeader === 'auto' || sourceHeader == null) { + arrayRowsTravelFirst(function (val) { + // '-' is regarded as null/undefined. + if (val != null && val !== '-') { + if (isString(val)) { + startIndex == null && (startIndex = 1); + } else { + startIndex = 0; + } + } // 10 is an experience number, avoid long loop. + + }, seriesLayoutBy, dataArrayRows, 10); + } else { + startIndex = isNumber(sourceHeader) ? sourceHeader : sourceHeader ? 1 : 0; + } + + if (!dimensionsDefine && startIndex === 1) { + dimensionsDefine = []; + arrayRowsTravelFirst(function (val, index) { + dimensionsDefine[index] = val != null ? val + '' : ''; + }, seriesLayoutBy, dataArrayRows, Infinity); + } + + dimensionsDetectedCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? dataArrayRows.length : dataArrayRows[0] ? dataArrayRows[0].length : null; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + if (!dimensionsDefine) { + dimensionsDefine = objectRowsCollectDimensions(data); + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + if (!dimensionsDefine) { + dimensionsDefine = []; + each(data, function (colArr, key) { + dimensionsDefine.push(key); + }); + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var value0 = getDataItemValue(data[0]); + dimensionsDetectedCount = isArray(value0) && value0.length || 1; + } else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if ("development" !== 'production') { + assert(!!dimensionsDefine, 'dimensions must be given if data is TypedArray.'); + } + } + + return { + startIndex: startIndex, + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + dimensionsDetectedCount: dimensionsDetectedCount + }; + } + + function objectRowsCollectDimensions(data) { + var firstIndex = 0; + var obj; + + while (firstIndex < data.length && !(obj = data[firstIndex++])) {} // jshint ignore: line + + + if (obj) { + var dimensions_1 = []; + each(obj, function (value, key) { + dimensions_1.push(key); + }); + return dimensions_1; + } + } // Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'], + // which is reasonable. But dimension name is duplicated. + // Returns undefined or an array contains only object without null/undefiend or string. + + + function normalizeDimensionsOption(dimensionsDefine) { + if (!dimensionsDefine) { + // The meaning of null/undefined is different from empty array. + return; + } + + var nameMap = createHashMap(); + return map(dimensionsDefine, function (rawItem, index) { + rawItem = isObject(rawItem) ? rawItem : { + name: rawItem + }; // Other fields will be discarded. + + var item = { + name: rawItem.name, + displayName: rawItem.displayName, + type: rawItem.type + }; // User can set null in dimensions. + // We dont auto specify name, othewise a given name may + // cause it be refered unexpectedly. + + if (item.name == null) { + return item; + } // Also consider number form like 2012. + + + item.name += ''; // User may also specify displayName. + // displayName will always exists except user not + // specified or dim name is not specified or detected. + // (A auto generated dim name will not be used as + // displayName). + + if (item.displayName == null) { + item.displayName = item.name; + } + + var exist = nameMap.get(item.name); + + if (!exist) { + nameMap.set(item.name, { + count: 1 + }); + } else { + item.name += '-' + exist.count++; + } + + return item; + }); + } + + function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) { + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + for (var i = 0; i < data.length && i < maxLoop; i++) { + cb(data[i] ? data[i][0] : null, i); + } + } else { + var value0 = data[0] || []; + + for (var i = 0; i < value0.length && i < maxLoop; i++) { + cb(value0[i], i); + } + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var _a, _b, _c; // TODO + var providerMethods; + var mountMethods; + /** + * If normal array used, mutable chunk size is supported. + * If typed array used, chunk size must be fixed. + */ + + var DefaultDataProvider = + /** @class */ + function () { + function DefaultDataProvider(sourceParam, dimSize) { + // let source: Source; + var source = !isSourceInstance(sourceParam) ? createSourceFromSeriesDataOption(sourceParam) : sourceParam; // declare source is Source; + + this._source = source; + var data = this._data = source.data; // Typed array. TODO IE10+? + + if (source.sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if ("development" !== 'production') { + if (dimSize == null) { + throw new Error('Typed array data must specify dimension size'); + } + } + + this._offset = 0; + this._dimSize = dimSize; + this._data = data; + } + + mountMethods(this, data, source); + } + + DefaultDataProvider.prototype.getSource = function () { + return this._source; + }; + + DefaultDataProvider.prototype.count = function () { + return 0; + }; + + DefaultDataProvider.prototype.getItem = function (idx, out) { + return; + }; + + DefaultDataProvider.prototype.appendData = function (newData) {}; + + DefaultDataProvider.prototype.clean = function () {}; + + DefaultDataProvider.protoInitialize = function () { + // PENDING: To avoid potential incompat (e.g., prototype + // is visited somewhere), still init them on prototype. + var proto = DefaultDataProvider.prototype; + proto.pure = false; + proto.persistent = true; + }(); + + DefaultDataProvider.internalField = function () { + var _a; + + mountMethods = function (provider, data, source) { + var sourceFormat = source.sourceFormat; + var seriesLayoutBy = source.seriesLayoutBy; + var startIndex = source.startIndex; + var dimsDef = source.dimensionsDefine; + var methods = providerMethods[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(methods, 'Invalide sourceFormat: ' + sourceFormat); + } + + extend(provider, methods); + + if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + provider.getItem = getItemForTypedArray; + provider.count = countForTypedArray; + provider.fillStorage = fillStorageForTypedArray; + } else { + var rawItemGetter = getRawSourceItemGetter(sourceFormat, seriesLayoutBy); + provider.getItem = bind(rawItemGetter, null, data, startIndex, dimsDef); + var rawCounter = getRawSourceDataCounter(sourceFormat, seriesLayoutBy); + provider.count = bind(rawCounter, null, data, startIndex, dimsDef); + } + }; + + var getItemForTypedArray = function (idx, out) { + idx = idx - this._offset; + out = out || []; + var data = this._data; + var dimSize = this._dimSize; + var offset = dimSize * idx; + + for (var i = 0; i < dimSize; i++) { + out[i] = data[offset + i]; + } + + return out; + }; + + var fillStorageForTypedArray = function (start, end, storage, extent) { + var data = this._data; + var dimSize = this._dimSize; + + for (var dim = 0; dim < dimSize; dim++) { + var dimExtent = extent[dim]; + var min = dimExtent[0] == null ? Infinity : dimExtent[0]; + var max = dimExtent[1] == null ? -Infinity : dimExtent[1]; + var count = end - start; + var arr = storage[dim]; + + for (var i = 0; i < count; i++) { + // appendData with TypedArray will always do replace in provider. + var val = data[i * dimSize + dim]; + arr[start + i] = val; + val < min && (min = val); + val > max && (max = val); + } + + dimExtent[0] = min; + dimExtent[1] = max; + } + }; + + var countForTypedArray = function () { + return this._data ? this._data.length / this._dimSize : 0; + }; + + providerMethods = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = { + pure: true, + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = { + pure: true, + appendData: function () { + throw new Error('Do not support appendData when set seriesLayoutBy: "row".'); + } + }, _a[SOURCE_FORMAT_OBJECT_ROWS] = { + pure: true, + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_KEYED_COLUMNS] = { + pure: true, + appendData: function (newData) { + var data = this._data; + each(newData, function (newCol, key) { + var oldCol = data[key] || (data[key] = []); + + for (var i = 0; i < (newCol || []).length; i++) { + oldCol.push(newCol[i]); + } + }); + } + }, _a[SOURCE_FORMAT_ORIGINAL] = { + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_TYPED_ARRAY] = { + persistent: false, + pure: true, + appendData: function (newData) { + if ("development" !== 'production') { + assert(isTypedArray(newData), 'Added data must be TypedArray if data in initialization is TypedArray'); + } + + this._data = newData; + }, + // Clean self if data is already used. + clean: function () { + // PENDING + this._offset += this.count(); + this._data = null; + } + }, _a); + + function appendDataSimply(newData) { + for (var i = 0; i < newData.length; i++) { + this._data.push(newData[i]); + } + } + }(); + + return DefaultDataProvider; + }(); + + var getItemSimply = function (rawData, startIndex, dimsDef, idx) { + return rawData[idx]; + }; + + var rawSourceItemGetterMap = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef, idx) { + return rawData[idx + startIndex]; + }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef, idx) { + idx += startIndex; + var item = []; + var data = rawData; + + for (var i = 0; i < data.length; i++) { + var row = data[i]; + item.push(row ? row[idx] : null); + } + + return item; + }, _a[SOURCE_FORMAT_OBJECT_ROWS] = getItemSimply, _a[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef, idx) { + var item = []; + + for (var i = 0; i < dimsDef.length; i++) { + var dimName = dimsDef[i].name; + + if ("development" !== 'production') { + if (dimName == null) { + throw new Error(); + } + } + + var col = rawData[dimName]; + item.push(col ? col[idx] : null); + } + + return item; + }, _a[SOURCE_FORMAT_ORIGINAL] = getItemSimply, _a); + function getRawSourceItemGetter(sourceFormat, seriesLayoutBy) { + var method = rawSourceItemGetterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(method, 'Do not suppport get item on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + } + + return method; + } + + var countSimply = function (rawData, startIndex, dimsDef) { + return rawData.length; + }; + + var rawSourceDataCounterMap = (_b = {}, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef) { + return Math.max(0, rawData.length - startIndex); + }, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef) { + var row = rawData[0]; + return row ? Math.max(0, row.length - startIndex) : 0; + }, _b[SOURCE_FORMAT_OBJECT_ROWS] = countSimply, _b[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef) { + var dimName = dimsDef[0].name; + + if ("development" !== 'production') { + if (dimName == null) { + throw new Error(); + } + } + + var col = rawData[dimName]; + return col ? col.length : 0; + }, _b[SOURCE_FORMAT_ORIGINAL] = countSimply, _b); + function getRawSourceDataCounter(sourceFormat, seriesLayoutBy) { + var method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(method, 'Do not suppport count on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + } + + return method; + } + + var getRawValueSimply = function (dataItem, dimIndex, dimName) { + return dimIndex != null ? dataItem[dimIndex] : dataItem; + }; + + var rawSourceValueGetterMap = (_c = {}, _c[SOURCE_FORMAT_ARRAY_ROWS] = getRawValueSimply, _c[SOURCE_FORMAT_OBJECT_ROWS] = function (dataItem, dimIndex, dimName) { + return dimIndex != null ? dataItem[dimName] : dataItem; + }, _c[SOURCE_FORMAT_KEYED_COLUMNS] = getRawValueSimply, _c[SOURCE_FORMAT_ORIGINAL] = function (dataItem, dimIndex, dimName) { + // FIXME: In some case (markpoint in geo (geo-map.html)), + // dataItem is {coord: [...]} + var value = getDataItemValue(dataItem); + return dimIndex == null || !(value instanceof Array) ? value : value[dimIndex]; + }, _c[SOURCE_FORMAT_TYPED_ARRAY] = getRawValueSimply, _c); + function getRawSourceValueGetter(sourceFormat) { + var method = rawSourceValueGetterMap[sourceFormat]; + + if ("development" !== 'production') { + assert(method, 'Do not suppport get value on "' + sourceFormat + '".'); + } + + return method; + } + + function getMethodMapKey(sourceFormat, seriesLayoutBy) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + '_' + seriesLayoutBy : sourceFormat; + } // ??? FIXME can these logic be more neat: getRawValue, getRawDataItem, + // Consider persistent. + // Caution: why use raw value to display on label or tooltip? + // A reason is to avoid format. For example time value we do not know + // how to format is expected. More over, if stack is used, calculated + // value may be 0.91000000001, which have brings trouble to display. + // TODO: consider how to treat null/undefined/NaN when display? + + + function retrieveRawValue(data, dataIndex, dim // If dimIndex is null/undefined, return OptionDataItem. + // Otherwise, return OptionDataValue. + ) { + if (!data) { + return; + } // Consider data may be not persistent. + + + var dataItem = data.getRawDataItem(dataIndex); + + if (dataItem == null) { + return; + } + + var sourceFormat = data.getProvider().getSource().sourceFormat; + var dimName; + var dimIndex; + var dimInfo = data.getDimensionInfo(dim); + + if (dimInfo) { + dimName = dimInfo.name; + dimIndex = dimInfo.index; + } + + return getRawSourceValueGetter(sourceFormat)(dataItem, dimIndex, dimName); + } + + var DIMENSION_LABEL_REG = /\{@(.+?)\}/g; + + var DataFormatMixin = + /** @class */ + function () { + function DataFormatMixin() {} + /** + * Get params for formatter + */ + + + DataFormatMixin.prototype.getDataParams = function (dataIndex, dataType) { + var data = this.getData(dataType); + var rawValue = this.getRawValue(dataIndex, dataType); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex); + var itemOpt = data.getRawDataItem(dataIndex); + var style = data.getItemVisual(dataIndex, 'style'); + var color = style && style[data.getItemVisual(dataIndex, 'drawType') || 'fill']; + var borderColor = style && style.stroke; + var mainType = this.mainType; + var isSeries = mainType === 'series'; + var userOutput = data.userOutput; + return { + componentType: mainType, + componentSubType: this.subType, + componentIndex: this.componentIndex, + seriesType: isSeries ? this.subType : null, + seriesIndex: this.seriesIndex, + seriesId: isSeries ? this.id : null, + seriesName: isSeries ? this.name : null, + name: name, + dataIndex: rawDataIndex, + data: itemOpt, + dataType: dataType, + value: rawValue, + color: color, + borderColor: borderColor, + dimensionNames: userOutput ? userOutput.dimensionNames : null, + encode: userOutput ? userOutput.encode : null, + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ['seriesName', 'name', 'value'] + }; + }; + /** + * Format label + * @param dataIndex + * @param status 'normal' by default + * @param dataType + * @param labelDimIndex Only used in some chart that + * use formatter in different dimensions, like radar. + * @param formatter Formatter given outside. + * @return return null/undefined if no formatter + */ + + + DataFormatMixin.prototype.getFormattedLabel = function (dataIndex, status, dataType, labelDimIndex, formatter, extendParams) { + status = status || 'normal'; + var data = this.getData(dataType); + var params = this.getDataParams(dataIndex, dataType); + + if (extendParams) { + params.value = extendParams.interpolatedValue; + } + + if (labelDimIndex != null && isArray(params.value)) { + params.value = params.value[labelDimIndex]; + } + + if (!formatter) { + var itemModel = data.getItemModel(dataIndex); // @ts-ignore + + formatter = itemModel.get(status === 'normal' ? ['label', 'formatter'] : [status, 'label', 'formatter']); + } + + if (typeof formatter === 'function') { + params.status = status; + params.dimensionIndex = labelDimIndex; + return formatter(params); + } else if (typeof formatter === 'string') { + var str = formatTpl(formatter, params); // Support 'aaa{@[3]}bbb{@product}ccc'. + // Do not support '}' in dim name util have to. + + return str.replace(DIMENSION_LABEL_REG, function (origin, dimStr) { + var len = dimStr.length; + var dimLoose = dimStr.charAt(0) === '[' && dimStr.charAt(len - 1) === ']' ? +dimStr.slice(1, len - 1) // Also support: '[]' => 0 + : dimStr; + var val = retrieveRawValue(data, dataIndex, dimLoose); + + if (extendParams && isArray(extendParams.interpolatedValue)) { + var dimInfo = data.getDimensionInfo(dimLoose); + + if (dimInfo) { + val = extendParams.interpolatedValue[dimInfo.index]; + } + } + + return val != null ? val + '' : ''; + }); + } + }; + /** + * Get raw value in option + */ + + + DataFormatMixin.prototype.getRawValue = function (idx, dataType) { + return retrieveRawValue(this.getData(dataType), idx); + }; + /** + * Should be implemented. + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + * @param {string} [dataType] + */ + + + DataFormatMixin.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + // Empty function + return; + }; + + return DataFormatMixin; + }(); + // but guess little chance has been used outside. Do we need to backward + // compat it? + // type TooltipFormatResultLegacyObject = { + // // `html` means the markup language text, either in 'html' or 'richText'. + // // The name `html` is not appropriate becuase in 'richText' it is not a HTML + // // string. But still support it for backward compat. + // html: string; + // markers: Dictionary; + // }; + + /** + * For backward compat, normalize the return from `formatTooltip`. + */ + + function normalizeTooltipFormatResult(result // markersExisting: Dictionary + ) { + var markupText; // let markers: Dictionary; + + var markupFragment; + + if (isObject(result)) { + if (result.type) { + markupFragment = result; + } else { + if ("development" !== 'production') { + console.warn('The return type of `formatTooltip` is not supported: ' + makePrintable(result)); + } + } // else { + // markupText = (result as TooltipFormatResultLegacyObject).html; + // markers = (result as TooltipFormatResultLegacyObject).markers; + // if (markersExisting) { + // markers = zrUtil.merge(markersExisting, markers); + // } + // } + + } else { + markupText = result; + } + + return { + markupText: markupText, + // markers: markers || markersExisting, + markupFragment: markupFragment + }; + } + + /** + * @param {Object} define + * @return See the return of `createTask`. + */ + + function createTask(define) { + return new Task(define); + } + + var Task = + /** @class */ + function () { + function Task(define) { + define = define || {}; + this._reset = define.reset; + this._plan = define.plan; + this._count = define.count; + this._onDirty = define.onDirty; + this._dirty = true; + } + /** + * @param step Specified step. + * @param skip Skip customer perform call. + * @param modBy Sampling window size. + * @param modDataCount Sampling count. + * @return whether unfinished. + */ + + + Task.prototype.perform = function (performArgs) { + var upTask = this._upstream; + var skip = performArgs && performArgs.skip; // TODO some refactor. + // Pull data. Must pull data each time, because context.data + // may be updated by Series.setData. + + if (this._dirty && upTask) { + var context = this.context; + context.data = context.outputData = upTask.context.outputData; + } + + if (this.__pipeline) { + this.__pipeline.currentTask = this; + } + + var planResult; + + if (this._plan && !skip) { + planResult = this._plan(this.context); + } // Support sharding by mod, which changes the render sequence and makes the rendered graphic + // elements uniformed distributed when progress, especially when moving or zooming. + + + var lastModBy = normalizeModBy(this._modBy); + var lastModDataCount = this._modDataCount || 0; + var modBy = normalizeModBy(performArgs && performArgs.modBy); + var modDataCount = performArgs && performArgs.modDataCount || 0; + + if (lastModBy !== modBy || lastModDataCount !== modDataCount) { + planResult = 'reset'; + } + + function normalizeModBy(val) { + !(val >= 1) && (val = 1); // jshint ignore:line + + return val; + } + + var forceFirstProgress; + + if (this._dirty || planResult === 'reset') { + this._dirty = false; + forceFirstProgress = this._doReset(skip); + } + + this._modBy = modBy; + this._modDataCount = modDataCount; + var step = performArgs && performArgs.step; + + if (upTask) { + if ("development" !== 'production') { + assert(upTask._outputDueEnd != null); + } + + this._dueEnd = upTask._outputDueEnd; + } // DataTask or overallTask + else { + if ("development" !== 'production') { + assert(!this._progress || this._count); + } + + this._dueEnd = this._count ? this._count(this.context) : Infinity; + } // Note: Stubs, that its host overall task let it has progress, has progress. + // If no progress, pass index from upstream to downstream each time plan called. + + + if (this._progress) { + var start = this._dueIndex; + var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd); + + if (!skip && (forceFirstProgress || start < end)) { + var progress = this._progress; + + if (isArray(progress)) { + for (var i = 0; i < progress.length; i++) { + this._doProgress(progress[i], start, end, modBy, modDataCount); + } + } else { + this._doProgress(progress, start, end, modBy, modDataCount); + } + } + + this._dueIndex = end; // If no `outputDueEnd`, assume that output data and + // input data is the same, so use `dueIndex` as `outputDueEnd`. + + var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end; + + if ("development" !== 'production') { + // ??? Can not rollback. + assert(outputDueEnd >= this._outputDueEnd); + } + + this._outputDueEnd = outputDueEnd; + } else { + // (1) Some overall task has no progress. + // (2) Stubs, that its host overall task do not let it has progress, has no progress. + // This should always be performed so it can be passed to downstream. + this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd; + } + + return this.unfinished(); + }; + + Task.prototype.dirty = function () { + this._dirty = true; + this._onDirty && this._onDirty(this.context); + }; + + Task.prototype._doProgress = function (progress, start, end, modBy, modDataCount) { + iterator.reset(start, end, modBy, modDataCount); + this._callingProgress = progress; + + this._callingProgress({ + start: start, + end: end, + count: end - start, + next: iterator.next + }, this.context); + }; + + Task.prototype._doReset = function (skip) { + this._dueIndex = this._outputDueEnd = this._dueEnd = 0; + this._settedOutputEnd = null; + var progress; + var forceFirstProgress; + + if (!skip && this._reset) { + progress = this._reset(this.context); + + if (progress && progress.progress) { + forceFirstProgress = progress.forceFirstProgress; + progress = progress.progress; + } // To simplify no progress checking, array must has item. + + + if (isArray(progress) && !progress.length) { + progress = null; + } + } + + this._progress = progress; + this._modBy = this._modDataCount = null; + var downstream = this._downstream; + downstream && downstream.dirty(); + return forceFirstProgress; + }; + + Task.prototype.unfinished = function () { + return this._progress && this._dueIndex < this._dueEnd; + }; + /** + * @param downTask The downstream task. + * @return The downstream task. + */ + + + Task.prototype.pipe = function (downTask) { + if ("development" !== 'production') { + assert(downTask && !downTask._disposed && downTask !== this); + } // If already downstream, do not dirty downTask. + + + if (this._downstream !== downTask || this._dirty) { + this._downstream = downTask; + downTask._upstream = this; + downTask.dirty(); + } + }; + + Task.prototype.dispose = function () { + if (this._disposed) { + return; + } + + this._upstream && (this._upstream._downstream = null); + this._downstream && (this._downstream._upstream = null); + this._dirty = false; + this._disposed = true; + }; + + Task.prototype.getUpstream = function () { + return this._upstream; + }; + + Task.prototype.getDownstream = function () { + return this._downstream; + }; + + Task.prototype.setOutputEnd = function (end) { + // This only happend in dataTask, dataZoom, map, currently. + // where dataZoom do not set end each time, but only set + // when reset. So we should record the setted end, in case + // that the stub of dataZoom perform again and earse the + // setted end by upstream. + this._outputDueEnd = this._settedOutputEnd = end; + }; + + return Task; + }(); + + var iterator = function () { + var end; + var current; + var modBy; + var modDataCount; + var winCount; + var it = { + reset: function (s, e, sStep, sCount) { + current = s; + end = e; + modBy = sStep; + modDataCount = sCount; + winCount = Math.ceil(modDataCount / modBy); + it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext; + } + }; + return it; + + function sequentialNext() { + return current < end ? current++ : null; + } + + function modNext() { + var dataIndex = current % winCount * modBy + Math.ceil(current / winCount); + var result = current >= end ? null : dataIndex < modDataCount ? dataIndex // If modDataCount is smaller than data.count() (consider `appendData` case), + // Use normal linear rendering mode. + : current; + current++; + return result; + } + }(); /////////////////////////////////////////////////////////// + // For stream debug (Should be commented out after used!) + // @usage: printTask(this, 'begin'); + // @usage: printTask(this, null, {someExtraProp}); + // @usage: Use `__idxInPipeline` as conditional breakpiont. + // + // window.printTask = function (task: any, prefix: string, extra: { [key: string]: unknown }): void { + // window.ecTaskUID == null && (window.ecTaskUID = 0); + // task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`); + // task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`); + // let props = []; + // if (task.__pipeline) { + // let val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`; + // props.push({text: '__idxInPipeline/total', value: val}); + // } else { + // let stubCount = 0; + // task.agentStubMap.each(() => stubCount++); + // props.push({text: 'idx', value: `overall (stubs: ${stubCount})`}); + // } + // props.push({text: 'uid', value: task.uidDebug}); + // if (task.__pipeline) { + // props.push({text: 'pipelineId', value: task.__pipeline.id}); + // task.agent && props.push( + // {text: 'stubFor', value: task.agent.uidDebug} + // ); + // } + // props.push( + // {text: 'dirty', value: task._dirty}, + // {text: 'dueIndex', value: task._dueIndex}, + // {text: 'dueEnd', value: task._dueEnd}, + // {text: 'outputDueEnd', value: task._outputDueEnd} + // ); + // if (extra) { + // Object.keys(extra).forEach(key => { + // props.push({text: key, value: extra[key]}); + // }); + // } + // let args = ['color: blue']; + // let msg = `%c[${prefix || 'T'}] %c` + props.map(item => ( + // args.push('color: green', 'color: red'), + // `${item.text}: %c${item.value}` + // )).join('%c, '); + // console.log.apply(console, [msg].concat(args)); + // // console.log(this); + // }; + // window.printPipeline = function (task: any, prefix: string) { + // const pipeline = task.__pipeline; + // let currTask = pipeline.head; + // while (currTask) { + // window.printTask(currTask, prefix); + // currTask = currTask._downstream; + // } + // }; + // window.showChain = function (chainHeadTask) { + // var chain = []; + // var task = chainHeadTask; + // while (task) { + // chain.push({ + // task: task, + // up: task._upstream, + // down: task._downstream, + // idxInPipeline: task.__idxInPipeline + // }); + // task = task._downstream; + // } + // return chain; + // }; + // window.findTaskInChain = function (task, chainHeadTask) { + // let chain = window.showChain(chainHeadTask); + // let result = []; + // for (let i = 0; i < chain.length; i++) { + // let chainItem = chain[i]; + // if (chainItem.task === task) { + // result.push(i); + // } + // } + // return result; + // }; + // window.printChainAEachInChainB = function (chainHeadTaskA, chainHeadTaskB) { + // let chainA = window.showChain(chainHeadTaskA); + // for (let i = 0; i < chainA.length; i++) { + // console.log('chainAIdx:', i, 'inChainB:', window.findTaskInChain(chainA[i].task, chainHeadTaskB)); + // } + // }; + + /** + * Convert raw the value in to inner value in List. + * + * [Performance sensitive] + * + * [Caution]: this is the key logic of user value parser. + * For backward compatibiliy, do not modify it until have to! + */ + + function parseDataValue(value, // For high performance, do not omit the second param. + opt) { + // Performance sensitive. + var dimType = opt && opt.type; + + if (dimType === 'ordinal') { + // If given value is a category string + var ordinalMeta = opt && opt.ordinalMeta; + return ordinalMeta ? ordinalMeta.parseAndCollect(value) : value; + } + + if (dimType === 'time' // spead up when using timestamp + && typeof value !== 'number' && value != null && value !== '-') { + value = +parseDate(value); + } // dimType defaults 'number'. + // If dimType is not ordinal and value is null or undefined or NaN or '-', + // parse to NaN. + // number-like string (like ' 123 ') can be converted to a number. + // where null/undefined or other string will be converted to NaN. + + + return value == null || value === '' ? NaN // If string (like '-'), using '+' parse to NaN + // If object, also parse to NaN + : +value; + } + var valueParserMap = createHashMap({ + 'number': function (val) { + // Do not use `numericToNumber` here. We have by defualt `numericToNumber`. + // Here the number parser can have loose rule: + // enable to cut suffix: "120px" => 120, "14%" => 14. + return parseFloat(val); + }, + 'time': function (val) { + // return timestamp. + return +parseDate(val); + }, + 'trim': function (val) { + return typeof val === 'string' ? trim(val) : val; + } + }); + function getRawValueParser(type) { + return valueParserMap.get(type); + } + var ORDER_COMPARISON_OP_MAP = { + lt: function (lval, rval) { + return lval < rval; + }, + lte: function (lval, rval) { + return lval <= rval; + }, + gt: function (lval, rval) { + return lval > rval; + }, + gte: function (lval, rval) { + return lval >= rval; + } + }; + + var FilterOrderComparator = + /** @class */ + function () { + function FilterOrderComparator(op, rval) { + if (typeof rval !== 'number') { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = 'rvalue of "<", ">", "<=", ">=" can only be number in filter.'; + } + + throwError(errMsg); + } + + this._opFn = ORDER_COMPARISON_OP_MAP[op]; + this._rvalFloat = numericToNumber(rval); + } // Performance sensitive. + + + FilterOrderComparator.prototype.evaluate = function (lval) { + // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. + return typeof lval === 'number' ? this._opFn(lval, this._rvalFloat) : this._opFn(numericToNumber(lval), this._rvalFloat); + }; + + return FilterOrderComparator; + }(); + + var SortOrderComparator = + /** @class */ + function () { + /** + * @param order by defualt: 'asc' + * @param incomparable by defualt: Always on the tail. + * That is, if 'asc' => 'max', if 'desc' => 'min' + * See the definition of "incomparable" in [SORT_COMPARISON_RULE] + */ + function SortOrderComparator(order, incomparable) { + var isDesc = order === 'desc'; + this._resultLT = isDesc ? 1 : -1; + + if (incomparable == null) { + incomparable = isDesc ? 'min' : 'max'; + } + + this._incomparable = incomparable === 'min' ? -Infinity : Infinity; + } // See [SORT_COMPARISON_RULE]. + // Performance sensitive. + + + SortOrderComparator.prototype.evaluate = function (lval, rval) { + // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. + var lvalTypeof = typeof lval; + var rvalTypeof = typeof rval; + var lvalFloat = lvalTypeof === 'number' ? lval : numericToNumber(lval); + var rvalFloat = rvalTypeof === 'number' ? rval : numericToNumber(rval); + var lvalNotNumeric = isNaN(lvalFloat); + var rvalNotNumeric = isNaN(rvalFloat); + + if (lvalNotNumeric) { + lvalFloat = this._incomparable; + } + + if (rvalNotNumeric) { + rvalFloat = this._incomparable; + } + + if (lvalNotNumeric && rvalNotNumeric) { + var lvalIsStr = lvalTypeof === 'string'; + var rvalIsStr = rvalTypeof === 'string'; + + if (lvalIsStr) { + lvalFloat = rvalIsStr ? lval : 0; + } + + if (rvalIsStr) { + rvalFloat = lvalIsStr ? rval : 0; + } + } + + return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0; + }; + + return SortOrderComparator; + }(); + + var FilterEqualityComparator = + /** @class */ + function () { + function FilterEqualityComparator(isEq, rval) { + this._rval = rval; + this._isEQ = isEq; + this._rvalTypeof = typeof rval; + this._rvalFloat = numericToNumber(rval); + } // Performance sensitive. + + + FilterEqualityComparator.prototype.evaluate = function (lval) { + var eqResult = lval === this._rval; + + if (!eqResult) { + var lvalTypeof = typeof lval; + + if (lvalTypeof !== this._rvalTypeof && (lvalTypeof === 'number' || this._rvalTypeof === 'number')) { + eqResult = numericToNumber(lval) === this._rvalFloat; + } + } + + return this._isEQ ? eqResult : !eqResult; + }; + + return FilterEqualityComparator; + }(); + /** + * [FILTER_COMPARISON_RULE] + * `lt`|`lte`|`gt`|`gte`: + * + rval must be a number. And lval will be converted to number (`numericToNumber`) to compare. + * `eq`: + * + If same type, compare with `===`. + * + If there is one number, convert to number (`numericToNumber`) to compare. + * + Else return `false`. + * `ne`: + * + Not `eq`. + * + * + * [SORT_COMPARISON_RULE] + * All the values are grouped into three categories: + * + "numeric" (number and numeric string) + * + "non-numeric-string" (string that excluding numeric string) + * + "others" + * "numeric" vs "numeric": values are ordered by number order. + * "non-numeric-string" vs "non-numeric-string": values are ordered by ES spec (#sec-abstract-relational-comparison). + * "others" vs "others": do not change order (always return 0). + * "numeric" vs "non-numeric-string": "non-numeric-string" is treated as "incomparable". + * "number" vs "others": "others" is treated as "incomparable". + * "non-numeric-string" vs "others": "others" is treated as "incomparable". + * "incomparable" will be seen as -Infinity or Infinity (depends on the settings). + * MEMO: + * non-numeric string sort make sence when need to put the items with the same tag together. + * But if we support string sort, we still need to avoid the misleading like `'2' > '12'`, + * So we treat "numeric-string" sorted by number order rather than string comparison. + * + * + * [CHECK_LIST_OF_THE_RULE_DESIGN] + * + Do not support string comparison until required. And also need to + * void the misleading of "2" > "12". + * + Should avoid the misleading case: + * `" 22 " gte "22"` is `true` but `" 22 " eq "22"` is `false`. + * + JS bad case should be avoided: null <= 0, [] <= 0, ' ' <= 0, ... + * + Only "numeric" can be converted to comparable number, otherwise converted to NaN. + * See `util/number.ts#numericToNumber`. + * + * @return If `op` is not `RelationalOperator`, return null; + */ + + + function createFilterComparator(op, rval) { + return op === 'eq' || op === 'ne' ? new FilterEqualityComparator(op === 'eq', rval) : hasOwn(ORDER_COMPARISON_OP_MAP, op) ? new FilterOrderComparator(op, rval) : null; + } + + /** + * TODO: disable writable. + * This structure will be exposed to users. + */ + + var ExternalSource = + /** @class */ + function () { + function ExternalSource() {} + + ExternalSource.prototype.getRawData = function () { + // Only built-in transform available. + throw new Error('not supported'); + }; + + ExternalSource.prototype.getRawDataItem = function (dataIndex) { + // Only built-in transform available. + throw new Error('not supported'); + }; + + ExternalSource.prototype.cloneRawData = function () { + return; + }; + /** + * @return If dimension not found, return null/undefined. + */ + + + ExternalSource.prototype.getDimensionInfo = function (dim) { + return; + }; + /** + * dimensions defined if and only if either: + * (a) dataset.dimensions are declared. + * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`). + * If dimensions are defined, `dimensionInfoAll` is corresponding to + * the defined dimensions. + * Otherwise, `dimensionInfoAll` is determined by data columns. + * @return Always return an array (even empty array). + */ + + + ExternalSource.prototype.cloneAllDimensionInfo = function () { + return; + }; + + ExternalSource.prototype.count = function () { + return; + }; + /** + * Only support by dimension index. + * No need to support by dimension name in transform function, + * becuase transform function is not case-specific, no need to use name literally. + */ + + + ExternalSource.prototype.retrieveValue = function (dataIndex, dimIndex) { + return; + }; + + ExternalSource.prototype.retrieveValueFromItem = function (dataItem, dimIndex) { + return; + }; + + ExternalSource.prototype.convertValue = function (rawVal, dimInfo) { + return parseDataValue(rawVal, dimInfo); + }; + + return ExternalSource; + }(); + + function createExternalSource(internalSource, externalTransform) { + var extSource = new ExternalSource(); + var data = internalSource.data; + var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat; + var sourceHeaderCount = internalSource.startIndex; + var errMsg = ''; + + if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) { + // For the logic simplicity in transformer, only 'culumn' is + // supported in data transform. Otherwise, the `dimensionsDefine` + // might be detected by 'row', which probably confuses users. + if ("development" !== 'production') { + errMsg = '`seriesLayoutBy` of upstream dataset can only be "column" in data transform.'; + } + + throwError(errMsg); + } // [MEMO] + // Create a new dimensions structure for exposing. + // Do not expose all dimension info to users directly. + // Becuase the dimension is probably auto detected from data and not might reliable. + // Should not lead the transformers to think that is relialbe and return it. + // See [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. + + + var dimensions = []; + var dimsByName = {}; + var dimsDef = internalSource.dimensionsDefine; + + if (dimsDef) { + each(dimsDef, function (dimDef, idx) { + var name = dimDef.name; + var dimDefExt = { + index: idx, + name: name, + displayName: dimDef.displayName + }; + dimensions.push(dimDefExt); // Users probably not sepcify dimension name. For simplicity, data transform + // do not generate dimension name. + + if (name != null) { + // Dimension name should not be duplicated. + // For simplicity, data transform forbid name duplication, do not generate + // new name like module `completeDimensions.ts` did, but just tell users. + var errMsg_1 = ''; + + if (hasOwn(dimsByName, name)) { + if ("development" !== 'production') { + errMsg_1 = 'dimension name "' + name + '" duplicated.'; + } + + throwError(errMsg_1); + } + + dimsByName[name] = dimDefExt; + } + }); + } // If dimension definitions are not defined and can not be detected. + // e.g., pure data `[[11, 22], ...]`. + else { + for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) { + // Do not generete name or anything others. The consequence process in + // `transform` or `series` probably have there own name generation strategry. + dimensions.push({ + index: i + }); + } + } // Implement public methods: + + + var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + + if (externalTransform.__isBuiltIn) { + extSource.getRawDataItem = function (dataIndex) { + return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + }; + + extSource.getRawData = bind(getRawData, null, internalSource); + } + + extSource.cloneRawData = bind(cloneRawData, null, internalSource); + var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + extSource.count = bind(rawCounter, null, data, sourceHeaderCount, dimensions); + var rawValueGetter = getRawSourceValueGetter(sourceFormat); + + extSource.retrieveValue = function (dataIndex, dimIndex) { + var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + return retrieveValueFromItem(rawItem, dimIndex); + }; + + var retrieveValueFromItem = extSource.retrieveValueFromItem = function (dataItem, dimIndex) { + if (dataItem == null) { + return; + } + + var dimDef = dimensions[dimIndex]; // When `dimIndex` is `null`, `rawValueGetter` return the whole item. + + if (dimDef) { + return rawValueGetter(dataItem, dimIndex, dimDef.name); + } + }; + + extSource.getDimensionInfo = bind(getDimensionInfo, null, dimensions, dimsByName); + extSource.cloneAllDimensionInfo = bind(cloneAllDimensionInfo, null, dimensions); + return extSource; + } + + function getRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`getRawData` is not supported in source format ' + sourceFormat; + } + + throwError(errMsg); + } + + return upstream.data; + } + + function cloneRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + var data = upstream.data; + + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`cloneRawData` is not supported in source format ' + sourceFormat; + } + + throwError(errMsg); + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var result = []; + + for (var i = 0, len = data.length; i < len; i++) { + // Not strictly clone for performance + result.push(data[i].slice()); + } + + return result; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var result = []; + + for (var i = 0, len = data.length; i < len; i++) { + // Not strictly clone for performance + result.push(extend({}, data[i])); + } + + return result; + } + } + + function getDimensionInfo(dimensions, dimsByName, dim) { + if (dim == null) { + return; + } // Keep the same logic as `List::getDimension` did. + + + if (typeof dim === 'number' // If being a number-like string but not being defined a dimension name. + || !isNaN(dim) && !hasOwn(dimsByName, dim)) { + return dimensions[dim]; + } else if (hasOwn(dimsByName, dim)) { + return dimsByName[dim]; + } + } + + function cloneAllDimensionInfo(dimensions) { + return clone(dimensions); + } + + var externalTransformMap = createHashMap(); + function registerExternalTransform(externalTransform) { + externalTransform = clone(externalTransform); + var type = externalTransform.type; + var errMsg = ''; + + if (!type) { + if ("development" !== 'production') { + errMsg = 'Must have a `type` when `registerTransform`.'; + } + + throwError(errMsg); + } + + var typeParsed = type.split(':'); + + if (typeParsed.length !== 2) { + if ("development" !== 'production') { + errMsg = 'Name must include namespace like "ns:regression".'; + } + + throwError(errMsg); + } // Namespace 'echarts:xxx' is official namespace, where the transforms should + // be called directly via 'xxx' rather than 'echarts:xxx'. + + + var isBuiltIn = false; + + if (typeParsed[0] === 'echarts') { + type = typeParsed[1]; + isBuiltIn = true; + } + + externalTransform.__isBuiltIn = isBuiltIn; + externalTransformMap.set(type, externalTransform); + } + function applyDataTransform(rawTransOption, sourceList, infoForPrint) { + var pipedTransOption = normalizeToArray(rawTransOption); + var pipeLen = pipedTransOption.length; + var errMsg = ''; + + if (!pipeLen) { + if ("development" !== 'production') { + errMsg = 'If `transform` declared, it should at least contain one transform.'; + } + + throwError(errMsg); + } + + for (var i = 0, len = pipeLen; i < len; i++) { + var transOption = pipedTransOption[i]; + sourceList = applySingleDataTransform(transOption, sourceList, infoForPrint, pipeLen === 1 ? null : i); // piped transform only support single input, except the fist one. + // piped transform only support single output, except the last one. + + if (i !== len - 1) { + sourceList.length = Math.max(sourceList.length, 1); + } + } + + return sourceList; + } + + function applySingleDataTransform(transOption, upSourceList, infoForPrint, // If `pipeIndex` is null/undefined, no piped transform. + pipeIndex) { + var errMsg = ''; + + if (!upSourceList.length) { + if ("development" !== 'production') { + errMsg = 'Must have at least one upstream dataset.'; + } + + throwError(errMsg); + } + + if (!isObject(transOption)) { + if ("development" !== 'production') { + errMsg = 'transform declaration must be an object rather than ' + typeof transOption + '.'; + } + + throwError(errMsg); + } + + var transType = transOption.type; + var externalTransform = externalTransformMap.get(transType); + + if (!externalTransform) { + if ("development" !== 'production') { + errMsg = 'Can not find transform on type "' + transType + '".'; + } + + throwError(errMsg); + } // Prepare source + + + var extUpSourceList = map(upSourceList, function (upSource) { + return createExternalSource(upSource, externalTransform); + }); + var resultList = normalizeToArray(externalTransform.transform({ + upstream: extUpSourceList[0], + upstreamList: extUpSourceList, + config: clone(transOption.config) + })); + + if ("development" !== 'production') { + if (transOption.print) { + var printStrArr = map(resultList, function (extSource) { + var pipeIndexStr = pipeIndex != null ? ' === pipe index: ' + pipeIndex : ''; + return ['=== dataset index: ' + infoForPrint.datasetIndex + pipeIndexStr + ' ===', '- transform result data:', makePrintable(extSource.data), '- transform result dimensions:', makePrintable(extSource.dimensions)].join('\n'); + }).join('\n'); + consoleLog(printStrArr); + } + } + + return map(resultList, function (result, resultIndex) { + var errMsg = ''; + + if (!isObject(result)) { + if ("development" !== 'production') { + errMsg = 'A transform should not return some empty results.'; + } + + throwError(errMsg); + } + + if (!result.data) { + if ("development" !== 'production') { + errMsg = 'Transform result data should be not be null or undefined'; + } + + throwError(errMsg); + } + + var sourceFormat = detectSourceFormat(result.data); + + if (!isSupportedSourceFormat(sourceFormat)) { + if ("development" !== 'production') { + errMsg = 'Transform result data should be array rows or object rows.'; + } + + throwError(errMsg); + } + + var resultMetaRawOption; + var firstUpSource = upSourceList[0]; + /** + * Intuitively, the end users known the content of the original `dataset.source`, + * calucating the transform result in mind. + * Suppose the original `dataset.source` is: + * ```js + * [ + * ['product', '2012', '2013', '2014', '2015'], + * ['AAA', 41.1, 30.4, 65.1, 53.3], + * ['BBB', 86.5, 92.1, 85.7, 83.1], + * ['CCC', 24.1, 67.2, 79.5, 86.4] + * ] + * ``` + * The dimension info have to be detected from the source data. + * Some of the transformers (like filter, sort) will follow the dimension info + * of upstream, while others use new dimensions (like aggregate). + * Transformer can output a field `dimensions` to define the its own output dimensions. + * We also allow transformers to ignore the output `dimensions` field, and + * inherit the upstream dimensions definition. It can reduce the burden of handling + * dimensions in transformers. + * + * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. + */ + + if (firstUpSource && resultIndex === 0 // If transformer returns `dimensions`, it means that the transformer has different + // dimensions definitions. We do not inherit anything from upstream. + && !result.dimensions) { + var startIndex = firstUpSource.startIndex; // We copy the header of upstream to the result becuase: + // (1) The returned data always does not contain header line and can not be used + // as dimension-detection. In this case we can not use "detected dimensions" of + // upstream directly, because it might be detected based on different `seriesLayoutBy`. + // (2) We should support that the series read the upstream source in `seriesLayoutBy: 'row'`. + // So the original detected header should be add to the result, otherwise they can not be read. + + if (startIndex) { + result.data = firstUpSource.data.slice(0, startIndex).concat(result.data); + } + + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: startIndex, + dimensions: firstUpSource.metaRawOption.dimensions + }; + } else { + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: 0, + dimensions: result.dimensions + }; + } + + return createSource(result.data, resultMetaRawOption, null, null); + }); + } + + function isSupportedSourceFormat(sourceFormat) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS; + } + + /** + * [REQUIREMENT_MEMO]: + * (0) `metaRawOption` means `dimensions`/`sourceHeader`/`seriesLayoutBy` in raw option. + * (1) Keep support the feature: `metaRawOption` can be specified both on `series` and + * `root-dataset`. Them on `series` has higher priority. + * (2) Do not support to set `metaRawOption` on a `non-root-dataset`, because it might + * confuse users: whether those props indicate how to visit the upstream source or visit + * the transform result source, and some transforms has nothing to do with these props, + * and some transforms might have multiple upstream. + * (3) Transforms should specify `metaRawOption` in each output, just like they can be + * declared in `root-dataset`. + * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms. + * That is for reducing complexity in transfroms. + * PENDING: Whether to provide transposition transform? + * + * [IMPLEMENTAION_MEMO]: + * "sourceVisitConfig" are calculated from `metaRawOption` and `data`. + * They will not be calculated until `source` is about to be visited (to prevent from + * duplicate calcuation). `source` is visited only in series and input to transforms. + * + * [DIMENSION_INHERIT_RULE]: + * By default the dimensions are inherited from ancestors, unless a transform return + * a new dimensions definition. + * Consider the case: + * ```js + * dataset: [{ + * source: [ ['Product', 'Sales', 'Prise'], ['Cookies', 321, 44.21], ...] + * }, { + * transform: { type: 'filter', ... } + * }] + * dataset: [{ + * dimension: ['Product', 'Sales', 'Prise'], + * source: [ ['Cookies', 321, 44.21], ...] + * }, { + * transform: { type: 'filter', ... } + * }] + * ``` + * The two types of option should have the same behavior after transform. + * + * + * [SCENARIO]: + * (1) Provide source data directly: + * ```js + * series: { + * encode: {...}, + * dimensions: [...] + * seriesLayoutBy: 'row', + * data: [[...]] + * } + * ``` + * (2) Series refer to dataset. + * ```js + * series: [{ + * encode: {...} + * // Ignore datasetIndex means `datasetIndex: 0` + * // and the dimensions defination in dataset is used + * }, { + * encode: {...}, + * seriesLayoutBy: 'column', + * datasetIndex: 1 + * }] + * ``` + * (3) dataset transform + * ```js + * dataset: [{ + * source: [...] + * }, { + * source: [...] + * }, { + * // By default from 0. + * transform: { type: 'filter', config: {...} } + * }, { + * // Piped. + * transform: [ + * { type: 'filter', config: {...} }, + * { type: 'sort', config: {...} } + * ] + * }, { + * id: 'regressionData', + * fromDatasetIndex: 1, + * // Third-party transform + * transform: { type: 'ecStat:regression', config: {...} } + * }, { + * // retrieve the extra result. + * id: 'regressionFormula', + * fromDatasetId: 'regressionData', + * fromTransformResult: 1 + * }] + * ``` + */ + + var SourceManager = + /** @class */ + function () { + function SourceManager(sourceHost) { + // Cached source. Do not repeat calculating if not dirty. + this._sourceList = []; // version sign of each upstream source manager. + + this._upstreamSignList = []; + this._versionSignBase = 0; + this._sourceHost = sourceHost; + } + /** + * Mark dirty. + */ + + + SourceManager.prototype.dirty = function () { + this._setLocalSource([], []); + }; + + SourceManager.prototype._setLocalSource = function (sourceList, upstreamSignList) { + this._sourceList = sourceList; + this._upstreamSignList = upstreamSignList; + this._versionSignBase++; + + if (this._versionSignBase > 9e10) { + this._versionSignBase = 0; + } + }; + /** + * For detecting whether the upstream source is dirty, so that + * the local cached source (in `_sourceList`) should be discarded. + */ + + + SourceManager.prototype._getVersionSign = function () { + return this._sourceHost.uid + '_' + this._versionSignBase; + }; + /** + * Always return a source instance. Otherwise throw error. + */ + + + SourceManager.prototype.prepareSource = function () { + // For the case that call `setOption` multiple time but no data changed, + // cache the result source to prevent from repeating transform. + if (this._isDirty()) { + this._createSource(); + } + }; + + SourceManager.prototype._createSource = function () { + this._setLocalSource([], []); + + var sourceHost = this._sourceHost; + + var upSourceMgrList = this._getUpstreamSourceManagers(); + + var hasUpstream = !!upSourceMgrList.length; + var resultSourceList; + var upstreamSignList; + + if (isSeries(sourceHost)) { + var seriesModel = sourceHost; + var data = void 0; + var sourceFormat = void 0; + var upSource = void 0; // Has upstream dataset + + if (hasUpstream) { + var upSourceMgr = upSourceMgrList[0]; + upSourceMgr.prepareSource(); + upSource = upSourceMgr.getSource(); + data = upSource.data; + sourceFormat = upSource.sourceFormat; + upstreamSignList = [upSourceMgr._getVersionSign()]; + } // Series data is from own. + else { + data = seriesModel.get('data', true); + sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL; + upstreamSignList = []; + } // See [REQUIREMENT_MEMO], merge settings on series and parent dataset if it is root. + + + var newMetaRawOption = this._getSourceMetaRawOption(); + + var upMetaRawOption = upSource ? upSource.metaRawOption : null; + var seriesLayoutBy = retrieve2(newMetaRawOption.seriesLayoutBy, upMetaRawOption ? upMetaRawOption.seriesLayoutBy : null); + var sourceHeader = retrieve2(newMetaRawOption.sourceHeader, upMetaRawOption ? upMetaRawOption.sourceHeader : null); // Note here we should not use `upSource.dimensionsDefine`. Consider the case: + // `upSource.dimensionsDefine` is detected by `seriesLayoutBy: 'column'`, + // but series need `seriesLayoutBy: 'row'`. + + var dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption ? upMetaRawOption.dimensions : null); + resultSourceList = [createSource(data, { + seriesLayoutBy: seriesLayoutBy, + sourceHeader: sourceHeader, + dimensions: dimensions + }, sourceFormat, seriesModel.get('encode', true))]; + } else { + var datasetModel = sourceHost; // Has upstream dataset. + + if (hasUpstream) { + var result = this._applyTransform(upSourceMgrList); + + resultSourceList = result.sourceList; + upstreamSignList = result.upstreamSignList; + } // Is root dataset. + else { + var sourceData = datasetModel.get('source', true); + resultSourceList = [createSource(sourceData, this._getSourceMetaRawOption(), null, // Note: dataset option does not have `encode`. + null)]; + upstreamSignList = []; + } + } + + if ("development" !== 'production') { + assert(resultSourceList && upstreamSignList); + } + + this._setLocalSource(resultSourceList, upstreamSignList); + }; + + SourceManager.prototype._applyTransform = function (upMgrList) { + var datasetModel = this._sourceHost; + var transformOption = datasetModel.get('transform', true); + var fromTransformResult = datasetModel.get('fromTransformResult', true); + + if ("development" !== 'production') { + assert(fromTransformResult != null || transformOption != null); + } + + if (fromTransformResult != null) { + var errMsg = ''; + + if (upMgrList.length !== 1) { + if ("development" !== 'production') { + errMsg = 'When using `fromTransformResult`, there should be only one upstream dataset'; + } + + doThrow(errMsg); + } + } + + var sourceList; + var upSourceList = []; + var upstreamSignList = []; + each(upMgrList, function (upMgr) { + upMgr.prepareSource(); + var upSource = upMgr.getSource(fromTransformResult || 0); + var errMsg = ''; + + if (fromTransformResult != null && !upSource) { + if ("development" !== 'production') { + errMsg = 'Can not retrieve result by `fromTransformResult`: ' + fromTransformResult; + } + + doThrow(errMsg); + } + + upSourceList.push(upSource); + upstreamSignList.push(upMgr._getVersionSign()); + }); + + if (transformOption) { + sourceList = applyDataTransform(transformOption, upSourceList, { + datasetIndex: datasetModel.componentIndex + }); + } else if (fromTransformResult != null) { + sourceList = [cloneSourceShallow(upSourceList[0])]; + } + + return { + sourceList: sourceList, + upstreamSignList: upstreamSignList + }; + }; + + SourceManager.prototype._isDirty = function () { + var sourceList = this._sourceList; + + if (!sourceList.length) { + return true; + } // All sourceList is from the some upsteam. + + + var upSourceMgrList = this._getUpstreamSourceManagers(); + + for (var i = 0; i < upSourceMgrList.length; i++) { + var upSrcMgr = upSourceMgrList[i]; + + if ( // Consider the case that there is ancestor diry, call it recursively. + // The performance is probably not an issue because usually the chain is not long. + upSrcMgr._isDirty() || this._upstreamSignList[i] !== upSrcMgr._getVersionSign()) { + return true; + } + } + }; + /** + * @param sourceIndex By defualt 0, means "main source". + * Most cases there is only one source. + */ + + + SourceManager.prototype.getSource = function (sourceIndex) { + return this._sourceList[sourceIndex || 0]; + }; + /** + * PEDING: Is it fast enough? + * If no upstream, return empty array. + */ + + + SourceManager.prototype._getUpstreamSourceManagers = function () { + // Always get the relationship from the raw option. + // Do not cache the link of the dependency graph, so that + // no need to update them when change happen. + var sourceHost = this._sourceHost; + + if (isSeries(sourceHost)) { + var datasetModel = querySeriesUpstreamDatasetModel(sourceHost); + return !datasetModel ? [] : [datasetModel.getSourceManager()]; + } else { + return map(queryDatasetUpstreamDatasetModels(sourceHost), function (datasetModel) { + return datasetModel.getSourceManager(); + }); + } + }; + + SourceManager.prototype._getSourceMetaRawOption = function () { + var sourceHost = this._sourceHost; + var seriesLayoutBy; + var sourceHeader; + var dimensions; + + if (isSeries(sourceHost)) { + seriesLayoutBy = sourceHost.get('seriesLayoutBy', true); + sourceHeader = sourceHost.get('sourceHeader', true); + dimensions = sourceHost.get('dimensions', true); + } // See [REQUIREMENT_MEMO], `non-root-dataset` do not support them. + else if (!this._getUpstreamSourceManagers().length) { + var model = sourceHost; + seriesLayoutBy = model.get('seriesLayoutBy', true); + sourceHeader = model.get('sourceHeader', true); + dimensions = model.get('dimensions', true); + } + + return { + seriesLayoutBy: seriesLayoutBy, + sourceHeader: sourceHeader, + dimensions: dimensions + }; + }; + + return SourceManager; + }(); + // disable the transform merge, but do not disable transfrom clone from rawOption. + + function disableTransformOptionMerge(datasetModel) { + var transformOption = datasetModel.option.transform; + transformOption && setAsPrimitive(datasetModel.option.transform); + } + + function isSeries(sourceHost) { + // Avoid circular dependency with Series.ts + return sourceHost.mainType === 'series'; + } + + function doThrow(errMsg) { + throw new Error(errMsg); + } + + var TOOLTIP_LINE_HEIGHT_CSS = 'line-height:1'; // TODO: more textStyle option + + function getTooltipTextStyle(textStyle, renderMode) { + var nameFontColor = textStyle.color || '#6e7079'; + var nameFontSize = textStyle.fontSize || 12; + var nameFontWeight = textStyle.fontWeight || '400'; + var valueFontColor = textStyle.color || '#464646'; + var valueFontSize = textStyle.fontSize || 14; + var valueFontWeight = textStyle.fontWeight || '900'; + + if (renderMode === 'html') { + // `textStyle` is probably from user input, should be encoded to reduce security risk. + return { + // eslint-disable-next-line max-len + nameStyle: "font-size:" + encodeHTML(nameFontSize + '') + "px;color:" + encodeHTML(nameFontColor) + ";font-weight:" + encodeHTML(nameFontWeight + ''), + // eslint-disable-next-line max-len + valueStyle: "font-size:" + encodeHTML(valueFontSize + '') + "px;color:" + encodeHTML(valueFontColor) + ";font-weight:" + encodeHTML(valueFontWeight + '') + }; + } else { + return { + nameStyle: { + fontSize: nameFontSize, + fill: nameFontColor, + fontWeight: nameFontWeight + }, + valueStyle: { + fontSize: valueFontSize, + fill: valueFontColor, + fontWeight: valueFontWeight + } + }; + } + } // See `TooltipMarkupLayoutIntent['innerGapLevel']`. + // (value from UI design) + + + var HTML_GAPS = [0, 10, 20, 30]; + var RICH_TEXT_GAPS = ['', '\n', '\n\n', '\n\n\n']; // eslint-disable-next-line max-len + + function createTooltipMarkup(type, option) { + option.type = type; + return option; + } + + function getBuilder(fragment) { + return hasOwn(builderMap, fragment.type) && builderMap[fragment.type]; + } + + var builderMap = { + /** + * A `section` block is like: + * ``` + * header + * subBlock + * subBlock + * ... + * ``` + */ + section: { + planLayout: function (fragment) { + var subBlockLen = fragment.blocks.length; + var thisBlockHasInnerGap = subBlockLen > 1 || subBlockLen > 0 && !fragment.noHeader; + var thisGapLevelBetweenSubBlocks = 0; + each(fragment.blocks, function (subBlock) { + getBuilder(subBlock).planLayout(subBlock); + var subGapLevel = subBlock.__gapLevelBetweenSubBlocks; // If the some of the sub-blocks have some gaps (like 10px) inside, this block + // should use a larger gap (like 20px) to distinguish those sub-blocks. + + if (subGapLevel >= thisGapLevelBetweenSubBlocks) { + thisGapLevelBetweenSubBlocks = subGapLevel + (thisBlockHasInnerGap && ( // 0 always can not be readable gap level. + !subGapLevel // If no header, always keep the sub gap level. Otherwise + // look weird in case `multipleSeries`. + || subBlock.type === 'section' && !subBlock.noHeader) ? 1 : 0); + } + }); + fragment.__gapLevelBetweenSubBlocks = thisGapLevelBetweenSubBlocks; + }, + build: function (ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var noHeader = fragment.noHeader; + var gaps = getGap(fragment); + var subMarkupText = buildSubBlocks(ctx, fragment, noHeader ? topMarginForOuterGap : gaps.html, toolTipTextStyle); + + if (noHeader) { + return subMarkupText; + } + + var displayableHeader = makeValueReadable(fragment.header, 'ordinal', ctx.useUTC); + var nameStyle = getTooltipTextStyle(toolTipTextStyle, ctx.renderMode).nameStyle; + + if (ctx.renderMode === 'richText') { + return wrapInlineNameRichText(ctx, displayableHeader, nameStyle) + gaps.richText + subMarkupText; + } else { + return wrapBlockHTML("
                                  " + encodeHTML(displayableHeader) + '
                                  ' + subMarkupText, topMarginForOuterGap); + } + } + }, + + /** + * A `nameValue` block is like: + * ``` + * marker name value + * ``` + */ + nameValue: { + planLayout: function (fragment) { + fragment.__gapLevelBetweenSubBlocks = 0; + }, + build: function (ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var renderMode = ctx.renderMode; + var noName = fragment.noName; + var noValue = fragment.noValue; + var noMarker = !fragment.markerType; + var name = fragment.name; + var value = fragment.value; + var useUTC = ctx.useUTC; + + if (noName && noValue) { + return; + } + + var markerStr = noMarker ? '' : ctx.markupStyleCreator.makeTooltipMarker(fragment.markerType, fragment.markerColor || '#333', renderMode); + var readableName = noName ? '' : makeValueReadable(name, 'ordinal', useUTC); + var valueTypeOption = fragment.valueType; + var readableValueList = noValue ? [] : isArray(value) ? map(value, function (val, idx) { + return makeValueReadable(val, isArray(valueTypeOption) ? valueTypeOption[idx] : valueTypeOption, useUTC); + }) : [makeValueReadable(value, isArray(valueTypeOption) ? valueTypeOption[0] : valueTypeOption, useUTC)]; + var valueAlignRight = !noMarker || !noName; // It little weird if only value next to marker but far from marker. + + var valueCloseToMarker = !noMarker && noName; + + var _a = getTooltipTextStyle(toolTipTextStyle, renderMode), + nameStyle = _a.nameStyle, + valueStyle = _a.valueStyle; + + return renderMode === 'richText' ? (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameRichText(ctx, readableName, nameStyle)) // Value has commas inside, so use ' ' as delimiter for multiple values. + + (noValue ? '' : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML((noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? '' : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap); + } + } + }; + + function buildSubBlocks(ctx, fragment, topMarginForOuterGap, tooltipTextStyle) { + var subMarkupTextList = []; + var subBlocks = fragment.blocks || []; + assert(!subBlocks || isArray(subBlocks)); + subBlocks = subBlocks || []; + var orderMode = ctx.orderMode; + + if (fragment.sortBlocks && orderMode) { + subBlocks = subBlocks.slice(); + var orderMap = { + valueAsc: 'asc', + valueDesc: 'desc' + }; + + if (hasOwn(orderMap, orderMode)) { + var comparator_1 = new SortOrderComparator(orderMap[orderMode], null); + subBlocks.sort(function (a, b) { + return comparator_1.evaluate(a.sortParam, b.sortParam); + }); + } // FIXME 'seriesDesc' necessary? + else if (orderMode === 'seriesDesc') { + subBlocks.reverse(); + } + } + + var gaps = getGap(fragment); + each(subBlocks, function (subBlock, idx) { + var subMarkupText = getBuilder(subBlock).build(ctx, subBlock, idx > 0 ? gaps.html : 0, tooltipTextStyle); + subMarkupText != null && subMarkupTextList.push(subMarkupText); + }); + + if (!subMarkupTextList.length) { + return; + } + + return ctx.renderMode === 'richText' ? subMarkupTextList.join(gaps.richText) : wrapBlockHTML(subMarkupTextList.join(''), topMarginForOuterGap); + } + /** + * @return markupText. null/undefined means no content. + */ + + + function buildTooltipMarkup(fragment, markupStyleCreator, renderMode, orderMode, useUTC, toolTipTextStyle) { + if (!fragment) { + return; + } + + var builder = getBuilder(fragment); + builder.planLayout(fragment); + var ctx = { + useUTC: useUTC, + renderMode: renderMode, + orderMode: orderMode, + markupStyleCreator: markupStyleCreator + }; + return builder.build(ctx, fragment, 0, toolTipTextStyle); + } + + function getGap(fragment) { + var gapLevelBetweenSubBlocks = fragment.__gapLevelBetweenSubBlocks; + return { + html: HTML_GAPS[gapLevelBetweenSubBlocks], + richText: RICH_TEXT_GAPS[gapLevelBetweenSubBlocks] + }; + } + + function wrapBlockHTML(encodedContent, topGap) { + var clearfix = '
                                  '; + var marginCSS = "margin: " + topGap + "px 0 0"; + return "
                                  " + encodedContent + clearfix + '
                                  '; + } + + function wrapInlineNameHTML(name, leftHasMarker, style) { + var marginCss = leftHasMarker ? 'margin-left:2px' : ''; + return "" + encodeHTML(name) + ''; + } + + function wrapInlineValueHTML(valueList, alignRight, valueCloseToMarker, style) { + // Do not too close to marker, considering there are multiple values separated by spaces. + var paddingStr = valueCloseToMarker ? '10px' : '20px'; + var alignCSS = alignRight ? "float:right;margin-left:" + paddingStr : ''; + return "" // Value has commas inside, so use ' ' as delimiter for multiple values. + + map(valueList, function (value) { + return encodeHTML(value); + }).join('  ') + ''; + } + + function wrapInlineNameRichText(ctx, name, style) { + return ctx.markupStyleCreator.wrapRichTextStyle(name, style); + } + + function wrapInlineValueRichText(ctx, valueList, alignRight, valueCloseToMarker, style) { + var styles = [style]; + var paddingLeft = valueCloseToMarker ? 10 : 20; + alignRight && styles.push({ + padding: [0, 0, 0, paddingLeft], + align: 'right' + }); // Value has commas inside, so use ' ' as delimiter for multiple values. + + return ctx.markupStyleCreator.wrapRichTextStyle(valueList.join(' '), styles); + } + + function retrieveVisualColorForTooltipMarker(series, dataIndex) { + var style = series.getData().getItemVisual(dataIndex, 'style'); + var color = style[series.visualDrawType]; + return convertToColorString(color); + } + function getPaddingFromTooltipModel(model, renderMode) { + var padding = model.get('padding'); + return padding != null ? padding // We give slightly different to look pretty. + : renderMode === 'richText' ? [8, 10] : 10; + } + /** + * The major feature is generate styles for `renderMode: 'richText'`. + * But it also serves `renderMode: 'html'` to provide + * "renderMode-independent" API. + */ + + var TooltipMarkupStyleCreator = + /** @class */ + function () { + function TooltipMarkupStyleCreator() { + this.richTextStyles = {}; // Notice that "generate a style name" usuall happens repeatly when mouse moving and + // displaying a tooltip. So we put the `_nextStyleNameId` as a member of each creator + // rather than static shared by all creators (which will cause it increase to fast). + + this._nextStyleNameId = getRandomIdBase(); + } + + TooltipMarkupStyleCreator.prototype._generateStyleName = function () { + return '__EC_aUTo_' + this._nextStyleNameId++; + }; + + TooltipMarkupStyleCreator.prototype.makeTooltipMarker = function (markerType, colorStr, renderMode) { + var markerId = renderMode === 'richText' ? this._generateStyleName() : null; + var marker = getTooltipMarker({ + color: colorStr, + type: markerType, + renderMode: renderMode, + markerId: markerId + }); + + if (isString(marker)) { + return marker; + } else { + if ("development" !== 'production') { + assert(markerId); + } + + this.richTextStyles[markerId] = marker.style; + return marker.content; + } + }; + /** + * @usage + * ```ts + * const styledText = markupStyleCreator.wrapRichTextStyle([ + * // The styles will be auto merged. + * { + * fontSize: 12, + * color: 'blue' + * }, + * { + * padding: 20 + * } + * ]); + * ``` + */ + + + TooltipMarkupStyleCreator.prototype.wrapRichTextStyle = function (text, styles) { + var finalStl = {}; + + if (isArray(styles)) { + each(styles, function (stl) { + return extend(finalStl, stl); + }); + } else { + extend(finalStl, styles); + } + + var styleName = this._generateStyleName(); + + this.richTextStyles[styleName] = finalStl; + return "{" + styleName + "|" + text + "}"; + }; + + return TooltipMarkupStyleCreator; + }(); + + function defaultSeriesFormatTooltip(opt) { + var series = opt.series; + var dataIndex = opt.dataIndex; + var multipleSeries = opt.multipleSeries; + var data = series.getData(); + var tooltipDims = data.mapDimensionsAll('defaultedTooltip'); + var tooltipDimLen = tooltipDims.length; + var value = series.getRawValue(dataIndex); + var isValueArr = isArray(value); + var markerColor = retrieveVisualColorForTooltipMarker(series, dataIndex); // Complicated rule for pretty tooltip. + + var inlineValue; + var inlineValueType; + var subBlocks; + var sortParam; + + if (tooltipDimLen > 1 || isValueArr && !tooltipDimLen) { + var formatArrResult = formatTooltipArrayValue(value, series, dataIndex, tooltipDims, markerColor); + inlineValue = formatArrResult.inlineValues; + inlineValueType = formatArrResult.inlineValueTypes; + subBlocks = formatArrResult.blocks; // Only support tooltip sort by the first inline value. It's enough in most cases. + + sortParam = formatArrResult.inlineValues[0]; + } else if (tooltipDimLen) { + var dimInfo = data.getDimensionInfo(tooltipDims[0]); + sortParam = inlineValue = retrieveRawValue(data, dataIndex, tooltipDims[0]); + inlineValueType = dimInfo.type; + } else { + sortParam = inlineValue = isValueArr ? value[0] : value; + } // Do not show generated series name. It might not be readable. + + + var seriesNameSpecified = isNameSpecified(series); + var seriesName = seriesNameSpecified && series.name || ''; + var itemName = data.getName(dataIndex); + var inlineName = multipleSeries ? seriesName : itemName; + return createTooltipMarkup('section', { + header: seriesName, + // When series name not specified, do not show a header line with only '-'. + // This case alway happen in tooltip.trigger: 'item'. + noHeader: multipleSeries || !seriesNameSpecified, + sortParam: sortParam, + blocks: [createTooltipMarkup('nameValue', { + markerType: 'item', + markerColor: markerColor, + // Do not mix display seriesName and itemName in one tooltip, + // which might confuses users. + name: inlineName, + // name dimension might be auto assigned, where the name might + // be not readable. So we check trim here. + noName: !trim(inlineName), + value: inlineValue, + valueType: inlineValueType + })].concat(subBlocks || []) + }); + } + + function formatTooltipArrayValue(value, series, dataIndex, tooltipDims, colorStr) { + // check: category-no-encode-has-axis-data in dataset.html + var data = series.getData(); + var isValueMultipleLine = reduce(value, function (isValueMultipleLine, val, idx) { + var dimItem = data.getDimensionInfo(idx); + return isValueMultipleLine = isValueMultipleLine || dimItem && dimItem.tooltip !== false && dimItem.displayName != null; + }, false); + var inlineValues = []; + var inlineValueTypes = []; + var blocks = []; + tooltipDims.length ? each(tooltipDims, function (dim) { + setEachItem(retrieveRawValue(data, dataIndex, dim), dim); + }) // By default, all dims is used on tooltip. + : each(value, setEachItem); + + function setEachItem(val, dim) { + var dimInfo = data.getDimensionInfo(dim); // If `dimInfo.tooltip` is not set, show tooltip. + + if (!dimInfo || dimInfo.otherDims.tooltip === false) { + return; + } + + if (isValueMultipleLine) { + blocks.push(createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: colorStr, + name: dimInfo.displayName, + value: val, + valueType: dimInfo.type + })); + } else { + inlineValues.push(val); + inlineValueTypes.push(dimInfo.type); + } + } + + return { + inlineValues: inlineValues, + inlineValueTypes: inlineValueTypes, + blocks: blocks + }; + } + + var inner$1 = makeInner(); + + function getSelectionKey(data, dataIndex) { + return data.getName(dataIndex) || data.getId(dataIndex); + } + + var SeriesModel = + /** @class */ + function (_super) { + __extends(SeriesModel, _super); + + function SeriesModel() { + // [Caution]: Becuase this class or desecendants can be used as `XXX.extend(subProto)`, + // the class members must not be initialized in constructor or declaration place. + // Otherwise there is bad case: + // class A {xxx = 1;} + // enableClassExtend(A); + // class B extends A {} + // var C = B.extend({xxx: 5}); + // var c = new C(); + // console.log(c.xxx); // expect 5 but always 1. + var _this = _super !== null && _super.apply(this, arguments) || this; // --------------------------------------- + // Props about data selection + // --------------------------------------- + + + _this._selectedDataIndicesMap = {}; + return _this; + } + + SeriesModel.prototype.init = function (option, parentModel, ecModel) { + this.seriesIndex = this.componentIndex; + this.dataTask = createTask({ + count: dataTaskCount, + reset: dataTaskReset + }); + this.dataTask.context = { + model: this + }; + this.mergeDefaultAndTheme(option, ecModel); + var sourceManager = inner$1(this).sourceManager = new SourceManager(this); + sourceManager.prepareSource(); + var data = this.getInitialData(option, ecModel); + wrapData(data, this); + this.dataTask.context.data = data; + + if ("development" !== 'production') { + assert(data, 'getInitialData returned invalid data.'); + } + + inner$1(this).dataBeforeProcessed = data; // If we reverse the order (make data firstly, and then make + // dataBeforeProcessed by cloneShallow), cloneShallow will + // cause data.graph.data !== data when using + // module:echarts/data/Graph or module:echarts/data/Tree. + // See module:echarts/data/helper/linkList + // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model + // init or merge stage, because the data can be restored. So we do not `restoreData` + // and `setData` here, which forbids calling `seriesModel.getData()` in this stage. + // Call `seriesModel.getRawData()` instead. + // this.restoreData(); + + autoSeriesName(this); + + this._initSelectedMapFromData(data); + }; + /** + * Util for merge default and theme to option + */ + + + SeriesModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; // Backward compat: using subType on theme. + // But if name duplicate between series subType + // (for example: parallel) add component mainType, + // add suffix 'Series'. + + var themeSubType = this.subType; + + if (ComponentModel.hasClass(themeSubType)) { + themeSubType += 'Series'; + } + + merge(option, ecModel.getTheme().get(this.subType)); + merge(option, this.getDefaultOption()); // Default label emphasis `show` + + defaultEmphasis(option, 'label', ['show']); + this.fillDataTextStyle(option.data); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + SeriesModel.prototype.mergeOption = function (newSeriesOption, ecModel) { + // this.settingTask.dirty(); + newSeriesOption = merge(this.option, newSeriesOption, true); + this.fillDataTextStyle(newSeriesOption.data); + var layoutMode = fetchLayoutMode(this); + + if (layoutMode) { + mergeLayoutParam(this.option, newSeriesOption, layoutMode); + } + + var sourceManager = inner$1(this).sourceManager; + sourceManager.dirty(); + sourceManager.prepareSource(); + var data = this.getInitialData(newSeriesOption, ecModel); + wrapData(data, this); + this.dataTask.dirty(); + this.dataTask.context.data = data; + inner$1(this).dataBeforeProcessed = data; + autoSeriesName(this); + + this._initSelectedMapFromData(data); + }; + + SeriesModel.prototype.fillDataTextStyle = function (data) { + // Default data label emphasis `show` + // FIXME Tree structure data ? + // FIXME Performance ? + if (data && !isTypedArray(data)) { + var props = ['show']; + + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + defaultEmphasis(data[i], 'label', props); + } + } + } + }; + /** + * Init a data structure from data related option in series + * Must be overriden. + */ + + + SeriesModel.prototype.getInitialData = function (option, ecModel) { + return; + }; + /** + * Append data to list + */ + + + SeriesModel.prototype.appendData = function (params) { + // FIXME ??? + // (1) If data from dataset, forbidden append. + // (2) support append data of dataset. + var data = this.getRawData(); + data.appendData(params.data); + }; + /** + * Consider some method like `filter`, `map` need make new data, + * We should make sure that `seriesModel.getData()` get correct + * data in the stream procedure. So we fetch data from upstream + * each time `task.perform` called. + */ + + + SeriesModel.prototype.getData = function (dataType) { + var task = getCurrentTask(this); + + if (task) { + var data = task.context.data; + return dataType == null ? data : data.getLinkedData(dataType); + } else { + // When series is not alive (that may happen when click toolbox + // restore or setOption with not merge mode), series data may + // be still need to judge animation or something when graphic + // elements want to know whether fade out. + return inner$1(this).data; + } + }; + + SeriesModel.prototype.getAllData = function () { + var mainData = this.getData(); + return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{ + data: mainData + }]; + }; + + SeriesModel.prototype.setData = function (data) { + var task = getCurrentTask(this); + + if (task) { + var context = task.context; // Consider case: filter, data sample. + // FIXME:TS never used, so comment it + // if (context.data !== data && task.modifyOutputEnd) { + // task.setOutputEnd(data.count()); + // } + + context.outputData = data; // Caution: setData should update context.data, + // Because getData may be called multiply in a + // single stage and expect to get the data just + // set. (For example, AxisProxy, x y both call + // getData and setDate sequentially). + // So the context.data should be fetched from + // upstream each time when a stage starts to be + // performed. + + if (task !== this.dataTask) { + context.data = data; + } + } + + inner$1(this).data = data; + }; + + SeriesModel.prototype.getSource = function () { + return inner$1(this).sourceManager.getSource(); + }; + /** + * Get data before processed + */ + + + SeriesModel.prototype.getRawData = function () { + return inner$1(this).dataBeforeProcessed; + }; + /** + * Get base axis if has coordinate system and has axis. + * By default use coordSys.getBaseAxis(); + * Can be overrided for some chart. + * @return {type} description + */ + + + SeriesModel.prototype.getBaseAxis = function () { + var coordSys = this.coordinateSystem; // @ts-ignore + + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }; + /** + * Default tooltip formatter + * + * @param dataIndex + * @param multipleSeries + * @param dataType + * @param renderMode valid values: 'html'(by default) and 'richText'. + * 'html' is used for rendering tooltip in extra DOM form, and the result + * string is used as DOM HTML content. + * 'richText' is used for rendering tooltip in rich text form, for those where + * DOM operation is not supported. + * @return formatted tooltip with `html` and `markers` + * Notice: The override method can also return string + */ + + + SeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + return defaultSeriesFormatTooltip({ + series: this, + dataIndex: dataIndex, + multipleSeries: multipleSeries + }); + }; + + SeriesModel.prototype.isAnimationEnabled = function () { + if (env.node) { + return false; + } + + var animationEnabled = this.getShallow('animation'); + + if (animationEnabled) { + if (this.getData().count() > this.getShallow('animationThreshold')) { + animationEnabled = false; + } + } + + return !!animationEnabled; + }; + + SeriesModel.prototype.restoreData = function () { + this.dataTask.dirty(); + }; + + SeriesModel.prototype.getColorFromPalette = function (name, scope, requestColorNum) { + var ecModel = this.ecModel; // PENDING + + var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum); + + if (!color) { + color = ecModel.getColorFromPalette(name, scope, requestColorNum); + } + + return color; + }; + /** + * Use `data.mapDimensionsAll(coordDim)` instead. + * @deprecated + */ + + + SeriesModel.prototype.coordDimToDataDim = function (coordDim) { + return this.getRawData().mapDimensionsAll(coordDim); + }; + /** + * Get progressive rendering count each step + */ + + + SeriesModel.prototype.getProgressive = function () { + return this.get('progressive'); + }; + /** + * Get progressive rendering count each step + */ + + + SeriesModel.prototype.getProgressiveThreshold = function () { + return this.get('progressiveThreshold'); + }; // PENGING If selectedMode is null ? + + + SeriesModel.prototype.select = function (innerDataIndices, dataType) { + this._innerSelect(this.getData(dataType), innerDataIndices); + }; + + SeriesModel.prototype.unselect = function (innerDataIndices, dataType) { + var selectedMap = this.option.selectedMap; + + if (!selectedMap) { + return; + } + + var data = this.getData(dataType); + + for (var i = 0; i < innerDataIndices.length; i++) { + var dataIndex = innerDataIndices[i]; + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = false; + this._selectedDataIndicesMap[nameOrId] = -1; + } + }; + + SeriesModel.prototype.toggleSelect = function (innerDataIndices, dataType) { + var tmpArr = []; + + for (var i = 0; i < innerDataIndices.length; i++) { + tmpArr[0] = innerDataIndices[i]; + this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr, dataType) : this.select(tmpArr, dataType); + } + }; + + SeriesModel.prototype.getSelectedDataIndices = function () { + var selectedDataIndicesMap = this._selectedDataIndicesMap; + var nameOrIds = keys(selectedDataIndicesMap); + var dataIndices = []; + + for (var i = 0; i < nameOrIds.length; i++) { + var dataIndex = selectedDataIndicesMap[nameOrIds[i]]; + + if (dataIndex >= 0) { + dataIndices.push(dataIndex); + } + } + + return dataIndices; + }; + + SeriesModel.prototype.isSelected = function (dataIndex, dataType) { + var selectedMap = this.option.selectedMap; + + if (!selectedMap) { + return false; + } + + var data = this.getData(dataType); + var nameOrId = getSelectionKey(data, dataIndex); + return selectedMap[nameOrId] || false; + }; + + SeriesModel.prototype._innerSelect = function (data, innerDataIndices) { + var _a, _b; + + var selectedMode = this.option.selectedMode; + var len = innerDataIndices.length; + + if (!selectedMode || !len) { + return; + } + + if (selectedMode === 'multiple') { + var selectedMap = this.option.selectedMap || (this.option.selectedMap = {}); + + for (var i = 0; i < len; i++) { + var dataIndex = innerDataIndices[i]; // TODO diffrent types of data share same object. + + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = true; + this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex); + } + } else if (selectedMode === 'single' || selectedMode === true) { + var lastDataIndex = innerDataIndices[len - 1]; + var nameOrId = getSelectionKey(data, lastDataIndex); + this.option.selectedMap = (_a = {}, _a[nameOrId] = true, _a); + this._selectedDataIndicesMap = (_b = {}, _b[nameOrId] = data.getRawIndex(lastDataIndex), _b); + } + }; + + SeriesModel.prototype._initSelectedMapFromData = function (data) { + // Ignore select info in data if selectedMap exists. + // NOTE It's only for legacy usage. edge data is not supported. + if (this.option.selectedMap) { + return; + } + + var dataIndices = []; + + if (data.hasItemOption) { + data.each(function (idx) { + var rawItem = data.getRawDataItem(idx); + + if (typeof rawItem === 'object' && rawItem.selected) { + dataIndices.push(idx); + } + }); + } + + if (dataIndices.length > 0) { + this._innerSelect(data, dataIndices); + } + }; // /** + // * @see {module:echarts/stream/Scheduler} + // */ + // abstract pipeTask: null + + + SeriesModel.registerClass = function (clz) { + return ComponentModel.registerClass(clz); + }; + + SeriesModel.protoInitialize = function () { + var proto = SeriesModel.prototype; + proto.type = 'series.__base__'; + proto.seriesIndex = 0; + proto.useColorPaletteOnData = false; + proto.ignoreStyleOnData = false; + proto.hasSymbolVisual = false; + proto.defaultSymbol = 'circle'; // Make sure the values can be accessed! + + proto.visualStyleAccessPath = 'itemStyle'; + proto.visualDrawType = 'fill'; + }(); + + return SeriesModel; + }(ComponentModel); + + mixin(SeriesModel, DataFormatMixin); + mixin(SeriesModel, PaletteMixin); + mountExtend(SeriesModel, ComponentModel); + /** + * MUST be called after `prepareSource` called + * Here we need to make auto series, especially for auto legend. But we + * do not modify series.name in option to avoid side effects. + */ + + function autoSeriesName(seriesModel) { + // User specified name has higher priority, otherwise it may cause + // series can not be queried unexpectedly. + var name = seriesModel.name; + + if (!isNameSpecified(seriesModel)) { + seriesModel.name = getSeriesAutoName(seriesModel) || name; + } + } + + function getSeriesAutoName(seriesModel) { + var data = seriesModel.getRawData(); + var dataDims = data.mapDimensionsAll('seriesName'); + var nameArr = []; + each(dataDims, function (dataDim) { + var dimInfo = data.getDimensionInfo(dataDim); + dimInfo.displayName && nameArr.push(dimInfo.displayName); + }); + return nameArr.join(' '); + } + + function dataTaskCount(context) { + return context.model.getRawData().count(); + } + + function dataTaskReset(context) { + var seriesModel = context.model; + seriesModel.setData(seriesModel.getRawData().cloneShallow()); + return dataTaskProgress; + } + + function dataTaskProgress(param, context) { + // Avoid repead cloneShallow when data just created in reset. + if (context.outputData && param.end > context.outputData.count()) { + context.model.getRawData().cloneShallow(context.outputData); + } + } // TODO refactor + + + function wrapData(data, seriesModel) { + each(__spreadArrays(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function (methodName) { + data.wrapMethod(methodName, curry(onDataChange, seriesModel)); + }); + } + + function onDataChange(seriesModel, newList) { + var task = getCurrentTask(seriesModel); + + if (task) { + // Consider case: filter, selectRange + task.setOutputEnd((newList || this).count()); + } + + return newList; + } + + function getCurrentTask(seriesModel) { + var scheduler = (seriesModel.ecModel || {}).scheduler; + var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid); + + if (pipeline) { + // When pipline finished, the currrentTask keep the last + // task (renderTask). + var task = pipeline.currentTask; + + if (task) { + var agentStubMap = task.agentStubMap; + + if (agentStubMap) { + task = agentStubMap.get(seriesModel.uid); + } + } + + return task; + } + } + + var ComponentView = + /** @class */ + function () { + function ComponentView() { + this.group = new Group(); + this.uid = getUID('viewComponent'); + } + + ComponentView.prototype.init = function (ecModel, api) {}; + + ComponentView.prototype.render = function (model, ecModel, api, payload) {}; + + ComponentView.prototype.dispose = function (ecModel, api) {}; + + ComponentView.prototype.updateView = function (model, ecModel, api, payload) {// Do nothing; + }; + + ComponentView.prototype.updateLayout = function (model, ecModel, api, payload) {// Do nothing; + }; + + ComponentView.prototype.updateVisual = function (model, ecModel, api, payload) {// Do nothing; + }; + /** + * Hook for blur target series. + * Can be used in marker for blur the markers + */ + + + ComponentView.prototype.blurSeries = function (seriesModels, ecModel) {// Do nothing; + }; + + return ComponentView; + }(); + enableClassExtend(ComponentView); + enableClassManagement(ComponentView); + + /** + * @return {string} If large mode changed, return string 'reset'; + */ + + function createRenderPlanner() { + var inner = makeInner(); + return function (seriesModel) { + var fields = inner(seriesModel); + var pipelineContext = seriesModel.pipelineContext; + var originalLarge = !!fields.large; + var originalProgressive = !!fields.progressiveRender; // FIXME: if the planner works on a filtered series, `pipelineContext` does not + // exists. See #11611 . Probably we need to modify this structure, see the comment + // on `performRawSeries` in `Schedular.js`. + + var large = fields.large = !!(pipelineContext && pipelineContext.large); + var progressive = fields.progressiveRender = !!(pipelineContext && pipelineContext.progressiveRender); + return !!(originalLarge !== large || originalProgressive !== progressive) && 'reset'; + }; + } + + var inner$2 = makeInner(); + var renderPlanner = createRenderPlanner(); + + var ChartView = + /** @class */ + function () { + function ChartView() { + this.group = new Group(); + this.uid = getUID('viewChart'); + this.renderTask = createTask({ + plan: renderTaskPlan, + reset: renderTaskReset + }); + this.renderTask.context = { + view: this + }; + } + + ChartView.prototype.init = function (ecModel, api) {}; + + ChartView.prototype.render = function (seriesModel, ecModel, api, payload) {}; + /** + * Highlight series or specified data item. + */ + + + ChartView.prototype.highlight = function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'emphasis'); + }; + /** + * Downplay series or specified data item. + */ + + + ChartView.prototype.downplay = function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'normal'); + }; + /** + * Remove self. + */ + + + ChartView.prototype.remove = function (ecModel, api) { + this.group.removeAll(); + }; + /** + * Dispose self. + */ + + + ChartView.prototype.dispose = function (ecModel, api) {}; + + ChartView.prototype.updateView = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; // FIXME never used? + + + ChartView.prototype.updateLayout = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; // FIXME never used? + + + ChartView.prototype.updateVisual = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + + ChartView.markUpdateMethod = function (payload, methodName) { + inner$2(payload).updateMethod = methodName; + }; + + ChartView.protoInitialize = function () { + var proto = ChartView.prototype; + proto.type = 'chart'; + }(); + + return ChartView; + }(); + /** + * Set state of single element + */ + + function elSetState(el, state, highlightDigit) { + if (el) { + (state === 'emphasis' ? enterEmphasis : leaveEmphasis)(el, highlightDigit); + } + } + + function toggleHighlight(data, payload, state) { + var dataIndex = queryDataIndex(data, payload); + var highlightDigit = payload && payload.highlightKey != null ? getHighlightDigit(payload.highlightKey) : null; + + if (dataIndex != null) { + each(normalizeToArray(dataIndex), function (dataIdx) { + elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit); + }); + } else { + data.eachItemGraphicEl(function (el) { + elSetState(el, state, highlightDigit); + }); + } + } + + enableClassExtend(ChartView, ['dispose']); + enableClassManagement(ChartView); + + function renderTaskPlan(context) { + return renderPlanner(context.model); + } + + function renderTaskReset(context) { + var seriesModel = context.model; + var ecModel = context.ecModel; + var api = context.api; + var payload = context.payload; // FIXME: remove updateView updateVisual + + var progressiveRender = seriesModel.pipelineContext.progressiveRender; + var view = context.view; + var updateMethod = payload && inner$2(payload).updateMethod; + var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod // `appendData` is also supported when data amount + // is less than progressive threshold. + : 'render'; + + if (methodName !== 'render') { + view[methodName](seriesModel, ecModel, api, payload); + } + + return progressMethodMap[methodName]; + } + + var progressMethodMap = { + incrementalPrepareRender: { + progress: function (params, context) { + context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload); + } + }, + render: { + // Put view.render in `progress` to support appendData. But in this case + // view.render should not be called in reset, otherwise it will be called + // twise. Use `forceFirstProgress` to make sure that view.render is called + // in any cases. + forceFirstProgress: true, + progress: function (params, context) { + context.view.render(context.model, context.ecModel, context.api, context.payload); + } + } + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var ORIGIN_METHOD = '\0__throttleOriginMethod'; + var RATE = '\0__throttleRate'; + var THROTTLE_TYPE = '\0__throttleType'; + /** + * @public + * @param {(Function)} fn + * @param {number} [delay=0] Unit: ms. + * @param {boolean} [debounce=false] + * true: If call interval less than `delay`, only the last call works. + * false: If call interval less than `delay, call works on fixed rate. + * @return {(Function)} throttled fn. + */ + + function throttle(fn, delay, debounce) { + var currCall; + var lastCall = 0; + var lastExec = 0; + var timer = null; + var diff; + var scope; + var args; + var debounceNextCall; + delay = delay || 0; + + function exec() { + lastExec = new Date().getTime(); + timer = null; + fn.apply(scope, args || []); + } + + var cb = function () { + var cbArgs = []; + + for (var _i = 0; _i < arguments.length; _i++) { + cbArgs[_i] = arguments[_i]; + } + + currCall = new Date().getTime(); + scope = this; + args = cbArgs; + var thisDelay = debounceNextCall || delay; + var thisDebounce = debounceNextCall || debounce; + debounceNextCall = null; + diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay; + clearTimeout(timer); // Here we should make sure that: the `exec` SHOULD NOT be called later + // than a new call of `cb`, that is, preserving the command order. Consider + // calculating "scale rate" when roaming as an example. When a call of `cb` + // happens, either the `exec` is called dierectly, or the call is delayed. + // But the delayed call should never be later than next call of `cb`. Under + // this assurance, we can simply update view state each time `dispatchAction` + // triggered by user roaming, but not need to add extra code to avoid the + // state being "rolled-back". + + if (thisDebounce) { + timer = setTimeout(exec, thisDelay); + } else { + if (diff >= 0) { + exec(); + } else { + timer = setTimeout(exec, -diff); + } + } + + lastCall = currCall; + }; + /** + * Clear throttle. + * @public + */ + + + cb.clear = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + }; + /** + * Enable debounce once. + */ + + + cb.debounceNextCall = function (debounceDelay) { + debounceNextCall = debounceDelay; + }; + + return cb; + } + /** + * 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'); + * }; + * + */ + + function createOrUpdate(obj, fnAttr, rate, throttleType) { + var fn = obj[fnAttr]; + + if (!fn) { + return; + } + + var originFn = fn[ORIGIN_METHOD] || fn; + var lastThrottleType = fn[THROTTLE_TYPE]; + var lastRate = fn[RATE]; + + if (lastRate !== rate || lastThrottleType !== throttleType) { + if (rate == null || !throttleType) { + return obj[fnAttr] = originFn; + } + + fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce'); + fn[ORIGIN_METHOD] = originFn; + fn[THROTTLE_TYPE] = throttleType; + fn[RATE] = rate; + } + + return fn; + } + /** + * Clear throttle. Example see throttle.createOrUpdate. + */ + + function clear(obj, fnAttr) { + var fn = obj[fnAttr]; + + if (fn && fn[ORIGIN_METHOD]) { + obj[fnAttr] = fn[ORIGIN_METHOD]; + } + } + + var inner$3 = makeInner(); + var defaultStyleMappers = { + itemStyle: makeStyleMapper(ITEM_STYLE_KEY_MAP, true), + lineStyle: makeStyleMapper(LINE_STYLE_KEY_MAP, true) + }; + var defaultColorKey = { + lineStyle: 'stroke', + itemStyle: 'fill' + }; + + function getStyleMapper(seriesModel, stylePath) { + var styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath]; + + if (!styleMapper) { + console.warn("Unkown style type '" + stylePath + "'."); + return defaultStyleMappers.itemStyle; + } + + return styleMapper; + } + + function getDefaultColorKey(seriesModel, stylePath) { + // return defaultColorKey[stylePath] || + var colorKey = seriesModel.visualDrawType || defaultColorKey[stylePath]; + + if (!colorKey) { + console.warn("Unkown style type '" + stylePath + "'."); + return 'fill'; + } + + return colorKey; + } + + var seriesStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; // Set in itemStyle + + var styleModel = seriesModel.getModel(stylePath); + var getStyle = getStyleMapper(seriesModel, stylePath); + var globalStyle = getStyle(styleModel); + var decalOption = styleModel.getShallow('decal'); + + if (decalOption) { + data.setVisual('decal', decalOption); + decalOption.dirty = true; + } // TODO + + + var colorKey = getDefaultColorKey(seriesModel, stylePath); + var color = globalStyle[colorKey]; // TODO style callback + + var colorCallback = isFunction(color) ? color : null; // Get from color palette by default. + + if (!globalStyle[colorKey] || colorCallback) { + // Note: if some series has color specified (e.g., by itemStyle.color), we DO NOT + // make it effect palette. Bacause some scenarios users need to make some series + // transparent or as background, which should better not effect the palette. + globalStyle[colorKey] = seriesModel.getColorFromPalette( // TODO series count changed. + seriesModel.name, null, ecModel.getSeriesCount()); + data.setVisual('colorFromPalette', true); + } + + data.setVisual('style', globalStyle); + data.setVisual('drawType', colorKey); // Only visible series has each data be visual encoded + + if (!ecModel.isSeriesFiltered(seriesModel) && colorCallback) { + data.setVisual('colorFromPalette', false); + return { + dataEach: function (data, idx) { + var dataParams = seriesModel.getDataParams(idx); + var itemStyle = extend({}, globalStyle); + itemStyle[colorKey] = colorCallback(dataParams); + data.setItemVisual(idx, 'style', itemStyle); + } + }; + } + } + }; + var sharedModel = new Model(); + var dataStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (seriesModel.ignoreStyleOnData || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; // Set in itemStyle + + var getStyle = getStyleMapper(seriesModel, stylePath); + var colorKey = data.getVisual('drawType'); + return { + dataEach: data.hasItemOption ? function (data, idx) { + // Not use getItemModel for performance considuration + var rawItem = data.getRawDataItem(idx); + + if (rawItem && rawItem[stylePath]) { + sharedModel.option = rawItem[stylePath]; + var style = getStyle(sharedModel); + var existsStyle = data.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + + if (sharedModel.option.decal) { + data.setItemVisual(idx, 'decal', sharedModel.option.decal); + sharedModel.option.decal.dirty = true; + } + + if (colorKey in style) { + data.setItemVisual(idx, 'colorFromPalette', false); + } + } + } : null + }; + } + }; // Pick color from palette for the data which has not been set with color yet. + // Note: do not support stream rendering. No such cases yet. + + var dataColorPaletteTask = { + performRawSeries: true, + overallReset: function (ecModel) { + // Each type of series use one scope. + // Pie and funnel are using diferrent scopes + var paletteScopeGroupByType = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + if (!seriesModel.useColorPaletteOnData) { + return; + } + + var colorScope = paletteScopeGroupByType.get(seriesModel.type); + + if (!colorScope) { + colorScope = {}; + paletteScopeGroupByType.set(seriesModel.type, colorScope); + } + + inner$3(seriesModel).scope = colorScope; + }); + ecModel.eachSeries(function (seriesModel) { + if (!seriesModel.useColorPaletteOnData || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var dataAll = seriesModel.getRawData(); + var idxMap = {}; + var data = seriesModel.getData(); + var colorScope = inner$3(seriesModel).scope; + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; + var colorKey = getDefaultColorKey(seriesModel, stylePath); + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap[rawIdx] = idx; + }); // Iterate on data before filtered. To make sure color from palette can be + // Consistent when toggling legend. + + dataAll.each(function (rawIdx) { + var idx = idxMap[rawIdx]; + var fromPalette = data.getItemVisual(idx, 'colorFromPalette'); // Get color from palette for each data only when the color is inherited from series color, which is + // also picked from color palette. So following situation is not in the case: + // 1. series.itemStyle.color is set + // 2. color is encoded by visualMap + + if (fromPalette) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + var name_1 = dataAll.getName(rawIdx) || rawIdx + ''; + var dataCount = dataAll.count(); + itemStyle[colorKey] = seriesModel.getColorFromPalette(name_1, colorScope, dataCount); + } + }); + }); + } + }; + + var PI$3 = 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} + */ + + function defaultLoading(api, opts) { + opts = opts || {}; + defaults(opts, { + text: 'loading', + textColor: '#000', + fontSize: 12, + fontWeight: 'normal', + fontStyle: 'normal', + fontFamily: 'sans-serif', + maskColor: 'rgba(255, 255, 255, 0.8)', + showSpinner: true, + color: '#5470c6', + spinnerRadius: 10, + lineWidth: 5, + zlevel: 0 + }); + var group = new Group(); + var mask = new Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + group.add(mask); + var textContent = new ZRText({ + style: { + text: opts.text, + fill: opts.textColor, + fontSize: opts.fontSize, + fontWeight: opts.fontWeight, + fontStyle: opts.fontStyle, + fontFamily: opts.fontFamily + } + }); + var labelRect = new Rect({ + style: { + fill: 'none' + }, + textContent: textContent, + textConfig: { + position: 'right', + distance: 10 + }, + zlevel: opts.zlevel, + z: 10001 + }); + group.add(labelRect); + var arc; + + if (opts.showSpinner) { + arc = new Arc({ + shape: { + startAngle: -PI$3 / 2, + endAngle: -PI$3 / 2 + 0.1, + r: opts.spinnerRadius + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: opts.lineWidth + }, + zlevel: opts.zlevel, + z: 10001 + }); + arc.animateShape(true).when(1000, { + endAngle: PI$3 * 3 / 2 + }).start('circularInOut'); + arc.animateShape(true).when(1000, { + startAngle: PI$3 * 3 / 2 + }).delay(300).start('circularInOut'); + group.add(arc); + } // Inject resize + + + group.resize = function () { + var textWidth = textContent.getBoundingRect().width; + var r = opts.showSpinner ? opts.spinnerRadius : 0; // cx = (containerWidth - arcDiameter - textDistance - textWidth) / 2 + // textDistance needs to be calculated when both animation and text exist + + var cx = (api.getWidth() - r * 2 - (opts.showSpinner && textWidth ? 10 : 0) - textWidth) / 2 - (opts.showSpinner && textWidth ? 0 : 5 + textWidth / 2) // only show the text + + (opts.showSpinner ? 0 : textWidth / 2) // only show the spinner + + (textWidth ? 0 : r); + var cy = api.getHeight() / 2; + opts.showSpinner && arc.setShape({ + cx: cx, + cy: cy + }); + 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; + } + + var Scheduler = + /** @class */ + function () { + function Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) { + // key: handlerUID + this._stageTaskMap = createHashMap(); + this.ecInstance = ecInstance; + this.api = api; // Fix current processors in case that in some rear cases that + // processors might be registered after echarts instance created. + // Register processors incrementally for a echarts instance is + // not supported by this stream architecture. + + dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice(); + visualHandlers = this._visualHandlers = visualHandlers.slice(); + this._allHandlers = dataProcessorHandlers.concat(visualHandlers); + } + + Scheduler.prototype.restoreData = function (ecModel, payload) { + // TODO: Only restore needed series and components, but not all components. + // Currently `restoreData` of all of the series and component will be called. + // But some independent components like `title`, `legend`, `graphic`, `toolbox`, + // `tooltip`, `axisPointer`, etc, do not need series refresh when `setOption`, + // and some components like coordinate system, axes, dataZoom, visualMap only + // need their target series refresh. + // (1) If we are implementing this feature some day, we should consider these cases: + // if a data processor depends on a component (e.g., dataZoomProcessor depends + // on the settings of `dataZoom`), it should be re-performed if the component + // is modified by `setOption`. + // (2) If a processor depends on sevral series, speicified by its `getTargetSeries`, + // it should be re-performed when the result array of `getTargetSeries` changed. + // We use `dependencies` to cover these issues. + // (3) How to update target series when coordinate system related components modified. + // TODO: simply the dirty mechanism? Check whether only the case here can set tasks dirty, + // and this case all of the tasks will be set as dirty. + ecModel.restoreData(payload); // Theoretically an overall task not only depends on each of its target series, but also + // depends on all of the series. + // The overall task is not in pipeline, and `ecModel.restoreData` only set pipeline tasks + // dirty. If `getTargetSeries` of an overall task returns nothing, we should also ensure + // that the overall task is set as dirty and to be performed, otherwise it probably cause + // state chaos. So we have to set dirty of all of the overall tasks manually, otherwise it + // probably cause state chaos (consider `dataZoomProcessor`). + + this._stageTaskMap.each(function (taskRecord) { + var overallTask = taskRecord.overallTask; + overallTask && overallTask.dirty(); + }); + }; // If seriesModel provided, incremental threshold is check by series data. + + + Scheduler.prototype.getPerformArgs = function (task, isBlock) { + // For overall task + if (!task.__pipeline) { + return; + } + + var pipeline = this._pipelineMap.get(task.__pipeline.id); + + var pCtx = pipeline.context; + var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex; + var step = incremental ? pipeline.step : null; + var modDataCount = pCtx && pCtx.modDataCount; + var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null; + return { + step: step, + modBy: modBy, + modDataCount: modDataCount + }; + }; + + Scheduler.prototype.getPipeline = function (pipelineId) { + return this._pipelineMap.get(pipelineId); + }; + /** + * Current, progressive rendering starts from visual and layout. + * Always detect render mode in the same stage, avoiding that incorrect + * detection caused by data filtering. + * Caution: + * `updateStreamModes` use `seriesModel.getData()`. + */ + + + Scheduler.prototype.updateStreamModes = function (seriesModel, view) { + var pipeline = this._pipelineMap.get(seriesModel.uid); + + var data = seriesModel.getData(); + var dataLen = data.count(); // `progressiveRender` means that can render progressively in each + // animation frame. Note that some types of series do not provide + // `view.incrementalPrepareRender` but support `chart.appendData`. We + // use the term `incremental` but not `progressive` to describe the + // case that `chart.appendData`. + + var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold; + var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold'); // TODO: modDataCount should not updated if `appendData`, otherwise cause whole repaint. + // see `test/candlestick-large3.html` + + var modDataCount = seriesModel.get('progressiveChunkMode') === 'mod' ? dataLen : null; + seriesModel.pipelineContext = pipeline.context = { + progressiveRender: progressiveRender, + modDataCount: modDataCount, + large: large + }; + }; + + Scheduler.prototype.restorePipelines = function (ecModel) { + var scheduler = this; + var pipelineMap = scheduler._pipelineMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var progressive = seriesModel.getProgressive(); + var pipelineId = seriesModel.uid; + pipelineMap.set(pipelineId, { + id: pipelineId, + head: null, + tail: null, + threshold: seriesModel.getProgressiveThreshold(), + progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()), + blockIndex: -1, + step: Math.round(progressive || 700), + count: 0 + }); + + scheduler._pipe(seriesModel, seriesModel.dataTask); + }); + }; + + Scheduler.prototype.prepareStageTasks = function () { + var stageTaskMap = this._stageTaskMap; + var ecModel = this.api.getModel(); + var api = this.api; + each(this._allHandlers, function (handler) { + var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, {}); + var errMsg = ''; + + if ("development" !== 'production') { + // Currently do not need to support to sepecify them both. + errMsg = '"reset" and "overallReset" must not be both specified.'; + } + + assert(!(handler.reset && handler.overallReset), errMsg); + handler.reset && this._createSeriesStageTask(handler, record, ecModel, api); + handler.overallReset && this._createOverallStageTask(handler, record, ecModel, api); + }, this); + }; + + Scheduler.prototype.prepareView = function (view, model, ecModel, api) { + var renderTask = view.renderTask; + var context = renderTask.context; + context.model = model; + context.ecModel = ecModel; + context.api = api; + renderTask.__block = !view.incrementalPrepareRender; + + this._pipe(model, renderTask); + }; + + Scheduler.prototype.performDataProcessorTasks = function (ecModel, payload) { + // If we do not use `block` here, it should be considered when to update modes. + this._performStageTasks(this._dataProcessorHandlers, ecModel, payload, { + block: true + }); + }; + + Scheduler.prototype.performVisualTasks = function (ecModel, payload, opt) { + this._performStageTasks(this._visualHandlers, ecModel, payload, opt); + }; + + Scheduler.prototype._performStageTasks = function (stageHandlers, ecModel, payload, opt) { + opt = opt || {}; + var unfinished = false; + var scheduler = this; + each(stageHandlers, function (stageHandler, idx) { + if (opt.visualType && opt.visualType !== stageHandler.visualType) { + return; + } + + var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid); + + var seriesTaskMap = stageHandlerRecord.seriesTaskMap; + var overallTask = stageHandlerRecord.overallTask; + + if (overallTask) { + var overallNeedDirty_1; + var agentStubMap = overallTask.agentStubMap; + agentStubMap.each(function (stub) { + if (needSetDirty(opt, stub)) { + stub.dirty(); + overallNeedDirty_1 = true; + } + }); + overallNeedDirty_1 && overallTask.dirty(); + scheduler.updatePayload(overallTask, payload); + var performArgs_1 = scheduler.getPerformArgs(overallTask, opt.block); // Execute stubs firstly, which may set the overall task dirty, + // then execute the overall task. And stub will call seriesModel.setData, + // which ensures that in the overallTask seriesModel.getData() will not + // return incorrect data. + + agentStubMap.each(function (stub) { + stub.perform(performArgs_1); + }); + + if (overallTask.perform(performArgs_1)) { + unfinished = true; + } + } else if (seriesTaskMap) { + seriesTaskMap.each(function (task, pipelineId) { + if (needSetDirty(opt, task)) { + task.dirty(); + } + + var performArgs = scheduler.getPerformArgs(task, opt.block); // FIXME + // if intending to decalare `performRawSeries` in handlers, only + // stream-independent (specifically, data item independent) operations can be + // performed. Because is a series is filtered, most of the tasks will not + // be performed. A stream-dependent operation probably cause wrong biz logic. + // Perhaps we should not provide a separate callback for this case instead + // of providing the config `performRawSeries`. The stream-dependent operaions + // and stream-independent operations should better not be mixed. + + performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model); + scheduler.updatePayload(task, payload); + + if (task.perform(performArgs)) { + unfinished = true; + } + }); + } + }); + + function needSetDirty(opt, task) { + return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id)); + } + + this.unfinished = unfinished || this.unfinished; + }; + + Scheduler.prototype.performSeriesTasks = function (ecModel) { + var unfinished; + ecModel.eachSeries(function (seriesModel) { + // Progress to the end for dataInit and dataRestore. + unfinished = seriesModel.dataTask.perform() || unfinished; + }); + this.unfinished = unfinished || this.unfinished; + }; + + Scheduler.prototype.plan = function () { + // Travel pipelines, check block. + this._pipelineMap.each(function (pipeline) { + var task = pipeline.tail; + + do { + if (task.__block) { + pipeline.blockIndex = task.__idxInPipeline; + break; + } + + task = task.getUpstream(); + } while (task); + }); + }; + + Scheduler.prototype.updatePayload = function (task, payload) { + payload !== 'remain' && (task.context.payload = payload); + }; + + Scheduler.prototype._createSeriesStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var oldSeriesTaskMap = stageHandlerRecord.seriesTaskMap; // The count of stages are totally about only several dozen, so + // do not need to reuse the map. + + var newSeriesTaskMap = stageHandlerRecord.seriesTaskMap = createHashMap(); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; // If a stageHandler should cover all series, `createOnAllSeries` should be declared mandatorily, + // to avoid some typo or abuse. Otherwise if an extension do not specify a `seriesType`, + // it works but it may cause other irrelevant charts blocked. + + if (stageHandler.createOnAllSeries) { + ecModel.eachRawSeries(create); + } else if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, create); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(create); + } + + function create(seriesModel) { + var pipelineId = seriesModel.uid; // Init tasks for each seriesModel only once. + // Reuse original task instance. + + var task = newSeriesTaskMap.set(pipelineId, oldSeriesTaskMap && oldSeriesTaskMap.get(pipelineId) || createTask({ + plan: seriesTaskPlan, + reset: seriesTaskReset, + count: seriesTaskCount + })); + task.context = { + model: seriesModel, + ecModel: ecModel, + api: api, + // PENDING: `useClearVisual` not used? + useClearVisual: stageHandler.isVisual && !stageHandler.isLayout, + plan: stageHandler.plan, + reset: stageHandler.reset, + scheduler: scheduler + }; + + scheduler._pipe(seriesModel, task); + } + }; + + Scheduler.prototype._createOverallStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask // For overall task, the function only be called on reset stage. + || createTask({ + reset: overallTaskReset + }); + overallTask.context = { + ecModel: ecModel, + api: api, + overallReset: stageHandler.overallReset, + scheduler: scheduler + }; + var oldAgentStubMap = overallTask.agentStubMap; // The count of stages are totally about only several dozen, so + // do not need to reuse the map. + + var newAgentStubMap = overallTask.agentStubMap = createHashMap(); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; + var overallProgress = true; + var shouldOverallTaskDirty = false; // FIXME:TS never used, so comment it + // let modifyOutputEnd = stageHandler.modifyOutputEnd; + // An overall task with seriesType detected or has `getTargetSeries`, we add + // stub in each pipelines, it will set the overall task dirty when the pipeline + // progress. Moreover, to avoid call the overall task each frame (too frequent), + // we set the pipeline block. + + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '"createOnAllSeries" do not supported for "overallReset", ' + 'becuase it will block all streams.'; + } + + assert(!stageHandler.createOnAllSeries, errMsg); + + if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, createStub); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(createStub); + } // Otherwise, (usually it is legancy case), the overall task will only be + // executed when upstream dirty. Otherwise the progressive rendering of all + // pipelines will be disabled unexpectedly. But it still needs stubs to receive + // dirty info from upsteam. + else { + overallProgress = false; + each(ecModel.getSeries(), createStub); + } + + function createStub(seriesModel) { + var pipelineId = seriesModel.uid; + var stub = newAgentStubMap.set(pipelineId, oldAgentStubMap && oldAgentStubMap.get(pipelineId) || ( // When the result of `getTargetSeries` changed, the overallTask + // should be set as dirty and re-performed. + shouldOverallTaskDirty = true, createTask({ + reset: stubReset, + onDirty: stubOnDirty + }))); + stub.context = { + model: seriesModel, + overallProgress: overallProgress // FIXME:TS never used, so comment it + // modifyOutputEnd: modifyOutputEnd + + }; + stub.agent = overallTask; + stub.__block = overallProgress; + + scheduler._pipe(seriesModel, stub); + } + + if (shouldOverallTaskDirty) { + overallTask.dirty(); + } + }; + + Scheduler.prototype._pipe = function (seriesModel, task) { + var pipelineId = seriesModel.uid; + + var pipeline = this._pipelineMap.get(pipelineId); + + !pipeline.head && (pipeline.head = task); + pipeline.tail && pipeline.tail.pipe(task); + pipeline.tail = task; + task.__idxInPipeline = pipeline.count++; + task.__pipeline = pipeline; + }; + + Scheduler.wrapStageHandler = function (stageHandler, visualType) { + if (isFunction(stageHandler)) { + stageHandler = { + overallReset: stageHandler, + seriesType: detectSeriseType(stageHandler) + }; + } + + stageHandler.uid = getUID('stageHandler'); + visualType && (stageHandler.visualType = visualType); + return stageHandler; + }; + return Scheduler; + }(); + + function overallTaskReset(context) { + context.overallReset(context.ecModel, context.api, context.payload); + } + + function stubReset(context) { + return context.overallProgress && stubProgress; + } + + function stubProgress() { + this.agent.dirty(); + this.getDownstream().dirty(); + } + + function stubOnDirty() { + this.agent && this.agent.dirty(); + } + + function seriesTaskPlan(context) { + return context.plan ? context.plan(context.model, context.ecModel, context.api, context.payload) : null; + } + + function seriesTaskReset(context) { + if (context.useClearVisual) { + context.data.clearAllVisual(); + } + + var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload)); + return resetDefines.length > 1 ? map(resetDefines, function (v, idx) { + return makeSeriesTaskProgress(idx); + }) : singleSeriesTaskProgress; + } + + var singleSeriesTaskProgress = makeSeriesTaskProgress(0); + + function makeSeriesTaskProgress(resetDefineIdx) { + return function (params, context) { + var data = context.data; + var resetDefine = context.resetDefines[resetDefineIdx]; + + if (resetDefine && resetDefine.dataEach) { + for (var i = params.start; i < params.end; i++) { + resetDefine.dataEach(data, i); + } + } else if (resetDefine && resetDefine.progress) { + resetDefine.progress(params, data); + } + }; + } + + function seriesTaskCount(context) { + return context.data.count(); + } + /** + * Only some legacy stage handlers (usually in echarts extensions) are pure function. + * To ensure that they can work normally, they should work in block mode, that is, + * they should not be started util the previous tasks finished. So they cause the + * progressive rendering disabled. We try to detect the series type, to narrow down + * the block range to only the series type they concern, but not all series. + */ + + + function detectSeriseType(legacyFunc) { + seriesType = null; + + try { + // Assume there is no async when calling `eachSeriesByType`. + legacyFunc(ecModelMock, apiMock); + } catch (e) {} + + return seriesType; + } + + var ecModelMock = {}; + var apiMock = {}; + var seriesType; + mockMethods(ecModelMock, GlobalModel); + mockMethods(apiMock, ExtensionAPI); + + ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function (type) { + seriesType = type; + }; + + ecModelMock.eachComponent = function (cond) { + if (cond.mainType === 'series' && cond.subType) { + seriesType = cond.subType; + } + }; + + function mockMethods(target, Clz) { + /* eslint-disable */ + for (var name_1 in Clz.prototype) { + // Do not use hasOwnProperty + target[name_1] = noop; + } + /* eslint-enable */ + + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF']; + var lightTheme = { + color: colorAll, + colorLayer: [['#37A2DA', '#ffd85c', '#fd7b5f'], ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'], ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'], colorAll] + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var contrastColor = '#B9B8CE'; + var backgroundColor = '#100C2A'; + + var axisCommon = function () { + return { + axisLine: { + lineStyle: { + color: contrastColor + } + }, + splitLine: { + lineStyle: { + color: '#484753' + } + }, + splitArea: { + areaStyle: { + color: ['rgba(255,255,255,0.02)', 'rgba(255,255,255,0.05)'] + } + }, + minorSplitLine: { + lineStyle: { + color: '#20203B' + } + } + }; + }; + + var colorPalette = ['#4992ff', '#7cffb2', '#fddd60', '#ff6e76', '#58d9f9', '#05c091', '#ff8a45', '#8d48e3', '#dd79ff']; + var theme = { + darkMode: true, + color: colorPalette, + backgroundColor: backgroundColor, + axisPointer: { + lineStyle: { + color: '#817f91' + }, + crossStyle: { + color: '#817f91' + }, + label: { + // TODO Contrast of label backgorundColor + color: '#fff' + } + }, + legend: { + textStyle: { + color: contrastColor + } + }, + textStyle: { + color: contrastColor + }, + title: { + textStyle: { + color: '#EEF1FA' + }, + subtextStyle: { + color: '#B9B8CE' + } + }, + toolbox: { + iconStyle: { + borderColor: contrastColor + } + }, + dataZoom: { + borderColor: '#71708A', + textStyle: { + color: contrastColor + }, + brushStyle: { + color: 'rgba(135,163,206,0.3)' + }, + handleStyle: { + color: '#353450', + borderColor: '#C5CBE3' + }, + moveHandleStyle: { + color: '#B0B6C3', + opacity: 0.3 + }, + fillerColor: 'rgba(135,163,206,0.2)', + emphasis: { + handleStyle: { + borderColor: '#91B7F2', + color: '#4D587D' + }, + moveHandleStyle: { + color: '#636D9A', + opacity: 0.7 + } + }, + dataBackground: { + lineStyle: { + color: '#71708A', + width: 1 + }, + areaStyle: { + color: '#71708A' + } + }, + selectedDataBackground: { + lineStyle: { + color: '#87A3CE' + }, + areaStyle: { + color: '#87A3CE' + } + } + }, + visualMap: { + textStyle: { + color: contrastColor + } + }, + timeline: { + lineStyle: { + color: contrastColor + }, + label: { + color: contrastColor + }, + controlStyle: { + color: contrastColor, + borderColor: contrastColor + } + }, + calendar: { + itemStyle: { + color: backgroundColor + }, + dayLabel: { + color: contrastColor + }, + monthLabel: { + color: contrastColor + }, + yearLabel: { + color: contrastColor + } + }, + timeAxis: axisCommon(), + logAxis: axisCommon(), + valueAxis: axisCommon(), + categoryAxis: axisCommon(), + line: { + symbol: 'circle' + }, + graph: { + color: colorPalette + }, + gauge: { + title: { + color: contrastColor + }, + axisLine: { + lineStyle: { + color: [[1, 'rgba(207,212,219,0.2)']] + } + }, + axisLabel: { + color: contrastColor + }, + detail: { + color: '#EEF1FA' + } + }, + candlestick: { + itemStyle: { + color: '#f64e56', + color0: '#54ea92', + borderColor: '#f64e56', + borderColor0: '#54ea92' // borderColor: '#ca2824', + // borderColor0: '#09a443' + + } + } + }; + theme.categoryAxis.splitLine.show = false; + + function parseXML(svg) { + if (isString(svg)) { + var parser = new DOMParser(); + svg = parser.parseFromString(svg, 'text/xml'); + } + var svgNode = svg; + if (svgNode.nodeType === 9) { + svgNode = svgNode.firstChild; + } + while (svgNode.nodeName.toLowerCase() !== 'svg' || svgNode.nodeType !== 1) { + svgNode = svgNode.nextSibling; + } + return svgNode; + } + + var storage = createHashMap(); + var mapDataStorage = { + /** + * Compatible with previous `echarts.registerMap`. + * @usage + * ```js + * $.get('USA.json', function (geoJson) { + * echarts.registerMap('USA', geoJson); + * // Or + * echarts.registerMap('USA', { + * geoJson: geoJson, + * specialAreas: {} + * }) + * }); + * + * $.get('airport.svg', function (svg) { + * echarts.registerMap('airport', { + * svg: svg + * } + * }); + * + * echarts.registerMap('eu', [ + * {svg: eu-topographic.svg}, + * {geoJSON: eu.json} + * ]) + * ``` + */ + registerMap: function (mapName, rawDef, rawSpecialAreas) { + var records; + + if (isArray(rawDef)) { + records = rawDef; + } else if (rawDef.svg) { + records = [{ + type: 'svg', + source: rawDef.svg, + specialAreas: rawDef.specialAreas + }]; + } else { + // Backward compatibility. + var geoSource = rawDef.geoJson || rawDef.geoJSON; + + if (geoSource && !rawDef.features) { + rawSpecialAreas = rawDef.specialAreas; + rawDef = geoSource; + } + + records = [{ + type: 'geoJSON', + source: rawDef, + specialAreas: rawSpecialAreas + }]; + } + + each(records, function (record) { + var type = record.type; + type === 'geoJson' && (type = record.type = 'geoJSON'); + var parse = parsers[type]; + + if ("development" !== 'production') { + assert(parse, 'Illegal map type: ' + type); + } + + parse(record); + }); + return storage.set(mapName, records); + }, + retrieveMap: function (mapName) { + return storage.get(mapName); + } + }; + var parsers = { + geoJSON: function (record) { + var source = record.source; + record.geoJSON = !isString(source) ? source : typeof JSON !== 'undefined' && JSON.parse ? JSON.parse(source) : new Function('return (' + source + ');')(); + }, + // Only perform parse to XML object here, which might be time + // consiming for large SVG. + // Although convert XML to zrender element is also time consiming, + // if we do it here, the clone of zrender elements has to be + // required. So we do it once for each geo instance, util real + // performance issues call for optimizing it. + svg: function (record) { + record.svgXML = parseXML(record.source); + } + }; + + /** + * Usage of query: + * `chart.on('click', query, handler);` + * The `query` can be: + * + The component type query string, only `mainType` or `mainType.subType`, + * like: 'xAxis', 'series', 'xAxis.category' or 'series.line'. + * + The component query object, like: + * `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`, + * `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`. + * + The data query object, like: + * `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`. + * + The other query object (cmponent customized query), like: + * `{element: 'some'}` (only available in custom series). + * + * Caveat: If a prop in the `query` object is `null/undefined`, it is the + * same as there is no such prop in the `query` object. + */ + + var ECEventProcessor = + /** @class */ + function () { + function ECEventProcessor() {} + + ECEventProcessor.prototype.normalizeQuery = function (query) { + var cptQuery = {}; + var dataQuery = {}; + var otherQuery = {}; // `query` is `mainType` or `mainType.subType` of component. + + if (isString(query)) { + var condCptType = parseClassType(query); // `.main` and `.sub` may be ''. + + cptQuery.mainType = condCptType.main || null; + cptQuery.subType = condCptType.sub || null; + } // `query` is an object, convert to {mainType, index, name, id}. + else { + // `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved, + // can not be used in `compomentModel.filterForExposedEvent`. + var suffixes_1 = ['Index', 'Name', 'Id']; + var dataKeys_1 = { + name: 1, + dataIndex: 1, + dataType: 1 + }; + each(query, function (val, key) { + var reserved = false; + + for (var i = 0; i < suffixes_1.length; i++) { + var propSuffix = suffixes_1[i]; + var suffixPos = key.lastIndexOf(propSuffix); + + if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) { + var mainType = key.slice(0, suffixPos); // Consider `dataIndex`. + + if (mainType !== 'data') { + cptQuery.mainType = mainType; + cptQuery[propSuffix.toLowerCase()] = val; + reserved = true; + } + } + } + + if (dataKeys_1.hasOwnProperty(key)) { + dataQuery[key] = val; + reserved = true; + } + + if (!reserved) { + otherQuery[key] = val; + } + }); + } + + return { + cptQuery: cptQuery, + dataQuery: dataQuery, + otherQuery: otherQuery + }; + }; + + ECEventProcessor.prototype.filter = function (eventType, query) { + // They should be assigned before each trigger call. + var eventInfo = this.eventInfo; + + if (!eventInfo) { + return true; + } + + var targetEl = eventInfo.targetEl; + var packedEvent = eventInfo.packedEvent; + var model = eventInfo.model; + var view = eventInfo.view; // For event like 'globalout'. + + if (!model || !view) { + return true; + } + + var cptQuery = query.cptQuery; + var dataQuery = query.dataQuery; + return check(cptQuery, model, 'mainType') && check(cptQuery, model, 'subType') && check(cptQuery, model, 'index', 'componentIndex') && check(cptQuery, model, 'name') && check(cptQuery, model, 'id') && check(dataQuery, packedEvent, 'name') && check(dataQuery, packedEvent, 'dataIndex') && check(dataQuery, packedEvent, 'dataType') && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent)); + + function check(query, host, prop, propOnHost) { + return query[prop] == null || host[propOnHost || prop] === query[prop]; + } + }; + + ECEventProcessor.prototype.afterTrigger = function () { + // Make sure the eventInfo wont be used in next trigger. + this.eventInfo = null; + }; + + return ECEventProcessor; + }(); + + var seriesSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + + if (seriesModel.legendSymbol) { + data.setVisual('legendSymbol', seriesModel.legendSymbol); + } + + if (!seriesModel.hasSymbolVisual) { + return; + } + + var symbolType = seriesModel.get('symbol'); + var symbolSize = seriesModel.get('symbolSize'); + var keepAspect = seriesModel.get('symbolKeepAspect'); + var symbolRotate = seriesModel.get('symbolRotate'); + var hasSymbolTypeCallback = isFunction(symbolType); + var hasSymbolSizeCallback = isFunction(symbolSize); + var hasSymbolRotateCallback = isFunction(symbolRotate); + var hasCallback = hasSymbolTypeCallback || hasSymbolSizeCallback || hasSymbolRotateCallback; + var seriesSymbol = !hasSymbolTypeCallback && symbolType ? symbolType : seriesModel.defaultSymbol; + var seriesSymbolSize = !hasSymbolSizeCallback ? symbolSize : null; + var seriesSymbolRotate = !hasSymbolRotateCallback ? symbolRotate : null; + data.setVisual({ + legendSymbol: seriesModel.legendSymbol || seriesSymbol, + // If seting callback functions on `symbol` or `symbolSize`, for simplicity and avoiding + // to bring trouble, we do not pick a reuslt from one of its calling on data item here, + // but just use the default value. Callback on `symbol` or `symbolSize` is convenient in + // some cases but generally it is not recommanded. + symbol: seriesSymbol, + symbolSize: seriesSymbolSize, + symbolKeepAspect: keepAspect, + symbolRotate: seriesSymbolRotate + }); // Only visible series has each data be visual encoded + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + function dataEach(data, idx) { + var rawValue = seriesModel.getRawValue(idx); + var params = seriesModel.getDataParams(idx); + hasSymbolTypeCallback && data.setItemVisual(idx, 'symbol', symbolType(rawValue, params)); + hasSymbolSizeCallback && data.setItemVisual(idx, 'symbolSize', symbolSize(rawValue, params)); + hasSymbolRotateCallback && data.setItemVisual(idx, 'symbolRotate', symbolRotate(rawValue, params)); + } + + return { + dataEach: hasCallback ? dataEach : null + }; + } + }; + var dataSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (!seriesModel.hasSymbolVisual) { + return; + } // Only visible series has each data be visual encoded + + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + var itemSymbolType = itemModel.getShallow('symbol', true); + var itemSymbolSize = itemModel.getShallow('symbolSize', true); + var itemSymbolRotate = itemModel.getShallow('symbolRotate', true); + var itemSymbolKeepAspect = itemModel.getShallow('symbolKeepAspect', true); // If has item symbol + + if (itemSymbolType != null) { + data.setItemVisual(idx, 'symbol', itemSymbolType); + } + + if (itemSymbolSize != null) { + // PENDING Transform symbolSize ? + data.setItemVisual(idx, 'symbolSize', itemSymbolSize); + } + + if (itemSymbolRotate != null) { + data.setItemVisual(idx, 'symbolRotate', itemSymbolRotate); + } + + if (itemSymbolKeepAspect != null) { + data.setItemVisual(idx, 'symbolKeepAspect', itemSymbolKeepAspect); + } + } + + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function getItemVisualFromData(data, dataIndex, key) { + switch (key) { + case 'color': + var style = data.getItemVisual(dataIndex, 'style'); + return style[data.getVisual('drawType')]; + + case 'opacity': + return data.getItemVisual(dataIndex, 'style').opacity; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + return data.getItemVisual(dataIndex, key); + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + function getVisualFromData(data, key) { + switch (key) { + case 'color': + var style = data.getVisual('style'); + return style[data.getVisual('drawType')]; + + case 'opacity': + return data.getVisual('style').opacity; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + return data.getVisual(key); + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + function setItemVisualFromData(data, dataIndex, key, value) { + switch (key) { + case 'color': + // Make sure not sharing style object. + var style = data.ensureUniqueItemVisual(dataIndex, 'style'); + style[data.getVisual('drawType')] = value; // Mark the color has been changed, not from palette anymore + + data.setItemVisual(dataIndex, 'colorFromPalette', false); + break; + + case 'opacity': + data.ensureUniqueItemVisual(dataIndex, 'style').opacity = value; + break; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + data.setItemVisual(dataIndex, key, value); + break; + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + + var PI2$6 = Math.PI * 2; + var CMD$3 = PathProxy.CMD; + var DEFAULT_SEARCH_SPACE = ['top', 'right', 'bottom', 'left']; + + function getCandidateAnchor(pos, distance, rect, outPt, outDir) { + var width = rect.width; + var height = rect.height; + + switch (pos) { + case 'top': + outPt.set(rect.x + width / 2, rect.y - distance); + outDir.set(0, -1); + break; + + case 'bottom': + outPt.set(rect.x + width / 2, rect.y + height + distance); + outDir.set(0, 1); + break; + + case 'left': + outPt.set(rect.x - distance, rect.y + height / 2); + outDir.set(-1, 0); + break; + + case 'right': + outPt.set(rect.x + width + distance, rect.y + height / 2); + outDir.set(1, 0); + break; + } + } + + function projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) { + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + x /= d; + y /= d; // Intersect point. + + var ox = x * r + cx; + var oy = y * r + cy; + + if (Math.abs(startAngle - endAngle) % PI2$6 < 1e-4) { + // Is a circle + out[0] = ox; + out[1] = oy; + return d - r; + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + + if (startAngle > endAngle) { + endAngle += PI2$6; + } + + var angle = Math.atan2(y, x); + + if (angle < 0) { + angle += PI2$6; + } + + if (angle >= startAngle && angle <= endAngle || angle + PI2$6 >= startAngle && angle + PI2$6 <= endAngle) { + // Project point is on the arc. + out[0] = ox; + out[1] = oy; + return d - r; + } + + var x1 = r * Math.cos(startAngle) + cx; + var y1 = r * Math.sin(startAngle) + cy; + var x2 = r * Math.cos(endAngle) + cx; + var y2 = r * Math.sin(endAngle) + cy; + var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y); + var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y); + + if (d1 < d2) { + out[0] = x1; + out[1] = y1; + return Math.sqrt(d1); + } else { + out[0] = x2; + out[1] = y2; + return Math.sqrt(d2); + } + } + + function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) { + var dx = x - x1; + var dy = y - y1; + var dx1 = x2 - x1; + var dy1 = y2 - y1; + var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1); + dx1 /= lineLen; + dy1 /= lineLen; // dot product + + var projectedLen = dx * dx1 + dy * dy1; + var t = projectedLen / lineLen; + + if (limitToEnds) { + t = Math.min(Math.max(t, 0), 1); + } + + t *= lineLen; + var ox = out[0] = x1 + t * dx1; + var oy = out[1] = y1 + t * dy1; + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); + } + + function projectPointToRect(x1, y1, width, height, x, y, out) { + if (width < 0) { + x1 = x1 + width; + width = -width; + } + + if (height < 0) { + y1 = y1 + height; + height = -height; + } + + var x2 = x1 + width; + var y2 = y1 + height; + var ox = out[0] = Math.min(Math.max(x, x1), x2); + var oy = out[1] = Math.min(Math.max(y, y1), y2); + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); + } + + var tmpPt = []; + + function nearestPointOnRect(pt, rect, out) { + var dist = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt); + out.set(tmpPt[0], tmpPt[1]); + return dist; + } + /** + * Calculate min distance corresponding point. + * This method won't evaluate if point is in the path. + */ + + + function nearestPointOnPath(pt, path, out) { + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + var minDist = Infinity; + var data = path.data; + var x = pt.x; + var y = pt.y; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + + if (i === 1) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + + var d = minDist; + + switch (cmd) { + case CMD$3.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + + case CMD$3.L: + d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.C: + d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.Q: + d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.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 旋转 + + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; // 不是直接使用 arc 命令 + + if (i <= 1) { + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + + + var _x = (x - cx) * ry / rx + cx; + + d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt); + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + + case CMD$3.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + d = projectPointToRect(x0, y0, width, height, x, y, tmpPt); + break; + + case CMD$3.Z: + d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true); + xi = x0; + yi = y0; + break; + } + + if (d < minDist) { + minDist = d; + out.set(tmpPt[0], tmpPt[1]); + } + } + + return minDist; + } // Temporal varible for intermediate usage. + + + var pt0 = new Point(); + var pt1 = new Point(); + var pt2 = new Point(); + var dir = new Point(); + var dir2 = new Point(); + /** + * Calculate a proper guide line based on the label position and graphic element definition + * @param label + * @param labelRect + * @param target + * @param targetRect + */ + + function updateLabelLinePoints(target, labelLineModel) { + if (!target) { + return; + } + + var labelLine = target.getTextGuideLine(); + var label = target.getTextContent(); // Needs to create text guide in each charts. + + if (!(label && labelLine)) { + return; + } + + var labelGuideConfig = target.textGuideLineConfig || {}; + var points = [[0, 0], [0, 0], [0, 0]]; + var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE; + var labelRect = label.getBoundingRect().clone(); + labelRect.applyTransform(label.getComputedTransform()); + var minDist = Infinity; + var anchorPoint = labelGuideConfig.anchor; + var targetTransform = target.getComputedTransform(); + var targetInversedTransform = targetTransform && invert([], targetTransform); + var len = labelLineModel.get('length2') || 0; + + if (anchorPoint) { + pt2.copy(anchorPoint); + } + + for (var i = 0; i < searchSpace.length; i++) { + var candidate = searchSpace[i]; + getCandidateAnchor(candidate, 0, labelRect, pt0, dir); + Point.scaleAndAdd(pt1, pt0, dir, len); // Transform to target coord space. + + pt1.transform(targetInversedTransform); // Note: getBoundingRect will ensure the `path` being created. + + var boundingRect = target.getBoundingRect(); + var dist = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2); // TODO pt2 is in the path + + if (dist < minDist) { + minDist = dist; // Transform back to global space. + + pt1.transform(targetTransform); + pt2.transform(targetTransform); + pt2.toArray(points[0]); + pt1.toArray(points[1]); + pt0.toArray(points[2]); + } + } + + limitTurnAngle(points, labelLineModel.get('minTurnAngle')); + labelLine.setShape({ + points: points + }); + } // Temporal variable for the limitTurnAngle function + + var tmpArr = []; + var tmpProjPoint = new Point(); + /** + * Reduce the line segment attached to the label to limit the turn angle between two segments. + * @param linePoints + * @param minTurnAngle Radian of minimum turn angle. 0 - 180 + */ + + function limitTurnAngle(linePoints, minTurnAngle) { + if (!(minTurnAngle <= 180 && minTurnAngle > 0)) { + return; + } + + minTurnAngle = minTurnAngle / 180 * Math.PI; // The line points can be + // /pt1----pt2 (label) + // / + // pt0/ + + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt0, pt1); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(dir2); + var minTurnAngleCos = Math.cos(minTurnAngle); + + if (minTurnAngleCos < angleCos) { + // Smaller than minTurnAngle + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); + tmpProjPoint.fromArray(tmpArr); // Calculate new projected length with limited minTurnAngle and get the new connect point + + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); // Limit the new calculated connect point between pt1 and pt2. + + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + + if (isNaN(t)) { + return; + } + + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + + tmpProjPoint.toArray(linePoints[1]); + } + } + /** + * Limit the angle of line and the surface + * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite + */ + + function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) { + if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) { + return; + } + + maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI; + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt1, pt0); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(surfaceNormal); + var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle); + + if (angleCos < maxSurfaceAngleCos) { + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); + tmpProjPoint.fromArray(tmpArr); + var HALF_PI = Math.PI / 2; + var angle2 = Math.acos(dir2.dot(surfaceNormal)); + var newAngle = HALF_PI + angle2 - maxSurfaceAngle; + + if (newAngle >= HALF_PI) { + // parallel + Point.copy(tmpProjPoint, pt2); + } else { + // Calculate new projected length with limited minTurnAngle and get the new connect point + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle)); // Limit the new calculated connect point between pt1 and pt2. + + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + + if (isNaN(t)) { + return; + } + + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + } + + tmpProjPoint.toArray(linePoints[1]); + } + } + + function setLabelLineState(labelLine, ignore, stateName, stateModel) { + var isNormal = stateName === 'normal'; + var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName); // Make sure display. + + stateObj.ignore = ignore; // Set smooth + + var smooth = stateModel.get('smooth'); + + if (smooth && smooth === true) { + smooth = 0.3; + } + + stateObj.shape = stateObj.shape || {}; + + if (smooth > 0) { + stateObj.shape.smooth = smooth; + } + + var styleObj = stateModel.getModel('lineStyle').getLineStyle(); + isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj; + } + + function buildLabelLinePath(path, shape) { + var smooth = shape.smooth; + var points = shape.points; + + if (!points) { + return; + } + + path.moveTo(points[0][0], points[0][1]); + + if (smooth > 0 && points.length >= 3) { + var len1 = dist(points[0], points[1]); + var len2 = dist(points[1], points[2]); + + if (!len1 || !len2) { + path.lineTo(points[1][0], points[1][1]); + path.lineTo(points[2][0], points[2][1]); + return; + } + + var moveLen = Math.min(len1, len2) * smooth; + var midPoint0 = lerp([], points[1], points[0], moveLen / len1); + var midPoint2 = lerp([], points[1], points[2], moveLen / len2); + var midPoint1 = lerp([], midPoint0, midPoint2, 0.5); + path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]); + path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]); + } else { + for (var i = 1; i < points.length; i++) { + path.lineTo(points[i][0], points[i][1]); + } + } + } + /** + * Create a label line if necessary and set it's style. + */ + + + function setLabelLineStyle(targetEl, statesModels, defaultStyle) { + var labelLine = targetEl.getTextGuideLine(); + var label = targetEl.getTextContent(); + + if (!label) { + // Not show label line if there is no label. + if (labelLine) { + targetEl.removeTextGuideLine(); + } + + return; + } + + var normalModel = statesModels.normal; + var showNormal = normalModel.get('show'); + var labelIgnoreNormal = label.ignore; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateName = DISPLAY_STATES[i]; + var stateModel = statesModels[stateName]; + var isNormal = stateName === 'normal'; + + if (stateModel) { + var stateShow = stateModel.get('show'); + var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal); + + if (isLabelIgnored // Not show when label is not shown in this state. + || !retrieve2(stateShow, showNormal) // Use normal state by default if not set. + ) { + var stateObj = isNormal ? labelLine : labelLine && labelLine.states.normal; + + if (stateObj) { + stateObj.ignore = true; + } + + continue; + } // Create labelLine if not exists + + + if (!labelLine) { + labelLine = new Polyline(); + targetEl.setTextGuideLine(labelLine); // Reset state of normal because it's new created. + // NOTE: NORMAL should always been the first! + + if (!isNormal && (labelIgnoreNormal || !showNormal)) { + setLabelLineState(labelLine, true, 'normal', statesModels.normal); + } // Use same state proxy. + + + if (targetEl.stateProxy) { + labelLine.stateProxy = targetEl.stateProxy; + } + } + + setLabelLineState(labelLine, false, stateName, stateModel); + } + } + + if (labelLine) { + defaults(labelLine.style, defaultStyle); // Not fill. + + labelLine.style.fill = null; + var showAbove = normalModel.get('showAbove'); + var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {}; + labelLineConfig.showAbove = showAbove || false; // Custom the buildPath. + + labelLine.buildPath = buildLabelLinePath; + } + } + function getLabelLineStatesModels(itemModel, labelLineName) { + labelLineName = labelLineName || 'labelLine'; + var statesModels = { + normal: itemModel.getModel(labelLineName) + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelLineName]); + } + + return statesModels; + } + + function prepareLayoutList(input) { + var list = []; + + for (var i = 0; i < input.length; i++) { + var rawItem = input[i]; + + if (rawItem.defaultAttr.ignore) { + continue; + } + + var label = rawItem.label; + var transform = label.getComputedTransform(); // NOTE: Get bounding rect after getComputedTransform, or label may not been updated by the host el. + + var localRect = label.getBoundingRect(); + var isAxisAligned = !transform || transform[1] < 1e-5 && transform[2] < 1e-5; + var minMargin = label.style.margin || 0; + var globalRect = localRect.clone(); + globalRect.applyTransform(transform); + globalRect.x -= minMargin / 2; + globalRect.y -= minMargin / 2; + globalRect.width += minMargin; + globalRect.height += minMargin; + var obb = isAxisAligned ? new OrientedBoundingRect(localRect, transform) : null; + list.push({ + label: label, + labelLine: rawItem.labelLine, + rect: globalRect, + localRect: localRect, + obb: obb, + priority: rawItem.priority, + defaultAttr: rawItem.defaultAttr, + layoutOption: rawItem.computedLayoutOption, + axisAligned: isAxisAligned, + transform: transform + }); + } + + return list; + } + + function shiftLayout(list, xyDim, sizeDim, minBound, maxBound, balanceShift) { + var len = list.length; + + if (len < 2) { + return; + } + + list.sort(function (a, b) { + return a.rect[xyDim] - b.rect[xyDim]; + }); + var lastPos = 0; + var delta; + var adjusted = false; + var totalShifts = 0; + + for (var i = 0; i < len; i++) { + var item = list[i]; + var rect = item.rect; + delta = rect[xyDim] - lastPos; + + if (delta < 0) { + // shiftForward(i, len, -delta); + rect[xyDim] -= delta; + item.label[xyDim] -= delta; + adjusted = true; + } + + var shift = Math.max(-delta, 0); + totalShifts += shift; + lastPos = rect[xyDim] + rect[sizeDim]; + } + + if (totalShifts > 0 && balanceShift) { + // Shift back to make the distribution more equally. + shiftList(-totalShifts / len, 0, len); + } // TODO bleedMargin? + + + var first = list[0]; + var last = list[len - 1]; + var minGap; + var maxGap; + updateMinMaxGap(); // If ends exceed two bounds, squeeze at most 80%, then take the gap of two bounds. + + minGap < 0 && squeezeGaps(-minGap, 0.8); + maxGap < 0 && squeezeGaps(maxGap, 0.8); + updateMinMaxGap(); + takeBoundsGap(minGap, maxGap, 1); + takeBoundsGap(maxGap, minGap, -1); // Handle bailout when there is not enough space. + + updateMinMaxGap(); + + if (minGap < 0) { + squeezeWhenBailout(-minGap); + } + + if (maxGap < 0) { + squeezeWhenBailout(maxGap); + } + + function updateMinMaxGap() { + minGap = first.rect[xyDim] - minBound; + maxGap = maxBound - last.rect[xyDim] - last.rect[sizeDim]; + } + + function takeBoundsGap(gapThisBound, gapOtherBound, moveDir) { + if (gapThisBound < 0) { + // Move from other gap if can. + var moveFromMaxGap = Math.min(gapOtherBound, -gapThisBound); + + if (moveFromMaxGap > 0) { + shiftList(moveFromMaxGap * moveDir, 0, len); + var remained = moveFromMaxGap + gapThisBound; + + if (remained < 0) { + squeezeGaps(-remained * moveDir, 1); + } + } else { + squeezeGaps(-gapThisBound * moveDir, 1); + } + } + } + + function shiftList(delta, start, end) { + if (delta !== 0) { + adjusted = true; + } + + for (var i = start; i < end; i++) { + var item = list[i]; + var rect = item.rect; + rect[xyDim] += delta; + item.label[xyDim] += delta; + } + } // Squeeze gaps if the labels exceed margin. + + + function squeezeGaps(delta, maxSqeezePercent) { + var gaps = []; + var totalGaps = 0; + + for (var i = 1; i < len; i++) { + var prevItemRect = list[i - 1].rect; + var gap = Math.max(list[i].rect[xyDim] - prevItemRect[xyDim] - prevItemRect[sizeDim], 0); + gaps.push(gap); + totalGaps += gap; + } + + if (!totalGaps) { + return; + } + + var squeezePercent = Math.min(Math.abs(delta) / totalGaps, maxSqeezePercent); + + if (delta > 0) { + for (var i = 0; i < len - 1; i++) { + // Distribute the shift delta to all gaps. + var movement = gaps[i] * squeezePercent; // Forward + + shiftList(movement, 0, i + 1); + } + } else { + // Backward + for (var i = len - 1; i > 0; i--) { + // Distribute the shift delta to all gaps. + var movement = gaps[i - 1] * squeezePercent; + shiftList(-movement, i, len); + } + } + } + /** + * Squeeze to allow overlap if there is no more space available. + * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds. + */ + + + function squeezeWhenBailout(delta) { + var dir = delta < 0 ? -1 : 1; + delta = Math.abs(delta); + var moveForEachLabel = Math.ceil(delta / (len - 1)); + + for (var i = 0; i < len - 1; i++) { + if (dir > 0) { + // Forward + shiftList(moveForEachLabel, 0, i + 1); + } else { + // Backward + shiftList(-moveForEachLabel, len - i - 1, len); + } + + delta -= moveForEachLabel; + + if (delta <= 0) { + return; + } + } + } + + return adjusted; + } + /** + * Adjust labels on x direction to avoid overlap. + */ + + + function shiftLayoutOnX(list, leftBound, rightBound, // If average the shifts on all labels and add them to 0 + // TODO: Not sure if should enable it. + // Pros: The angle of lines will distribute more equally + // Cons: In some layout. It may not what user wanted. like in pie. the label of last sector is usually changed unexpectedly. + balanceShift) { + return shiftLayout(list, 'x', 'width', leftBound, rightBound, balanceShift); + } + /** + * Adjust labels on y direction to avoid overlap. + */ + + function shiftLayoutOnY(list, topBound, bottomBound, // If average the shifts on all labels and add them to 0 + balanceShift) { + return shiftLayout(list, 'y', 'height', topBound, bottomBound, balanceShift); + } + function hideOverlap(labelList) { + var displayedLabels = []; // TODO, render overflow visible first, put in the displayedLabels. + + labelList.sort(function (a, b) { + return b.priority - a.priority; + }); + var globalRect = new BoundingRect(0, 0, 0, 0); + + function hideEl(el) { + if (!el.ignore) { + // Show on emphasis. + var emphasisState = el.ensureState('emphasis'); + + if (emphasisState.ignore == null) { + emphasisState.ignore = false; + } + } + + el.ignore = true; + } + + for (var i = 0; i < labelList.length; i++) { + var labelItem = labelList[i]; + var isAxisAligned = labelItem.axisAligned; + var localRect = labelItem.localRect; + var transform = labelItem.transform; + var label = labelItem.label; + var labelLine = labelItem.labelLine; + globalRect.copy(labelItem.rect); // Add a threshold because layout may be aligned precisely. + + globalRect.width -= 0.1; + globalRect.height -= 0.1; + globalRect.x += 0.05; + globalRect.y += 0.05; + var obb = labelItem.obb; + var overlapped = false; + + for (var j = 0; j < displayedLabels.length; j++) { + var existsTextCfg = displayedLabels[j]; // Fast rejection. + + if (!globalRect.intersect(existsTextCfg.rect)) { + continue; + } + + if (isAxisAligned && existsTextCfg.axisAligned) { + // Is overlapped + overlapped = true; + break; + } + + if (!existsTextCfg.obb) { + // If self is not axis aligned. But other is. + existsTextCfg.obb = new OrientedBoundingRect(existsTextCfg.localRect, existsTextCfg.transform); + } + + if (!obb) { + // If self is axis aligned. But other is not. + obb = new OrientedBoundingRect(localRect, transform); + } + + if (obb.intersect(existsTextCfg.obb)) { + overlapped = true; + break; + } + } // TODO Callback to determine if this overlap should be handled? + + + if (overlapped) { + hideEl(label); + labelLine && hideEl(labelLine); + } else { + label.attr('ignore', labelItem.defaultAttr.ignore); + labelLine && labelLine.attr('ignore', labelItem.defaultAttr.labelGuideIgnore); + displayedLabels.push(labelItem); + } + } + } + + function cloneArr(points) { + if (points) { + var newPoints = []; + + for (var i = 0; i < points.length; i++) { + newPoints.push(points[i].slice()); + } + + return newPoints; + } + } + + function prepareLayoutCallbackParams(labelItem, hostEl) { + var label = labelItem.label; + var labelLine = hostEl && hostEl.getTextGuideLine(); + return { + dataIndex: labelItem.dataIndex, + dataType: labelItem.dataType, + seriesIndex: labelItem.seriesModel.seriesIndex, + text: labelItem.label.style.text, + rect: labelItem.hostRect, + labelRect: labelItem.rect, + // x: labelAttr.x, + // y: labelAttr.y, + align: label.style.align, + verticalAlign: label.style.verticalAlign, + labelLinePoints: cloneArr(labelLine && labelLine.shape.points) + }; + } + + var LABEL_OPTION_TO_STYLE_KEYS = ['align', 'verticalAlign', 'width', 'height', 'fontSize']; + var dummyTransformable = new Transformable(); + var labelLayoutInnerStore = makeInner(); + var labelLineAnimationStore = makeInner(); + + function extendWithKeys(target, source, keys) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (source[key] != null) { + target[key] = source[key]; + } + } + } + + var LABEL_LAYOUT_PROPS = ['x', 'y', 'rotation']; + + var LabelManager = + /** @class */ + function () { + function LabelManager() { + this._labelList = []; + this._chartViewList = []; + } + + LabelManager.prototype.clearLabels = function () { + this._labelList = []; + this._chartViewList = []; + }; + /** + * Add label to manager + */ + + + LabelManager.prototype._addLabel = function (dataIndex, dataType, seriesModel, label, layoutOption) { + var labelStyle = label.style; + var hostEl = label.__hostTarget; + var textConfig = hostEl.textConfig || {}; // TODO: If label is in other state. + + var labelTransform = label.getComputedTransform(); + var labelRect = label.getBoundingRect().plain(); + BoundingRect.applyTransform(labelRect, labelRect, labelTransform); + + if (labelTransform) { + dummyTransformable.setLocalTransform(labelTransform); + } else { + // Identity transform. + dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0; + dummyTransformable.scaleX = dummyTransformable.scaleY = 1; + } + + var host = label.__hostTarget; + var hostRect; + + if (host) { + hostRect = host.getBoundingRect().plain(); + var transform = host.getComputedTransform(); + BoundingRect.applyTransform(hostRect, hostRect, transform); + } + + var labelGuide = hostRect && host.getTextGuideLine(); + + this._labelList.push({ + label: label, + labelLine: labelGuide, + seriesModel: seriesModel, + dataIndex: dataIndex, + dataType: dataType, + layoutOption: layoutOption, + computedLayoutOption: null, + rect: labelRect, + hostRect: hostRect, + // Label with lower priority will be hidden when overlapped + // Use rect size as default priority + priority: hostRect ? hostRect.width * hostRect.height : 0, + // Save default label attributes. + // For restore if developers want get back to default value in callback. + defaultAttr: { + ignore: label.ignore, + labelGuideIgnore: labelGuide && labelGuide.ignore, + x: dummyTransformable.x, + y: dummyTransformable.y, + rotation: dummyTransformable.rotation, + style: { + x: labelStyle.x, + y: labelStyle.y, + align: labelStyle.align, + verticalAlign: labelStyle.verticalAlign, + width: labelStyle.width, + height: labelStyle.height, + fontSize: labelStyle.fontSize + }, + cursor: label.cursor, + attachedPos: textConfig.position, + attachedRot: textConfig.rotation + } + }); + }; + + LabelManager.prototype.addLabelsOfSeries = function (chartView) { + var _this = this; + + this._chartViewList.push(chartView); + + var seriesModel = chartView.__model; + var layoutOption = seriesModel.get('labelLayout'); + /** + * Ignore layouting if it's not specified anything. + */ + + if (!(isFunction(layoutOption) || keys(layoutOption).length)) { + return; + } + + chartView.group.traverse(function (child) { + if (child.ignore) { + return true; // Stop traverse descendants. + } // Only support label being hosted on graphic elements. + + + var textEl = child.getTextContent(); + var ecData = getECData(child); // Can only attach the text on the element with dataIndex + + if (textEl && !textEl.disableLabelLayout) { + _this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption); + } + }); + }; + + LabelManager.prototype.updateLayoutConfig = function (api) { + var width = api.getWidth(); + var height = api.getHeight(); + + function createDragHandler(el, labelLineModel) { + return function () { + updateLabelLinePoints(el, labelLineModel); + }; + } + + for (var i = 0; i < this._labelList.length; i++) { + var labelItem = this._labelList[i]; + var label = labelItem.label; + var hostEl = label.__hostTarget; + var defaultLabelAttr = labelItem.defaultAttr; + var layoutOption = void 0; // TODO A global layout option? + + if (typeof labelItem.layoutOption === 'function') { + layoutOption = labelItem.layoutOption(prepareLayoutCallbackParams(labelItem, hostEl)); + } else { + layoutOption = labelItem.layoutOption; + } + + layoutOption = layoutOption || {}; + labelItem.computedLayoutOption = layoutOption; + var degreeToRadian = Math.PI / 180; + + if (hostEl) { + hostEl.setTextConfig({ + // Force to set local false. + local: false, + // Ignore position and rotation config on the host el if x or y is changed. + position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos, + // Ignore rotation config on the host el if rotation is changed. + rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot, + offset: [layoutOption.dx || 0, layoutOption.dy || 0] + }); + } + + var needsUpdateLabelLine = false; + + if (layoutOption.x != null) { + // TODO width of chart view. + label.x = parsePercent$1(layoutOption.x, width); + label.setStyle('x', 0); // Ignore movement in style. TODO: origin. + + needsUpdateLabelLine = true; + } else { + label.x = defaultLabelAttr.x; + label.setStyle('x', defaultLabelAttr.style.x); + } + + if (layoutOption.y != null) { + // TODO height of chart view. + label.y = parsePercent$1(layoutOption.y, height); + label.setStyle('y', 0); // Ignore movement in style. + + needsUpdateLabelLine = true; + } else { + label.y = defaultLabelAttr.y; + label.setStyle('y', defaultLabelAttr.style.y); + } + + if (layoutOption.labelLinePoints) { + var guideLine = hostEl.getTextGuideLine(); + + if (guideLine) { + guideLine.setShape({ + points: layoutOption.labelLinePoints + }); // Not update + + needsUpdateLabelLine = false; + } + } + + var labelLayoutStore = labelLayoutInnerStore(label); + labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine; + label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation; + + for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) { + var key = LABEL_OPTION_TO_STYLE_KEYS[k]; + label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]); + } + + if (layoutOption.draggable) { + label.draggable = true; + label.cursor = 'move'; + + if (hostEl) { + var hostModel = labelItem.seriesModel; + + if (labelItem.dataIndex != null) { + var data = labelItem.seriesModel.getData(labelItem.dataType); + hostModel = data.getItemModel(labelItem.dataIndex); + } + + label.on('drag', createDragHandler(hostEl, hostModel.getModel('labelLine'))); + } + } else { + // TODO Other drag functions? + label.off('drag'); + label.cursor = defaultLabelAttr.cursor; + } + } + }; + + LabelManager.prototype.layout = function (api) { + var width = api.getWidth(); + var height = api.getHeight(); + var labelList = prepareLayoutList(this._labelList); + var labelsNeedsAdjustOnX = filter(labelList, function (item) { + return item.layoutOption.moveOverlap === 'shiftX'; + }); + var labelsNeedsAdjustOnY = filter(labelList, function (item) { + return item.layoutOption.moveOverlap === 'shiftY'; + }); + shiftLayoutOnX(labelsNeedsAdjustOnX, 0, width); + shiftLayoutOnY(labelsNeedsAdjustOnY, 0, height); + var labelsNeedsHideOverlap = filter(labelList, function (item) { + return item.layoutOption.hideOverlap; + }); + hideOverlap(labelsNeedsHideOverlap); + }; + /** + * Process all labels. Not only labels with layoutOption. + */ + + + LabelManager.prototype.processLabelsOverall = function () { + var _this = this; + + each(this._chartViewList, function (chartView) { + var seriesModel = chartView.__model; + var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate; + var animationEnabled = seriesModel.isAnimationEnabled(); + chartView.group.traverse(function (child) { + if (child.ignore) { + return true; // Stop traverse descendants. + } + + var needsUpdateLabelLine = !ignoreLabelLineUpdate; + var label = child.getTextContent(); + + if (!needsUpdateLabelLine && label) { + needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine; + } + + if (needsUpdateLabelLine) { + _this._updateLabelLine(child, seriesModel); + } + + if (animationEnabled) { + _this._animateLabels(child, seriesModel); + } + }); + }); + }; + + LabelManager.prototype._updateLabelLine = function (el, seriesModel) { + // Only support label being hosted on graphic elements. + var textEl = el.getTextContent(); // Update label line style. + + var ecData = getECData(el); + var dataIndex = ecData.dataIndex; // Only support labelLine on the labels represent data. + + if (textEl && dataIndex != null) { + var data = seriesModel.getData(ecData.dataType); + var itemModel = data.getItemModel(dataIndex); + var defaultStyle = {}; + var visualStyle = data.getItemVisual(dataIndex, 'style'); + var visualType = data.getVisual('drawType'); // Default to be same with main color + + defaultStyle.stroke = visualStyle[visualType]; + var labelLineModel = itemModel.getModel('labelLine'); + setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle); + updateLabelLinePoints(el, labelLineModel); + } + }; + + LabelManager.prototype._animateLabels = function (el, seriesModel) { + var textEl = el.getTextContent(); + var guideLine = el.getTextGuideLine(); // Animate + + if (textEl && !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el)) { + var layoutStore = labelLayoutInnerStore(textEl); + var oldLayout = layoutStore.oldLayout; + var ecData = getECData(el); + var dataIndex = ecData.dataIndex; + var newProps = { + x: textEl.x, + y: textEl.y, + rotation: textEl.rotation + }; + var data = seriesModel.getData(ecData.dataType); + + if (!oldLayout) { + textEl.attr(newProps); // Disable fade in animation if value animation is enabled. + + if (!labelInner(textEl).valueAnimation) { + var oldOpacity = retrieve2(textEl.style.opacity, 1); // Fade in animation + + textEl.style.opacity = 0; + initProps(textEl, { + style: { + opacity: oldOpacity + } + }, seriesModel, dataIndex); + } + } else { + textEl.attr(oldLayout); // Make sure the animation from is in the right status. + + var prevStates = el.prevStates; + + if (prevStates) { + if (indexOf(prevStates, 'select') >= 0) { + textEl.attr(layoutStore.oldLayoutSelect); + } + + if (indexOf(prevStates, 'emphasis') >= 0) { + textEl.attr(layoutStore.oldLayoutEmphasis); + } + } + + updateProps(textEl, newProps, seriesModel, dataIndex); + } + + layoutStore.oldLayout = newProps; + + if (textEl.states.select) { + var layoutSelect = layoutStore.oldLayoutSelect = {}; + extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS); + extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS); + } + + if (textEl.states.emphasis) { + var layoutEmphasis = layoutStore.oldLayoutEmphasis = {}; + extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS); + extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS); + } + + animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel); + } + + if (guideLine && !guideLine.ignore && !guideLine.invisible) { + var layoutStore = labelLineAnimationStore(guideLine); + var oldLayout = layoutStore.oldLayout; + var newLayout = { + points: guideLine.shape.points + }; + + if (!oldLayout) { + guideLine.setShape(newLayout); + guideLine.style.strokePercent = 0; + initProps(guideLine, { + style: { + strokePercent: 1 + } + }, seriesModel); + } else { + guideLine.attr({ + shape: oldLayout + }); + updateProps(guideLine, { + shape: newLayout + }, seriesModel); + } + + layoutStore.oldLayout = newLayout; + } + }; + + return LabelManager; + }(); + + // Inlucdes: pieSelect, pieUnSelect, pieToggleSelect, mapSelect, mapUnSelect, mapToggleSelect + + function createLegacyDataSelectAction(seriesType, ecRegisterAction) { + function getSeriesIndices(ecModel, payload) { + var seriesIndices = []; + ecModel.eachComponent({ + mainType: 'series', + subType: seriesType, + query: payload + }, function (seriesModel) { + seriesIndices.push(seriesModel.seriesIndex); + }); + return seriesIndices; + } + + each([[seriesType + 'ToggleSelect', 'toggleSelect'], [seriesType + 'Select', 'select'], [seriesType + 'UnSelect', 'unselect']], function (eventsMap) { + ecRegisterAction(eventsMap[0], function (payload, ecModel, api) { + payload = extend({}, payload); + + if ("development" !== 'production') { + deprecateReplaceLog(payload.type, eventsMap[1]); + } + + api.dispatchAction(extend(payload, { + type: eventsMap[1], + seriesIndex: getSeriesIndices(ecModel, payload) + })); + }); + }); + } + + function handleSeriesLegacySelectEvents(type, eventPostfix, ecIns, ecModel, payload) { + var legacyEventName = type + eventPostfix; + + if (!ecIns.isSilent(legacyEventName)) { + if ("development" !== 'production') { + deprecateLog("event " + legacyEventName + " is deprecated."); + } + + ecModel.eachComponent({ + mainType: 'series', + subType: 'pie' + }, function (seriesModel) { + var seriesIndex = seriesModel.seriesIndex; + var selected = payload.selected; + + for (var i = 0; i < selected.length; i++) { + if (selected[i].seriesIndex === seriesIndex) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload.fromActionPayload); + ecIns.trigger(legacyEventName, { + type: legacyEventName, + seriesId: seriesModel.id, + name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex), + selected: extend({}, seriesModel.option.selectedMap) + }); + } + } + }); + } + } + + function handleLegacySelectEvents(messageCenter, ecIns, api) { + messageCenter.on('selectchanged', function (params) { + var ecModel = api.getModel(); + + if (params.isFromClick) { + handleSeriesLegacySelectEvents('map', 'selectchanged', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'selectchanged', ecIns, ecModel, params); + } else if (params.fromAction === 'select') { + handleSeriesLegacySelectEvents('map', 'selected', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'selected', ecIns, ecModel, params); + } else if (params.fromAction === 'unselect') { + handleSeriesLegacySelectEvents('map', 'unselected', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'unselected', ecIns, ecModel, params); + } + }); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function findEventDispatcher(target, det, returnFirstMatch) { + var found; + + while (target) { + if (det(target)) { + found = target; + + if (returnFirstMatch) { + break; + } + } + + target = target.__hostTarget || target.parent; + } + + return found; + } + + var wmUniqueIndex = Math.round(Math.random() * 9); + var WeakMap = (function () { + function WeakMap() { + this._id = '__ec_inner_' + wmUniqueIndex++; + } + WeakMap.prototype.get = function (key) { + return this._guard(key)[this._id]; + }; + WeakMap.prototype.set = function (key, value) { + var target = this._guard(key); + if (typeof Object.defineProperty === 'function') { + Object.defineProperty(target, this._id, { + value: value, + enumerable: false, + configurable: true + }); + } + else { + target[this._id] = value; + } + return this; + }; + WeakMap.prototype["delete"] = function (key) { + if (this.has(key)) { + delete this._guard(key)[this._id]; + return true; + } + return false; + }; + WeakMap.prototype.has = function (key) { + return !!this._guard(key)[this._id]; + }; + WeakMap.prototype._guard = function (key) { + if (key !== Object(key)) { + throw TypeError('Value of WeakMap is not a non-null object.'); + } + return key; + }; + return WeakMap; + }()); + + /** + * Triangle shape + * @inner + */ + + var Triangle = Path.extend({ + 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 = Path.extend({ + 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 = Path.extend({ + 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); + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + path.moveTo(x - dx, cy + dy); + path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle); + 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 = Path.extend({ + 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 + */ + // TODO Use function to build symbol path. + + var symbolCtors = { + // Use small height rect to simulate line. + // Avoid using stroke. + line: Rect, + rect: Rect, + roundRect: Rect, + square: Rect, + circle: Circle, + diamond: Diamond, + pin: Pin, + arrow: Arrow, + triangle: Triangle + }; // NOTICE Only use fill. No line! + + var symbolShapeMakers = { + line: function (x, y, w, h, shape) { + var thickness = 2; // A thin line + + shape.x = x; + shape.y = y + h / 2 - thickness / 2; + shape.width = w; + shape.height = thickness; + }, + 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 = {}; + each(symbolCtors, function (Ctor, name) { + symbolBuildProxies[name] = new Ctor(); + }); + var SymbolClz = Path.extend({ + type: 'symbol', + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + calculateTextPosition: function (out, config, rect) { + var res = calculateTextPosition(out, config, rect); + var shape = this.shape; + + if (shape && shape.symbolType === 'pin' && config.position === 'inside') { + res.y = rect.y + rect.height * 0.4; + } + + return res; + }, + buildPath: function (ctx, shape, inBundle) { + var symbolType = shape.symbolType; + + if (symbolType !== 'none') { + var proxySymbol = symbolBuildProxies[symbolType]; + + 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, inBundle); + } + } + }); // Provide setColor helper method to avoid determine if set the fill or stroke outside + + function symbolPathSetColor(color, innerColor) { + if (this.type !== 'image') { + var symbolStyle = this.style; + + if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = innerColor || '#fff'; // TODO Same width with lineStyle in LineView. + + symbolStyle.lineWidth = 2; + } else { + symbolStyle.fill = color; + } + + this.markRedraw(); + } + } + /** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + */ + + + function createSymbol(symbolType, x, y, w, h, color, // whether to keep the ratio of w/h, + keepAspect) { + // TODO Support image object, DynamicImage. + 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 = makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else if (symbolType.indexOf('path://') === 0) { + symbolPath = makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else { + symbolPath = new SymbolClz({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + + symbolPath.__isEmptyBrush = isEmpty; // TODO Should deprecate setColor + + symbolPath.setColor = symbolPathSetColor; + + if (color) { + symbolPath.setColor(color); + } + + return symbolPath; + } + + function createLinearGradient(ctx, obj, rect) { + var x = obj.x == null ? 0 : obj.x; + var x2 = obj.x2 == null ? 1 : obj.x2; + var y = obj.y == null ? 0 : obj.y; + var y2 = obj.y2 == null ? 0 : obj.y2; + if (!obj.global) { + x = x * rect.width + rect.x; + x2 = x2 * rect.width + rect.x; + y = y * rect.height + rect.y; + y2 = y2 * rect.height + rect.y; + } + x = isNaN(x) ? 0 : x; + x2 = isNaN(x2) ? 1 : x2; + y = isNaN(y) ? 0 : y; + y2 = isNaN(y2) ? 0 : y2; + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + return canvasGradient; + } + function createRadialGradient(ctx, obj, rect) { + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + var x = obj.x == null ? 0.5 : obj.x; + var y = obj.y == null ? 0.5 : obj.y; + var r = obj.r == null ? 0.5 : obj.r; + if (!obj.global) { + x = x * width + rect.x; + y = y * height + rect.y; + r = r * min; + } + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + return canvasGradient; + } + function getCanvasGradient(ctx, obj, rect) { + var canvasGradient = obj.type === 'radial' + ? createRadialGradient(ctx, obj, rect) + : createLinearGradient(ctx, obj, rect); + var colorStops = obj.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color); + } + return canvasGradient; + } + function isClipPathChanged(clipPaths, prevClipPaths) { + if (clipPaths === prevClipPaths || (!clipPaths && !prevClipPaths)) { + return false; + } + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } + return false; + } + + function normalizeLineDash(lineType, lineWidth) { + if (!lineType || lineType === 'solid' || !(lineWidth > 0)) { + return null; + } + lineWidth = lineWidth || 1; + return lineType === 'dashed' + ? [4 * lineWidth, 2 * lineWidth] + : lineType === 'dotted' + ? [lineWidth] + : isNumber(lineType) + ? [lineType] : isArray(lineType) ? lineType : null; + } + + var pathProxyForDraw = new PathProxy(true); + function styleHasStroke(style) { + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + } + function styleHasFill(style) { + var fill = style.fill; + return fill != null && fill !== 'none'; + } + function doFillPath(ctx, style) { + if (style.fillOpacity != null && style.fillOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.fillOpacity * style.opacity; + ctx.fill(); + ctx.globalAlpha = originalGlobalAlpha; + } + else { + ctx.fill(); + } + } + function doStrokePath(ctx, style) { + if (style.strokeOpacity != null && style.strokeOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.strokeOpacity * style.opacity; + ctx.stroke(); + ctx.globalAlpha = originalGlobalAlpha; + } + else { + ctx.stroke(); + } + } + function createCanvasPattern(ctx, pattern, el) { + var image = createOrUpdateImage(pattern.image, pattern.__image, el); + if (isImageReady(image)) { + var canvasPattern = ctx.createPattern(image, pattern.repeat || 'repeat'); + if (typeof DOMMatrix === 'function') { + var matrix = new DOMMatrix(); + matrix.rotateSelf(0, 0, (pattern.rotation || 0) / Math.PI * 180); + matrix.scaleSelf((pattern.scaleX || 1), (pattern.scaleY || 1)); + matrix.translateSelf((pattern.x || 0), (pattern.y || 0)); + canvasPattern.setTransform(matrix); + } + return canvasPattern; + } + } + function brushPath(ctx, el, style, inBatch) { + var hasStroke = styleHasStroke(style); + var hasFill = styleHasFill(style); + var strokePercent = style.strokePercent; + var strokePart = strokePercent < 1; + var firstDraw = !el.path; + if ((!el.silent || strokePart) && firstDraw) { + el.createPathProxy(); + } + var path = el.path || pathProxyForDraw; + if (!inBatch) { + var fill = style.fill; + var stroke = style.stroke; + var hasFillGradient = hasFill && !!fill.colorStops; + var hasStrokeGradient = hasStroke && !!stroke.colorStops; + var hasFillPattern = hasFill && !!fill.image; + var hasStrokePattern = hasStroke && !!stroke.image; + var fillGradient = void 0; + var strokeGradient = void 0; + var fillPattern = void 0; + var strokePattern = void 0; + var rect = void 0; + if (hasFillGradient || hasStrokeGradient) { + rect = el.getBoundingRect(); + } + if (hasFillGradient) { + fillGradient = el.__dirty + ? getCanvasGradient(ctx, fill, rect) + : el.__canvasFillGradient; + el.__canvasFillGradient = fillGradient; + } + if (hasStrokeGradient) { + strokeGradient = el.__dirty + ? getCanvasGradient(ctx, stroke, rect) + : el.__canvasStrokeGradient; + el.__canvasStrokeGradient = strokeGradient; + } + if (hasFillPattern) { + fillPattern = (el.__dirty || !el.__canvasFillPattern) + ? createCanvasPattern(ctx, fill, el) + : el.__canvasFillPattern; + el.__canvasFillPattern = fillPattern; + } + if (hasStrokePattern) { + strokePattern = (el.__dirty || !el.__canvasStrokePattern) + ? createCanvasPattern(ctx, stroke, el) + : el.__canvasStrokePattern; + el.__canvasStrokePattern = fillPattern; + } + if (hasFillGradient) { + ctx.fillStyle = fillGradient; + } + else if (hasFillPattern) { + if (fillPattern) { + ctx.fillStyle = fillPattern; + } + else { + hasFill = false; + } + } + if (hasStrokeGradient) { + ctx.strokeStyle = strokeGradient; + } + else if (hasStrokePattern) { + if (strokePattern) { + ctx.strokeStyle = strokePattern; + } + else { + hasStroke = false; + } + } + } + var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth); + var lineDashOffset = style.lineDashOffset; + var ctxLineDash = !!ctx.setLineDash; + var scale = el.getGlobalScale(); + path.setScale(scale[0], scale[1], el.segmentIgnoreThreshold); + if (lineDash) { + var lineScale_1 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1; + if (lineScale_1 && lineScale_1 !== 1) { + lineDash = map(lineDash, function (rawVal) { + return rawVal / lineScale_1; + }); + lineDashOffset /= lineScale_1; + } + } + var needsRebuild = true; + if (firstDraw || (el.__dirty & Path.SHAPE_CHANGED_BIT) + || (lineDash && !ctxLineDash && hasStroke)) { + path.setDPR(ctx.dpr); + if (strokePart) { + path.setContext(null); + } + else { + path.setContext(ctx); + needsRebuild = false; + } + path.reset(); + if (lineDash && !ctxLineDash) { + path.setLineDash(lineDash); + path.setLineDashOffset(lineDashOffset); + } + el.buildPath(path, el.shape, inBatch); + path.toStatic(); + el.pathUpdated(); + } + if (needsRebuild) { + path.rebuildPath(ctx, strokePart ? strokePercent : 1); + } + if (lineDash && ctxLineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (!inBatch) { + if (style.strokeFirst) { + if (hasStroke) { + doStrokePath(ctx, style); + } + if (hasFill) { + doFillPath(ctx, style); + } + } + else { + if (hasFill) { + doFillPath(ctx, style); + } + if (hasStroke) { + doStrokePath(ctx, style); + } + } + } + if (lineDash && ctxLineDash) { + ctx.setLineDash([]); + } + } + function brushImage(ctx, el, style) { + var image = el.__image = createOrUpdateImage(style.image, el.__image, el, el.onload); + if (!image || !isImageReady(image)) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var width = el.getWidth(); + var height = el.getHeight(); + var aspect = image.width / image.height; + if (width == null && height != null) { + width = height * aspect; + } + else if (height == null && width != null) { + height = width / aspect; + } + else if (width == null && height == null) { + width = image.width; + height = image.height; + } + 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); + } + } + function brushText(ctx, el, style) { + var text = style.text; + text != null && (text += ''); + if (text) { + ctx.font = style.font || DEFAULT_FONT; + ctx.textAlign = style.textAlign; + ctx.textBaseline = style.textBaseline; + var hasLineDash = void 0; + if (ctx.setLineDash) { + var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth); + var lineDashOffset = style.lineDashOffset; + if (lineDash) { + var lineScale_2 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1; + if (lineScale_2 && lineScale_2 !== 1) { + lineDash = map(lineDash, function (rawVal) { + return rawVal / lineScale_2; + }); + lineDashOffset /= lineScale_2; + } + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + hasLineDash = true; + } + } + if (style.strokeFirst) { + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + } + else { + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + } + if (hasLineDash) { + ctx.setLineDash([]); + } + } + } + var SHADOW_NUMBER_PROPS = ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + var STROKE_PROPS = [ + ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10] + ]; + function bindCommonProps(ctx, style, prevStyle, forceSetAll, scope) { + var styleChanged = false; + if (!forceSetAll) { + prevStyle = prevStyle || {}; + if (style === prevStyle) { + return false; + } + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalAlpha = style.opacity == null ? DEFAULT_COMMON_STYLE.opacity : style.opacity; + } + if (forceSetAll || style.blend !== prevStyle.blend) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalCompositeOperation = style.blend || DEFAULT_COMMON_STYLE.blend; + } + for (var i = 0; i < SHADOW_NUMBER_PROPS.length; i++) { + var propName = SHADOW_NUMBER_PROPS[i]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = ctx.dpr * (style[propName] || 0); + } + } + if (forceSetAll || style.shadowColor !== prevStyle.shadowColor) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.shadowColor = style.shadowColor || DEFAULT_COMMON_STYLE.shadowColor; + } + return styleChanged; + } + function bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetAll, scope) { + var style = getStyle(el, scope.inHover); + var prevStyle = forceSetAll + ? null + : (prevEl && getStyle(prevEl, scope.inHover) || {}); + if (style === prevStyle) { + return false; + } + var styleChanged = bindCommonProps(ctx, style, prevStyle, forceSetAll, scope); + if (forceSetAll || style.fill !== prevStyle.fill) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.fillStyle = style.fill; + } + if (forceSetAll || style.stroke !== prevStyle.stroke) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.strokeStyle = style.stroke; + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalAlpha = style.opacity == null ? 1 : style.opacity; + } + if (el.hasStroke()) { + var lineWidth = style.lineWidth; + var newLineWidth = lineWidth / ((style.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1); + if (ctx.lineWidth !== newLineWidth) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.lineWidth = newLineWidth; + } + } + for (var i = 0; i < STROKE_PROPS.length; i++) { + var prop = STROKE_PROPS[i]; + var propName = prop[0]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = style[propName] || prop[1]; + } + } + return styleChanged; + } + function bindImageStyle(ctx, el, prevEl, forceSetAll, scope) { + return bindCommonProps(ctx, getStyle(el, scope.inHover), prevEl && getStyle(prevEl, scope.inHover), forceSetAll, scope); + } + function setContextTransform(ctx, el) { + var m = el.transform; + var dpr = ctx.dpr || 1; + if (m) { + ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]); + } + else { + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + } + } + function updateClipStatus(clipPaths, ctx, scope) { + var allClipped = false; + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + allClipped = allClipped || clipPath.isZeroArea(); + setContextTransform(ctx, clipPath); + ctx.beginPath(); + clipPath.buildPath(ctx, clipPath.shape); + ctx.clip(); + } + scope.allClipped = allClipped; + } + function isTransformChanged(m0, m1) { + if (m0 && m1) { + return m0[0] !== m1[0] + || m0[1] !== m1[1] + || m0[2] !== m1[2] + || m0[3] !== m1[3] + || m0[4] !== m1[4] + || m0[5] !== m1[5]; + } + else if (!m0 && !m1) { + return false; + } + return true; + } + var DRAW_TYPE_PATH = 1; + var DRAW_TYPE_IMAGE = 2; + var DRAW_TYPE_TEXT = 3; + var DRAW_TYPE_INCREMENTAL = 4; + function canPathBatch(style) { + var hasFill = styleHasFill(style); + var hasStroke = styleHasStroke(style); + return !(style.lineDash + || !(+hasFill ^ +hasStroke) + || (hasFill && typeof style.fill !== 'string') + || (hasStroke && typeof style.stroke !== 'string') + || style.strokePercent < 1 + || style.strokeOpacity < 1 + || style.fillOpacity < 1); + } + function flushPathDrawn(ctx, scope) { + scope.batchFill && ctx.fill(); + scope.batchStroke && ctx.stroke(); + scope.batchFill = ''; + scope.batchStroke = ''; + } + function getStyle(el, inHover) { + return inHover ? (el.__hoverStyle || el.style) : el.style; + } + function brushSingle(ctx, el) { + brush(ctx, el, { inHover: false, viewWidth: 0, viewHeight: 0 }, true); + } + function brush(ctx, el, scope, isLast) { + var m = el.transform; + if (!el.shouldBePainted(scope.viewWidth, scope.viewHeight, false, false)) { + el.__dirty &= ~Element.REDARAW_BIT; + el.__isRendered = false; + return; + } + var clipPaths = el.__clipPaths; + var prevElClipPaths = scope.prevElClipPaths; + var forceSetTransform = false; + var forceSetStyle = false; + if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) { + if (prevElClipPaths && prevElClipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.restore(); + forceSetStyle = forceSetTransform = true; + scope.prevElClipPaths = null; + scope.allClipped = false; + scope.prevEl = null; + } + if (clipPaths && clipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.save(); + updateClipStatus(clipPaths, ctx, scope); + forceSetTransform = true; + } + scope.prevElClipPaths = clipPaths; + } + if (scope.allClipped) { + el.__isRendered = false; + return; + } + el.beforeBrush && el.beforeBrush(); + el.innerBeforeBrush(); + var prevEl = scope.prevEl; + if (!prevEl) { + forceSetStyle = forceSetTransform = true; + } + var canBatchPath = el instanceof Path + && el.autoBatch + && canPathBatch(el.style); + if (forceSetTransform || isTransformChanged(m, prevEl.transform)) { + flushPathDrawn(ctx, scope); + setContextTransform(ctx, el); + } + else if (!canBatchPath) { + flushPathDrawn(ctx, scope); + } + var style = getStyle(el, scope.inHover); + if (el instanceof Path) { + if (scope.lastDrawType !== DRAW_TYPE_PATH) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_PATH; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + if (!canBatchPath || (!scope.batchFill && !scope.batchStroke)) { + ctx.beginPath(); + } + brushPath(ctx, el, style, canBatchPath); + if (canBatchPath) { + scope.batchFill = style.fill || ''; + scope.batchStroke = style.stroke || ''; + } + } + else { + if (el instanceof TSpan) { + if (scope.lastDrawType !== DRAW_TYPE_TEXT) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_TEXT; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + brushText(ctx, el, style); + } + else if (el instanceof ZRImage) { + if (scope.lastDrawType !== DRAW_TYPE_IMAGE) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_IMAGE; + } + bindImageStyle(ctx, el, prevEl, forceSetStyle, scope); + brushImage(ctx, el, style); + } + else if (el instanceof IncrementalDisplayable) { + if (scope.lastDrawType !== DRAW_TYPE_INCREMENTAL) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_INCREMENTAL; + } + brushIncremental(ctx, el, scope); + } + } + if (canBatchPath && isLast) { + flushPathDrawn(ctx, scope); + } + el.innerAfterBrush(); + el.afterBrush && el.afterBrush(); + scope.prevEl = el; + el.__dirty = 0; + el.__isRendered = true; + } + function brushIncremental(ctx, el, scope) { + var displayables = el.getDisplayables(); + var temporalDisplayables = el.getTemporalDisplayables(); + ctx.save(); + var innerScope = { + prevElClipPaths: null, + prevEl: null, + allClipped: false, + viewWidth: scope.viewWidth, + viewHeight: scope.viewHeight, + inHover: scope.inHover + }; + var i; + var len; + for (i = el.getCursor(), len = displayables.length; i < len; i++) { + var displayable = displayables[i]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i === len - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + for (var i_1 = 0, len_1 = temporalDisplayables.length; i_1 < len_1; i_1++) { + var displayable = temporalDisplayables[i_1]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i_1 === len_1 - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + el.clearTemporalDisplayables(); + el.notClear = true; + ctx.restore(); + } + + var decalMap = new WeakMap(); + var decalCache = new LRU(100); + var decalKeys = ['symbol', 'symbolSize', 'symbolKeepAspect', 'color', 'backgroundColor', 'dashArrayX', 'dashArrayY', 'maxTileWidth', 'maxTileHeight']; + /** + * Create or update pattern image from decal options + * + * @param {InnerDecalObject | 'none'} decalObject decal options, 'none' if no decal + * @return {Pattern} pattern with generated image, null if no decal + */ + + function createOrUpdatePatternFromDecal(decalObject, api) { + if (decalObject === 'none') { + return null; + } + + var dpr = api.getDevicePixelRatio(); + var zr = api.getZr(); + var isSVG = zr.painter.type === 'svg'; + + if (decalObject.dirty) { + decalMap["delete"](decalObject); + } + + var oldPattern = decalMap.get(decalObject); + + if (oldPattern) { + return oldPattern; + } + + var decalOpt = defaults(decalObject, { + symbol: 'rect', + symbolSize: 1, + symbolKeepAspect: true, + color: 'rgba(0, 0, 0, 0.2)', + backgroundColor: null, + dashArrayX: 5, + dashArrayY: 5, + rotation: 0, + maxTileWidth: 512, + maxTileHeight: 512 + }); + + if (decalOpt.backgroundColor === 'none') { + decalOpt.backgroundColor = null; + } + + var pattern = { + repeat: 'repeat' + }; + setPatternnSource(pattern); + pattern.rotation = decalOpt.rotation; + pattern.scaleX = pattern.scaleY = isSVG ? 1 : 1 / dpr; + decalMap.set(decalObject, pattern); + decalObject.dirty = false; + return pattern; + + function setPatternnSource(pattern) { + var keys = [dpr]; + var isValidKey = true; + + for (var i = 0; i < decalKeys.length; ++i) { + var value = decalOpt[decalKeys[i]]; + var valueType = typeof value; + + if (value != null && !isArray(value) && valueType !== 'string' && valueType !== 'number' && valueType !== 'boolean') { + isValidKey = false; + break; + } + + keys.push(value); + } + + var cacheKey; + + if (isValidKey) { + cacheKey = keys.join(',') + (isSVG ? '-svg' : ''); + var cache = decalCache.get(cacheKey); + + if (cache) { + isSVG ? pattern.svgElement = cache : pattern.image = cache; + } + } + + var dashArrayX = normalizeDashArrayX(decalOpt.dashArrayX); + var dashArrayY = normalizeDashArrayY(decalOpt.dashArrayY); + var symbolArray = normalizeSymbolArray(decalOpt.symbol); + var lineBlockLengthsX = getLineBlockLengthX(dashArrayX); + var lineBlockLengthY = getLineBlockLengthY(dashArrayY); + var canvas = !isSVG && createCanvas(); + var svgRoot = isSVG && zr.painter.createSVGElement('g'); + var pSize = getPatternSize(); + var ctx; + + if (canvas) { + canvas.width = pSize.width * dpr; + canvas.height = pSize.height * dpr; + ctx = canvas.getContext('2d'); + } + + brushDecal(); + + if (isValidKey) { + decalCache.put(cacheKey, canvas || svgRoot); + } + + pattern.image = canvas; + pattern.svgElement = svgRoot; + pattern.svgWidth = pSize.width; + pattern.svgHeight = pSize.height; + /** + * Get minumum length that can make a repeatable pattern. + * + * @return {Object} pattern width and height + */ + + function getPatternSize() { + /** + * For example, if dash is [[3, 2], [2, 1]] for X, it looks like + * |--- --- --- --- --- ... + * |-- -- -- -- -- -- -- -- ... + * |--- --- --- --- --- ... + * |-- -- -- -- -- -- -- -- ... + * So the minumum length of X is 15, + * which is the least common multiple of `3 + 2` and `2 + 1` + * |--- --- --- |--- --- ... + * |-- -- -- -- -- |-- -- -- ... + */ + var width = 1; + + for (var i = 0, xlen = lineBlockLengthsX.length; i < xlen; ++i) { + width = getLeastCommonMultiple(width, lineBlockLengthsX[i]); + } + + var symbolRepeats = 1; + + for (var i = 0, xlen = symbolArray.length; i < xlen; ++i) { + symbolRepeats = getLeastCommonMultiple(symbolRepeats, symbolArray[i].length); + } + + width *= symbolRepeats; + var height = lineBlockLengthY * lineBlockLengthsX.length * symbolArray.length; + + if ("development" !== 'production') { + var warn = function (attrName) { + /* eslint-disable-next-line */ + console.warn("Calculated decal size is greater than " + attrName + " due to decal option settings so " + attrName + " is used for the decal size. Please consider changing the decal option to make a smaller decal or set " + attrName + " to be larger to avoid incontinuity."); + }; + + if (width > decalOpt.maxTileWidth) { + warn('maxTileWidth'); + } + + if (height > decalOpt.maxTileHeight) { + warn('maxTileHeight'); + } + } + + return { + width: Math.max(1, Math.min(width, decalOpt.maxTileWidth)), + height: Math.max(1, Math.min(height, decalOpt.maxTileHeight)) + }; + } + + function brushDecal() { + if (ctx) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + + if (decalOpt.backgroundColor) { + ctx.fillStyle = decalOpt.backgroundColor; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + } + + var ySum = 0; + + for (var i = 0; i < dashArrayY.length; ++i) { + ySum += dashArrayY[i]; + } + + if (ySum <= 0) { + // dashArrayY is 0, draw nothing + return; + } + + var y = -lineBlockLengthY; + var yId = 0; + var yIdTotal = 0; + var xId0 = 0; + + while (y < pSize.height) { + if (yId % 2 === 0) { + var symbolYId = yIdTotal / 2 % symbolArray.length; + var x = 0; + var xId1 = 0; + var xId1Total = 0; + + while (x < pSize.width * 2) { + var xSum = 0; + + for (var i = 0; i < dashArrayX[xId0].length; ++i) { + xSum += dashArrayX[xId0][i]; + } + + if (xSum <= 0) { + // Skip empty line + break; + } // E.g., [15, 5, 20, 5] draws only for 15 and 20 + + + if (xId1 % 2 === 0) { + var size = (1 - decalOpt.symbolSize) * 0.5; + var left = x + dashArrayX[xId0][xId1] * size; + var top_1 = y + dashArrayY[yId] * size; + var width = dashArrayX[xId0][xId1] * decalOpt.symbolSize; + var height = dashArrayY[yId] * decalOpt.symbolSize; + var symbolXId = xId1Total / 2 % symbolArray[symbolYId].length; + brushSymbol(left, top_1, width, height, symbolArray[symbolYId][symbolXId]); + } + + x += dashArrayX[xId0][xId1]; + ++xId1Total; + ++xId1; + + if (xId1 === dashArrayX[xId0].length) { + xId1 = 0; + } + } + + ++xId0; + + if (xId0 === dashArrayX.length) { + xId0 = 0; + } + } + + y += dashArrayY[yId]; + ++yIdTotal; + ++yId; + + if (yId === dashArrayY.length) { + yId = 0; + } + } + + function brushSymbol(x, y, width, height, symbolType) { + var scale = isSVG ? 1 : dpr; + var symbol = createSymbol(symbolType, x * scale, y * scale, width * scale, height * scale, decalOpt.color, decalOpt.symbolKeepAspect); + + if (isSVG) { + svgRoot.appendChild(zr.painter.paintOne(symbol)); + } else { + // Paint to canvas for all other renderers. + brushSingle(ctx, symbol); + } + } + } + } + } + /** + * Convert symbol array into normalized array + * + * @param {string | (string | string[])[]} symbol symbol input + * @return {string[][]} normolized symbol array + */ + + function normalizeSymbolArray(symbol) { + if (!symbol || symbol.length === 0) { + return [['rect']]; + } + + if (typeof symbol === 'string') { + return [[symbol]]; + } + + var isAllString = true; + + for (var i = 0; i < symbol.length; ++i) { + if (typeof symbol[i] !== 'string') { + isAllString = false; + break; + } + } + + if (isAllString) { + return normalizeSymbolArray([symbol]); + } + + var result = []; + + for (var i = 0; i < symbol.length; ++i) { + if (typeof symbol[i] === 'string') { + result.push([symbol[i]]); + } else { + result.push(symbol[i]); + } + } + + return result; + } + /** + * Convert dash input into dashArray + * + * @param {DecalDashArrayX} dash dash input + * @return {number[][]} normolized dash array + */ + + + function normalizeDashArrayX(dash) { + if (!dash || dash.length === 0) { + return [[0, 0]]; + } + + if (typeof dash === 'number') { + var dashValue = Math.ceil(dash); + return [[dashValue, dashValue]]; + } + /** + * [20, 5] should be normalized into [[20, 5]], + * while [20, [5, 10]] should be normalized into [[20, 20], [5, 10]] + */ + + + var isAllNumber = true; + + for (var i = 0; i < dash.length; ++i) { + if (typeof dash[i] !== 'number') { + isAllNumber = false; + break; + } + } + + if (isAllNumber) { + return normalizeDashArrayX([dash]); + } + + var result = []; + + for (var i = 0; i < dash.length; ++i) { + if (typeof dash[i] === 'number') { + var dashValue = Math.ceil(dash[i]); + result.push([dashValue, dashValue]); + } else { + var dashValue = map(dash[i], function (n) { + return Math.ceil(n); + }); + + if (dashValue.length % 2 === 1) { + // [4, 2, 1] means |---- - -- |---- - -- | + // so normalize it to be [4, 2, 1, 4, 2, 1] + result.push(dashValue.concat(dashValue)); + } else { + result.push(dashValue); + } + } + } + + return result; + } + /** + * Convert dash input into dashArray + * + * @param {DecalDashArrayY} dash dash input + * @return {number[]} normolized dash array + */ + + + function normalizeDashArrayY(dash) { + if (!dash || typeof dash === 'object' && dash.length === 0) { + return [0, 0]; + } + + if (typeof dash === 'number') { + var dashValue_1 = Math.ceil(dash); + return [dashValue_1, dashValue_1]; + } + + var dashValue = map(dash, function (n) { + return Math.ceil(n); + }); + return dash.length % 2 ? dashValue.concat(dashValue) : dashValue; + } + /** + * Get block length of each line. A block is the length of dash line and space. + * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after + * that, so the block length of this line is 5. + * + * @param {number[][]} dash dash arrary of X or Y + * @return {number[]} block length of each line + */ + + + function getLineBlockLengthX(dash) { + return map(dash, function (line) { + return getLineBlockLengthY(line); + }); + } + + function getLineBlockLengthY(dash) { + var blockLength = 0; + + for (var i = 0; i < dash.length; ++i) { + blockLength += dash[i]; + } + + if (dash.length % 2 === 1) { + // [4, 2, 1] means |---- - -- |---- - -- | + // So total length is (4 + 2 + 1) * 2 + return blockLength * 2; + } + + return blockLength; + } + + function decalVisual(ecModel, api) { + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + + if (data.hasItemVisual()) { + data.each(function (idx) { + var decal = data.getItemVisual(idx, 'decal'); + + if (decal) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + itemStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + + var decal = data.getVisual('decal'); + + if (decal) { + var style = data.getVisual('style'); + style.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + + var assert$1 = assert; + var each$3 = each; + var isFunction$1 = isFunction; + var isObject$2 = isObject; + var indexOf$1 = indexOf; + var hasWindow = typeof window !== 'undefined'; + var version$1 = '5.0.2'; + var dependencies = { + zrender: '5.0.4' + }; + var TEST_FRAME_REMAIN_TIME = 1; + var PRIORITY_PROCESSOR_SERIES_FILTER = 800; // Some data processors depends on the stack result dimension (to calculate data extent). + // So data stack stage should be in front of data processing stage. + + var PRIORITY_PROCESSOR_DATASTACK = 900; // "Data filter" will block the stream, so it should be + // put at the begining of data processing. + + var PRIORITY_PROCESSOR_FILTER = 1000; + var PRIORITY_PROCESSOR_DEFAULT = 2000; + var PRIORITY_PROCESSOR_STATISTIC = 5000; + var PRIORITY_VISUAL_LAYOUT = 1000; + var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100; + var PRIORITY_VISUAL_GLOBAL = 2000; + var PRIORITY_VISUAL_CHART = 3000; + var PRIORITY_VISUAL_COMPONENT = 4000; // Visual property in data. Greater than `PRIORITY_VISUAL_COMPONENT` to enable to + // overwrite the viusal result of component (like `visualMap`) + // using data item specific setting (like itemStyle.xxx on data item) + + var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500; // Greater than `PRIORITY_VISUAL_CHART_DATA_CUSTOM` to enable to layout based on + // visual result like `symbolSize`. + + var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600; + var PRIORITY_VISUAL_BRUSH = 5000; + var PRIORITY_VISUAL_ARIA = 6000; + var PRIORITY_VISUAL_DECAL = 7000; + var PRIORITY = { + PROCESSOR: { + FILTER: PRIORITY_PROCESSOR_FILTER, + SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER, + STATISTIC: PRIORITY_PROCESSOR_STATISTIC + }, + VISUAL: { + LAYOUT: PRIORITY_VISUAL_LAYOUT, + PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT, + GLOBAL: PRIORITY_VISUAL_GLOBAL, + CHART: PRIORITY_VISUAL_CHART, + POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT, + COMPONENT: PRIORITY_VISUAL_COMPONENT, + BRUSH: PRIORITY_VISUAL_BRUSH, + CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM, + ARIA: PRIORITY_VISUAL_ARIA, + DECAL: PRIORITY_VISUAL_DECAL + } + }; // Main process have three entries: `setOption`, `dispatchAction` and `resize`, + // where they must not be invoked nestedly, except the only case: invoke + // dispatchAction with updateMethod "none" in main process. + // This flag is used to carry out this rule. + // All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]). + + var IN_MAIN_PROCESS_KEY = '__flagInMainProcess'; + var OPTION_UPDATED_KEY = '__optionUpdated'; + var STATUS_NEEDS_UPDATE_KEY = '__needsUpdateStatus'; + var ACTION_REG = /^[a-zA-Z0-9_]+$/; + var CONNECT_STATUS_KEY = '__connectUpdateStatus'; + var CONNECT_STATUS_PENDING = 0; + var CONNECT_STATUS_UPDATING = 1; + var CONNECT_STATUS_UPDATED = 2; + + function createRegisterEventWithLowercaseECharts(method) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + if (this.isDisposed()) { + disposedWarning(this.id); + return; + } + + return toLowercaseNameAndCallEventful(this, method, args); + }; + } + + function createRegisterEventWithLowercaseMessageCenter(method) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + return toLowercaseNameAndCallEventful(this, method, args); + }; + } + + function toLowercaseNameAndCallEventful(host, method, args) { + // `args[0]` is event name. Event name is all lowercase. + args[0] = args[0] && args[0].toLowerCase(); + return Eventful.prototype[method].apply(host, args); + } + + var MessageCenter = + /** @class */ + function (_super) { + __extends(MessageCenter, _super); + + function MessageCenter() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return MessageCenter; + }(Eventful); + + var messageCenterProto = MessageCenter.prototype; + messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter('on'); + messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter('off'); // --------------------------------------- + // Internal method names for class ECharts + // --------------------------------------- + + var prepare; + var prepareView; + var updateDirectly; + var updateMethods; + var doConvertPixel; + var updateStreamModes; + var doDispatchAction; + var flushPendingActions; + var triggerUpdatedEvent; + var bindRenderedEvent; + var bindMouseEvent; + var clearColorPalette; + var render; + var renderComponents; + var renderSeries; + var performPostUpdateFuncs; + var createExtensionAPI; + var enableConnect; + var setTransitionOpt; + var markStatusToUpdate; + var applyChangedStates; + + var ECharts = + /** @class */ + function (_super) { + __extends(ECharts, _super); + + function ECharts(dom, // Theme name or themeOption. + theme, opts) { + var _this = _super.call(this, new ECEventProcessor()) || this; + + _this._chartsViews = []; + _this._chartsMap = {}; + _this._componentsViews = []; + _this._componentsMap = {}; // Can't dispatch action during rendering procedure + + _this._pendingActions = []; + opts = opts || {}; // Get theme by name + + if (typeof theme === 'string') { + theme = themeStorage[theme]; + } + + _this._dom = dom; + var defaultRenderer = 'canvas'; + var defaultUseDirtyRect = false; + + if ("development" !== 'production') { + var root = + /* eslint-disable-next-line */ + hasWindow ? window : global; + defaultRenderer = root.__ECHARTS__DEFAULT__RENDERER__ || defaultRenderer; + var devUseDirtyRect = root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__; + defaultUseDirtyRect = devUseDirtyRect == null ? defaultUseDirtyRect : devUseDirtyRect; + } + + var zr = _this._zr = init(dom, { + renderer: opts.renderer || defaultRenderer, + devicePixelRatio: opts.devicePixelRatio, + width: opts.width, + height: opts.height, + useDirtyRect: opts.useDirtyRect == null ? defaultUseDirtyRect : opts.useDirtyRect + }); // Expect 60 fps. + + _this._throttledZrFlush = throttle(bind(zr.flush, zr), 17); + theme = clone(theme); + theme && globalBackwardCompat(theme, true); + _this._theme = theme; + _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG); + _this._coordSysMgr = new CoordinateSystemManager(); + var api = _this._api = createExtensionAPI(_this); // Sort on demand + + function prioritySortFunc(a, b) { + return a.__prio - b.__prio; + } + + sort(visualFuncs, prioritySortFunc); + sort(dataProcessorFuncs, prioritySortFunc); + _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs); + _this._messageCenter = new MessageCenter(); + _this._labelManager = new LabelManager(); // Init mouse events + + _this._initEvents(); // In case some people write `window.onresize = chart.resize` + + + _this.resize = bind(_this.resize, _this); + zr.animation.on('frame', _this._onframe, _this); + bindRenderedEvent(zr, _this); + bindMouseEvent(zr, _this); // ECharts instance can be used as value. + + setAsPrimitive(_this); + return _this; + } + + ECharts.prototype._onframe = function () { + if (this._disposed) { + return; + } + + applyChangedStates(this); + var scheduler = this._scheduler; // Lazy update + + if (this[OPTION_UPDATED_KEY]) { + var silent = this[OPTION_UPDATED_KEY].silent; + this[IN_MAIN_PROCESS_KEY] = true; + prepare(this); + updateMethods.update.call(this); // At present, in each frame, zrender performs: + // (1) animation step forward. + // (2) trigger('frame') (where this `_onframe` is called) + // (3) zrender flush (render). + // If we do nothing here, since we use `setToFinal: true`, the step (3) above + // will render the final state of the elements before the real animation started. + + this._zr.flush(); + + this[IN_MAIN_PROCESS_KEY] = false; + this[OPTION_UPDATED_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } // Avoid do both lazy update and progress in one frame. + else if (scheduler.unfinished) { + // Stream progress. + var remainTime = TEST_FRAME_REMAIN_TIME; + var ecModel = this._model; + var api = this._api; + scheduler.unfinished = false; + + do { + var startTime = +new Date(); + scheduler.performSeriesTasks(ecModel); // Currently dataProcessorFuncs do not check threshold. + + scheduler.performDataProcessorTasks(ecModel); + updateStreamModes(this, ecModel); // Do not update coordinate system here. Because that coord system update in + // each frame is not a good user experience. So we follow the rule that + // the extent of the coordinate system is determin in the first frame (the + // frame is executed immedietely after task reset. + // this._coordSysMgr.update(ecModel, api); + // console.log('--- ec frame visual ---', remainTime); + + scheduler.performVisualTasks(ecModel); + renderSeries(this, this._model, api, 'remain'); + remainTime -= +new Date() - startTime; + } while (remainTime > 0 && scheduler.unfinished); // Call flush explicitly for trigger finished event. + + + if (!scheduler.unfinished) { + this._zr.flush(); + } // Else, zr flushing be ensue within the same frame, + // because zr flushing is after onframe event. + + } + }; + + ECharts.prototype.getDom = function () { + return this._dom; + }; + + ECharts.prototype.getId = function () { + return this.id; + }; + + ECharts.prototype.getZr = function () { + return this._zr; + }; + /* eslint-disable-next-line */ + + + ECharts.prototype.setOption = function (option, notMerge, lazyUpdate) { + if ("development" !== 'production') { + assert$1(!this[IN_MAIN_PROCESS_KEY], '`setOption` should not be called during main process.'); + } + + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var silent; + var replaceMerge; + var transitionOpt; + + if (isObject$2(notMerge)) { + lazyUpdate = notMerge.lazyUpdate; + silent = notMerge.silent; + replaceMerge = notMerge.replaceMerge; + transitionOpt = notMerge.transition; + notMerge = notMerge.notMerge; + } + + this[IN_MAIN_PROCESS_KEY] = true; + + if (!this._model || notMerge) { + var optionManager = new OptionManager(this._api); + var theme = this._theme; + var ecModel = this._model = new GlobalModel(); + ecModel.scheduler = this._scheduler; + ecModel.init(null, null, null, theme, this._locale, optionManager); + } + + this._model.setOption(option, { + replaceMerge: replaceMerge + }, optionPreprocessorFuncs); + + setTransitionOpt(this, transitionOpt); + + if (lazyUpdate) { + this[OPTION_UPDATED_KEY] = { + silent: silent + }; + this[IN_MAIN_PROCESS_KEY] = false; // `setOption(option, {lazyMode: true})` may be called when zrender has been slept. + // It should wake it up to make sure zrender start to render at the next frame. + + this.getZr().wakeUp(); + } else { + prepare(this); + updateMethods.update.call(this); // Ensure zr refresh sychronously, and then pixel in canvas can be + // fetched after `setOption`. + + this._zr.flush(); + + this[OPTION_UPDATED_KEY] = false; + this[IN_MAIN_PROCESS_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } + }; + /** + * @DEPRECATED + */ + + + ECharts.prototype.setTheme = function () { + console.error('ECharts#setTheme() is DEPRECATED in ECharts 3.0'); + }; // We don't want developers to use getModel directly. + + + ECharts.prototype.getModel = function () { + return this._model; + }; + + ECharts.prototype.getOption = function () { + return this._model && this._model.getOption(); + }; + + ECharts.prototype.getWidth = function () { + return this._zr.getWidth(); + }; + + ECharts.prototype.getHeight = function () { + return this._zr.getHeight(); + }; + + ECharts.prototype.getDevicePixelRatio = function () { + return this._zr.painter.dpr + /* eslint-disable-next-line */ + || hasWindow && window.devicePixelRatio || 1; + }; + /** + * Get canvas which has all thing rendered + */ + + + ECharts.prototype.getRenderedCanvas = function (opts) { + if (!env.canvasSupported) { + return; + } + + opts = extend({}, opts || {}); + opts.pixelRatio = opts.pixelRatio || this.getDevicePixelRatio(); + opts.backgroundColor = opts.backgroundColor || this._model.get('backgroundColor'); + var zr = this._zr; // let list = zr.storage.getDisplayList(); + // Stop animations + // Never works before in init animation, so remove it. + // zrUtil.each(list, function (el) { + // el.stopAnimation(true); + // }); + + return zr.painter.getRenderedCanvas(opts); + }; + /** + * Get svg data url + */ + + + ECharts.prototype.getSvgDataURL = function () { + if (!env.svgSupported) { + return; + } + + var zr = this._zr; + var list = zr.storage.getDisplayList(); // Stop animations + + each(list, function (el) { + el.stopAnimation(null, true); + }); + return zr.painter.toDataURL(); + }; + + ECharts.prototype.getDataURL = function (opts) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + opts = opts || {}; + var excludeComponents = opts.excludeComponents; + var ecModel = this._model; + var excludesComponentViews = []; + var self = this; + each$3(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._zr.painter.getType() === 'svg' ? this.getSvgDataURL() : this.getRenderedCanvas(opts).toDataURL('image/' + (opts && opts.type || 'png')); + each$3(excludesComponentViews, function (view) { + view.group.ignore = false; + }); + return url; + }; + + ECharts.prototype.getConnectedDataURL = function (opts) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + if (!env.canvasSupported) { + return; + } + + var isSvg = opts.type === 'svg'; + var groupId = this.group; + var mathMin = Math.min; + var mathMax = Math.max; + var MAX_NUMBER = Infinity; + + if (connectedGroups[groupId]) { + var left_1 = MAX_NUMBER; + var top_1 = MAX_NUMBER; + var right_1 = -MAX_NUMBER; + var bottom_1 = -MAX_NUMBER; + var canvasList_1 = []; + var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio(); + each(instances$1, function (chart, id) { + if (chart.group === groupId) { + var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.getRenderedCanvas(clone(opts)); + var boundingRect = chart.getDom().getBoundingClientRect(); + left_1 = mathMin(boundingRect.left, left_1); + top_1 = mathMin(boundingRect.top, top_1); + right_1 = mathMax(boundingRect.right, right_1); + bottom_1 = mathMax(boundingRect.bottom, bottom_1); + canvasList_1.push({ + dom: canvas, + left: boundingRect.left, + top: boundingRect.top + }); + } + }); + left_1 *= dpr_1; + top_1 *= dpr_1; + right_1 *= dpr_1; + bottom_1 *= dpr_1; + var width = right_1 - left_1; + var height = bottom_1 - top_1; + var targetCanvas = createCanvas(); + var zr_1 = init(targetCanvas, { + renderer: isSvg ? 'svg' : 'canvas' + }); + zr_1.resize({ + width: width, + height: height + }); + + if (isSvg) { + var content_1 = ''; + each$3(canvasList_1, function (item) { + var x = item.left - left_1; + var y = item.top - top_1; + content_1 += '' + item.dom + ''; + }); + zr_1.painter.getSvgRoot().innerHTML = content_1; + + if (opts.connectedBackgroundColor) { + zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor); + } + + zr_1.refreshImmediately(); + return zr_1.painter.toDataURL(); + } else { + // Background between the charts + if (opts.connectedBackgroundColor) { + zr_1.add(new Rect({ + shape: { + x: 0, + y: 0, + width: width, + height: height + }, + style: { + fill: opts.connectedBackgroundColor + } + })); + } + + each$3(canvasList_1, function (item) { + var img = new ZRImage({ + style: { + x: item.left * dpr_1 - left_1, + y: item.top * dpr_1 - top_1, + image: item.dom + } + }); + zr_1.add(img); + }); + zr_1.refreshImmediately(); + return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png')); + } + } else { + return this.getDataURL(opts); + } + }; + + ECharts.prototype.convertToPixel = function (finder, value) { + return doConvertPixel(this, 'convertToPixel', finder, value); + }; + + ECharts.prototype.convertFromPixel = function (finder, value) { + return doConvertPixel(this, 'convertFromPixel', finder, value); + }; + /** + * Is the specified coordinate systems or components contain the given pixel point. + * @param {Array|number} value + * @return {boolean} result + */ + + + ECharts.prototype.containPixel = function (finder, value) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var ecModel = this._model; + var result; + var findResult = parseFinder(ecModel, finder); + each(findResult, function (models, key) { + key.indexOf('Models') >= 0 && each(models, function (model) { + var coordSys = model.coordinateSystem; + + if (coordSys && coordSys.containPoint) { + result = result || !!coordSys.containPoint(value); + } else if (key === 'seriesModels') { + var view = this._chartsMap[model.__viewId]; + + if (view && view.containPoint) { + result = result || view.containPoint(value, model); + } else { + if ("development" !== 'production') { + console.warn(key + ': ' + (view ? 'The found component do not support containPoint.' : 'No view mapping to the found component.')); + } + } + } else { + if ("development" !== 'production') { + console.warn(key + ': containPoint is not supported'); + } + } + }, this); + }, this); + return !!result; + }; + /** + * Get visual from series or data. + * @param finder + * If string, e.g., 'series', means {seriesIndex: 0}. + * If Object, could contain some of these properties below: + * { + * seriesIndex / seriesId / seriesName, + * dataIndex / dataIndexInside + * } + * If dataIndex is not specified, series visual will be fetched, + * but not data item visual. + * If all of seriesIndex, seriesId, seriesName are not specified, + * visual will be fetched from first series. + * @param visualType 'color', 'symbol', 'symbolSize' + */ + + + ECharts.prototype.getVisual = function (finder, visualType) { + var ecModel = this._model; + var parsedFinder = parseFinder(ecModel, finder, { + defaultMainType: 'series' + }); + var seriesModel = parsedFinder.seriesModel; + + if ("development" !== 'production') { + if (!seriesModel) { + console.warn('There is no specified seires model'); + } + } + + var data = seriesModel.getData(); + var dataIndexInside = parsedFinder.hasOwnProperty('dataIndexInside') ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty('dataIndex') ? data.indexOfRawIndex(parsedFinder.dataIndex) : null; + return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType); + }; + /** + * Get view of corresponding component model + */ + + + ECharts.prototype.getViewOfComponentModel = function (componentModel) { + return this._componentsMap[componentModel.__viewId]; + }; + /** + * Get view of corresponding series model + */ + + + ECharts.prototype.getViewOfSeriesModel = function (seriesModel) { + return this._chartsMap[seriesModel.__viewId]; + }; + + ECharts.prototype._initEvents = function () { + var _this = this; + + each$3(MOUSE_EVENT_NAMES, function (eveName) { + var handler = function (e) { + var ecModel = _this.getModel(); + + var el = e.target; + var params; + var isGlobalOut = eveName === 'globalout'; // no e.target when 'globalout'. + + if (isGlobalOut) { + params = {}; + } else { + el && findEventDispatcher(el, function (parent) { + var ecData = getECData(parent); + + if (ecData && ecData.dataIndex != null) { + var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex); + params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType) || {}; + return true; + } // If element has custom eventData of components + else if (ecData.eventData) { + params = extend({}, ecData.eventData); + return true; + } + }, true); + } // Contract: if params prepared in mouse event, + // these properties must be specified: + // { + // componentType: string (component main type) + // componentIndex: number + // } + // Otherwise event query can not work. + + + if (params) { + var componentType = params.componentType; + var componentIndex = params.componentIndex; // Special handling for historic reason: when trigger by + // markLine/markPoint/markArea, the componentType is + // 'markLine'/'markPoint'/'markArea', but we should better + // enable them to be queried by seriesIndex, since their + // option is set in each series. + + if (componentType === 'markLine' || componentType === 'markPoint' || componentType === 'markArea') { + componentType = 'series'; + componentIndex = params.seriesIndex; + } + + var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex); + var view = model && _this[model.mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]; + + if ("development" !== 'production') { + // `event.componentType` and `event[componentTpype + 'Index']` must not + // be missed, otherwise there is no way to distinguish source component. + // See `dataFormat.getDataParams`. + if (!isGlobalOut && !(model && view)) { + console.warn('model or view can not be found by params'); + } + } + + params.event = e; + params.type = eveName; + _this._$eventProcessor.eventInfo = { + targetEl: el, + packedEvent: params, + model: model, + view: view + }; + + _this.trigger(eveName, params); + } + }; // Consider that some component (like tooltip, brush, ...) + // register zr event handler, but user event handler might + // do anything, such as call `setOption` or `dispatchAction`, + // which probably update any of the content and probably + // cause problem if it is called previous other inner handlers. + + + handler.zrEventfulCallAtLast = true; + + _this._zr.on(eveName, handler, _this); + }); + each$3(eventActionMap, function (actionType, eventType) { + _this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, _this); + }); // Extra events + // TODO register? + + each$3(['selectchanged'], function (eventType) { + _this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, _this); + }); + handleLegacySelectEvents(this._messageCenter, this, this._api); + }; + + ECharts.prototype.isDisposed = function () { + return this._disposed; + }; + + ECharts.prototype.clear = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this.setOption({ + series: [] + }, true); + }; + + ECharts.prototype.dispose = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._disposed = true; + setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, ''); + var api = this._api; + var ecModel = this._model; + each$3(this._componentsViews, function (component) { + component.dispose(ecModel, api); + }); + each$3(this._chartsViews, function (chart) { + chart.dispose(ecModel, api); + }); // Dispose after all views disposed + + this._zr.dispose(); + + delete instances$1[this.id]; + }; + /** + * Resize the chart + */ + + + ECharts.prototype.resize = function (opts) { + if ("development" !== 'production') { + assert$1(!this[IN_MAIN_PROCESS_KEY], '`resize` should not be called during main process.'); + } + + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._zr.resize(opts); + + var ecModel = this._model; // Resize loading effect + + this._loadingFX && this._loadingFX.resize(); + + if (!ecModel) { + return; + } + + var optionChanged = ecModel.resetOption('media'); + var silent = opts && opts.silent; + this[IN_MAIN_PROCESS_KEY] = true; + optionChanged && prepare(this); + updateMethods.update.call(this, { + type: 'resize', + animation: { + // Disable animation + duration: 0 + } + }); + this[IN_MAIN_PROCESS_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + }; + + ECharts.prototype.showLoading = function (name, cfg) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + if (isObject$2(name)) { + cfg = name; + name = ''; + } + + name = name || 'default'; + this.hideLoading(); + + if (!loadingEffects[name]) { + if ("development" !== 'production') { + console.warn('Loading effects ' + name + ' not exists.'); + } + + return; + } + + var el = loadingEffects[name](this._api, cfg); + var zr = this._zr; + this._loadingFX = el; + zr.add(el); + }; + /** + * Hide loading effect + */ + + + ECharts.prototype.hideLoading = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._loadingFX && this._zr.remove(this._loadingFX); + this._loadingFX = null; + }; + + ECharts.prototype.makeActionFromEvent = function (eventObj) { + var payload = extend({}, eventObj); + payload.type = eventActionMap[eventObj.type]; + return payload; + }; + /** + * @param opt If pass boolean, means opt.silent + * @param opt.silent Default `false`. Whether trigger events. + * @param opt.flush Default `undefined`. + * true: Flush immediately, and then pixel in canvas can be fetched + * immediately. Caution: it might affect performance. + * false: Not flush. + * undefined: Auto decide whether perform flush. + */ + + + ECharts.prototype.dispatchAction = function (payload, opt) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + if (!isObject$2(opt)) { + opt = { + silent: !!opt + }; + } + + if (!actions[payload.type]) { + return; + } // Avoid dispatch action before setOption. Especially in `connect`. + + + if (!this._model) { + return; + } // May dispatchAction in rendering procedure + + + if (this[IN_MAIN_PROCESS_KEY]) { + this._pendingActions.push(payload); + + return; + } + + var silent = opt.silent; + doDispatchAction.call(this, payload, silent); + var flush = opt.flush; + + if (flush) { + this._zr.flush(); + } else if (flush !== false && env.browser.weChat) { + // In WeChat embeded browser, `requestAnimationFrame` and `setInterval` + // hang when sliding page (on touch event), which cause that zr does not + // refresh util user interaction finished, which is not expected. + // But `dispatchAction` may be called too frequently when pan on touch + // screen, which impacts performance if do not throttle them. + this._throttledZrFlush(); + } + + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + }; + + ECharts.prototype.updateLabelLayout = function () { + var labelManager = this._labelManager; + labelManager.updateLayoutConfig(this._api); + labelManager.layout(this._api); + labelManager.processLabelsOverall(); + }; + + ECharts.prototype.appendData = function (params) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var seriesIndex = params.seriesIndex; + var ecModel = this.getModel(); + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + if ("development" !== 'production') { + assert$1(params.data && seriesModel); + } + + seriesModel.appendData(params); // Note: `appendData` does not support that update extent of coordinate + // system, util some scenario require that. In the expected usage of + // `appendData`, the initial extent of coordinate system should better + // be fixed by axis `min`/`max` setting or initial data, otherwise if + // the extent changed while `appendData`, the location of the painted + // graphic elements have to be changed, which make the usage of + // `appendData` meaningless. + + this._scheduler.unfinished = true; + this.getZr().wakeUp(); + }; // A work around for no `internal` modifier in ts yet but + // need to strictly hide private methods to JS users. + + + ECharts.internalField = function () { + prepare = function (ecIns) { + var scheduler = ecIns._scheduler; + scheduler.restorePipelines(ecIns._model); + scheduler.prepareStageTasks(); + prepareView(ecIns, true); + prepareView(ecIns, false); + scheduler.plan(); + }; + /** + * Prepare view instances of charts and components + */ + + + prepareView = function (ecIns, isComponent) { + var ecModel = ecIns._model; + var scheduler = ecIns._scheduler; + var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews; + var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap; + var zr = ecIns._zr; + var api = ecIns._api; + + for (var i = 0; i < viewList.length; i++) { + viewList[i].__alive = false; + } + + isComponent ? ecModel.eachComponent(function (componentType, model) { + componentType !== 'series' && doPrepare(model); + }) : ecModel.eachSeries(doPrepare); + + function doPrepare(model) { + // By defaut view will be reused if possible for the case that `setOption` with "notMerge" + // mode and need to enable transition animation. (Usually, when they have the same id, or + // especially no id but have the same type & name & index. See the `model.id` generation + // rule in `makeIdAndName` and `viewId` generation rule here). + // But in `replaceMerge` mode, this feature should be able to disabled when it is clear that + // the new model has nothing to do with the old model. + var requireNewView = model.__requireNewView; // This command should not work twice. + + model.__requireNewView = false; // Consider: id same and type changed. + + var viewId = '_ec_' + model.id + '_' + model.type; + var view = !requireNewView && viewMap[viewId]; + + if (!view) { + var classType = parseClassType(model.type); + var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) : // FIXME:TS + // (ChartView as ChartViewConstructor).getClass('series', classType.sub) + // For backward compat, still support a chart type declared as only subType + // like "liquidfill", but recommend "series.liquidfill" + // But need a base class to make a type series. + ChartView.getClass(classType.sub); + + if ("development" !== 'production') { + assert$1(Clazz, classType.sub + ' does not exist.'); + } + + view = new Clazz(); + view.init(ecModel, api); + viewMap[viewId] = view; + viewList.push(view); + zr.add(view.group); + } + + model.__viewId = view.__id = viewId; + view.__alive = true; + view.__model = model; + view.group.__ecComponentInfo = { + mainType: model.mainType, + index: model.componentIndex + }; + !isComponent && scheduler.prepareView(view, model, ecModel, api); + } + + for (var i = 0; i < viewList.length;) { + var view = viewList[i]; + + if (!view.__alive) { + !isComponent && view.renderTask.dispose(); + zr.remove(view.group); + view.dispose(ecModel, api); + viewList.splice(i, 1); + + if (viewMap[view.__id] === view) { + delete viewMap[view.__id]; + } + + view.__id = view.group.__ecComponentInfo = null; + } else { + i++; + } + } + }; + + updateDirectly = function (ecIns, method, payload, mainType, subType) { + var ecModel = ecIns._model; + ecModel.setUpdatePayload(payload); // broadcast + + if (!mainType) { + // FIXME + // Chart will not be update directly here, except set dirty. + // But there is no such scenario now. + each$3([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView); + return; + } + + var query = {}; + query[mainType + 'Id'] = payload[mainType + 'Id']; + query[mainType + 'Index'] = payload[mainType + 'Index']; + query[mainType + 'Name'] = payload[mainType + 'Name']; + var condition = { + mainType: mainType, + query: query + }; + subType && (condition.subType = subType); // subType may be '' by parseClassType; + + var excludeSeriesId = payload.excludeSeriesId; + var excludeSeriesIdMap; + + if (excludeSeriesId != null) { + excludeSeriesIdMap = createHashMap(); + each$3(normalizeToArray(excludeSeriesId), function (id) { + var modelId = convertOptionIdName(id, null); + + if (modelId != null) { + excludeSeriesIdMap.set(modelId, true); + } + }); + } // If dispatchAction before setOption, do nothing. + + + ecModel && ecModel.eachComponent(condition, function (model) { + if (!excludeSeriesIdMap || excludeSeriesIdMap.get(model.id) == null) { + if (isHighDownPayload(payload) && !payload.notBlur) { + if (model instanceof SeriesModel) { + toggleSeriesBlurStateFromPayload(model, payload, ecIns._api); + } + } else if (isSelectChangePayload(payload)) { + // TODO geo + if (model instanceof SeriesModel) { + toggleSelectionFromPayload(model, payload, ecIns._api); + updateSeriesElementSelection(model); + markStatusToUpdate(ecIns); + } + } + + callView(ecIns[mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]); + } + }, ecIns); + + function callView(view) { + view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload); + } + }; + + updateMethods = { + prepareAndUpdate: function (payload) { + prepare(this); + updateMethods.update.call(this, payload); + }, + update: function (payload) { + // console.profile && console.profile('update'); + var ecModel = this._model; + var api = this._api; + var zr = this._zr; + var coordSysMgr = this._coordSysMgr; + var scheduler = this._scheduler; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); + scheduler.restoreData(ecModel, payload); + scheduler.performSeriesTasks(ecModel); // 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(ecModel, api); + scheduler.performDataProcessorTasks(ecModel, payload); // Current stream render is not supported in data process. So we can update + // stream modes after data processing, where the filtered data is used to + // deteming whether use progressive rendering. + + updateStreamModes(this, ecModel); // We update stream modes before coordinate system updated, then the modes info + // can be fetched when coord sys updating (consider the barGrid extent fix). But + // the drawback is the full coord info can not be fetched. Fortunately this full + // coord is not requied in stream mode updater currently. + + coordSysMgr.update(ecModel, api); + clearColorPalette(ecModel); + scheduler.performVisualTasks(ecModel, payload); + render(this, ecModel, api, payload); // Set background + + var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; + var darkMode = ecModel.get('darkMode'); // In IE8 + + if (!env.canvasSupported) { + var colorArr = parse(backgroundColor); + backgroundColor = stringify(colorArr, 'rgb'); + + if (colorArr[3] === 0) { + backgroundColor = 'transparent'; + } + } else { + zr.setBackgroundColor(backgroundColor); // Force set dark mode. + + if (darkMode != null && darkMode !== 'auto') { + zr.setDarkMode(darkMode); + } + } + + performPostUpdateFuncs(ecModel, api); // console.profile && console.profileEnd('update'); + }, + updateTransform: function (payload) { + var _this = this; + + var ecModel = this._model; + var api = this._api; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); // ChartView.markUpdateMethod(payload, 'updateTransform'); + + var componentDirtyList = []; + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType === 'series') { + return; + } + + var componentView = _this.getViewOfComponentModel(componentModel); + + if (componentView && componentView.__alive) { + if (componentView.updateTransform) { + var result = componentView.updateTransform(componentModel, ecModel, api, payload); + result && result.update && componentDirtyList.push(componentView); + } else { + componentDirtyList.push(componentView); + } + } + }); + var seriesDirtyMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var chartView = _this._chartsMap[seriesModel.__viewId]; + + if (chartView.updateTransform) { + var result = chartView.updateTransform(seriesModel, ecModel, api, payload); + result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); + } else { + seriesDirtyMap.set(seriesModel.uid, 1); + } + }); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true); + + this._scheduler.performVisualTasks(ecModel, payload, { + setDirty: true, + dirtyMap: seriesDirtyMap + }); // Currently, not call render of components. Geo render cost a lot. + // renderComponents(ecIns, ecModel, api, payload, componentDirtyList); + + + renderSeries(this, ecModel, api, payload, seriesDirtyMap); + performPostUpdateFuncs(ecModel, this._api); + }, + updateView: function (payload) { + var ecModel = this._model; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); + ChartView.markUpdateMethod(payload, 'updateView'); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + + this._scheduler.performVisualTasks(ecModel, payload, { + setDirty: true + }); + + render(this, this._model, this._api, payload); + performPostUpdateFuncs(ecModel, this._api); + }, + updateVisual: function (payload) { + // updateMethods.update.call(this, payload); + var _this = this; + + var ecModel = this._model; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); // clear all visual + + ecModel.eachSeries(function (seriesModel) { + seriesModel.getData().clearAllVisual(); + }); // Perform visual + + ChartView.markUpdateMethod(payload, 'updateVisual'); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + + this._scheduler.performVisualTasks(ecModel, payload, { + visualType: 'visual', + setDirty: true + }); + + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType !== 'series') { + var componentView = _this.getViewOfComponentModel(componentModel); + + componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload); + } + }); + ecModel.eachSeries(function (seriesModel) { + var chartView = _this._chartsMap[seriesModel.__viewId]; + chartView.updateVisual(seriesModel, ecModel, _this._api, payload); + }); + performPostUpdateFuncs(ecModel, this._api); + }, + updateLayout: function (payload) { + updateMethods.update.call(this, payload); + } + }; + + doConvertPixel = function (ecIns, methodName, finder, value) { + if (ecIns._disposed) { + disposedWarning(ecIns.id); + return; + } + + var ecModel = ecIns._model; + + var coordSysList = ecIns._coordSysMgr.getCoordinateSystems(); + + var result; + var parsedFinder = parseFinder(ecModel, finder); + + for (var i = 0; i < coordSysList.length; i++) { + var coordSys = coordSysList[i]; + + if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value)) != null) { + return result; + } + } + + if ("development" !== 'production') { + console.warn('No coordinate system that supports ' + methodName + ' found by the given finder.'); + } + }; + + updateStreamModes = function (ecIns, ecModel) { + var chartsMap = ecIns._chartsMap; + var scheduler = ecIns._scheduler; + ecModel.eachSeries(function (seriesModel) { + scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]); + }); + }; + + doDispatchAction = function (payload, silent) { + var _this = this; + + var ecModel = this.getModel(); + var payloadType = payload.type; + var escapeConnect = payload.escapeConnect; + var actionWrap = actions[payloadType]; + var actionInfo = actionWrap.actionInfo; + var cptTypeTmp = (actionInfo.update || 'update').split(':'); + var updateMethod = cptTypeTmp.pop(); + var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]); + this[IN_MAIN_PROCESS_KEY] = true; + var payloads = [payload]; + var batched = false; // Batch action + + if (payload.batch) { + batched = true; + payloads = map(payload.batch, function (item) { + item = defaults(extend({}, item), payload); + item.batch = null; + return item; + }); + } + + var eventObjBatch = []; + var eventObj; + var isSelectChange = isSelectChangePayload(payload); + var isStatusChange = isHighDownPayload(payload) || isSelectChange; + each$3(payloads, function (batchItem) { + // Action can specify the event by return it. + eventObj = actionWrap.action(batchItem, _this._model, _this._api); // Emit event outside + + eventObj = eventObj || extend({}, batchItem); // Convert type to eventType + + eventObj.type = actionInfo.event || eventObj.type; + eventObjBatch.push(eventObj); // light update does not perform data process, layout and visual. + + if (isStatusChange) { + // method, payload, mainType, subType + updateDirectly(_this, updateMethod, batchItem, 'series'); // Mark status to update + + markStatusToUpdate(_this); + } else if (cptType) { + updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub); + } + }); + + if (updateMethod !== 'none' && !isStatusChange && !cptType) { + // Still dirty + if (this[OPTION_UPDATED_KEY]) { + prepare(this); + updateMethods.update.call(this, payload); + this[OPTION_UPDATED_KEY] = false; + } else { + updateMethods[updateMethod].call(this, payload); + } + } // Follow the rule of action batch + + + if (batched) { + eventObj = { + type: actionInfo.event || payloadType, + escapeConnect: escapeConnect, + batch: eventObjBatch + }; + } else { + eventObj = eventObjBatch[0]; + } + + this[IN_MAIN_PROCESS_KEY] = false; + + if (!silent) { + var messageCenter = this._messageCenter; + messageCenter.trigger(eventObj.type, eventObj); // Extra triggered 'selectchanged' event + + if (isSelectChange) { + var newObj = { + type: 'selectchanged', + escapeConnect: escapeConnect, + selected: getAllSelectedIndices(ecModel), + isFromClick: payload.isFromClick || false, + fromAction: payload.type, + fromActionPayload: payload + }; + messageCenter.trigger(newObj.type, newObj); + } + } + }; + + flushPendingActions = function (silent) { + var pendingActions = this._pendingActions; + + while (pendingActions.length) { + var payload = pendingActions.shift(); + doDispatchAction.call(this, payload, silent); + } + }; + + triggerUpdatedEvent = function (silent) { + !silent && this.trigger('updated'); + }; + /** + * Event `rendered` is triggered when zr + * rendered. It is useful for realtime + * snapshot (reflect animation). + * + * Event `finished` is triggered when: + * (1) zrender rendering finished. + * (2) initial animation finished. + * (3) progressive rendering finished. + * (4) no pending action. + * (5) no delayed setOption needs to be processed. + */ + + + bindRenderedEvent = function (zr, ecIns) { + zr.on('rendered', function (params) { + ecIns.trigger('rendered', params); // The `finished` event should not be triggered repeatly, + // so it should only be triggered when rendering indeed happend + // in zrender. (Consider the case that dipatchAction is keep + // triggering when mouse move). + + if ( // Although zr is dirty if initial animation is not finished + // and this checking is called on frame, we also check + // animation finished for robustness. + zr.animation.isFinished() && !ecIns[OPTION_UPDATED_KEY] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length) { + ecIns.trigger('finished'); + } + }); + }; + + bindMouseEvent = function (zr, ecIns) { + zr.on('mouseover', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, isHighDownDispatcher); + + if (dispatcher) { + var ecData = getECData(dispatcher); // Try blur all in the related series. Then emphasis the hoverred. + // TODO. progressive mode. + + toggleSeriesBlurState(ecData.seriesIndex, ecData.focus, ecData.blurScope, ecIns._api, true); + enterEmphasisWhenMouseOver(dispatcher, e); + markStatusToUpdate(ecIns); + } + }).on('mouseout', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, isHighDownDispatcher); + + if (dispatcher) { + var ecData = getECData(dispatcher); + toggleSeriesBlurState(ecData.seriesIndex, ecData.focus, ecData.blurScope, ecIns._api, false); + leaveEmphasisWhenMouseOut(dispatcher, e); + markStatusToUpdate(ecIns); + } + }).on('click', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, function (target) { + return getECData(target).dataIndex != null; + }, true); + + if (dispatcher) { + var actionType = dispatcher.selected ? 'unselect' : 'select'; + var ecData = getECData(dispatcher); + + ecIns._api.dispatchAction({ + type: actionType, + dataType: ecData.dataType, + dataIndexInside: ecData.dataIndex, + seriesIndex: ecData.seriesIndex, + isFromClick: true + }); + } + }); + }; + + clearColorPalette = function (ecModel) { + ecModel.clearColorPalette(); + ecModel.eachSeries(function (seriesModel) { + seriesModel.clearColorPalette(); + }); + }; + + render = function (ecIns, ecModel, api, payload) { + renderComponents(ecIns, ecModel, api, payload); + each$3(ecIns._chartsViews, function (chart) { + chart.__alive = false; + }); + renderSeries(ecIns, ecModel, api, payload); // Remove groups of unrendered charts + + each$3(ecIns._chartsViews, function (chart) { + if (!chart.__alive) { + chart.remove(ecModel, api); + } + }); + }; + + renderComponents = function (ecIns, ecModel, api, payload, dirtyList) { + each$3(dirtyList || ecIns._componentsViews, function (componentView) { + var componentModel = componentView.__model; + clearStates(componentModel, componentView); + componentView.render(componentModel, ecModel, api, payload); + updateZ(componentModel, componentView); + updateStates(componentModel, componentView); + }); + }; + /** + * Render each chart and component + */ + + + renderSeries = function (ecIns, ecModel, api, payload, dirtyMap) { + // Render all charts + var scheduler = ecIns._scheduler; + var labelManager = ecIns._labelManager; + labelManager.clearLabels(); + var unfinished = false; + ecModel.eachSeries(function (seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + chartView.__alive = true; + var renderTask = chartView.renderTask; + scheduler.updatePayload(renderTask, payload); // TODO states on marker. + + clearStates(seriesModel, chartView); + + if (dirtyMap && dirtyMap.get(seriesModel.uid)) { + renderTask.dirty(); + } + + if (renderTask.perform(scheduler.getPerformArgs(renderTask))) { + unfinished = true; + } + + seriesModel.__transientTransitionOpt = null; + chartView.group.silent = !!seriesModel.get('silent'); // Should not call markRedraw on group, because it will disable zrender + // increamental render (alway render from the __startIndex each frame) + // chartView.group.markRedraw(); + + updateBlend(seriesModel, chartView); + updateSeriesElementSelection(seriesModel); // Add labels. + + labelManager.addLabelsOfSeries(chartView); + }); + scheduler.unfinished = unfinished || scheduler.unfinished; + labelManager.updateLayoutConfig(api); + labelManager.layout(api); + labelManager.processLabelsOverall(); + ecModel.eachSeries(function (seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; // Update Z after labels updated. Before applying states. + + updateZ(seriesModel, chartView); // NOTE: Update states after label is updated. + // label should be in normal status when layouting. + + updateStates(seriesModel, chartView); + }); // If use hover layer + + updateHoverLayerStatus(ecIns, ecModel); + }; + + performPostUpdateFuncs = function (ecModel, api) { + each$3(postUpdateFuncs, function (func) { + func(ecModel, api); + }); + }; + + markStatusToUpdate = function (ecIns) { + ecIns[STATUS_NEEDS_UPDATE_KEY] = true; // Wake up zrender if it's sleep. Let it update states in the next frame. + + ecIns.getZr().wakeUp(); + }; + + applyChangedStates = function (ecIns) { + if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) { + return; + } + + ecIns.getZr().storage.traverse(function (el) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + applyElementStates(el); + }); + ecIns[STATUS_NEEDS_UPDATE_KEY] = false; + }; + + function applyElementStates(el) { + var newStates = []; + var oldStates = el.currentStates; // Keep other states. + + for (var i = 0; i < oldStates.length; i++) { + var stateName = oldStates[i]; + + if (!(stateName === 'emphasis' || stateName === 'blur' || stateName === 'select')) { + newStates.push(stateName); + } + } // Only use states when it's exists. + + + if (el.selected && el.states.select) { + newStates.push('select'); + } + + if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) { + newStates.push('emphasis'); + } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) { + newStates.push('blur'); + } + + el.useStates(newStates); + } + + function updateHoverLayerStatus(ecIns, ecModel) { + var zr = ecIns._zr; + var storage = zr.storage; + var elCount = 0; + storage.traverse(function (el) { + if (!el.isGroup) { + elCount++; + } + }); + + if (elCount > ecModel.get('hoverLayerThreshold') && !env.node && !env.worker) { + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.preventUsingHoverLayer) { + return; + } + + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + + if (chartView.__alive) { + chartView.group.traverse(function (el) { + if (el.states.emphasis) { + el.states.emphasis.hoverLayer = true; + } + }); + } + }); + } + } + /** + * Update chart and blend. + */ + + function updateBlend(seriesModel, chartView) { + var blendMode = seriesModel.get('blendMode') || null; + + if ("development" !== 'production') { + if (!env.canvasSupported && blendMode && blendMode !== 'source-over') { + console.warn('Only canvas support blendMode'); + } + } + + chartView.group.traverse(function (el) { + // FIXME marker and other components + if (!el.isGroup) { + // DONT mark the element dirty. In case element is incremental and don't wan't to rerender. + el.style.blend = blendMode; + } + + if (el.eachPendingDisplayable) { + el.eachPendingDisplayable(function (displayable) { + displayable.style.blend = blendMode; + }); + } + }); + } + + function updateZ(model, view) { + if (model.preventAutoZ) { + return; + } + + var z = model.get('z'); + var zlevel = model.get('zlevel'); // Set z and zlevel + + view.group.traverse(function (el) { + if (!el.isGroup) { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); // TODO if textContent is on group. + + var label = el.getTextContent(); + var labelLine = el.getTextGuideLine(); + + if (label) { + label.z = el.z; + label.zlevel = el.zlevel; // lift z2 of text content + // TODO if el.emphasis.z2 is spcefied, what about textContent. + + label.z2 = el.z2 + 2; + } + + if (labelLine) { + var showAbove = el.textGuideLineConfig && el.textGuideLineConfig.showAbove; + labelLine.z = el.z; + labelLine.zlevel = el.zlevel; + labelLine.z2 = el.z2 + (showAbove ? 1 : -1); + } + } + }); + } + // TODO States on component. + + function clearStates(model, view) { + view.group.traverse(function (el) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + + if (el.stateTransition) { + el.stateTransition = null; + } + + if (textContent && textContent.stateTransition) { + textContent.stateTransition = null; + } + + if (textGuide && textGuide.stateTransition) { + textGuide.stateTransition = null; + } // TODO If el is incremental. + + + if (el.hasState()) { + el.prevStates = el.currentStates; + el.clearStates(); + } else if (el.prevStates) { + el.prevStates = null; + } + }); + } + + function updateStates(model, view) { + var stateAnimationModel = model.getModel('stateAnimation'); + var enableAnimation = model.isAnimationEnabled(); + var duration = stateAnimationModel.get('duration'); + var stateTransition = duration > 0 ? { + duration: duration, + delay: stateAnimationModel.get('delay'), + easing: stateAnimationModel.get('easing') // additive: stateAnimationModel.get('additive') + + } : null; + view.group.traverse(function (el) { + if (el.states && el.states.emphasis) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + if (el instanceof Path) { + savePathStates(el); + } // Only updated on changed element. In case element is incremental and don't wan't to rerender. + // TODO, a more proper way? + + + if (el.__dirty) { + var prevStates = el.prevStates; // Restore states without animation + + if (prevStates) { + el.useStates(prevStates); + } + } // Update state transition and enable animation again. + + + if (enableAnimation) { + el.stateTransition = stateTransition; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); // TODO Is it necessary to animate label? + + if (textContent) { + textContent.stateTransition = stateTransition; + } + + if (textGuide) { + textGuide.stateTransition = stateTransition; + } + } // The use higlighted and selected flag to toggle states. + + + if (el.__dirty) { + applyElementStates(el); + } + } + }); + } + + createExtensionAPI = function (ecIns) { + return new ( + /** @class */ + function (_super) { + __extends(class_1, _super); + + function class_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + + class_1.prototype.getCoordinateSystems = function () { + return ecIns._coordSysMgr.getCoordinateSystems(); + }; + + class_1.prototype.getComponentByElement = function (el) { + while (el) { + var modelInfo = el.__ecComponentInfo; + + if (modelInfo != null) { + return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index); + } + + el = el.parent; + } + }; + + class_1.prototype.enterEmphasis = function (el, highlightDigit) { + enterEmphasis(el, highlightDigit); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveEmphasis = function (el, highlightDigit) { + leaveEmphasis(el, highlightDigit); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.enterBlur = function (el) { + enterBlur(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveBlur = function (el) { + leaveBlur(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.enterSelect = function (el) { + enterSelect(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveSelect = function (el) { + leaveSelect(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.getModel = function () { + return ecIns.getModel(); + }; + + class_1.prototype.getViewOfComponentModel = function (componentModel) { + return ecIns.getViewOfComponentModel(componentModel); + }; + + class_1.prototype.getViewOfSeriesModel = function (seriesModel) { + return ecIns.getViewOfSeriesModel(seriesModel); + }; + + return class_1; + }(ExtensionAPI))(ecIns); + }; + + enableConnect = function (chart) { + function updateConnectedChartsStatus(charts, status) { + for (var i = 0; i < charts.length; i++) { + var otherChart = charts[i]; + otherChart[CONNECT_STATUS_KEY] = status; + } + } + + each$3(eventActionMap, function (actionType, eventType) { + chart._messageCenter.on(eventType, function (event) { + if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) { + if (event && event.escapeConnect) { + return; + } + + var action_1 = chart.makeActionFromEvent(event); + var otherCharts_1 = []; + each$3(instances$1, function (otherChart) { + if (otherChart !== chart && otherChart.group === chart.group) { + otherCharts_1.push(otherChart); + } + }); + updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING); + each$3(otherCharts_1, function (otherChart) { + if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) { + otherChart.dispatchAction(action_1); + } + }); + updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED); + } + }); + }); + }; + + setTransitionOpt = function (chart, transitionOpt) { + var ecModel = chart._model; + each(normalizeToArray(transitionOpt), function (transOpt) { + var errMsg; + var fromOpt = transOpt.from; + var toOpt = transOpt.to; + + if (toOpt == null) { + if ("development" !== 'production') { + errMsg = '`transition.to` must be specified.'; + } + + throwError(errMsg); + } + + var finderOpt = { + includeMainTypes: ['series'], + enableAll: false, + enableNone: false + }; + var fromResult = fromOpt ? parseFinder(ecModel, fromOpt, finderOpt) : null; + var toResult = parseFinder(ecModel, toOpt, finderOpt); + var toSeries = toResult.seriesModel; + + if (toSeries == null) { + errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`transition` is only supported on series.'; + } + } + + if (fromResult && fromResult.seriesModel !== toSeries) { + errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`transition.from` and `transition.to` must be specified to the same series.'; + } + } + + if (errMsg != null) { + throwError(errMsg); + } // Just a temp solution: mount them on series. + + + toSeries.__transientTransitionOpt = { + from: fromOpt ? fromOpt.dimension : null, + to: toOpt.dimension, + dividingMethod: transOpt.dividingMethod + }; + }); + }; + }(); + + return ECharts; + }(Eventful); + + var echartsProto = ECharts.prototype; + echartsProto.on = createRegisterEventWithLowercaseECharts('on'); + echartsProto.off = createRegisterEventWithLowercaseECharts('off'); + /** + * @deprecated + */ + // @ts-ignore + + echartsProto.one = function (eventName, cb, ctx) { + var self = this; + deprecateLog('ECharts#one is deprecated.'); + + function wrapped() { + var args2 = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args2[_i] = arguments[_i]; + } + + cb && cb.apply && cb.apply(this, args2); // @ts-ignore + + self.off(eventName, wrapped); + } + + this.on.call(this, eventName, wrapped, ctx); + }; // /** + // * Encode visual infomation from data after data processing + // * + // * @param {module:echarts/model/Global} ecModel + // * @param {object} layout + // * @param {boolean} [layoutFilter] `true`: only layout, + // * `false`: only not layout, + // * `null`/`undefined`: all. + // * @param {string} taskBaseTag + // * @private + // */ + // function startVisualEncoding(ecIns, ecModel, api, payload, layoutFilter) { + // each(visualFuncs, function (visual, index) { + // let isLayout = visual.isLayout; + // if (layoutFilter == null + // || (layoutFilter === false && !isLayout) + // || (layoutFilter === true && isLayout) + // ) { + // visual.func(ecModel, api, payload); + // } + // }); + // } + + + var MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu']; + + function disposedWarning(id) { + if ("development" !== 'production') { + console.warn('Instance ' + id + ' has been disposed'); + } + } + + var actions = {}; + /** + * Map eventType to actionType + */ + + var eventActionMap = {}; + var dataProcessorFuncs = []; + var optionPreprocessorFuncs = []; + var postInitFuncs = []; + var postUpdateFuncs = []; + var visualFuncs = []; + var themeStorage = {}; + var loadingEffects = {}; + var instances$1 = {}; + var connectedGroups = {}; + var idBase = +new Date() - 0; + var groupIdBase = +new Date() - 0; + var DOM_ATTRIBUTE_KEY = '_echarts_instance_'; + /** + * @param opts.devicePixelRatio Use window.devicePixelRatio by default + * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart. + * @param opts.width Use clientWidth of the input `dom` by default. + * Can be 'auto' (the same as null/undefined) + * @param opts.height Use clientHeight of the input `dom` by default. + * Can be 'auto' (the same as null/undefined) + */ + + function init$1(dom, theme, opts) { + if ("development" !== 'production') { + if (!dom) { + throw new Error('Initialize failed: invalid dom.'); + } + } + + var existInstance = getInstanceByDom(dom); + + if (existInstance) { + if ("development" !== 'production') { + console.warn('There is a chart instance already initialized on the dom.'); + } + + return existInstance; + } + + if ("development" !== 'production') { + if (isDom(dom) && dom.nodeName.toUpperCase() !== 'CANVAS' && (!dom.clientWidth && (!opts || opts.width == null) || !dom.clientHeight && (!opts || opts.height == null))) { + console.warn('Can\'t get DOM width or height. Please check ' + 'dom.clientWidth and dom.clientHeight. They should not be 0.' + 'For example, you may need to call this in the callback ' + 'of window.onload.'); + } + } + + var chart = new ECharts(dom, theme, opts); + chart.id = 'ec_' + idBase++; + instances$1[chart.id] = chart; + setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id); + enableConnect(chart); + each$3(postInitFuncs, function (postInitFunc) { + postInitFunc(chart); + }); + return chart; + } + /** + * @usage + * (A) + * ```js + * let chart1 = echarts.init(dom1); + * let chart2 = echarts.init(dom2); + * chart1.group = 'xxx'; + * chart2.group = 'xxx'; + * echarts.connect('xxx'); + * ``` + * (B) + * ```js + * let chart1 = echarts.init(dom1); + * let chart2 = echarts.init(dom2); + * echarts.connect('xxx', [chart1, chart2]); + * ``` + */ + + function connect(groupId) { + // Is array of charts + if (isArray(groupId)) { + var charts = groupId; + groupId = null; // If any chart has group + + each$3(charts, function (chart) { + if (chart.group != null) { + groupId = chart.group; + } + }); + groupId = groupId || 'g_' + groupIdBase++; + each$3(charts, function (chart) { + chart.group = groupId; + }); + } + + connectedGroups[groupId] = true; + return groupId; + } + /** + * @deprecated + */ + + function disConnect(groupId) { + connectedGroups[groupId] = false; + } + /** + * Alias and backword compat + */ + + var disconnect = disConnect; + /** + * Dispose a chart instance + */ + + function dispose$1(chart) { + if (typeof chart === 'string') { + chart = instances$1[chart]; + } else if (!(chart instanceof ECharts)) { + // Try to treat as dom + chart = getInstanceByDom(chart); + } + + if (chart instanceof ECharts && !chart.isDisposed()) { + chart.dispose(); + } + } + function getInstanceByDom(dom) { + return instances$1[getAttribute(dom, DOM_ATTRIBUTE_KEY)]; + } + function getInstanceById(key) { + return instances$1[key]; + } + /** + * Register theme + */ + + function registerTheme(name, theme) { + themeStorage[name] = theme; + } + /** + * Register option preprocessor + */ + + function registerPreprocessor(preprocessorFunc) { + if (indexOf$1(optionPreprocessorFuncs, preprocessorFunc) < 0) { + optionPreprocessorFuncs.push(preprocessorFunc); + } + } + function registerProcessor(priority, processor) { + normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT); + } + /** + * Register postIniter + * @param {Function} postInitFunc + */ + + function registerPostInit(postInitFunc) { + if (indexOf$1(postInitFuncs, postInitFunc) < 0) { + postInitFunc && postInitFuncs.push(postInitFunc); + } + } + /** + * Register postUpdater + * @param {Function} postUpdateFunc + */ + + function registerPostUpdate(postUpdateFunc) { + if (indexOf$1(postUpdateFuncs, postUpdateFunc) < 0) { + postUpdateFunc && postUpdateFuncs.push(postUpdateFunc); + } + } + function registerAction(actionInfo, eventName, action) { + if (typeof eventName === 'function') { + action = eventName; + eventName = ''; + } + + var actionType = isObject$2(actionInfo) ? actionInfo.type : [actionInfo, actionInfo = { + event: eventName + }][0]; // Event name is all lowercase + + actionInfo.event = (actionInfo.event || actionType).toLowerCase(); + eventName = actionInfo.event; + + if (eventActionMap[eventName]) { + // Already registered. + return; + } // Validate action type and event name. + + + assert$1(ACTION_REG.test(actionType) && ACTION_REG.test(eventName)); + + if (!actions[actionType]) { + actions[actionType] = { + action: action, + actionInfo: actionInfo + }; + } + + eventActionMap[eventName] = actionType; + } + function registerCoordinateSystem(type, coordSysCreator) { + CoordinateSystemManager.register(type, coordSysCreator); + } + /** + * Get dimensions of specified coordinate system. + * @param {string} type + * @return {Array.} + */ + + function getCoordinateSystemDimensions(type) { + var coordSysCreator = CoordinateSystemManager.get(type); + + if (coordSysCreator) { + return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice(); + } + } + + function registerLayout(priority, layoutTask) { + normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout'); + } + + function registerVisual(priority, visualTask) { + normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual'); + } + var registeredTasks = []; + + function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) { + if (isFunction$1(priority) || isObject$2(priority)) { + fn = priority; + priority = defaultPriority; + } + + if ("development" !== 'production') { + if (isNaN(priority) || priority == null) { + throw new Error('Illegal priority'); + } // Check duplicate + + + each$3(targetList, function (wrap) { + assert$1(wrap.__raw !== fn); + }); + } // Already registered + + + if (indexOf$1(registeredTasks, fn) >= 0) { + return; + } + + registeredTasks.push(fn); + var stageHandler = Scheduler.wrapStageHandler(fn, visualType); + stageHandler.__prio = priority; + stageHandler.__raw = fn; + targetList.push(stageHandler); + } + + function registerLoading(name, loadingFx) { + loadingEffects[name] = loadingFx; + } + /** + * 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. + * + * @example + * let Canvas = require('canvas'); + * let echarts = require('echarts'); + * echarts.setCanvasCreator(function () { + * // Small size is enough. + * return new Canvas(32, 32); + * }); + */ + + function setCanvasCreator(creator) { + $override('createCanvas', creator); + } + /** + * The parameters and usage: see `mapDataStorage.registerMap`. + * Compatible with previous `echarts.registerMap`. + */ + + function registerMap(mapName, geoJson, specialAreas) { + mapDataStorage.registerMap(mapName, geoJson, specialAreas); + } + function getMap(mapName) { + // For backward compatibility, only return the first one. + var records = mapDataStorage.retrieveMap(mapName); // FIXME support SVG, where return not only records[0]. + + return records && records[0] && { + // @ts-ignore + geoJson: records[0].geoJSON, + specialAreas: records[0].specialAreas + }; + } + var registerTransform = registerExternalTransform; + /** + * Globa dispatchAction to a specified chart instance. + */ + // export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters[1]) { + // if (!payload || !payload.chartId) { + // // Must have chartId to find chart + // return; + // } + // const chart = instances[payload.chartId]; + // if (chart) { + // chart.dispatchAction(payload, opt); + // } + // } + // Buitlin global visual + + registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask); + registerVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask); + registerVisual(PRIORITY_VISUAL_DECAL, decalVisual); + registerPreprocessor(globalBackwardCompat); + registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack); + registerLoading('default', defaultLoading); // Default actions + + registerAction({ + type: HIGHLIGHT_ACTION_TYPE, + event: HIGHLIGHT_ACTION_TYPE, + update: HIGHLIGHT_ACTION_TYPE + }, noop); + registerAction({ + type: DOWNPLAY_ACTION_TYPE, + event: DOWNPLAY_ACTION_TYPE, + update: DOWNPLAY_ACTION_TYPE + }, noop); + registerAction({ + type: SELECT_ACTION_TYPE, + event: SELECT_ACTION_TYPE, + update: SELECT_ACTION_TYPE + }, noop); + registerAction({ + type: UNSELECT_ACTION_TYPE, + event: UNSELECT_ACTION_TYPE, + update: UNSELECT_ACTION_TYPE + }, noop); + registerAction({ + type: TOGGLE_SELECT_ACTION_TYPE, + event: TOGGLE_SELECT_ACTION_TYPE, + update: TOGGLE_SELECT_ACTION_TYPE + }, noop); // Default theme + + registerTheme('light', lightTheme); + registerTheme('dark', theme); // For backward compatibility, where the namespace `dataTool` will + // be mounted on `echarts` is the extension `dataTool` is imported. + + var dataTool = {}; + + var extensions = []; + var extensionRegisters = { + registerPreprocessor: registerPreprocessor, + registerProcessor: registerProcessor, + registerPostInit: registerPostInit, + registerPostUpdate: registerPostUpdate, + registerAction: registerAction, + registerCoordinateSystem: registerCoordinateSystem, + registerLayout: registerLayout, + registerVisual: registerVisual, + registerTransform: registerTransform, + registerLoading: registerLoading, + registerMap: registerMap, + PRIORITY: PRIORITY, + ComponentModel: ComponentModel, + ComponentView: ComponentView, + SeriesModel: SeriesModel, + ChartView: ChartView, + // TODO Use ComponentModel and SeriesModel instead of Constructor + registerComponentModel: function (ComponentModelClass) { + ComponentModel.registerClass(ComponentModelClass); + }, + registerComponentView: function (ComponentViewClass) { + ComponentView.registerClass(ComponentViewClass); + }, + registerSeriesModel: function (SeriesModelClass) { + SeriesModel.registerClass(SeriesModelClass); + }, + registerChartView: function (ChartViewClass) { + ChartView.registerClass(ChartViewClass); + }, + registerSubTypeDefaulter: function (componentType, defaulter) { + ComponentModel.registerSubTypeDefaulter(componentType, defaulter); + }, + registerPainter: function (painterType, PainterCtor) { + registerPainter(painterType, PainterCtor); + } + }; + function use(ext) { + if (isArray(ext)) { + // use([ChartLine, ChartBar]); + each(ext, function (singleExt) { + use(singleExt); + }); + return; + } + + if (indexOf(extensions, ext) >= 0) { + return; + } + + extensions.push(ext); + + if (isFunction(ext)) { + ext = { + install: ext + }; + } + + ext.install(extensionRegisters); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function dataIndexMapValueLength(valNumOrArrLengthMoreThan2) { + return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1; + } + + function defaultKeyGetter(item) { + return item; + } + + var DataDiffer = + /** @class */ + function () { + /** + * @param context Can be visited by this.context in callback. + */ + function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context, // By default: 'oneToOne'. + diffMode) { + this._old = oldArr; + this._new = newArr; + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; // Visible in callback via `this.context`; + + this.context = context; + this._diffModeMultiple = diffMode === 'multiple'; + } + /** + * Callback function when add a data + */ + + + DataDiffer.prototype.add = function (func) { + this._add = func; + return this; + }; + /** + * Callback function when update a data + */ + + + DataDiffer.prototype.update = function (func) { + this._update = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateManyToOne = function (func) { + this._updateManyToOne = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateOneToMany = function (func) { + this._updateOneToMany = func; + return this; + }; + /** + * Callback function when remove a data + */ + + + DataDiffer.prototype.remove = function (func) { + this._remove = func; + return this; + }; + + DataDiffer.prototype.execute = function () { + this[this._diffModeMultiple ? '_executeMultiple' : '_executeOneToOne'](); + }; + + DataDiffer.prototype._executeOneToOne = function () { + var oldArr = this._old; + var newArr = this._new; + var newDataIndexMap = {}; + var oldDataKeyArr = new Array(oldArr.length); + var newDataKeyArr = new Array(newArr.length); + + this._initIndexMap(oldArr, null, oldDataKeyArr, '_oldKeyGetter'); + + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + + for (var i = 0; i < oldArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); // idx can never be empty array here. see 'set null' logic below. + + if (newIdxMapValLen > 1) { + // 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 newIdx = newIdxMapVal.shift(); + + if (newIdxMapVal.length === 1) { + newDataIndexMap[oldKey] = newIdxMapVal[0]; + } + + this._update && this._update(newIdx, i); + } else if (newIdxMapValLen === 1) { + newDataIndexMap[oldKey] = null; + this._update && this._update(newIdxMapVal, i); + } else { + this._remove && this._remove(i); + } + } + + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + /** + * For example, consider the case: + * oldData: [o0, o1, o2, o3, o4, o5, o6, o7], + * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8], + * Where: + * o0, o1, n0 has key 'a' (many to one) + * o5, n4, n5, n6 has key 'b' (one to many) + * o2, n1 has key 'c' (one to one) + * n2, n3 has key 'd' (add) + * o3, o4 has key 'e' (remove) + * o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove) + * Then: + * (The order of the following directives are not ensured.) + * this._updateManyToOne(n0, [o0, o1]); + * this._updateOneToMany([n4, n5, n6], o5); + * this._update(n1, o2); + * this._remove(o3); + * this._remove(o4); + * this._remove(o6); + * this._remove(o7); + * this._add(n2); + * this._add(n3); + * this._add(n7); + * this._add(n8); + */ + + + DataDiffer.prototype._executeMultiple = function () { + var oldArr = this._old; + var newArr = this._new; + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var oldDataKeyArr = []; + var newDataKeyArr = []; + + this._initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter'); + + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + + for (var i = 0; i < oldDataKeyArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var oldIdxMapVal = oldDataIndexMap[oldKey]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var oldIdxMapValLen = dataIndexMapValueLength(oldIdxMapVal); + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); + + if (oldIdxMapValLen > 1 && newIdxMapValLen === 1) { + this._updateManyToOne && this._updateManyToOne(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen > 1) { + this._updateOneToMany && this._updateOneToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen === 1) { + this._update && this._update(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1) { + for (var i_1 = 0; i_1 < oldIdxMapValLen; i_1++) { + this._remove && this._remove(oldIdxMapVal[i_1]); + } + } else { + this._remove && this._remove(oldIdxMapVal); + } + } + + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + + DataDiffer.prototype._performRestAdd = function (newDataKeyArr, newDataIndexMap) { + for (var i = 0; i < newDataKeyArr.length; i++) { + var newKey = newDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[newKey]; + var idxMapValLen = dataIndexMapValueLength(newIdxMapVal); + + if (idxMapValLen > 1) { + for (var j = 0; j < idxMapValLen; j++) { + this._add && this._add(newIdxMapVal[j]); + } + } else if (idxMapValLen === 1) { + this._add && this._add(newIdxMapVal); + } // Support both `newDataKeyArr` are duplication removed or not removed. + + + newDataIndexMap[newKey] = null; + } + }; + + DataDiffer.prototype._initIndexMap = function (arr, // Can be null. + map, // In 'byKey', the output `keyArr` is duplication removed. + // In 'byIndex', the output `keyArr` is not duplication removed and + // its indices are accurately corresponding to `arr`. + keyArr, keyGetterName) { + var cbModeMultiple = this._diffModeMultiple; + + for (var i = 0; i < arr.length; i++) { + // Add prefix to avoid conflict with Object.prototype. + var key = '_ec_' + this[keyGetterName](arr[i], i); + + if (!cbModeMultiple) { + keyArr[i] = key; + } + + if (!map) { + continue; + } + + var idxMapVal = map[key]; + var idxMapValLen = dataIndexMapValueLength(idxMapVal); + + if (idxMapValLen === 0) { + // Simple optimize: in most cases, one index has one key, + // do not need array. + map[key] = i; + + if (cbModeMultiple) { + keyArr.push(key); + } + } else if (idxMapValLen === 1) { + map[key] = [idxMapVal, i]; + } else { + idxMapVal.push(i); + } + } + }; + + return DataDiffer; + }(); + + function summarizeDimensions(data) { + var summary = {}; + var encode = summary.encode = {}; + var notExtraCoordDimMap = createHashMap(); + var defaultedLabel = []; + var defaultedTooltip = []; // See the comment of `List.js#userOutput`. + + var userOutput = summary.userOutput = { + dimensionNames: data.dimensions.slice(), + encode: {} + }; + each(data.dimensions, function (dimName) { + var dimItem = data.getDimensionInfo(dimName); + var coordDim = dimItem.coordDim; + + if (coordDim) { + if ("development" !== 'production') { + assert(VISUAL_DIMENSIONS.get(coordDim) == null); + } + + var coordDimIndex = dimItem.coordDimIndex; + getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName; + + if (!dimItem.isExtraCoord) { + notExtraCoordDimMap.set(coordDim, 1); // Use the last coord dim (and label friendly) as default label, + // because when dataset is used, it is hard to guess which dimension + // can be value dimension. If both show x, y on label is not look good, + // and conventionally y axis is focused more. + + if (mayLabelDimType(dimItem.type)) { + defaultedLabel[0] = dimName; + } // User output encode do not contain generated coords. + // And it only has index. User can use index to retrieve value from the raw item array. + + + getOrCreateEncodeArr(userOutput.encode, coordDim)[coordDimIndex] = dimItem.index; + } + + if (dimItem.defaultTooltip) { + defaultedTooltip.push(dimName); + } + } + + VISUAL_DIMENSIONS.each(function (v, otherDim) { + var encodeArr = getOrCreateEncodeArr(encode, otherDim); + var dimIndex = dimItem.otherDims[otherDim]; + + if (dimIndex != null && dimIndex !== false) { + encodeArr[dimIndex] = dimItem.name; + } + }); + }); + var dataDimsOnCoord = []; + var encodeFirstDimNotExtra = {}; + notExtraCoordDimMap.each(function (v, coordDim) { + var dimArr = encode[coordDim]; + encodeFirstDimNotExtra[coordDim] = dimArr[0]; // Not necessary to remove duplicate, because a data + // dim canot on more than one coordDim. + + dataDimsOnCoord = dataDimsOnCoord.concat(dimArr); + }); + summary.dataDimsOnCoord = dataDimsOnCoord; + summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra; + var encodeLabel = encode.label; // FIXME `encode.label` is not recommanded, because formatter can not be set + // in this way. Use label.formatter instead. May be remove this approach someday. + + if (encodeLabel && encodeLabel.length) { + defaultedLabel = encodeLabel.slice(); + } + + var encodeTooltip = encode.tooltip; + + if (encodeTooltip && encodeTooltip.length) { + defaultedTooltip = encodeTooltip.slice(); + } else if (!defaultedTooltip.length) { + defaultedTooltip = defaultedLabel.slice(); + } + + encode.defaultedLabel = defaultedLabel; + encode.defaultedTooltip = defaultedTooltip; + return summary; + } + + function getOrCreateEncodeArr(encode, dim) { + if (!encode.hasOwnProperty(dim)) { + encode[dim] = []; + } + + return encode[dim]; + } // FIXME:TS should be type `AxisType` + + + function getDimensionTypeByAxis(axisType) { + return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float'; + } + + function mayLabelDimType(dimType) { + // In most cases, ordinal and time do not suitable for label. + // Ordinal info can be displayed on axis. Time is too long. + return !(dimType === 'ordinal' || dimType === 'time'); + } // function findTheLastDimMayLabel(data) { + // // Get last value dim + // let dimensions = data.dimensions.slice(); + // let valueType; + // let valueDim; + // while (dimensions.length && ( + // valueDim = dimensions.pop(), + // valueType = data.getDimensionInfo(valueDim).type, + // valueType === 'ordinal' || valueType === 'time' + // )) {} // jshint ignore:line + // return valueDim; + // } + + var DataDimensionInfo = + /** @class */ + function () { + /** + * @param opt All of the fields will be shallow copied. + */ + function DataDimensionInfo(opt) { + /** + * The format of `otherDims` is: + * ```js + * { + * tooltip: number optional, + * label: number optional, + * itemName: number optional, + * seriesName: number optional, + * } + * ``` + * + * A `series.encode` can specified these fields: + * ```js + * encode: { + * // "3, 1, 5" is the index of data dimension. + * tooltip: [3, 1, 5], + * label: [0, 3], + * ... + * } + * ``` + * `otherDims` is the parse result of the `series.encode` above, like: + * ```js + * // Suppose the index of this data dimension is `3`. + * this.otherDims = { + * // `3` is at the index `0` of the `encode.tooltip` + * tooltip: 0, + * // `3` is at the index `1` of the `encode.tooltip` + * label: 1 + * }; + * ``` + * + * This prop should never be `null`/`undefined` after initialized. + */ + this.otherDims = {}; + + if (opt != null) { + extend(this, opt); + } + } + + return DataDimensionInfo; + }(); + + var mathFloor = Math.floor; + var isObject$3 = isObject; + var map$1 = map; + var UNDEFINED = 'undefined'; + var INDEX_NOT_FOUND = -1; // Use prefix to avoid index to be the same as otherIdList[idx], + // which will cause weird udpate animation. + + var ID_PREFIX = 'e\0\0'; + var dataCtors = { + 'float': typeof Float64Array === UNDEFINED ? Array : Float64Array, + 'int': typeof Int32Array === UNDEFINED ? Array : Int32Array, + // Ordinal data type can be string or int + 'ordinal': Array, + 'number': Array, + 'time': Array + }; // Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is + // different from the Ctor of typed array. + + var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array; + var CtorInt32Array = typeof Int32Array === UNDEFINED ? Array : Int32Array; + var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array; + var TRANSFERABLE_PROPERTIES = ['hasItemOption', '_nameList', '_idList', '_invertedIndicesMap', '_rawData', '_dimValueGetter', '_count', '_rawCount', '_nameDimIdx', '_idDimIdx', '_nameRepeatCount']; + var CLONE_PROPERTIES = ['_extent', '_approximateExtent', '_rawExtent']; // ----------------------------- + // Internal method declarations: + // ----------------------------- + + var defaultDimValueGetters; + var prepareInvertedIndex; + var getIndicesCtor; + var prepareStorage; + var getRawIndexWithoutIndices; + var getRawIndexWithIndices; + var getId; + var getIdNameFromStore; + var makeIdFromName; + var normalizeDimensions; + var validateDimensions; + var cloneListForMapAndSample; + var getInitialExtent; + var setItemDataAndSeriesIndex; + var transferProperties; + + var List = + /** @class */ + function () { + /** + * @param dimensions + * For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...]. + * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius + */ + function List(dimensions, hostModel) { + this.type = 'list'; + this._count = 0; + this._rawCount = 0; + this._storage = {}; // We have an extra array store here. It's faster to be acessed than KV structured `_storage`. + // We profile the code `storage[dim]` and it seems to be KeyedLoadIC_Megamorphic instead of fast property access. + // Not sure why this happens. But using an extra array seems leads to faster `initData` + // See https://github.com/apache/incubator-echarts/pull/13314 for more explanation. + + this._storageArr = []; + this._nameList = []; + this._idList = []; // Models of data option is stored sparse for optimizing memory cost + // Never used yet (not used yet). + // private _optionModels: Model[] = []; + // Global visual properties after visual coding + + this._visual = {}; // Globel layout properties. + + this._layout = {}; // Item visual properties after visual coding + + this._itemVisuals = []; // Item layout properties after layout + + this._itemLayouts = []; // Graphic elemnents + + this._graphicEls = []; // Raw extent will not be cloned, but only transfered. + // It will not be calculated util needed. + + this._rawExtent = {}; + this._extent = {}; // key: dim, value: extent + + this._approximateExtent = {}; + this._calculationInfo = {}; // Having detected that there is data item is non primitive type + // (in type `OptionDataItemObject`). + // Like `data: [ { value: xx, itemStyle: {...} }, ...]` + // At present it only happen in `SOURCE_FORMAT_ORIGINAL`. + + this.hasItemOption = true; // Methods that create a new list based on this list should be listed here. + // Notice that those method should `RETURN` the new list. + + this.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'lttbDownSample', 'map']; // Methods that change indices of this list should be listed here. + + this.CHANGABLE_METHODS = ['filterSelf', 'selectRange']; + this.DOWNSAMPLE_METHODS = ['downSample', 'lttbDownSample']; + /** + * Get raw data index. + * Do not initialize. + * Default `getRawIndex`. And it can be changed. + */ + + this.getRawIndex = getRawIndexWithoutIndices; + dimensions = dimensions || ['x', 'y']; + var dimensionInfos = {}; + var dimensionNames = []; + var invertedIndicesMap = {}; + + for (var i = 0; i < dimensions.length; i++) { + // Use the original dimensions[i], where other flag props may exists. + var dimInfoInput = dimensions[i]; + var dimensionInfo = isString(dimInfoInput) ? new DataDimensionInfo({ + name: dimInfoInput + }) : !(dimInfoInput instanceof DataDimensionInfo) ? new DataDimensionInfo(dimInfoInput) : dimInfoInput; + var dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || 'float'; + + if (!dimensionInfo.coordDim) { + dimensionInfo.coordDim = dimensionName; + dimensionInfo.coordDimIndex = 0; + } + + var otherDims = dimensionInfo.otherDims = dimensionInfo.otherDims || {}; + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + dimensionInfo.index = i; + + if (dimensionInfo.createInvertedIndices) { + invertedIndicesMap[dimensionName] = []; + } + + if (otherDims.itemName === 0) { + this._nameDimIdx = i; + this._nameOrdinalMeta = dimensionInfo.ordinalMeta; + } + + if (otherDims.itemId === 0) { + this._idDimIdx = i; + this._idOrdinalMeta = dimensionInfo.ordinalMeta; + } + } + + this.dimensions = dimensionNames; + this._dimensionInfos = dimensionInfos; + this.hostModel = hostModel; // Cache summary info for fast visit. See "dimensionHelper". + + this._dimensionsSummary = summarizeDimensions(this); + this._invertedIndicesMap = invertedIndicesMap; + this.userOutput = this._dimensionsSummary.userOutput; + } + /** + * The meanings of the input parameter `dim`: + * + * + If dim is a number (e.g., `1`), it means the index of the dimension. + * For example, `getDimension(0)` will return 'x' or 'lng' or 'radius'. + * + If dim is a number-like string (e.g., `"1"`): + * + If there is the same concrete dim name defined in `this.dimensions`, it means that concrete name. + * + If not, it will be converted to a number, which means the index of the dimension. + * (why? because of the backward compatbility. We have been tolerating number-like string in + * dimension setting, although now it seems that it is not a good idea.) + * For example, `visualMap[i].dimension: "1"` is the same meaning as `visualMap[i].dimension: 1`, + * if no dimension name is defined as `"1"`. + * + If dim is a not-number-like string, it means the concrete dim name. + * For example, it can be be default name `"x"`, `"y"`, `"z"`, `"lng"`, `"lat"`, `"angle"`, `"radius"`, + * or customized in `dimensions` property of option like `"age"`. + * + * Get dimension name + * @param dim See above. + * @return Concrete dim name. + */ + + + List.prototype.getDimension = function (dim) { + if (typeof dim === 'number' // If being a number-like string but not being defined a dimension name. + || !isNaN(dim) && !this._dimensionInfos.hasOwnProperty(dim)) { + dim = this.dimensions[dim]; + } + + return dim; + }; + /** + * Get type and calculation info of particular dimension + * @param 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' + */ + + + List.prototype.getDimensionInfo = function (dim) { + // Do not clone, because there may be categories in dimInfo. + return this._dimensionInfos[this.getDimension(dim)]; + }; + /** + * concrete dimension name list on coord. + */ + + + List.prototype.getDimensionsOnCoord = function () { + return this._dimensionsSummary.dataDimsOnCoord.slice(); + }; + + List.prototype.mapDimension = function (coordDim, idx) { + var dimensionsSummary = this._dimensionsSummary; + + if (idx == null) { + return dimensionsSummary.encodeFirstDimNotExtra[coordDim]; + } + + var dims = dimensionsSummary.encode[coordDim]; + return dims ? dims[idx] : null; + }; + + List.prototype.mapDimensionsAll = function (coordDim) { + var dimensionsSummary = this._dimensionsSummary; + var dims = dimensionsSummary.encode[coordDim]; + return (dims || []).slice(); + }; + /** + * Initialize from data + * @param data source or data or data provider. + * @param nameList The name of a datum is used on data diff and + * default label/tooltip. + * A name can be specified in encode.itemName, + * or dataItem.name (only for series option data), + * or provided in nameList from outside. + */ + + + List.prototype.initData = function (data, nameList, dimValueGetter) { + var notProvider = isSourceInstance(data) || isArrayLike(data); + var provider = notProvider ? new DefaultDataProvider(data, this.dimensions.length) : data; + + if ("development" !== 'production') { + assert(notProvider || isFunction(provider.getItem) && isFunction(provider.count), 'Inavlid data provider.'); + } + + this._rawData = provider; + var sourceFormat = provider.getSource().sourceFormat; // Clear + + this._storage = {}; + this._indices = null; + this._dontMakeIdFromName = this._idDimIdx != null || sourceFormat === SOURCE_FORMAT_TYPED_ARRAY // Cosndier performance. + || !!provider.fillStorage; + this._nameList = (nameList || []).slice(); + this._idList = []; + this._nameRepeatCount = {}; + + if (!dimValueGetter) { + this.hasItemOption = false; + } + + this.defaultDimValueGetter = defaultDimValueGetters[sourceFormat]; // Default dim value getter + + this._dimValueGetter = dimValueGetter = dimValueGetter || this.defaultDimValueGetter; + this._dimValueGetterArrayRows = defaultDimValueGetters.arrayRows; // Reset raw extent. + + this._rawExtent = {}; + + this._initDataFromProvider(0, provider.count()); // If data has no item option. + + + if (provider.pure) { + this.hasItemOption = false; + } + }; + + List.prototype.getProvider = function () { + return this._rawData; + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + */ + + + List.prototype.appendData = function (data) { + if ("development" !== 'production') { + assert(!this._indices, 'appendData can only be called on raw data.'); + } + + var rawData = this._rawData; + var start = this.count(); + rawData.appendData(data); + var end = rawData.count(); + + if (!rawData.persistent) { + end += start; + } + + this._initDataFromProvider(start, end, true); + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + * This method does not modify `rawData` (`dataProvider`), but only + * add values to storage. + * + * The final count will be increased by `Math.max(values.length, names.length)`. + * + * @param values That is the SourceType: 'arrayRows', like + * [ + * [12, 33, 44], + * [NaN, 43, 1], + * ['-', 'asdf', 0] + * ] + * Each item is exaclty cooresponding to a dimension. + */ + + + List.prototype.appendValues = function (values, names) { + var storage = this._storage; + var dimensions = this.dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var start = this.count(); + var end = start + Math.max(values.length, names ? names.length : 0); + + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + + if (!rawExtent[dim]) { + rawExtent[dim] = getInitialExtent(); + } + + prepareStorage(storage, this._dimensionInfos[dim], end, true); + } + + var rawExtentArr = map$1(dimensions, function (dim) { + return rawExtent[dim]; + }); + var storageArr = this._storageArr = map$1(dimensions, function (dim) { + return storage[dim]; + }); + var emptyDataItem = []; + + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; // Store the data by dimensions + + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dim = dimensions[dimIdx]; + + var val = this._dimValueGetterArrayRows(values[sourceIdx] || emptyDataItem, dim, sourceIdx, dimIdx); + + storageArr[dimIdx][idx] = val; + var dimRawExtent = rawExtentArr[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + + if (names) { + this._nameList[idx] = names[sourceIdx]; + + if (!this._dontMakeIdFromName) { + makeIdFromName(this, idx); + } + } + } + + this._rawCount = this._count = end; // Reset data extent + + this._extent = {}; + prepareInvertedIndex(this); + }; + + List.prototype._initDataFromProvider = function (start, end, append) { + if (start >= end) { + return; + } + + var rawData = this._rawData; + var storage = this._storage; + var dimensions = this.dimensions; + var dimLen = dimensions.length; + var dimensionInfoMap = this._dimensionInfos; + var nameList = this._nameList; + var idList = this._idList; + var rawExtent = this._rawExtent; + var sourceFormat = rawData.getSource().sourceFormat; + var isFormatOriginal = sourceFormat === SOURCE_FORMAT_ORIGINAL; + + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + + if (!rawExtent[dim]) { + rawExtent[dim] = getInitialExtent(); + } + + prepareStorage(storage, dimensionInfoMap[dim], end, append); + } + + var storageArr = this._storageArr = map$1(dimensions, function (dim) { + return storage[dim]; + }); + var rawExtentArr = map$1(dimensions, function (dim) { + return rawExtent[dim]; + }); + + if (rawData.fillStorage) { + rawData.fillStorage(start, end, storageArr, rawExtentArr); + } else { + var dataItem = []; + + for (var idx = start; idx < end; idx++) { + // NOTICE: Try not to write things into dataItem + dataItem = rawData.getItem(idx, dataItem); // 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 category + // Use a tempValue to normalize the value to be a (x, y) value + // Store the data by dimensions + + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dim = dimensions[dimIdx]; + var dimStorage = storageArr[dimIdx]; // PENDING NULL is empty or zero + + var val = this._dimValueGetter(dataItem, dim, idx, dimIdx); + + dimStorage[idx] = val; + var dimRawExtent = rawExtentArr[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } // If dataItem is {name: ...} or {id: ...}, it has highest priority. + // This kind of ids and names are always stored `_nameList` and `_idList`. + + + if (isFormatOriginal && !rawData.pure && dataItem) { + var itemName = dataItem.name; + + if (nameList[idx] == null && itemName != null) { + nameList[idx] = convertOptionIdName(itemName, null); + } + + var itemId = dataItem.id; + + if (idList[idx] == null && itemId != null) { + idList[idx] = convertOptionIdName(itemId, null); + } + } + + if (!this._dontMakeIdFromName) { + makeIdFromName(this, idx); + } + } + } + + if (!rawData.persistent && rawData.clean) { + // Clean unused data if data source is typed array. + rawData.clean(); + } + + this._rawCount = this._count = end; // Reset data extent + + this._extent = {}; + prepareInvertedIndex(this); + }; + + List.prototype.count = function () { + return this._count; + }; + + List.prototype.getIndices = function () { + var newIndices; + var indices = this._indices; + + if (indices) { + var Ctor = indices.constructor; + var thisCount = this._count; // `new Array(a, b, c)` is different from `new Uint32Array(a, b, c)`. + + if (Ctor === Array) { + newIndices = new Ctor(thisCount); + + for (var i = 0; i < thisCount; i++) { + newIndices[i] = indices[i]; + } + } else { + newIndices = new Ctor(indices.buffer, 0, thisCount); + } + } else { + var Ctor = getIndicesCtor(this); + newIndices = new Ctor(this.count()); + + for (var i = 0; i < newIndices.length; i++) { + newIndices[i] = i; + } + } + + return newIndices; + }; // Get data by index of dimension. + // Because in v8 access array by number variable is faster than access object by string variable + // Not sure why but the optimization just works. + + + List.prototype.getByDimIdx = function (dimIdx, idx) { + if (!(idx >= 0 && idx < this._count)) { + return NaN; + } + + var dimStore = this._storageArr[dimIdx]; + return dimStore ? dimStore[this.getRawIndex(idx)] : NaN; + }; + /** + * Get value. Return NaN if idx is out of range. + * @param dim Dim must be concrete name. + */ + + + List.prototype.get = function (dim, idx) { + if (!(idx >= 0 && idx < this._count)) { + return NaN; + } + + var dimStore = this._storage[dim]; + return dimStore ? dimStore[this.getRawIndex(idx)] : NaN; + }; + /** + * @param dim concrete dim + */ + + + List.prototype.getByRawIndex = function (dim, rawIdx) { + if (!(rawIdx >= 0 && rawIdx < this._rawCount)) { + return NaN; + } + + var dimStore = this._storage[dim]; + return dimStore ? dimStore[rawIdx] : NaN; + }; + + List.prototype.getValues = function (dimensions, idx) { + var values = []; + + if (!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 '-' + * Only check the coord dimensions. + */ + + + List.prototype.hasValue = function (idx) { + var dataDimsOnCoord = this._dimensionsSummary.dataDimsOnCoord; + + for (var i = 0, len = dataDimsOnCoord.length; i < len; i++) { + // Ordinal type originally can be string or number. + // But when an ordinal type is used on coord, it can + // not be string but only number. So we can also use isNaN. + if (isNaN(this.get(dataDimsOnCoord[i], idx))) { + return false; + } + } + + return true; + }; + /** + * Get extent of data in one dimension + */ + + + List.prototype.getDataExtent = function (dim) { + // Make sure use concrete dim as cache name. + dim = this.getDimension(dim); + var dimData = this._storage[dim]; + var initialExtent = getInitialExtent(); // stack = !!((stack || false) && this.getCalculationInfo(dim)); + + if (!dimData) { + return initialExtent; + } // Make more strict checkings to ensure hitting cache. + + + var currEnd = this.count(); // let cacheName = [dim, !!stack].join('_'); + // let cacheName = dim; + // Consider the most cases when using data zoom, `getDataExtent` + // happened before filtering. We cache raw extent, which is not + // necessary to be cleared and recalculated when restore data. + + var useRaw = !this._indices; // && !stack; + + var dimExtent; + + if (useRaw) { + return this._rawExtent[dim].slice(); + } + + dimExtent = this._extent[dim]; + + if (dimExtent) { + return dimExtent.slice(); + } + + dimExtent = initialExtent; + var min = dimExtent[0]; + var max = dimExtent[1]; + + for (var i = 0; i < currEnd; i++) { + var rawIdx = this.getRawIndex(i); + var value = dimData[rawIdx]; + value < min && (min = value); + value > max && (max = value); + } + + dimExtent = [min, max]; + this._extent[dim] = dimExtent; + return dimExtent; + }; + /** + * PENDING: In fact currently this function is only used to short-circuit + * the calling of `scale.unionExtentFromData` when data have been filtered by modules + * like "dataZoom". `scale.unionExtentFromData` is used to calculate data extent for series on + * an axis, but if a "axis related data filter module" is used, the extent of the axis have + * been fixed and no need to calling `scale.unionExtentFromData` actually. + * But if we add "custom data filter" in future, which is not "axis related", this method may + * be still needed. + * + * Optimize for the scenario that data is filtered by a given extent. + * Consider that if data amount is more than hundreds of thousand, + * extent calculation will cost more than 10ms and the cache will + * be erased because of the filtering. + */ + + + List.prototype.getApproximateExtent = function (dim) { + dim = this.getDimension(dim); + return this._approximateExtent[dim] || this.getDataExtent(dim); + }; + /** + * Calculate extent on a filtered data might be time consuming. + * Approximate extent is only used for: calculte extent of filtered data outside. + */ + + + List.prototype.setApproximateExtent = function (extent, dim) { + dim = this.getDimension(dim); + this._approximateExtent[dim] = extent.slice(); + }; + + List.prototype.getCalculationInfo = function (key) { + return this._calculationInfo[key]; + }; + + List.prototype.setCalculationInfo = function (key, value) { + isObject$3(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value; + }; + /** + * Get sum of data in one dimension + */ + + + List.prototype.getSum = function (dim) { + 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); + + if (!isNaN(value)) { + sum += value; + } + } + } + + return sum; + }; + /** + * Get median of data in one dimension + */ + + + List.prototype.getMedian = function (dim) { + var dimDataArray = []; // map all data of one dimension + + this.each(dim, function (val) { + if (!isNaN(val)) { + dimDataArray.push(val); + } + }); // TODO + // Use quick select? + + var sortedDimDataArray = dimDataArray.sort(function (a, b) { + return a - b; + }); + var len = this.count(); // calculate median + + return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2; + }; // /** + // * Retreive the index with given value + // * @param {string} dim Concrete dimension. + // * @param {number} value + // * @return {number} + // */ + // Currently incorrect: should return dataIndex but not rawIndex. + // Do not fix it until this method is to be used somewhere. + // FIXME Precision of float value + // indexOf(dim, value) { + // let storage = this._storage; + // let dimData = storage[dim]; + // let chunkSize = this._chunkSize; + // if (dimData) { + // for (let i = 0, len = this.count(); i < len; i++) { + // let chunkIndex = mathFloor(i / chunkSize); + // let chunkOffset = i % chunkSize; + // if (dimData[chunkIndex][chunkOffset] === value) { + // return i; + // } + // } + // } + // return -1; + // } + + /** + * Only support the dimension which inverted index created. + * Do not support other cases until required. + * @param dim concrete dim + * @param value ordinal index + * @return rawIndex + */ + + + List.prototype.rawIndexOf = function (dim, value) { + var invertedIndices = dim && this._invertedIndicesMap[dim]; + + if ("development" !== 'production') { + if (!invertedIndices) { + throw new Error('Do not supported yet'); + } + } + + var rawIndex = invertedIndices[value]; + + if (rawIndex == null || isNaN(rawIndex)) { + return INDEX_NOT_FOUND; + } + + return rawIndex; + }; + /** + * Retreive the index with given name + */ + + + List.prototype.indexOfName = function (name) { + for (var i = 0, len = this.count(); i < len; i++) { + if (this.getName(i) === name) { + return i; + } + } + + return -1; + }; + /** + * Retreive the index with given raw data index + */ + + + List.prototype.indexOfRawIndex = function (rawIndex) { + if (rawIndex >= this._rawCount || rawIndex < 0) { + return -1; + } + + if (!this._indices) { + return rawIndex; + } // Indices are ascending + + + var indices = this._indices; // If rawIndex === dataIndex + + var rawDataIndex = indices[rawIndex]; + + if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) { + return rawIndex; + } + + var left = 0; + var right = this._count - 1; + + while (left <= right) { + var mid = (left + right) / 2 | 0; + + if (indices[mid] < rawIndex) { + left = mid + 1; + } else if (indices[mid] > rawIndex) { + right = mid - 1; + } else { + return mid; + } + } + + return -1; + }; + /** + * Retreive the index of nearest value + * @param dim + * @param value + * @param [maxDistance=Infinity] + * @return If and only if multiple indices has + * the same value, they are put to the result. + */ + + + List.prototype.indicesOfNearest = function (dim, value, maxDistance) { + var storage = this._storage; + var dimData = storage[dim]; + var nearestIndices = []; + + if (!dimData) { + return nearestIndices; + } + + if (maxDistance == null) { + maxDistance = Infinity; + } + + var minDist = Infinity; + var minDiff = -1; + var nearestIndicesLen = 0; // Check the test case of `test/ut/spec/data/List.js`. + + for (var i = 0, len = this.count(); i < len; i++) { + var dataIndex = this.getRawIndex(i); + var diff = value - dimData[dataIndex]; + var dist = Math.abs(diff); + + if (dist <= maxDistance) { + // When the `value` is at the middle of `this.get(dim, i)` and `this.get(dim, i+1)`, + // we'd better not push both of them to `nearestIndices`, otherwise it is easy to + // get more than one item in `nearestIndices` (more specifically, in `tooltip`). + // So we chose the one that `diff >= 0` in this csae. + // But if `this.get(dim, i)` and `this.get(dim, j)` get the same value, both of them + // should be push to `nearestIndices`. + if (dist < minDist || dist === minDist && diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + nearestIndicesLen = 0; + } + + if (diff === minDiff) { + nearestIndices[nearestIndicesLen++] = i; + } + } + } + + nearestIndices.length = nearestIndicesLen; + return nearestIndices; + }; + /** + * Get raw data item + */ + + + List.prototype.getRawDataItem = function (idx) { + if (!this._rawData.persistent) { + var val = []; + + for (var i = 0; i < this.dimensions.length; i++) { + var dim = this.dimensions[i]; + val.push(this.get(dim, idx)); + } + + return val; + } else { + return this._rawData.getItem(this.getRawIndex(idx)); + } + }; + /** + * @return Never be null/undefined. `number` will be converted to string. Becuase: + * In most cases, name is used in display, where returning a string is more convenient. + * In other cases, name is used in query (see `indexOfName`), where we can keep the + * rule that name `2` equals to name `'2'`. + */ + + + List.prototype.getName = function (idx) { + var rawIndex = this.getRawIndex(idx); + var name = this._nameList[rawIndex]; + + if (name == null && this._nameDimIdx != null) { + name = getIdNameFromStore(this, this._nameDimIdx, this._nameOrdinalMeta, rawIndex); + } + + if (name == null) { + name = ''; + } + + return name; + }; + /** + * @return Never null/undefined. `number` will be converted to string. Becuase: + * In all cases having encountered at present, id is used in making diff comparison, which + * are usually based on hash map. We can keep the rule that the internal id are always string + * (treat `2` is the same as `'2'`) to make the related logic simple. + */ + + + List.prototype.getId = function (idx) { + return getId(this, this.getRawIndex(idx)); + }; + + List.prototype.each = function (dims, cb, ctx, ctxCompat) { + + var _this = this; + + if (!this._count) { + return; + } + + if (typeof dims === 'function') { + ctxCompat = ctx; + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + var fCtx = ctx || ctxCompat || this; + var dimNames = map$1(normalizeDimensions(dims), this.getDimension, this); + + if ("development" !== 'production') { + validateDimensions(this, dimNames); + } + + var dimSize = dimNames.length; + var dimIndices = map$1(dimNames, function (dimName) { + return _this._dimensionInfos[dimName].index; + }); + var storageArr = this._storageArr; + + for (var i = 0, len = this.count(); i < len; i++) { + var rawIdx = this.getRawIndex(i); // Simple optimization + + switch (dimSize) { + case 0: + cb.call(fCtx, i); + break; + + case 1: + cb.call(fCtx, storageArr[dimIndices[0]][rawIdx], i); + break; + + case 2: + cb.call(fCtx, storageArr[dimIndices[0]][rawIdx], storageArr[dimIndices[1]][rawIdx], i); + break; + + default: + var k = 0; + var value = []; + + for (; k < dimSize; k++) { + value[k] = storageArr[dimIndices[k]][rawIdx]; + } // Index + + + value[k] = i; + cb.apply(fCtx, value); + } + } + }; + + List.prototype.filterSelf = function (dims, cb, ctx, ctxCompat) { + + var _this = this; + + if (!this._count) { + return; + } + + if (typeof dims === 'function') { + ctxCompat = ctx; + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + var fCtx = ctx || ctxCompat || this; + var dimNames = map$1(normalizeDimensions(dims), this.getDimension, this); + + if ("development" !== 'production') { + validateDimensions(this, dimNames); + } + + var count = this.count(); + var Ctor = getIndicesCtor(this); + var newIndices = new Ctor(count); + var value = []; + var dimSize = dimNames.length; + var offset = 0; + var dimIndices = map$1(dimNames, function (dimName) { + return _this._dimensionInfos[dimName].index; + }); + var dim0 = dimIndices[0]; + var storageArr = this._storageArr; + + for (var i = 0; i < count; i++) { + var keep = void 0; + var rawIdx = this.getRawIndex(i); // Simple optimization + + if (dimSize === 0) { + keep = cb.call(fCtx, i); + } else if (dimSize === 1) { + var val = storageArr[dim0][rawIdx]; + keep = cb.call(fCtx, val, i); + } else { + var k = 0; + + for (; k < dimSize; k++) { + value[k] = storageArr[dimIndices[k]][rawIdx]; + } + + value[k] = i; + keep = cb.apply(fCtx, value); + } + + if (keep) { + newIndices[offset++] = rawIdx; + } + } // Set indices after filtered. + + + if (offset < count) { + this._indices = newIndices; + } + + this._count = offset; // Reset data extent + + this._extent = {}; + this.getRawIndex = this._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices; + return this; + }; + /** + * Select data in range. (For optimization of filter) + * (Manually inline code, support 5 million data filtering in data zoom.) + */ + + + List.prototype.selectRange = function (range) { + + var _this = this; + + var len = this._count; + + if (!len) { + return; + } + + var dimensions = []; + + for (var dim in range) { + if (range.hasOwnProperty(dim)) { + dimensions.push(dim); + } + } + + if ("development" !== 'production') { + validateDimensions(this, dimensions); + } + + var dimSize = dimensions.length; + + if (!dimSize) { + return; + } + + var originalCount = this.count(); + var Ctor = getIndicesCtor(this); + var newIndices = new Ctor(originalCount); + var offset = 0; + var dim0 = dimensions[0]; + var dimIndices = map$1(dimensions, function (dimName) { + return _this._dimensionInfos[dimName].index; + }); + var min = range[dim0][0]; + var max = range[dim0][1]; + var storageArr = this._storageArr; + var quickFinished = false; + + if (!this._indices) { + // Extreme optimization for common case. About 2x faster in chrome. + var idx = 0; + + if (dimSize === 1) { + var dimStorage = storageArr[dimIndices[0]]; + + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; // NaN will not be filtered. Consider the case, in line chart, empty + // value indicates the line should be broken. But for the case like + // scatter plot, a data item with empty value will not be rendered, + // but the axis extent may be effected if some other dim of the data + // item has value. Fortunately it is not a significant negative effect. + + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = idx; + } + + idx++; + } + + quickFinished = true; + } else if (dimSize === 2) { + var dimStorage = storageArr[dimIndices[0]]; + var dimStorage2 = storageArr[dimIndices[1]]; + var min2 = range[dimensions[1]][0]; + var max2 = range[dimensions[1]][1]; + + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; + var val2 = dimStorage2[i]; // Do not filter NaN, see comment above. + + if ((val >= min && val <= max || isNaN(val)) && (val2 >= min2 && val2 <= max2 || isNaN(val2))) { + newIndices[offset++] = idx; + } + + idx++; + } + + quickFinished = true; + } + } + + if (!quickFinished) { + if (dimSize === 1) { + for (var i = 0; i < originalCount; i++) { + var rawIndex = this.getRawIndex(i); + var val = storageArr[dimIndices[0]][rawIndex]; // Do not filter NaN, see comment above. + + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = rawIndex; + } + } + } else { + for (var i = 0; i < originalCount; i++) { + var keep = true; + var rawIndex = this.getRawIndex(i); + + for (var k = 0; k < dimSize; k++) { + var dimk = dimensions[k]; + var val = storageArr[dimIndices[k]][rawIndex]; // Do not filter NaN, see comment above. + + if (val < range[dimk][0] || val > range[dimk][1]) { + keep = false; + } + } + + if (keep) { + newIndices[offset++] = this.getRawIndex(i); + } + } + } + } // Set indices after filtered. + + + if (offset < originalCount) { + this._indices = newIndices; + } + + this._count = offset; // Reset data extent + + this._extent = {}; + this.getRawIndex = this._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices; + return this; + }; + /* eslint-enable */ + + + List.prototype.mapArray = function (dims, cb, ctx, ctxCompat) { + + if (typeof dims === 'function') { + ctxCompat = ctx; + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + ctx = ctx || ctxCompat || this; + var result = []; + this.each(dims, function () { + result.push(cb && cb.apply(this, arguments)); + }, ctx); + return result; + }; + + List.prototype.map = function (dims, cb, ctx, ctxCompat) { + + var fCtx = ctx || ctxCompat || this; + var dimNames = map$1(normalizeDimensions(dims), this.getDimension, this); + + if ("development" !== 'production') { + validateDimensions(this, dimNames); + } + + var list = cloneListForMapAndSample(this, dimNames); + var storage = list._storage; // Following properties are all immutable. + // So we can reference to the same value + + list._indices = this._indices; + list.getRawIndex = list._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices; + var tmpRetValue = []; + var dimSize = dimNames.length; + var dataCount = this.count(); + var values = []; + var rawExtent = list._rawExtent; + + for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) { + for (var dimIndex = 0; dimIndex < dimSize; dimIndex++) { + values[dimIndex] = this.get(dimNames[dimIndex], dataIndex); + } + + values[dimSize] = dataIndex; + var retValue = cb && cb.apply(fCtx, values); + + if (retValue != null) { + // a number or string (in oridinal dimension)? + if (typeof retValue !== 'object') { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + + var rawIndex = this.getRawIndex(dataIndex); + + for (var i = 0; i < retValue.length; i++) { + var dim = dimNames[i]; + var val = retValue[i]; + var rawExtentOnDim = rawExtent[dim]; + var dimStore = storage[dim]; + + if (dimStore) { + dimStore[rawIndex] = val; + } + + if (val < rawExtentOnDim[0]) { + rawExtentOnDim[0] = val; + } + + if (val > rawExtentOnDim[1]) { + rawExtentOnDim[1] = val; + } + } + } + } + + return list; + }; + /** + * Large data down sampling on given dimension + * @param sampleIndex Sample index for name and id + */ + + + List.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this, [dimension]); + var targetStorage = list._storage; + var frameValues = []; + var frameSize = mathFloor(1 / rate); + var dimStore = targetStorage[dimension]; + var len = this.count(); + var rawExtentOnDim = list._rawExtent[dimension]; + var newIndices = new (getIndicesCtor(this))(len); + var offset = 0; + + 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 dataIdx = this.getRawIndex(i + k); + frameValues[k] = dimStore[dataIdx]; + } + + var value = sampleValue(frameValues); + var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len - 1)); // Only write value on the filtered data + + dimStore[sampleFrameIdx] = value; + + if (value < rawExtentOnDim[0]) { + rawExtentOnDim[0] = value; + } + + if (value > rawExtentOnDim[1]) { + rawExtentOnDim[1] = value; + } + + newIndices[offset++] = sampleFrameIdx; + } + + list._count = offset; + list._indices = newIndices; + list.getRawIndex = getRawIndexWithIndices; + return list; + }; + /** + * Large data down sampling using largest-triangle-three-buckets + * @param {string} valueDimension + * @param {number} targetCount + */ + + + List.prototype.lttbDownSample = function (valueDimension, rate) { + var list = cloneListForMapAndSample(this, []); + var targetStorage = list._storage; + var dimStore = targetStorage[valueDimension]; + var len = this.count(); + var newIndices = new (getIndicesCtor(this))(len); + var sampledIndex = 0; + var frameSize = mathFloor(1 / rate); + var currentRawIndex = this.getRawIndex(0); + var maxArea; + var area; + var nextRawIndex; // First frame use the first data. + + newIndices[sampledIndex++] = currentRawIndex; + + for (var i = 1; i < len - 1; i += frameSize) { + var nextFrameStart = Math.min(i + frameSize, len - 1); + var nextFrameEnd = Math.min(i + frameSize * 2, len); + var avgX = (nextFrameEnd + nextFrameStart) / 2; + var avgY = 0; + + for (var idx = nextFrameStart; idx < nextFrameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + + if (isNaN(y)) { + continue; + } + + avgY += y; + } + + avgY /= nextFrameEnd - nextFrameStart; + var frameStart = i; + var frameEnd = Math.min(i + frameSize, len); + var pointAX = i - 1; + var pointAY = dimStore[currentRawIndex]; + maxArea = -1; + nextRawIndex = frameStart; // Find a point from current frame that construct a triangel with largest area with previous selected point + // And the average of next frame. + + for (var idx = frameStart; idx < frameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + + if (isNaN(y)) { + continue; + } // Calculate triangle area over three buckets + + + area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY)); + + if (area > maxArea) { + maxArea = area; + nextRawIndex = rawIndex; // Next a is this b + } + } + + newIndices[sampledIndex++] = nextRawIndex; + currentRawIndex = nextRawIndex; // This a is the next a (chosen b) + } // First frame use the last data. + + + newIndices[sampledIndex++] = this.getRawIndex(len - 1); + list._count = sampledIndex; + list._indices = newIndices; + list.getRawIndex = getRawIndexWithIndices; + return list; + }; + /** + * Get model of one data item. + */ + // TODO: Type of data item + + + List.prototype.getItemModel = function (idx) { + var hostModel = this.hostModel; + var dataItem = this.getRawDataItem(idx); + return new Model(dataItem, hostModel, hostModel && hostModel.ecModel); + }; + /** + * Create a data differ + */ + + + List.prototype.diff = function (otherList) { + var thisList = this; + return new DataDiffer(otherList ? otherList.getIndices() : [], this.getIndices(), function (idx) { + return getId(otherList, idx); + }, function (idx) { + return getId(thisList, idx); + }); + }; + /** + * Get visual property. + */ + + + List.prototype.getVisual = function (key) { + var visual = this._visual; + return visual && visual[key]; + }; + + List.prototype.setVisual = function (kvObj, val) { + this._visual = this._visual || {}; + + if (isObject$3(kvObj)) { + extend(this._visual, kvObj); + } else { + this._visual[kvObj] = val; + } + }; + /** + * Get visual property of single data item + */ + // eslint-disable-next-line + + + List.prototype.getItemVisual = function (idx, key) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + + if (val == null) { + // Use global visual property + return this.getVisual(key); + } + + return val; + }; + /** + * If exists visual property of single data item + */ + + + List.prototype.hasItemVisual = function () { + return this._itemVisuals.length > 0; + }; + /** + * Make sure itemVisual property is unique + */ + // TODO: use key to save visual to reduce memory. + + + List.prototype.ensureUniqueItemVisual = function (idx, key) { + var itemVisuals = this._itemVisuals; + var itemVisual = itemVisuals[idx]; + + if (!itemVisual) { + itemVisual = itemVisuals[idx] = {}; + } + + var val = itemVisual[key]; + + if (val == null) { + val = this.getVisual(key); // TODO Performance? + + if (isArray(val)) { + val = val.slice(); + } else if (isObject$3(val)) { + val = extend({}, val); + } + + itemVisual[key] = val; + } + + return val; + }; // eslint-disable-next-line + + + List.prototype.setItemVisual = function (idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + this._itemVisuals[idx] = itemVisual; + + if (isObject$3(key)) { + extend(itemVisual, key); + } else { + itemVisual[key] = value; + } + }; + /** + * Clear itemVisuals and list visual. + */ + + + List.prototype.clearAllVisual = function () { + this._visual = {}; + this._itemVisuals = []; + }; + + List.prototype.setLayout = function (key, val) { + if (isObject$3(key)) { + for (var name_1 in key) { + if (key.hasOwnProperty(name_1)) { + this.setLayout(name_1, key[name_1]); + } + } + + return; + } + + this._layout[key] = val; + }; + /** + * Get layout property. + */ + + + List.prototype.getLayout = function (key) { + return this._layout[key]; + }; + /** + * Get layout of single data item + */ + + + List.prototype.getItemLayout = function (idx) { + return this._itemLayouts[idx]; + }; + /** + * Set layout of single data item + */ + + + List.prototype.setItemLayout = function (idx, layout, merge) { + this._itemLayouts[idx] = merge ? extend(this._itemLayouts[idx] || {}, layout) : layout; + }; + /** + * Clear all layout of single data item + */ + + + List.prototype.clearItemLayouts = function () { + this._itemLayouts.length = 0; + }; + /** + * Set graphic element relative to data. It can be set as null + */ + + + List.prototype.setItemGraphicEl = function (idx, el) { + var hostModel = this.hostModel; + + if (el) { + var ecData = getECData(el); // Add data index and series index for indexing the data by element + // Useful in tooltip + + ecData.dataIndex = idx; + ecData.dataType = this.dataType; + ecData.seriesIndex = hostModel && hostModel.seriesIndex; // TODO: not store dataIndex on children. + + if (el.type === 'group') { + el.traverse(setItemDataAndSeriesIndex, el); + } + } + + this._graphicEls[idx] = el; + }; + + List.prototype.getItemGraphicEl = function (idx) { + return this._graphicEls[idx]; + }; + + List.prototype.eachItemGraphicEl = function (cb, context) { + 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. + */ + + + List.prototype.cloneShallow = function (list) { + if (!list) { + var dimensionInfoList = map$1(this.dimensions, this.getDimensionInfo, this); + list = new List(dimensionInfoList, this.hostModel); + } // FIXME + + + list._storage = this._storage; + list._storageArr = this._storageArr; + transferProperties(list, this); // Clone will not change the data extent and indices + + if (this._indices) { + var Ctor = this._indices.constructor; + + if (Ctor === Array) { + var thisCount = this._indices.length; + list._indices = new Ctor(thisCount); + + for (var i = 0; i < thisCount; i++) { + list._indices[i] = this._indices[i]; + } + } else { + list._indices = new Ctor(this._indices); + } + } else { + list._indices = null; + } + + list.getRawIndex = list._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices; + return list; + }; + /** + * Wrap some method to add more feature + */ + + + List.prototype.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.apply(this, [res].concat(slice(arguments))); + }; + }; // ---------------------------------------------------------- + // A work around for internal method visiting private member. + // ---------------------------------------------------------- + + + List.internalField = function () { + defaultDimValueGetters = { + arrayRows: getDimValueSimply, + objectRows: function (dataItem, dimName, dataIndex, dimIndex) { + return parseDataValue(dataItem[dimName], this._dimensionInfos[dimName]); + }, + keyedColumns: getDimValueSimply, + original: function (dataItem, dimName, dataIndex, dimIndex) { + // Performance sensitive, do not use modelUtil.getDataItemValue. + // If dataItem is an plain object with no value field, the let `value` + // will be assigned with the object, but it will be tread correctly + // in the `convertValue`. + var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value); // If any dataItem is like { value: 10 } + + if (!this._rawData.pure && isDataItemOption(dataItem)) { + this.hasItemOption = true; + } + + return parseDataValue(value instanceof Array ? value[dimIndex] // If value is a single number or something else not array. + : value, this._dimensionInfos[dimName]); + }, + typedArray: function (dataItem, dimName, dataIndex, dimIndex) { + return dataItem[dimIndex]; + } + }; + + function getDimValueSimply(dataItem, dimName, dataIndex, dimIndex) { + return parseDataValue(dataItem[dimIndex], this._dimensionInfos[dimName]); + } + + prepareInvertedIndex = function (list) { + var invertedIndicesMap = list._invertedIndicesMap; + each(invertedIndicesMap, function (invertedIndices, dim) { + var dimInfo = list._dimensionInfos[dim]; // Currently, only dimensions that has ordinalMeta can create inverted indices. + + var ordinalMeta = dimInfo.ordinalMeta; + + if (ordinalMeta) { + invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array(ordinalMeta.categories.length); // The default value of TypedArray is 0. To avoid miss + // mapping to 0, we should set it as INDEX_NOT_FOUND. + + for (var i = 0; i < invertedIndices.length; i++) { + invertedIndices[i] = INDEX_NOT_FOUND; + } + + for (var i = 0; i < list._count; i++) { + // Only support the case that all values are distinct. + invertedIndices[list.get(dim, i)] = i; + } + } + }); + }; + + getIdNameFromStore = function (list, dimIdx, ordinalMeta, rawIndex) { + var val; + var chunk = list._storageArr[dimIdx]; + + if (chunk) { + val = chunk[rawIndex]; + + if (ordinalMeta && ordinalMeta.categories.length) { + val = ordinalMeta.categories[val]; + } + } + + return convertOptionIdName(val, null); + }; + + getIndicesCtor = function (list) { + // The possible max value in this._indicies is always this._rawCount despite of filtering. + return list._rawCount > 65535 ? CtorUint32Array : CtorUint16Array; + }; + + prepareStorage = function (storage, dimInfo, end, append) { + var DataCtor = dataCtors[dimInfo.type]; + var dim = dimInfo.name; + + if (append) { + var oldStore = storage[dim]; + var oldLen = oldStore && oldStore.length; + + if (!(oldLen === end)) { + var newStore = new DataCtor(end); // The cost of the copy is probably inconsiderable + // within the initial chunkSize. + + for (var j = 0; j < oldLen; j++) { + newStore[j] = oldStore[j]; + } + + storage[dim] = newStore; + } + } else { + storage[dim] = new DataCtor(end); + } + }; + + getRawIndexWithoutIndices = function (idx) { + return idx; + }; + + getRawIndexWithIndices = function (idx) { + if (idx < this._count && idx >= 0) { + return this._indices[idx]; + } + + return -1; + }; + /** + * @see the comment of `List['getId']`. + */ + + + getId = function (list, rawIndex) { + var id = list._idList[rawIndex]; + + if (id == null && list._idDimIdx != null) { + id = getIdNameFromStore(list, list._idDimIdx, list._idOrdinalMeta, rawIndex); + } + + if (id == null) { + id = ID_PREFIX + rawIndex; + } + + return id; + }; + + normalizeDimensions = function (dimensions) { + if (!isArray(dimensions)) { + dimensions = dimensions != null ? [dimensions] : []; + } + + return dimensions; + }; + + validateDimensions = function (list, dims) { + for (var i = 0; i < dims.length; i++) { + // stroage may be empty when no data, so use + // dimensionInfos to check. + if (!list._dimensionInfos[dims[i]]) { + console.error('Unkown dimension ' + dims[i]); + } + } + }; // Data in excludeDimensions is copied, otherwise transfered. + + + cloneListForMapAndSample = function (original, excludeDimensions) { + var allDimensions = original.dimensions; + var list = new List(map$1(allDimensions, original.getDimensionInfo, original), original.hostModel); // FIXME If needs stackedOn, value may already been stacked + + transferProperties(list, original); + var storage = list._storage = {}; + var originalStorage = original._storage; + var storageArr = list._storageArr = []; // Init storage + + for (var i = 0; i < allDimensions.length; i++) { + var dim = allDimensions[i]; + + if (originalStorage[dim]) { + // Notice that we do not reset invertedIndicesMap here, becuase + // there is no scenario of mapping or sampling ordinal dimension. + if (indexOf(excludeDimensions, dim) >= 0) { + storage[dim] = cloneChunk(originalStorage[dim]); + list._rawExtent[dim] = getInitialExtent(); + list._extent[dim] = null; + } else { + // Direct reference for other dimensions + storage[dim] = originalStorage[dim]; + } + + storageArr.push(storage[dim]); + } + } + + return list; + }; + + function cloneChunk(originalChunk) { + var Ctor = originalChunk.constructor; // Only shallow clone is enough when Array. + + return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk); + } + + getInitialExtent = function () { + return [Infinity, -Infinity]; + }; + + setItemDataAndSeriesIndex = function (child) { + var childECData = getECData(child); + var thisECData = getECData(this); + childECData.seriesIndex = thisECData.seriesIndex; + childECData.dataIndex = thisECData.dataIndex; + childECData.dataType = thisECData.dataType; + }; + + transferProperties = function (target, source) { + each(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function (propName) { + if (source.hasOwnProperty(propName)) { + target[propName] = source[propName]; + } + }); + target.__wrappedMethods = source.__wrappedMethods; + each(CLONE_PROPERTIES, function (propName) { + target[propName] = clone(source[propName]); + }); + target._calculationInfo = extend({}, source._calculationInfo); + }; + + makeIdFromName = function (list, idx) { + var nameList = list._nameList; + var idList = list._idList; + var nameDimIdx = list._nameDimIdx; + var idDimIdx = list._idDimIdx; + var name = nameList[idx]; + var id = idList[idx]; + + if (name == null && nameDimIdx != null) { + nameList[idx] = name = getIdNameFromStore(list, nameDimIdx, list._nameOrdinalMeta, idx); + } + + if (id == null && idDimIdx != null) { + idList[idx] = id = getIdNameFromStore(list, idDimIdx, list._idOrdinalMeta, idx); + } + + if (id == null && name != null) { + var nameRepeatCount = list._nameRepeatCount; + var nmCnt = nameRepeatCount[name] = (nameRepeatCount[name] || 0) + 1; + id = name; + + if (nmCnt > 1) { + id += '__ec__' + nmCnt; + } + + idList[idx] = id; + } + }; + }(); + + return List; + }(); + + /** + * @see {module:echarts/test/ut/spec/data/completeDimensions} + * + * This method builds the relationship between: + * + "what the coord sys or series requires (see `sysDims`)", + * + "what the user defines (in `encode` and `dimensions`, see `opt.dimsDef` and `opt.encodeDef`)" + * + "what the data source provids (see `source`)". + * + * Some guess strategy will be adapted if user does not define something. + * If no 'value' dimension specified, the first no-named dimension will be + * named as 'value'. + * + * @param {Array.} sysDims Necessary dimensions, like ['x', 'y'], which + * provides not only dim template, but also default order. + * properties: 'name', 'type', 'displayName'. + * `name` of each item provides default coord name. + * [{dimsDef: [string|Object, ...]}, ...] dimsDef of sysDim item provides default dim name, and + * provide dims count that the sysDim required. + * [{ordinalMeta}] can be specified. + * @param {module:echarts/data/Source|Array|Object} source or data (for compatibal with pervious) + * @param {Object} [opt] + * @param {Array.} [opt.dimsDef] option.series.dimensions User defined dimensions + * For example: ['asdf', {name, type}, ...]. + * @param {Object|HashMap} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3} + * @param {Function} [opt.encodeDefaulter] Called if no `opt.encodeDef` exists. + * If not specified, auto find the next available data dim. + * param source {module:data/Source} + * param dimCount {number} + * return {Object} encode Never be `null/undefined`. + * @param {string} [opt.generateCoord] Generate coord dim with the given name. + * If not specified, extra dim names will be: + * 'value', 'value0', 'value1', ... + * @param {number} [opt.generateCoordCount] By default, the generated dim name is `generateCoord`. + * If `generateCoordCount` specified, the generated dim names will be: + * `generateCoord` + 0, `generateCoord` + 1, ... + * can be Infinity, indicate that use all of the remain columns. + * @param {number} [opt.dimCount] If not specified, guess by the first data item. + * @return {Array.} + */ + + function completeDimensions(sysDims, source, opt) { + if (!isSourceInstance(source)) { + source = createSourceFromSeriesDataOption(source); + } + + opt = opt || {}; + sysDims = (sysDims || []).slice(); + var dimsDef = (opt.dimsDef || []).slice(); + var dataDimNameMap = createHashMap(); + var coordDimNameMap = createHashMap(); // let valueCandidate; + + var result = []; + var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimCount); // Apply user defined dims (`name` and `type`) and init result. + + for (var i = 0; i < dimCount; i++) { + var dimDefItemRaw = dimsDef[i]; + var dimDefItem = dimsDef[i] = extend({}, isObject(dimDefItemRaw) ? dimDefItemRaw : { + name: dimDefItemRaw + }); + var userDimName = dimDefItem.name; + var resultItem = result[i] = new DataDimensionInfo(); // Name will be applied later for avoiding duplication. + + if (userDimName != null && dataDimNameMap.get(userDimName) == null) { + // Only if `series.dimensions` is defined in option + // displayName, will be set, and dimension will be diplayed vertically in + // tooltip by default. + resultItem.name = resultItem.displayName = userDimName; + dataDimNameMap.set(userDimName, i); + } + + dimDefItem.type != null && (resultItem.type = dimDefItem.type); + dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName); + } + + var encodeDef = opt.encodeDef; + + if (!encodeDef && opt.encodeDefaulter) { + encodeDef = opt.encodeDefaulter(source, dimCount); + } + + var encodeDefMap = createHashMap(encodeDef); // Set `coordDim` and `coordDimIndex` by `encodeDefMap` and normalize `encodeDefMap`. + + encodeDefMap.each(function (dataDimsRaw, coordDim) { + var dataDims = normalizeToArray(dataDimsRaw).slice(); // Note: It is allowed that `dataDims.length` is `0`, e.g., options is + // `{encode: {x: -1, y: 1}}`. Should not filter anything in + // this case. + + if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 0) { + encodeDefMap.set(coordDim, false); + return; + } + + var validDataDims = encodeDefMap.set(coordDim, []); + each(dataDims, function (resultDimIdxOrName, idx) { + // The input resultDimIdx can be dim name or index. + var resultDimIdx = isString(resultDimIdxOrName) ? dataDimNameMap.get(resultDimIdxOrName) : resultDimIdxOrName; + + if (resultDimIdx != null && resultDimIdx < dimCount) { + validDataDims[idx] = resultDimIdx; + applyDim(result[resultDimIdx], coordDim, idx); + } + }); + }); // Apply templetes and default order from `sysDims`. + + var availDimIdx = 0; + each(sysDims, function (sysDimItemRaw) { + var coordDim; + var sysDimItemDimsDef; + var sysDimItemOtherDims; + var sysDimItem; + + if (isString(sysDimItemRaw)) { + coordDim = sysDimItemRaw; + sysDimItem = {}; + } else { + sysDimItem = sysDimItemRaw; + coordDim = sysDimItem.name; + var ordinalMeta = sysDimItem.ordinalMeta; + sysDimItem.ordinalMeta = null; + sysDimItem = clone(sysDimItem); + sysDimItem.ordinalMeta = ordinalMeta; // `coordDimIndex` should not be set directly. + + sysDimItemDimsDef = sysDimItem.dimsDef; + sysDimItemOtherDims = sysDimItem.otherDims; + sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null; + } + + var dataDims = encodeDefMap.get(coordDim); // negative resultDimIdx means no need to mapping. + + if (dataDims === false) { + return; + } + + dataDims = normalizeToArray(dataDims); // dimensions provides default dim sequences. + + if (!dataDims.length) { + for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) { + while (availDimIdx < result.length && result[availDimIdx].coordDim != null) { + availDimIdx++; + } + + availDimIdx < result.length && dataDims.push(availDimIdx++); + } + } // Apply templates. + + + each(dataDims, function (resultDimIdx, coordDimIndex) { + var resultItem = result[resultDimIdx]; + applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex); + + if (resultItem.name == null && sysDimItemDimsDef) { + var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex]; + !isObject(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = { + name: sysDimItemDimsDefItem + }); + resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name; + resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip; + } // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}} + + + sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims); + }); + }); + + function applyDim(resultItem, coordDim, coordDimIndex) { + if (VISUAL_DIMENSIONS.get(coordDim) != null) { + resultItem.otherDims[coordDim] = coordDimIndex; + } else { + resultItem.coordDim = coordDim; + resultItem.coordDimIndex = coordDimIndex; + coordDimNameMap.set(coordDim, true); + } + } // Make sure the first extra dim is 'value'. + + + var generateCoord = opt.generateCoord; + var generateCoordCount = opt.generateCoordCount; + var fromZero = generateCoordCount != null; + generateCoordCount = generateCoord ? generateCoordCount || 1 : 0; + var extra = generateCoord || 'value'; // Set dim `name` and other `coordDim` and other props. + + for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) { + var resultItem = result[resultDimIdx] = result[resultDimIdx] || new DataDimensionInfo(); + var coordDim = resultItem.coordDim; + + if (coordDim == null) { + resultItem.coordDim = genName(extra, coordDimNameMap, fromZero); + resultItem.coordDimIndex = 0; + + if (!generateCoord || generateCoordCount <= 0) { + resultItem.isExtraCoord = true; + } + + generateCoordCount--; + } + + resultItem.name == null && (resultItem.name = genName(resultItem.coordDim, dataDimNameMap, false)); + + if (resultItem.type == null && (guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must // Consider the case: + // { + // dataset: {source: [ + // ['2001', 123], + // ['2002', 456], + // ... + // ['The others', 987], + // ]}, + // series: {type: 'pie'} + // } + // The first colum should better be treated as a "ordinal" although it + // might not able to be detected as an "ordinal" by `guessOrdinal`. + || resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null))) { + resultItem.type = 'ordinal'; + } + } + + return result; + } // ??? TODO + // Originally detect dimCount by data[0]. Should we + // optimize it to only by sysDims and dimensions and encode. + // So only necessary dims will be initialized. + // But + // (1) custom series should be considered. where other dims + // may be visited. + // (2) sometimes user need to calcualte bubble size or use visualMap + // on other dimensions besides coordSys needed. + // So, dims that is not used by system, should be shared in storage? + + + function getDimCount(source, sysDims, dimsDef, optDimCount) { + // Note that the result dimCount should not small than columns count + // of data, otherwise `dataDimNameMap` checking will be incorrect. + var dimCount = Math.max(source.dimensionsDetectedCount || 1, sysDims.length, dimsDef.length, optDimCount || 0); + each(sysDims, function (sysDimItem) { + var sysDimItemDimsDef; + + if (isObject(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) { + dimCount = Math.max(dimCount, sysDimItemDimsDef.length); + } + }); + return dimCount; + } + + function genName(name, map, fromZero) { + if (fromZero || map.get(name) != null) { + var i = 0; + + while (map.get(name + i) != null) { + i++; + } + + name += i; + } + + map.set(name, true); + return name; + } + + /** + * @param opt.coordDimensions + * @param opt.dimensionsDefine By default `source.dimensionsDefine` Overwrite source define. + * @param opt.encodeDefine By default `source.encodeDefine` Overwrite source define. + * @param opt.encodeDefaulter Make default encode if user not specified. + */ + + function createDimensions( // TODO: TYPE completeDimensions type + source, opt) { + opt = opt || {}; + return completeDimensions(opt.coordDimensions || [], source, { + // FIXME:TS detect whether source then call `.dimensionsDefine` and `.encodeDefine`? + dimsDef: opt.dimensionsDefine || source.dimensionsDefine, + encodeDef: opt.encodeDefine || source.encodeDefine, + dimCount: opt.dimensionsCount, + encodeDefaulter: opt.encodeDefaulter, + generateCoord: opt.generateCoord, + generateCoordCount: opt.generateCoordCount + }); + } + + /** + * @class + * For example: + * { + * coordSysName: 'cartesian2d', + * coordSysDims: ['x', 'y', ...], + * axisMap: HashMap({ + * x: xAxisModel, + * y: yAxisModel + * }), + * categoryAxisMap: HashMap({ + * x: xAxisModel, + * y: undefined + * }), + * // The index of the first category axis in `coordSysDims`. + * // `null/undefined` means no category axis exists. + * firstCategoryDimIndex: 1, + * // To replace user specified encode. + * } + */ + + var CoordSysInfo = + /** @class */ + function () { + function CoordSysInfo(coordSysName) { + this.coordSysDims = []; + this.axisMap = createHashMap(); + this.categoryAxisMap = createHashMap(); + this.coordSysName = coordSysName; + } + + return CoordSysInfo; + }(); + + function getCoordSysInfoBySeries(seriesModel) { + var coordSysName = seriesModel.get('coordinateSystem'); + var result = new CoordSysInfo(coordSysName); + var fetch = fetchers[coordSysName]; + + if (fetch) { + fetch(seriesModel, result, result.axisMap, result.categoryAxisMap); + return result; + } + } + var fetchers = { + cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) { + var xAxisModel = seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0]; + var yAxisModel = seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!xAxisModel) { + throw new Error('xAxis "' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('xAxisId'), 0) + '" not found'); + } + + if (!yAxisModel) { + throw new Error('yAxis "' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('yAxisId'), 0) + '" not found'); + } + } + + result.coordSysDims = ['x', 'y']; + axisMap.set('x', xAxisModel); + axisMap.set('y', yAxisModel); + + if (isCategory(xAxisModel)) { + categoryAxisMap.set('x', xAxisModel); + result.firstCategoryDimIndex = 0; + } + + if (isCategory(yAxisModel)) { + categoryAxisMap.set('y', yAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!singleAxisModel) { + throw new Error('singleAxis should be specified.'); + } + } + + result.coordSysDims = ['single']; + axisMap.set('single', singleAxisModel); + + if (isCategory(singleAxisModel)) { + categoryAxisMap.set('single', singleAxisModel); + result.firstCategoryDimIndex = 0; + } + }, + polar: function (seriesModel, result, axisMap, categoryAxisMap) { + var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + + if ("development" !== 'production') { + if (!angleAxisModel) { + throw new Error('angleAxis option not found'); + } + + if (!radiusAxisModel) { + throw new Error('radiusAxis option not found'); + } + } + + result.coordSysDims = ['radius', 'angle']; + axisMap.set('radius', radiusAxisModel); + axisMap.set('angle', angleAxisModel); + + if (isCategory(radiusAxisModel)) { + categoryAxisMap.set('radius', radiusAxisModel); + result.firstCategoryDimIndex = 0; + } + + if (isCategory(angleAxisModel)) { + categoryAxisMap.set('angle', angleAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + geo: function (seriesModel, result, axisMap, categoryAxisMap) { + result.coordSysDims = ['lng', 'lat']; + }, + parallel: function (seriesModel, result, axisMap, categoryAxisMap) { + var ecModel = seriesModel.ecModel; + var parallelModel = ecModel.getComponent('parallel', seriesModel.get('parallelIndex')); + var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice(); + each(parallelModel.parallelAxisIndex, function (axisIndex, index) { + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + var axisDim = coordSysDims[index]; + axisMap.set(axisDim, axisModel); + + if (isCategory(axisModel)) { + categoryAxisMap.set(axisDim, axisModel); + + if (result.firstCategoryDimIndex == null) { + result.firstCategoryDimIndex = index; + } + } + }); + } + }; + + function isCategory(axisModel) { + return axisModel.get('type') === 'category'; + } + + /** + * Note that it is too complicated to support 3d stack by value + * (have to create two-dimension inverted index), so in 3d case + * we just support that stacked by index. + * + * @param seriesModel + * @param dimensionInfoList The same as the input of . + * The input dimensionInfoList will be modified. + * @param opt + * @param opt.stackedCoordDimension Specify a coord dimension if needed. + * @param opt.byIndex=false + * @return calculationInfo + * { + * stackedDimension: string + * stackedByDimension: string + * isStackedByIndex: boolean + * stackedOverDimension: string + * stackResultDimension: string + * } + */ + + function enableDataStack(seriesModel, dimensionInfoList, opt) { + opt = opt || {}; + var byIndex = opt.byIndex; + var stackedCoordDimension = opt.stackedCoordDimension; // Compatibal: when `stack` is set as '', do not stack. + + var mayStack = !!(seriesModel && seriesModel.get('stack')); + var stackedByDimInfo; + var stackedDimInfo; + var stackResultDimension; + var stackedOverDimension; + each(dimensionInfoList, function (dimensionInfo, index) { + if (isString(dimensionInfo)) { + dimensionInfoList[index] = dimensionInfo = { + name: dimensionInfo + }; + } + + if (mayStack && !dimensionInfo.isExtraCoord) { + // Find the first ordinal dimension as the stackedByDimInfo. + if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) { + stackedByDimInfo = dimensionInfo; + } // Find the first stackable dimension as the stackedDimInfo. + + + if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) { + stackedDimInfo = dimensionInfo; + } + } + }); + + if (stackedDimInfo && !byIndex && !stackedByDimInfo) { + // Compatible with previous design, value axis (time axis) only stack by index. + // It may make sense if the user provides elaborately constructed data. + byIndex = true; + } // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`. + // That put stack logic in List is for using conveniently in echarts extensions, but it + // might not be a good way. + + + if (stackedDimInfo) { + // Use a weird name that not duplicated with other names. + stackResultDimension = '__\0ecstackresult'; + stackedOverDimension = '__\0ecstackedover'; // Create inverted index to fast query index by value. + + if (stackedByDimInfo) { + stackedByDimInfo.createInvertedIndices = true; + } + + var stackedDimCoordDim_1 = stackedDimInfo.coordDim; + var stackedDimType = stackedDimInfo.type; + var stackedDimCoordIndex_1 = 0; + each(dimensionInfoList, function (dimensionInfo) { + if (dimensionInfo.coordDim === stackedDimCoordDim_1) { + stackedDimCoordIndex_1++; + } + }); + dimensionInfoList.push({ + name: stackResultDimension, + coordDim: stackedDimCoordDim_1, + coordDimIndex: stackedDimCoordIndex_1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true + }); + stackedDimCoordIndex_1++; + dimensionInfoList.push({ + name: stackedOverDimension, + // This dimension contains stack base (generally, 0), so do not set it as + // `stackedDimCoordDim` to avoid extent calculation, consider log scale. + coordDim: stackedOverDimension, + coordDimIndex: stackedDimCoordIndex_1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true + }); + } + + return { + stackedDimension: stackedDimInfo && stackedDimInfo.name, + stackedByDimension: stackedByDimInfo && stackedByDimInfo.name, + isStackedByIndex: byIndex, + stackedOverDimension: stackedOverDimension, + stackResultDimension: stackResultDimension + }; + } + function isDimensionStacked(data, stackedDim + /*, stackedByDim*/ + ) { + // Each single series only maps to one pair of axis. So we do not need to + // check stackByDim, whatever stacked by a dimension or stacked by index. + return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension'); // && ( + // stackedByDim != null + // ? stackedByDim === data.getCalculationInfo('stackedByDimension') + // : data.getCalculationInfo('isStackedByIndex') + // ); + } + function getStackedDimension(data, targetDim) { + return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim; + } + + function createListFromArray(source, seriesModel, opt) { + opt = opt || {}; + + if (!isSourceInstance(source)) { + source = createSourceFromSeriesDataOption(source); + } + + var coordSysName = seriesModel.get('coordinateSystem'); + var registeredCoordSys = CoordinateSystemManager.get(coordSysName); + var coordSysInfo = getCoordSysInfoBySeries(seriesModel); + var coordSysDimDefs; + + if (coordSysInfo && coordSysInfo.coordSysDims) { + coordSysDimDefs = map(coordSysInfo.coordSysDims, function (dim) { + var dimInfo = { + name: dim + }; + var axisModel = coordSysInfo.axisMap.get(dim); + + if (axisModel) { + var axisType = axisModel.get('type'); + dimInfo.type = getDimensionTypeByAxis(axisType); // dimInfo.stackable = isStackable(axisType); + } + + return dimInfo; + }); + } + + if (!coordSysDimDefs) { + // Get dimensions from registered coordinate system + coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y']; + } + + var useEncodeDefaulter = opt.useEncodeDefaulter; + var dimInfoList = createDimensions(source, { + coordDimensions: coordSysDimDefs, + generateCoord: opt.generateCoord, + encodeDefaulter: isFunction(useEncodeDefaulter) ? useEncodeDefaulter : useEncodeDefaulter ? curry(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) : null + }); + var firstCategoryDimIndex; + var hasNameEncode; + coordSysInfo && each(dimInfoList, function (dimInfo, dimIndex) { + var coordDim = dimInfo.coordDim; + var categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim); + + if (categoryAxisModel) { + if (firstCategoryDimIndex == null) { + firstCategoryDimIndex = dimIndex; + } + + dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta(); + + if (opt.createInvertedIndices) { + dimInfo.createInvertedIndices = true; + } + } + + if (dimInfo.otherDims.itemName != null) { + hasNameEncode = true; + } + }); + + if (!hasNameEncode && firstCategoryDimIndex != null) { + dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0; + } + + var stackCalculationInfo = enableDataStack(seriesModel, dimInfoList); + var list = new List(dimInfoList, seriesModel); + list.setCalculationInfo(stackCalculationInfo); + var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source) ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex); + } : null; + list.hasItemOption = false; + list.initData(source, null, dimValueGetter); + return list; + } + + function isNeedCompleteOrdinalData(source) { + if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var sampleItem = firstDataNotNull(source.data || []); + return sampleItem != null && !isArray(getDataItemValue(sampleItem)); + } + } + + function firstDataNotNull(data) { + var i = 0; + + while (i < data.length && data[i] == null) { + i++; + } + + return data[i]; + } + + var Scale = + /** @class */ + function () { + function Scale(setting) { + this._setting = setting || {}; + this._extent = [Infinity, -Infinity]; + } + + Scale.prototype.getSetting = function (name) { + return this._setting[name]; + }; + /** + * Set extent from data + */ + + + Scale.prototype.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]); + }; + /** + * Set extent from data + */ + + + Scale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Get extent + * + * Extent is always in increase order. + */ + + + Scale.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Set extent + */ + + + Scale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; + + if (!isNaN(start)) { + thisExtent[0] = start; + } + + if (!isNaN(end)) { + thisExtent[1] = end; + } + }; + /** + * If value is in extent range + */ + + + Scale.prototype.isInExtentRange = function (value) { + return this._extent[0] <= value && this._extent[1] >= value; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + + + Scale.prototype.isBlank = function () { + return this._isBlank; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + + + Scale.prototype.setBlank = function (isBlank) { + this._isBlank = isBlank; + }; + + return Scale; + }(); + + enableClassManagement(Scale); + + var OrdinalMeta = + /** @class */ + function () { + function OrdinalMeta(opt) { + this.categories = opt.categories || []; + this._needCollect = opt.needCollect; + this._deduplication = opt.deduplication; + } + + OrdinalMeta.createByAxisModel = function (axisModel) { + var option = axisModel.option; + var data = option.data; + var categories = data && map(data, getName); + return new OrdinalMeta({ + categories: categories, + needCollect: !categories, + // deduplication is default in axis. + deduplication: option.dedplication !== false + }); + }; + + OrdinalMeta.prototype.getOrdinal = function (category) { + // @ts-ignore + return this._getOrCreateMap().get(category); + }; + /** + * @return The ordinal. If not found, return NaN. + */ + + + OrdinalMeta.prototype.parseAndCollect = function (category) { + var index; + var needCollect = this._needCollect; // The value of category dim can be the index of the given category set. + // This feature is only supported when !needCollect, because we should + // consider a common case: a value is 2017, which is a number but is + // expected to be tread as a category. This case usually happen in dataset, + // where it happent to be no need of the index feature. + + if (typeof category !== 'string' && !needCollect) { + return category; + } // Optimize for the scenario: + // category is ['2012-01-01', '2012-01-02', ...], where the input + // data has been ensured not duplicate and is large data. + // Notice, if a dataset dimension provide categroies, usually echarts + // should remove duplication except user tell echarts dont do that + // (set axis.deduplication = false), because echarts do not know whether + // the values in the category dimension has duplication (consider the + // parallel-aqi example) + + + if (needCollect && !this._deduplication) { + index = this.categories.length; + this.categories[index] = category; + return index; + } + + var map = this._getOrCreateMap(); // @ts-ignore + + + index = map.get(category); + + if (index == null) { + if (needCollect) { + index = this.categories.length; + this.categories[index] = category; // @ts-ignore + + map.set(category, index); + } else { + index = NaN; + } + } + + return index; + }; // Consider big data, do not create map until needed. + + + OrdinalMeta.prototype._getOrCreateMap = function () { + return this._map || (this._map = createHashMap(this.categories)); + }; + + return OrdinalMeta; + }(); + + function getName(obj) { + if (isObject(obj) && obj.value != null) { + return obj.value; + } else { + return obj + ''; + } + } + + var roundNumber = round; + /** + * @param extent Both extent[0] and extent[1] should be valid number. + * Should be extent[0] < extent[1]. + * @param splitNumber splitNumber should be >= 1. + */ + + function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) { + var result = {}; + var span = extent[1] - extent[0]; + var interval = result.interval = nice(span / splitNumber, true); + + if (minInterval != null && interval < minInterval) { + interval = result.interval = minInterval; + } + + if (maxInterval != null && interval > maxInterval) { + interval = result.interval = maxInterval; + } // Tow more digital for tick. + + + var precision = result.intervalPrecision = getIntervalPrecision(interval); // Niced extent inside original extent + + var niceTickExtent = result.niceTickExtent = [roundNumber(Math.ceil(extent[0] / interval) * interval, precision), roundNumber(Math.floor(extent[1] / interval) * interval, precision)]; + fixExtent(niceTickExtent, extent); + return result; + } + /** + * @return interval precision + */ + + function getIntervalPrecision(interval) { + // Tow more digital for tick. + return getPrecisionSafe(interval) + 2; + } + + function clamp(niceTickExtent, idx, extent) { + niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]); + } // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent. + + + function fixExtent(niceTickExtent, extent) { + !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]); + !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]); + clamp(niceTickExtent, 0, extent); + clamp(niceTickExtent, 1, extent); + + if (niceTickExtent[0] > niceTickExtent[1]) { + niceTickExtent[0] = niceTickExtent[1]; + } + } + function contain$1(val, extent) { + return val >= extent[0] && val <= extent[1]; + } + function normalize$1(val, extent) { + if (extent[1] === extent[0]) { + return 0.5; + } + + return (val - extent[0]) / (extent[1] - extent[0]); + } + function scale$2(val, extent) { + return val * (extent[1] - extent[0]) + extent[0]; + } + + var OrdinalScale = + /** @class */ + function (_super) { + __extends(OrdinalScale, _super); + + function OrdinalScale(setting) { + var _this = _super.call(this, setting) || this; + + _this.type = 'ordinal'; + + var ordinalMeta = _this.getSetting('ordinalMeta'); // Caution: Should not use instanceof, consider ec-extensions using + // import approach to get OrdinalMeta class. + + + if (!ordinalMeta) { + ordinalMeta = new OrdinalMeta({}); + } + + if (isArray(ordinalMeta)) { + ordinalMeta = new OrdinalMeta({ + categories: map(ordinalMeta, function (item) { + return isObject(item) ? item.value : item; + }) + }); + } + + _this._ordinalMeta = ordinalMeta; + _this._extent = _this.getSetting('extent') || [0, ordinalMeta.categories.length - 1]; + return _this; + } + + OrdinalScale.prototype.parse = function (val) { + return typeof val === 'string' ? this._ordinalMeta.getOrdinal(val) // val might be float. + : Math.round(val); + }; + + OrdinalScale.prototype.contain = function (rank) { + rank = this.parse(rank); + return contain$1(rank, this._extent) && this._ordinalMeta.categories[rank] != null; + }; + /** + * Normalize given rank or name to linear [0, 1] + * @param val raw ordinal number. + * @return normalized value in [0, 1]. + */ + + + OrdinalScale.prototype.normalize = function (val) { + val = this._getTickNumber(this.parse(val)); + return normalize$1(val, this._extent); + }; + /** + * @param val normalized value in [0, 1]. + * @return raw ordinal number. + */ + + + OrdinalScale.prototype.scale = function (val) { + val = Math.round(scale$2(val, this._extent)); + return this.getRawOrdinalNumber(val); + }; + + OrdinalScale.prototype.getTicks = function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + + while (rank <= extent[1]) { + ticks.push({ + value: rank + }); + rank++; + } + + return ticks; + }; + + OrdinalScale.prototype.getMinorTicks = function (splitNumber) { + // Not support. + return; + }; + /** + * @see `Ordinal['_ordinalNumbersByTick']` + */ + + + OrdinalScale.prototype.setSortInfo = function (info) { + if (info == null) { + this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null; + return; + } + + var infoOrdinalNumbers = info.ordinalNumbers; + var ordinalsByTick = this._ordinalNumbersByTick = []; + var ticksByOrdinal = this._ticksByOrdinalNumber = []; // Unnecessary support negative tick in `realtimeSort`. + + var tickNum = 0; + var allCategoryLen = this._ordinalMeta.categories.length; + + for (var len = Math.min(allCategoryLen, infoOrdinalNumbers.length); tickNum < len; ++tickNum) { + var ordinalNumber = infoOrdinalNumbers[tickNum]; + ordinalsByTick[tickNum] = ordinalNumber; + ticksByOrdinal[ordinalNumber] = tickNum; + } // Handle that `series.data` only covers part of the `axis.category.data`. + + + var unusedOrdinal = 0; + + for (; tickNum < allCategoryLen; ++tickNum) { + while (ticksByOrdinal[unusedOrdinal] != null) { + unusedOrdinal++; + } + ordinalsByTick.push(unusedOrdinal); + ticksByOrdinal[unusedOrdinal] = tickNum; + } + }; + + OrdinalScale.prototype._getTickNumber = function (ordinal) { + var ticksByOrdinalNumber = this._ticksByOrdinalNumber; // also support ordinal out of range of `ordinalMeta.categories.length`, + // where ordinal numbers are used as tick value directly. + + return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal; + }; + /** + * @usage + * ```js + * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal); + * + * // case0 + * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber]; + * // case1 + * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber]; + * // case2 + * const coord = axis.dataToCoord(ordinalNumber); + * ``` + * + * @param {OrdinalNumber} tickNumber index of display + */ + + + OrdinalScale.prototype.getRawOrdinalNumber = function (tickNumber) { + var ordinalNumbersByTick = this._ordinalNumbersByTick; // tickNumber may be out of range, e.g., when axis max is larger than `ordinalMeta.categories.length`., + // where ordinal numbers are used as tick value directly. + + return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber; + }; + /** + * Get item on tick + */ + + + OrdinalScale.prototype.getLabel = function (tick) { + if (!this.isBlank()) { + var ordinalNumber = this.getRawOrdinalNumber(tick.value); + var cateogry = this._ordinalMeta.categories[ordinalNumber]; // Note that if no data, ordinalMeta.categories is an empty array. + // Return empty if it's not exist. + + return cateogry == null ? '' : cateogry + ''; + } + }; + + OrdinalScale.prototype.count = function () { + return this._extent[1] - this._extent[0] + 1; + }; + + OrdinalScale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * @override + * If value is in extent range + */ + + + OrdinalScale.prototype.isInExtentRange = function (value) { + value = this._getTickNumber(value); + return this._extent[0] <= value && this._extent[1] >= value; + }; + + OrdinalScale.prototype.getOrdinalMeta = function () { + return this._ordinalMeta; + }; + + OrdinalScale.prototype.niceTicks = function () {}; + + OrdinalScale.prototype.niceExtent = function () {}; + + OrdinalScale.type = 'ordinal'; + return OrdinalScale; + }(Scale); + + Scale.registerClass(OrdinalScale); + + var roundNumber$1 = round; + + var IntervalScale = + /** @class */ + function (_super) { + __extends(IntervalScale, _super); + + function IntervalScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'interval'; // Step is calculated in adjustExtent. + + _this._interval = 0; + _this._intervalPrecision = 2; + return _this; + } + + IntervalScale.prototype.parse = function (val) { + return val; + }; + + IntervalScale.prototype.contain = function (val) { + return contain$1(val, this._extent); + }; + + IntervalScale.prototype.normalize = function (val) { + return normalize$1(val, this._extent); + }; + + IntervalScale.prototype.scale = function (val) { + return scale$2(val, this._extent); + }; + + IntervalScale.prototype.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); + } + }; + + IntervalScale.prototype.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 + + this.setExtent(extent[0], extent[1]); + }; + + IntervalScale.prototype.getInterval = function () { + return this._interval; + }; + + IntervalScale.prototype.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(); + this._intervalPrecision = getIntervalPrecision(interval); + }; + /** + * @param expandToNicedExtent Whether expand the ticks to niced extent. + */ + + + IntervalScale.prototype.getTicks = function (expandToNicedExtent) { + var interval = this._interval; + var extent = this._extent; + var niceTickExtent = this._niceExtent; + var intervalPrecision = this._intervalPrecision; + var ticks = []; // If interval is 0, return []; + + if (!interval) { + return ticks; + } // Consider this case: using dataZoom toolbox, zoom and zoom. + + + var safeLimit = 10000; + + if (extent[0] < niceTickExtent[0]) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber$1(niceTickExtent[0] - interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[0] + }); + } + } + + var tick = niceTickExtent[0]; + + while (tick <= niceTickExtent[1]) { + ticks.push({ + value: tick + }); // Avoid rounding error + + tick = roundNumber$1(tick + interval, intervalPrecision); + + if (tick === ticks[ticks.length - 1].value) { + // Consider out of safe float point, e.g., + // -3711126.9907707 + 2e-10 === -3711126.9907707 + break; + } + + if (ticks.length > safeLimit) { + return []; + } + } // Consider this case: the last item of ticks is smaller + // than niceTickExtent[1] and niceTickExtent[1] === extent[1]. + + + var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1]; + + if (extent[1] > lastNiceTick) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber$1(lastNiceTick + interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[1] + }); + } + } + + return ticks; + }; + + IntervalScale.prototype.getMinorTicks = function (splitNumber) { + var ticks = this.getTicks(true); + var minorTicks = []; + var extent = this.getExtent(); + + for (var i = 1; i < ticks.length; i++) { + var nextTick = ticks[i]; + var prevTick = ticks[i - 1]; + var count = 0; + var minorTicksGroup = []; + var interval = nextTick.value - prevTick.value; + var minorInterval = interval / splitNumber; + + while (count < splitNumber - 1) { + var minorTick = roundNumber$1(prevTick.value + (count + 1) * minorInterval); // For the first and last interval. The count may be less than splitNumber. + + if (minorTick > extent[0] && minorTick < extent[1]) { + minorTicksGroup.push(minorTick); + } + + count++; + } + + minorTicks.push(minorTicksGroup); + } + + return minorTicks; + }; + /** + * @param opt.precision If 'auto', use nice presision. + * @param opt.pad returns 1.50 but not 1.5 if precision is 2. + */ + + + IntervalScale.prototype.getLabel = function (data, opt) { + if (data == null) { + return ''; + } + + var precision = opt && opt.precision; + + if (precision == null) { + precision = getPrecisionSafe(data.value) || 0; + } else if (precision === 'auto') { + // Should be more precise then tick. + precision = this._intervalPrecision; + } // (1) If `precision` is set, 12.005 should be display as '12.00500'. + // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'. + + + var dataNum = roundNumber$1(data.value, precision, true); + return addCommas(dataNum); + }; + /** + * @param splitNumber By default `5`. + */ + + + IntervalScale.prototype.niceTicks = function (splitNumber, minInterval, maxInterval) { + 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(); + } + + var result = intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval); + this._intervalPrecision = result.intervalPrecision; + this._interval = result.interval; + this._niceExtent = result.niceTickExtent; + }; + + IntervalScale.prototype.niceExtent = function (opt) { + 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]; // In the fowllowing case + // Axis has been fixed max 100 + // Plus data are all 100 and axis extent are [100, 100]. + // Extend to the both side will cause expanded max is larger than fixed max. + // So only expand to the smaller side. + + if (!opt.fixMax) { + extent[1] += expandSize / 2; + extent[0] -= expandSize / 2; + } else { + extent[0] -= expandSize / 2; + } + } 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(opt.splitNumber, opt.minInterval, opt.maxInterval); // let extent = this._extent; + + var interval = this._interval; + + if (!opt.fixMin) { + extent[0] = roundNumber$1(Math.floor(extent[0] / interval) * interval); + } + + if (!opt.fixMax) { + extent[1] = roundNumber$1(Math.ceil(extent[1] / interval) * interval); + } + }; + + IntervalScale.type = 'interval'; + return IntervalScale; + }(Scale); + + Scale.registerClass(IntervalScale); + + var STACK_PREFIX = '__ec_stack_'; + var LARGE_BAR_MIN_WIDTH = 0.5; + var LargeArr = typeof Float32Array !== 'undefined' ? Float32Array : Array; + + function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex; + } + + function getAxisKey(axis) { + return axis.dim + axis.index; + } + /** + * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined. + */ + + + function getLayoutOnAxis(opt) { + var params = []; + var baseAxis = opt.axis; + var axisKey = 'axis0'; + + if (baseAxis.type !== 'category') { + return; + } + + var bandWidth = baseAxis.getBandWidth(); + + for (var i = 0; i < opt.count || 0; i++) { + params.push(defaults({ + bandWidth: bandWidth, + axisKey: axisKey, + stackId: STACK_PREFIX + i + }, opt)); + } + + var widthAndOffsets = doCalBarWidthAndOffset(params); + var result = []; + + for (var i = 0; i < opt.count; i++) { + var item = widthAndOffsets[axisKey][STACK_PREFIX + i]; + item.offsetCenter = item.offset + item.width / 2; + result.push(item); + } + + return result; + } + function prepareLayoutBarSeries(seriesType, ecModel) { + var seriesModels = []; + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for cartesian2d only + if (isOnCartesian(seriesModel) && !isInLargeMode(seriesModel)) { + seriesModels.push(seriesModel); + } + }); + return seriesModels; + } + /** + * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent + * values. + * This works for time axes, value axes, and log axes. + * For a single time axis, return value is in the form like + * {'x_0': [1000000]}. + * The value of 1000000 is in milliseconds. + */ + + function getValueAxesMinGaps(barSeries) { + /** + * Map from axis.index to values. + * For a single time axis, axisValues is in the form like + * {'x_0': [1495555200000, 1495641600000, 1495728000000]}. + * Items in axisValues[x], e.g. 1495555200000, are time values of all + * series. + */ + var axisValues = {}; + each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + + if (baseAxis.type !== 'time' && baseAxis.type !== 'value') { + return; + } + + var data = seriesModel.getData(); + var key = baseAxis.dim + '_' + baseAxis.index; + var dim = data.mapDimension(baseAxis.dim); + + for (var i = 0, cnt = data.count(); i < cnt; ++i) { + var value = data.get(dim, i); + + if (!axisValues[key]) { + // No previous data for the axis + axisValues[key] = [value]; + } else { + // No value in previous series + axisValues[key].push(value); + } // Ignore duplicated time values in the same axis + + } + }); + var axisMinGaps = {}; + + for (var key in axisValues) { + if (axisValues.hasOwnProperty(key)) { + var valuesInAxis = axisValues[key]; + + if (valuesInAxis) { + // Sort axis values into ascending order to calculate gaps + valuesInAxis.sort(function (a, b) { + return a - b; + }); + var min = null; + + for (var j = 1; j < valuesInAxis.length; ++j) { + var delta = valuesInAxis[j] - valuesInAxis[j - 1]; + + if (delta > 0) { + // Ignore 0 delta because they are of the same axis value + min = min === null ? delta : Math.min(min, delta); + } + } // Set to null if only have one data + + + axisMinGaps[key] = min; + } + } + } + + return axisMinGaps; + } + + function makeColumnLayout(barSeries) { + var axisMinGaps = getValueAxesMinGaps(barSeries); + var seriesInfoList = []; + each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var axisExtent = baseAxis.getExtent(); + var bandWidth; + + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } else if (baseAxis.type === 'value' || baseAxis.type === 'time') { + var key = baseAxis.dim + '_' + baseAxis.index; + var minGap = axisMinGaps[key]; + var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]); + var scale = baseAxis.scale.getExtent(); + var scaleSpan = Math.abs(scale[1] - scale[0]); + bandWidth = minGap ? extentSpan / scaleSpan * minGap : extentSpan; // When there is only one data value + } else { + var data = seriesModel.getData(); + bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + } + + var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth); + var barMinWidth = parsePercent$1( // barMinWidth by default is 1 in cartesian. Because in value axis, + // the auto-calculated bar width might be less than 1. + seriesModel.get('barMinWidth') || 1, bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + seriesInfoList.push({ + bandWidth: bandWidth, + barWidth: barWidth, + barMaxWidth: barMaxWidth, + barMinWidth: barMinWidth, + barGap: barGap, + barCategoryGap: barCategoryGap, + axisKey: getAxisKey(baseAxis), + stackId: getSeriesStackId(seriesModel) + }); + }); + return doCalBarWidthAndOffset(seriesInfoList); + } + + function doCalBarWidthAndOffset(seriesInfoList) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + each(seriesInfoList, function (seriesInfo, idx) { + var axisKey = seriesInfo.axisKey; + var bandWidth = seriesInfo.bandWidth; + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: null, + gap: '20%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = seriesInfo.stackId; + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; // Caution: In a single coordinate system, these barGrid attributes + // will be shared by series. Consider that they have default values, + // only the attributes set on the last series will work. + // Do not change this fact unless there will be a break change. + + var barWidth = seriesInfo.barWidth; + + if (barWidth && !stacks[stackId].width) { + // See #6312, do not restrict width. + stacks[stackId].width = barWidth; + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + columnsOnAxis.remainedWidth -= barWidth; + } + + var barMaxWidth = seriesInfo.barMaxWidth; + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + var barMinWidth = seriesInfo.barMinWidth; + barMinWidth && (stacks[stackId].minWidth = barMinWidth); + var barGap = seriesInfo.barGap; + barGap != null && (columnsOnAxis.gap = barGap); + var barCategoryGap = seriesInfo.barCategoryGap; + barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); + }); + var result = {}; + each(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGapPercent = columnsOnAxis.categoryGap; + + if (categoryGapPercent == null) { + var columnCount = keys(stacks).length; // More columns in one group + // the spaces between group is smaller. Or the column will be too thin. + + categoryGapPercent = Math.max(35 - columnCount * 4, 15) + '%'; + } + + var categoryGap = parsePercent$1(categoryGapPercent, bandWidth); + var barGapPercent = parsePercent$1(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 + + each(stacks, function (column) { + var maxWidth = column.maxWidth; + var minWidth = column.minWidth; + + if (!column.width) { + var finalWidth = autoWidth; + + if (maxWidth && maxWidth < finalWidth) { + finalWidth = Math.min(maxWidth, remainedWidth); + } // `minWidth` has higher priority. `minWidth` decide that wheter the + // bar is able to be visible. So `minWidth` should not be restricted + // by `maxWidth` or `remainedWidth` (which is from `bandWidth`). In + // the extreme cases for `value` axis, bars are allowed to overlap + // with each other if `minWidth` specified. + + + if (minWidth && minWidth > finalWidth) { + finalWidth = minWidth; + } + + if (finalWidth !== autoWidth) { + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + } else { + // `barMinWidth/barMaxWidth` has higher priority than `barWidth`, as + // CSS does. Becuase barWidth can be a percent value, where + // `barMaxWidth` can be used to restrict the final width. + var finalWidth = column.width; + + if (maxWidth) { + finalWidth = Math.min(finalWidth, maxWidth); + } // `minWidth` has higher priority, as described above + + + if (minWidth) { + finalWidth = Math.max(finalWidth, minWidth); + } + + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + }); // Recalculate width again + + autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + var widthSum = 0; + var lastColumn; + 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; + each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + bandWidth: bandWidth, + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; + } + + function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) { + if (barWidthAndOffset && axis) { + var result = barWidthAndOffset[getAxisKey(axis)]; + + if (result != null && seriesModel != null) { + return result[getSeriesStackId(seriesModel)]; + } + + return result; + } + } + function layout(seriesType, ecModel) { + var seriesModels = prepareLayoutBarSeries(seriesType, ecModel); + var barWidthAndOffset = makeColumnLayout(seriesModels); + var lastStackCoords = {}; + each(seriesModels, function (seriesModel) { + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var stackId = getSeriesStackId(seriesModel); + var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = cartesian.getOtherAxis(baseAxis); + var barMinHeight = seriesModel.get('barMinHeight') || 0; + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + data.setLayout({ + bandWidth: columnLayoutInfo.bandWidth, + offset: columnOffset, + size: columnWidth + }); + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var stacked = isDimensionStacked(data, valueDim + /*, baseDim*/ + ); + var isValueAxisH = valueAxis.isHorizontal(); + var valueAxisStart = getValueAxisStart(baseAxis, valueAxis); + + for (var idx = 0, len = data.count(); idx < len; idx++) { + var value = data.get(valueDim, idx); + var baseValue = data.get(baseDim, idx); + var sign = value >= 0 ? 'p' : 'n'; + var baseCoord = valueAxisStart; // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + + if (stacked) { + // Only ordinal axis can be stacked. + if (!lastStackCoords[stackId][baseValue]) { + lastStackCoords[stackId][baseValue] = { + p: valueAxisStart, + n: valueAxisStart // Negative stack + + }; + } // Should also consider #4243 + + + baseCoord = lastStackCoords[stackId][baseValue][sign]; + } + + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + + if (isValueAxisH) { + var coord = cartesian.dataToPoint([value, baseValue]); + x = baseCoord; + y = coord[1] + columnOffset; + width = coord[0] - valueAxisStart; + height = columnWidth; + + if (Math.abs(width) < barMinHeight) { + width = (width < 0 ? -1 : 1) * barMinHeight; + } // Ignore stack from NaN value + + + if (!isNaN(width)) { + stacked && (lastStackCoords[stackId][baseValue][sign] += width); + } + } else { + var coord = cartesian.dataToPoint([baseValue, value]); + x = coord[0] + columnOffset; + y = baseCoord; + width = columnWidth; + height = coord[1] - valueAxisStart; + + if (Math.abs(height) < barMinHeight) { + // Include zero to has a positive bar + height = (height <= 0 ? -1 : 1) * barMinHeight; + } // Ignore stack from NaN value + + + if (!isNaN(height)) { + stacked && (lastStackCoords[stackId][baseValue][sign] += height); + } + } + + data.setItemLayout(idx, { + x: x, + y: y, + width: width, + height: height + }); + } + }); + } // TODO: Do not support stack in large mode yet. + + var largeLayout = { + seriesType: 'bar', + plan: createRenderPlanner(), + reset: function (seriesModel) { + if (!isOnCartesian(seriesModel) || !isInLargeMode(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var coordLayout = cartesian.master.getRect(); + var baseAxis = cartesian.getBaseAxis(); + var valueAxis = cartesian.getOtherAxis(baseAxis); + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var valueAxisHorizontal = valueAxis.isHorizontal(); + var valueDimIdx = valueAxisHorizontal ? 0 : 1; + var barWidth = retrieveColumnLayout(makeColumnLayout([seriesModel]), baseAxis, seriesModel).width; + + if (!(barWidth > LARGE_BAR_MIN_WIDTH)) { + // jshint ignore:line + barWidth = LARGE_BAR_MIN_WIDTH; + } + + return { + progress: function (params, data) { + var count = params.count; + var largePoints = new LargeArr(count * 2); + var largeBackgroundPoints = new LargeArr(count * 2); + var largeDataIndices = new LargeArr(count); + var dataIndex; + var coord = []; + var valuePair = []; + var pointsOffset = 0; + var idxOffset = 0; + + while ((dataIndex = params.next()) != null) { + valuePair[valueDimIdx] = data.get(valueDim, dataIndex); + valuePair[1 - valueDimIdx] = data.get(baseDim, dataIndex); + coord = cartesian.dataToPoint(valuePair, null, coord); // Data index might not be in order, depends on `progressiveChunkMode`. + + largeBackgroundPoints[pointsOffset] = valueAxisHorizontal ? coordLayout.x + coordLayout.width : coord[0]; + largePoints[pointsOffset++] = coord[0]; + largeBackgroundPoints[pointsOffset] = valueAxisHorizontal ? coord[1] : coordLayout.y + coordLayout.height; + largePoints[pointsOffset++] = coord[1]; + largeDataIndices[idxOffset++] = dataIndex; + } + + data.setLayout({ + largePoints: largePoints, + largeDataIndices: largeDataIndices, + largeBackgroundPoints: largeBackgroundPoints, + barWidth: barWidth, + valueAxisStart: getValueAxisStart(baseAxis, valueAxis), + backgroundStart: valueAxisHorizontal ? coordLayout.x : coordLayout.y, + valueAxisHorizontal: valueAxisHorizontal + }); + } + }; + } + }; + + function isOnCartesian(seriesModel) { + return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d'; + } + + function isInLargeMode(seriesModel) { + return seriesModel.pipelineContext && seriesModel.pipelineContext.large; + } // See cases in `test/bar-start.html` and `#7412`, `#8747`. + + + function getValueAxisStart(baseAxis, valueAxis, stacked) { + return valueAxis.toGlobalCoord(valueAxis.dataToCoord(valueAxis.type === 'log' ? 1 : 0)); + } + + var bisect = function (a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + + if (a[mid][1] < x) { + lo = mid + 1; + } else { + hi = mid; + } + } + + return lo; + }; + + var TimeScale = + /** @class */ + function (_super) { + __extends(TimeScale, _super); + + function TimeScale(settings) { + var _this = _super.call(this, settings) || this; + + _this.type = 'time'; + return _this; + } + /** + * Get label is mainly for other components like dataZoom, tooltip. + */ + + + TimeScale.prototype.getLabel = function (tick) { + var useUTC = this.getSetting('useUTC'); + return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting('locale')); + }; + + TimeScale.prototype.getFormattedLabel = function (tick, idx, labelFormatter) { + var isUTC = this.getSetting('useUTC'); + var lang = this.getSetting('locale'); + return leveledFormat(tick, idx, labelFormatter, lang, isUTC); + }; + /** + * @override + * @param expandToNicedExtent Whether expand the ticks to niced extent. + */ + + + TimeScale.prototype.getTicks = function (expandToNicedExtent) { + var interval = this._interval; + var extent = this._extent; + var ticks = []; // If interval is 0, return []; + + if (!interval) { + return ticks; + } + + ticks.push({ + value: extent[0], + level: 0 + }); + var useUTC = this.getSetting('useUTC'); + var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent); + ticks = ticks.concat(innerTicks); + ticks.push({ + value: extent[1], + level: 0 + }); + return ticks; + }; + + TimeScale.prototype.niceExtent = function (opt) { + 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(opt.splitNumber, opt.minInterval, opt.maxInterval); + }; + + TimeScale.prototype.niceTicks = function (approxTickNum, minInterval, maxInterval) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + this._approxInterval = span / approxTickNum; + + if (minInterval != null && this._approxInterval < minInterval) { + this._approxInterval = minInterval; + } + + if (maxInterval != null && this._approxInterval > maxInterval) { + this._approxInterval = maxInterval; + } + + var scaleIntervalsLen = scaleIntervals.length; + var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1); // Interval that can be used to calculate ticks + + this._interval = scaleIntervals[idx][1]; // Min level used when picking ticks from top down. + // We check one more level to avoid the ticks are to sparse in some case. + + this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0]; + }; + + TimeScale.prototype.parse = function (val) { + // val might be float. + return typeof val === 'number' ? val : +parseDate(val); + }; + + TimeScale.prototype.contain = function (val) { + return contain$1(this.parse(val), this._extent); + }; + + TimeScale.prototype.normalize = function (val) { + return normalize$1(this.parse(val), this._extent); + }; + + TimeScale.prototype.scale = function (val) { + return scale$2(val, this._extent); + }; + + TimeScale.type = 'time'; + return TimeScale; + }(IntervalScale); + /** + * This implementation was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + + var scaleIntervals = [// Format interval + ['second', ONE_SECOND], ['minute', ONE_MINUTE], ['hour', ONE_HOUR], ['quarter-day', ONE_HOUR * 6], ['half-day', ONE_HOUR * 12], ['day', ONE_DAY * 1.2], ['half-week', ONE_DAY * 3.5], ['week', ONE_DAY * 7], ['month', ONE_DAY * 31], ['quarter', ONE_DAY * 95], ['half-year', ONE_YEAR / 2], ['year', ONE_YEAR] // 1Y + ]; + + function isUnitValueSame(unit, valueA, valueB, isUTC) { + var dateA = parseDate(valueA); + var dateB = parseDate(valueB); + + var isSame = function (unit) { + return getUnitValue(dateA, unit, isUTC) === getUnitValue(dateB, unit, isUTC); + }; + + var isSameYear = function () { + return isSame('year'); + }; // const isSameHalfYear = () => isSameYear() && isSame('half-year'); + // const isSameQuater = () => isSameYear() && isSame('quarter'); + + + var isSameMonth = function () { + return isSameYear() && isSame('month'); + }; + + var isSameDay = function () { + return isSameMonth() && isSame('day'); + }; // const isSameHalfDay = () => isSameDay() && isSame('half-day'); + + + var isSameHour = function () { + return isSameDay() && isSame('hour'); + }; + + var isSameMinute = function () { + return isSameHour() && isSame('minute'); + }; + + var isSameSecond = function () { + return isSameMinute() && isSame('second'); + }; + + var isSameMilliSecond = function () { + return isSameSecond() && isSame('millisecond'); + }; + + switch (unit) { + case 'year': + return isSameYear(); + + case 'month': + return isSameMonth(); + + case 'day': + return isSameDay(); + + case 'hour': + return isSameHour(); + + case 'minute': + return isSameMinute(); + + case 'second': + return isSameSecond(); + + case 'millisecond': + return isSameMilliSecond(); + } + } // const primaryUnitGetters = { + // year: fullYearGetterName(), + // month: monthGetterName(), + // day: dateGetterName(), + // hour: hoursGetterName(), + // minute: minutesGetterName(), + // second: secondsGetterName(), + // millisecond: millisecondsGetterName() + // }; + // const primaryUnitUTCGetters = { + // year: fullYearGetterName(true), + // month: monthGetterName(true), + // day: dateGetterName(true), + // hour: hoursGetterName(true), + // minute: minutesGetterName(true), + // second: secondsGetterName(true), + // millisecond: millisecondsGetterName(true) + // }; + // function moveTick(date: Date, unitName: TimeUnit, step: number, isUTC: boolean) { + // step = step || 1; + // switch (getPrimaryTimeUnit(unitName)) { + // case 'year': + // date[fullYearSetterName(isUTC)](date[fullYearGetterName(isUTC)]() + step); + // break; + // case 'month': + // date[monthSetterName(isUTC)](date[monthGetterName(isUTC)]() + step); + // break; + // case 'day': + // date[dateSetterName(isUTC)](date[dateGetterName(isUTC)]() + step); + // break; + // case 'hour': + // date[hoursSetterName(isUTC)](date[hoursGetterName(isUTC)]() + step); + // break; + // case 'minute': + // date[minutesSetterName(isUTC)](date[minutesGetterName(isUTC)]() + step); + // break; + // case 'second': + // date[secondsSetterName(isUTC)](date[secondsGetterName(isUTC)]() + step); + // break; + // case 'millisecond': + // date[millisecondsSetterName(isUTC)](date[millisecondsGetterName(isUTC)]() + step); + // break; + // } + // return date.getTime(); + // } + // const DATE_INTERVALS = [[8, 7.5], [4, 3.5], [2, 1.5]]; + // const MONTH_INTERVALS = [[6, 5.5], [3, 2.5], [2, 1.5]]; + // const MINUTES_SECONDS_INTERVALS = [[30, 30], [20, 20], [15, 15], [10, 10], [5, 5], [2, 2]]; + + + function getDateInterval(approxInterval, daysInMonth) { + approxInterval /= ONE_DAY; + return approxInterval > 16 ? 16 // Math.floor(daysInMonth / 2) + 1 // In this case we only want one tick betwen two month. + : approxInterval > 7.5 ? 7 // TODO week 7 or day 8? + : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1; + } + + function getMonthInterval(approxInterval) { + var APPROX_ONE_MONTH = 30 * ONE_DAY; + approxInterval /= APPROX_ONE_MONTH; + return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1; + } + + function getHourInterval(approxInterval) { + approxInterval /= ONE_HOUR; + return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1; + } + + function getMinutesAndSecondsInterval(approxInterval, isMinutes) { + approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND; + return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1; + } + + function getMillisecondsInterval(approxInterval) { + return nice(approxInterval, true); + } + + function getFirstTimestampOfUnit(date, unitName, isUTC) { + var outDate = new Date(date); + + switch (getPrimaryTimeUnit(unitName)) { + case 'year': + case 'month': + outDate[monthSetterName(isUTC)](0); + + case 'day': + outDate[dateSetterName(isUTC)](1); + + case 'hour': + outDate[hoursSetterName(isUTC)](0); + + case 'minute': + outDate[minutesSetterName(isUTC)](0); + + case 'second': + outDate[secondsSetterName(isUTC)](0); + outDate[millisecondsSetterName(isUTC)](0); + } + + return outDate.getTime(); + } + + function getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent) { + var safeLimit = 10000; + var unitNames = timeUnits; + var iter = 0; + + function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) { + var date = new Date(minTimestamp); + var dateTime = minTimestamp; + var d = date[getMethodName](); // if (isDate) { + // d -= 1; // Starts with 0; PENDING + // } + + while (dateTime < maxTimestamp && dateTime <= extent[1]) { + out.push({ + value: dateTime + }); + d += interval; + date[setMethodName](d); + dateTime = date.getTime(); + } // This extra tick is for calcuating ticks of next level. Will not been added to the final result + + + out.push({ + value: dateTime, + notAdd: true + }); + } + + function addLevelTicks(unitName, lastLevelTicks, levelTicks) { + var newAddedTicks = []; + var isFirstLevel = !lastLevelTicks.length; + + if (isUnitValueSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) { + return; + } + + if (isFirstLevel) { + lastLevelTicks = [{ + // TODO Optimize. Not include so may ticks. + value: getFirstTimestampOfUnit(new Date(extent[0]), unitName, isUTC) + }, { + value: extent[1] + }]; + } + + for (var i = 0; i < lastLevelTicks.length - 1; i++) { + var startTick = lastLevelTicks[i].value; + var endTick = lastLevelTicks[i + 1].value; + + if (startTick === endTick) { + continue; + } + + var interval = void 0; + var getterName = void 0; + var setterName = void 0; + var isDate = false; + + switch (unitName) { + case 'year': + interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365)); + getterName = fullYearGetterName(isUTC); + setterName = fullYearSetterName(isUTC); + break; + + case 'half-year': + case 'quarter': + case 'month': + interval = getMonthInterval(approxInterval); + getterName = monthGetterName(isUTC); + setterName = monthSetterName(isUTC); + break; + + case 'week': // PENDING If week is added. Ignore day. + + case 'half-week': + case 'day': + interval = getDateInterval(approxInterval); // Use 32 days and let interval been 16 + + getterName = dateGetterName(isUTC); + setterName = dateSetterName(isUTC); + isDate = true; + break; + + case 'half-day': + case 'quarter-day': + case 'hour': + interval = getHourInterval(approxInterval); + getterName = hoursGetterName(isUTC); + setterName = hoursSetterName(isUTC); + break; + + case 'minute': + interval = getMinutesAndSecondsInterval(approxInterval, true); + getterName = minutesGetterName(isUTC); + setterName = minutesSetterName(isUTC); + break; + + case 'second': + interval = getMinutesAndSecondsInterval(approxInterval, false); + getterName = secondsGetterName(isUTC); + setterName = secondsSetterName(isUTC); + break; + + case 'millisecond': + interval = getMillisecondsInterval(approxInterval); + getterName = millisecondsGetterName(isUTC); + setterName = millisecondsSetterName(isUTC); + break; + } + + addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks); + + if (unitName === 'year' && levelTicks.length > 1 && i === 0) { + // Add nearest years to the left extent. + levelTicks.unshift({ + value: levelTicks[0].value - interval + }); + } + } + + for (var i = 0; i < newAddedTicks.length; i++) { + levelTicks.push(newAddedTicks[i]); + } // newAddedTicks.length && console.log(unitName, newAddedTicks); + + + return newAddedTicks; + } + + var levelsTicks = []; + var currentLevelTicks = []; + var tickCount = 0; + var lastLevelTickCount = 0; + + for (var i = 0; i < unitNames.length && iter++ < safeLimit; ++i) { + var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]); + + if (!isPrimaryTimeUnit(unitNames[i])) { + // TODO + continue; + } + + addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks); + var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null; + + if (primaryTimeUnit !== nextPrimaryTimeUnit) { + if (currentLevelTicks.length) { + lastLevelTickCount = tickCount; // Remove the duplicate so the tick count can be precisely. + + currentLevelTicks.sort(function (a, b) { + return a.value - b.value; + }); + var levelTicksRemoveDuplicated = []; + + for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) { + var tickValue = currentLevelTicks[i_1].value; + + if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) { + levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]); + + if (tickValue >= extent[0] && tickValue <= extent[1]) { + tickCount++; + } + } + } + + var targetTickNum = (extent[1] - extent[0]) / approxInterval; // Added too much in this level and not too less in last level + + if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) { + break; + } // Only treat primary time unit as one level. + + + levelsTicks.push(levelTicksRemoveDuplicated); + + if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) { + break; + } + } // Reset if next unitName is primary + + + currentLevelTicks = []; + } + } + + if ("development" !== 'production') { + if (iter >= safeLimit) { + warn('Exceed safe limit.'); + } + } + + var levelsTicksInExtent = filter(map(levelsTicks, function (levelTicks) { + return filter(levelTicks, function (tick) { + return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd; + }); + }), function (levelTicks) { + return levelTicks.length > 0; + }); + var ticks = []; + var maxLevel = levelsTicksInExtent.length - 1; + + for (var i = 0; i < levelsTicksInExtent.length; ++i) { + var levelTicks = levelsTicksInExtent[i]; + + for (var k = 0; k < levelTicks.length; ++k) { + ticks.push({ + value: levelTicks[k].value, + level: maxLevel - i + }); + } + } + + ticks.sort(function (a, b) { + return a.value - b.value; + }); // Remove duplicates + + var result = []; + + for (var i = 0; i < ticks.length; ++i) { + if (i === 0 || ticks[i].value !== ticks[i - 1].value) { + result.push(ticks[i]); + } + } + + return result; + } + + Scale.registerClass(TimeScale); + + var scaleProto = Scale.prototype; // FIXME:TS refactor: not good to call it directly with `this`? + + var intervalScaleProto = IntervalScale.prototype; + var getPrecisionSafe$1 = getPrecisionSafe; + var roundingErrorFix = round; + var mathFloor$1 = Math.floor; + var mathCeil = Math.ceil; + var mathPow$1 = Math.pow; + var mathLog = Math.log; + + var LogScale = + /** @class */ + function (_super) { + __extends(LogScale, _super); + + function LogScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'log'; + _this.base = 10; + _this._originalScale = new IntervalScale(); // FIXME:TS actually used by `IntervalScale` + + _this._interval = 0; + return _this; + } + /** + * @param Whether expand the ticks to niced extent. + */ + + + LogScale.prototype.getTicks = function (expandToNicedExtent) { + var originalScale = this._originalScale; + var extent = this._extent; + var originalExtent = originalScale.getExtent(); + var ticks = intervalScaleProto.getTicks.call(this, expandToNicedExtent); + return map(ticks, function (tick) { + var val = tick.value; + var powVal = round(mathPow$1(this.base, val)); // Fix #4158 + + powVal = val === extent[0] && this._fixMin ? fixRoundingError(powVal, originalExtent[0]) : powVal; + powVal = val === extent[1] && this._fixMax ? fixRoundingError(powVal, originalExtent[1]) : powVal; + return { + value: powVal + }; + }, this); + }; + + LogScale.prototype.setExtent = function (start, end) { + var base = this.base; + start = mathLog(start) / mathLog(base); + end = mathLog(end) / mathLog(base); + intervalScaleProto.setExtent.call(this, start, end); + }; + /** + * @return {number} end + */ + + + LogScale.prototype.getExtent = function () { + var base = this.base; + var extent = scaleProto.getExtent.call(this); + extent[0] = mathPow$1(base, extent[0]); + extent[1] = mathPow$1(base, extent[1]); // Fix #4158 + + var originalScale = this._originalScale; + var originalExtent = originalScale.getExtent(); + this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); + this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); + return extent; + }; + + LogScale.prototype.unionExtent = function (extent) { + this._originalScale.unionExtent(extent); + + var base = this.base; + extent[0] = mathLog(extent[0]) / mathLog(base); + extent[1] = mathLog(extent[1]) / mathLog(base); + scaleProto.unionExtent.call(this, extent); + }; + + LogScale.prototype.unionExtentFromData = function (data, dim) { + // TODO + // filter value that <= 0 + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Update interval and extent of intervals for nice ticks + * @param approxTickNum default 10 Given approx tick number + */ + + + LogScale.prototype.niceTicks = function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + + if (span === Infinity || span <= 0) { + return; + } + + var interval = quantity(span); + var err = approxTickNum / span * interval; // Filter ticks to get closer to the desired count. + + if (err <= 0.5) { + interval *= 10; + } // Interval should be integer + + + while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) { + interval *= 10; + } + + var niceExtent = [round(mathCeil(extent[0] / interval) * interval), round(mathFloor$1(extent[1] / interval) * interval)]; + this._interval = interval; + this._niceExtent = niceExtent; + }; + + LogScale.prototype.niceExtent = function (opt) { + intervalScaleProto.niceExtent.call(this, opt); + this._fixMin = opt.fixMin; + this._fixMax = opt.fixMax; + }; + + LogScale.prototype.parse = function (val) { + return val; + }; + + LogScale.prototype.contain = function (val) { + val = mathLog(val) / mathLog(this.base); + return contain$1(val, this._extent); + }; + + LogScale.prototype.normalize = function (val) { + val = mathLog(val) / mathLog(this.base); + return normalize$1(val, this._extent); + }; + + LogScale.prototype.scale = function (val) { + val = scale$2(val, this._extent); + return mathPow$1(this.base, val); + }; + + LogScale.type = 'log'; + return LogScale; + }(Scale); + + var proto = LogScale.prototype; + proto.getMinorTicks = intervalScaleProto.getMinorTicks; + proto.getLabel = intervalScaleProto.getLabel; + + function fixRoundingError(val, originalVal) { + return roundingErrorFix(val, getPrecisionSafe$1(originalVal)); + } + + Scale.registerClass(LogScale); + + var ScaleRawExtentInfo = + /** @class */ + function () { + function ScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis. + originalExtent) { + this._prepareParams(scale, model, originalExtent); + } + /** + * Parameters depending on ouside (like model, user callback) + * are prepared and fixed here. + */ + + + ScaleRawExtentInfo.prototype._prepareParams = function (scale, model, // Usually: data extent from all series on this axis. + dataExtent) { + if (dataExtent[1] < dataExtent[0]) { + dataExtent = [NaN, NaN]; + } + + this._dataMin = dataExtent[0]; + this._dataMax = dataExtent[1]; + var isOrdinal = this._isOrdinal = scale.type === 'ordinal'; + this._needCrossZero = model.getNeedCrossZero && model.getNeedCrossZero(); + var modelMinRaw = this._modelMinRaw = model.get('min', true); + + if (isFunction(modelMinRaw)) { + // This callback alway provide users the full data extent (before data filtered). + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMinRaw !== 'dataMin') { + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw); + } + + var modelMaxRaw = this._modelMaxRaw = model.get('max', true); + + if (isFunction(modelMaxRaw)) { + // This callback alway provide users the full data extent (before data filtered). + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMaxRaw !== 'dataMax') { + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw); + } + + if (isOrdinal) { + // FIXME: there is a flaw here: if there is no "block" data processor like `dataZoom`, + // and progressive rendering is using, here the category result might just only contain + // the processed chunk rather than the entire result. + this._axisDataLen = model.getCategories().length; + } else { + var boundaryGap = model.get('boundaryGap'); + var boundaryGapArr = isArray(boundaryGap) ? boundaryGap : [boundaryGap || 0, boundaryGap || 0]; + + if (typeof boundaryGapArr[0] === 'boolean' || typeof boundaryGapArr[1] === 'boolean') { + if ("development" !== 'production') { + console.warn('Boolean type for boundaryGap is only ' + 'allowed for ordinal axis. Please use string in ' + 'percentage instead, e.g., "20%". Currently, ' + 'boundaryGap is set to be 0.'); + } + + this._boundaryGapInner = [0, 0]; + } else { + this._boundaryGapInner = [parsePercent(boundaryGapArr[0], 1), parsePercent(boundaryGapArr[1], 1)]; + } + } + }; + /** + * Calculate extent by prepared parameters. + * This method has no external dependency and can be called duplicatedly, + * getting the same result. + * If parameters changed, should call this method to recalcuate. + */ + + + ScaleRawExtentInfo.prototype.calculate = function () { + // Notice: When min/max is not set (that is, when there are null/undefined, + // which is the most common case), these cases should be ensured: + // (1) For 'ordinal', show all axis.data. + // (2) For others: + // + `boundaryGap` is applied (if min/max set, boundaryGap is + // disabled). + // + If `needCrossZero`, min/max should be zero, otherwise, min/max should + // be the result that originalExtent enlarged by boundaryGap. + // (3) If no data, it should be ensured that `scale.setBlank` is set. + var isOrdinal = this._isOrdinal; + var dataMin = this._dataMin; + var dataMax = this._dataMax; + var axisDataLen = this._axisDataLen; + var boundaryGapInner = this._boundaryGapInner; + var span = !isOrdinal ? dataMax - dataMin || Math.abs(dataMin) : null; // Currently if a `'value'` axis model min is specified as 'dataMin'/'dataMax', + // `boundaryGap` will not be used. It's the different from specifying as `null`/`undefined`. + + var min = this._modelMinRaw === 'dataMin' ? dataMin : this._modelMinNum; + var max = this._modelMaxRaw === 'dataMax' ? dataMax : this._modelMaxNum; // If `_modelMinNum`/`_modelMaxNum` is `null`/`undefined`, should not be fixed. + + var minFixed = min != null; + var maxFixed = max != null; + + if (min == null) { + min = isOrdinal ? axisDataLen ? 0 : NaN : dataMin - boundaryGapInner[0] * span; + } + + if (max == null) { + max = isOrdinal ? axisDataLen ? axisDataLen - 1 : NaN : dataMax + boundaryGapInner[1] * span; + } + + (min == null || !isFinite(min)) && (min = NaN); + (max == null || !isFinite(max)) && (max = NaN); + + if (min > max) { + min = NaN; + max = NaN; + } + + var isBlank = eqNaN(min) || eqNaN(max) || isOrdinal && !axisDataLen; // If data extent modified, need to recalculated to ensure cross zero. + + if (this._needCrossZero) { + // Axis is over zero and min is not set + if (min > 0 && max > 0 && !minFixed) { + min = 0; // minFixed = true; + } // Axis is under zero and max is not set + + + if (min < 0 && max < 0 && !maxFixed) { + max = 0; // maxFixed = true; + } // PENDING: + // When `needCrossZero` and all data is positive/negative, should it be ensured + // that the results processed by boundaryGap are positive/negative? + // If so, here `minFixed`/`maxFixed` need to be set. + + } + + var determinedMin = this._determinedMin; + var determinedMax = this._determinedMax; + + if (determinedMin != null) { + min = determinedMin; + minFixed = true; + } + + if (determinedMax != null) { + max = determinedMax; + maxFixed = true; + } // Ensure min/max be finite number or NaN here. (not to be null/undefined) + // `NaN` means min/max axis is blank. + + + return { + min: min, + max: max, + minFixed: minFixed, + maxFixed: maxFixed, + isBlank: isBlank + }; + }; + + ScaleRawExtentInfo.prototype.modifyDataMinMax = function (minMaxName, val) { + if ("development" !== 'production') { + assert(!this.frozen); + } + + this[DATA_MIN_MAX_ATTR[minMaxName]] = val; + }; + + ScaleRawExtentInfo.prototype.setDeterminedMinMax = function (minMaxName, val) { + var attr = DETERMINED_MIN_MAX_ATTR[minMaxName]; + + if ("development" !== 'production') { + assert(!this.frozen // Earse them usually means logic flaw. + && this[attr] == null); + } + + this[attr] = val; + }; + + ScaleRawExtentInfo.prototype.freeze = function () { + // @ts-ignore + this.frozen = true; + }; + + return ScaleRawExtentInfo; + }(); + var DETERMINED_MIN_MAX_ATTR = { + min: '_determinedMin', + max: '_determinedMax' + }; + var DATA_MIN_MAX_ATTR = { + min: '_dataMin', + max: '_dataMax' + }; + /** + * Get scale min max and related info only depends on model settings. + * This method can be called after coordinate system created. + * For example, in data processing stage. + * + * Scale extent info probably be required multiple times during a workflow. + * For example: + * (1) `dataZoom` depends it to get the axis extent in "100%" state. + * (2) `processor/extentCalculator` depends it to make sure whether axis extent is specified. + * (3) `coordSys.update` use it to finally decide the scale extent. + * But the callback of `min`/`max` should not be called multiple times. + * The code below should not be implemented repeatedly either. + * So we cache the result in the scale instance, which will be recreated at the begining + * of the workflow (because `scale` instance will be recreated each round of the workflow). + */ + + function ensureScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis. + originalExtent) { + // Do not permit to recreate. + var rawExtentInfo = scale.rawExtentInfo; + + if (rawExtentInfo) { + return rawExtentInfo; + } + + rawExtentInfo = new ScaleRawExtentInfo(scale, model, originalExtent); // @ts-ignore + + scale.rawExtentInfo = rawExtentInfo; + return rawExtentInfo; + } + function parseAxisModelMinMax(scale, minMax) { + return minMax == null ? null : eqNaN(minMax) ? NaN : scale.parse(minMax); + } + + /** + * Get axis scale extent before niced. + * Item of returned array can only be number (including Infinity and NaN). + * + * Caution: + * Precondition of calling this method: + * The scale extent has been initialized using series data extent via + * `scale.setExtent` or `scale.unionExtentFromData`; + */ + + function getScaleExtent(scale, model) { + var scaleType = scale.type; + var rawExtentResult = ensureScaleRawExtentInfo(scale, model, scale.getExtent()).calculate(); + scale.setBlank(rawExtentResult.isBlank); + var min = rawExtentResult.min; + var max = rawExtentResult.max; // If bars are placed on a base axis of type time or interval account for axis boundary overflow and current axis + // is base axis + // FIXME + // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly. + // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent? + // Should not depend on series type `bar`? + // (3) Fix that might overlap when using dataZoom. + // (4) Consider other chart types using `barGrid`? + // See #6728, #4862, `test/bar-overflow-time-plot.html` + + var ecModel = model.ecModel; + + if (ecModel && scaleType === 'time' + /*|| scaleType === 'interval' */ + ) { + var barSeriesModels = prepareLayoutBarSeries('bar', ecModel); + var isBaseAxisAndHasBarSeries_1 = false; + each(barSeriesModels, function (seriesModel) { + isBaseAxisAndHasBarSeries_1 = isBaseAxisAndHasBarSeries_1 || seriesModel.getBaseAxis() === model.axis; + }); + + if (isBaseAxisAndHasBarSeries_1) { + // Calculate placement of bars on axis. TODO should be decoupled + // with barLayout + var barWidthAndOffset = makeColumnLayout(barSeriesModels); // Adjust axis min and max to account for overflow + + var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset); + min = adjustedScale.min; + max = adjustedScale.max; + } + } + + return { + extent: [min, max], + // "fix" means "fixed", the value should not be + // changed in the subsequent steps. + fixMin: rawExtentResult.minFixed, + fixMax: rawExtentResult.maxFixed + }; + } + + function adjustScaleForOverflow(min, max, model, // Only support cartesian coord yet. + barWidthAndOffset) { + // Get Axis Length + var axisExtent = model.axis.getExtent(); + var axisLength = axisExtent[1] - axisExtent[0]; // Get bars on current base axis and calculate min and max overflow + + var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis); + + if (barsOnCurrentAxis === undefined) { + return { + min: min, + max: max + }; + } + + var minOverflow = Infinity; + each(barsOnCurrentAxis, function (item) { + minOverflow = Math.min(item.offset, minOverflow); + }); + var maxOverflow = -Infinity; + each(barsOnCurrentAxis, function (item) { + maxOverflow = Math.max(item.offset + item.width, maxOverflow); + }); + minOverflow = Math.abs(minOverflow); + maxOverflow = Math.abs(maxOverflow); + var totalOverFlow = minOverflow + maxOverflow; // Calculate required buffer based on old range and overflow + + var oldRange = max - min; + var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength; + var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange; + max += overflowBuffer * (maxOverflow / totalOverFlow); + min -= overflowBuffer * (minOverflow / totalOverFlow); + return { + min: min, + max: max + }; + } // Precondition of calling this method: + // The scale extent has been initailized using series data extent via + // `scale.setExtent` or `scale.unionExtentFromData`; + + + function niceScaleExtent(scale, model) { + var extentInfo = getScaleExtent(scale, model); + var extent = extentInfo.extent; + var splitNumber = model.get('splitNumber'); + + if (scale instanceof LogScale) { + scale.base = model.get('logBase'); + } + + var scaleType = scale.type; + scale.setExtent(extent[0], extent[1]); + scale.niceExtent({ + splitNumber: splitNumber, + fixMin: extentInfo.fixMin, + fixMax: extentInfo.fixMax, + minInterval: scaleType === 'interval' || scaleType === 'time' ? model.get('minInterval') : null, + maxInterval: scaleType === 'interval' || scaleType === 'time' ? model.get('maxInterval') : null + }); // 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 axisType Default retrieve from model.type + */ + + function createScaleByModel(model, axisType) { + axisType = axisType || model.get('type'); + + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(), + extent: [Infinity, -Infinity] + }); + + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + + default: + // case 'value'/'interval', 'log', or others. + return new (Scale.getClass(axisType) || IntervalScale)(); + } + } + } + /** + * Check if the axis cross 0 + */ + + function ifAxisCrossZero(axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !(min > 0 && max > 0 || min < 0 && max < 0); + } + /** + * @param axis + * @return Label formatter function. + * param: {number} tickValue, + * param: {number} idx, the index in all ticks. + * If category axis, this param is not required. + * return: {string} label string. + */ + + function makeLabelFormatter(axis) { + var labelFormatter = axis.getLabelModel().get('formatter'); + var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null; + + if (axis.scale.type === 'time') { + return function (tpl) { + return function (tick, idx) { + return axis.scale.getFormattedLabel(tick, idx, tpl); + }; + }(labelFormatter); + } else if (typeof labelFormatter === 'string') { + return function (tpl) { + return function (tick) { + // For category axis, get raw value; for numeric axis, + // get formatted label like '1,333,444'. + var label = axis.scale.getLabel(tick); + var text = tpl.replace('{value}', label != null ? label : ''); + return text; + }; + }(labelFormatter); + } else if (typeof labelFormatter === 'function') { + return function (cb) { + return function (tick, idx) { + // The original intention of `idx` is "the index of the tick in all ticks". + // But the previous implementation of category axis do not consider the + // `axisLabel.interval`, which cause that, for example, the `interval` is + // `1`, then the ticks "name5", "name7", "name9" are displayed, where the + // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep + // the definition here for back compatibility. + if (categoryTickStart != null) { + idx = tick.value - categoryTickStart; + } + + return cb(getAxisRawValue(axis, tick), idx, tick.level != null ? { + level: tick.level + } : null); + }; + }(labelFormatter); + } else { + return function (tick) { + return axis.scale.getLabel(tick); + }; + } + } + function getAxisRawValue(axis, tick) { + // In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + return axis.type === 'category' ? axis.scale.getLabel(tick) : tick.value; + } + /** + * @param axis + * @return Be null/undefined if no labels. + */ + + function estimateLabelUnionRect(axis) { + var axisModel = axis.model; + var scale = axis.scale; + + if (!axisModel.get(['axisLabel', 'show']) || scale.isBlank()) { + return; + } + + var realNumberScaleTicks; + var tickCount; + var categoryScaleExtent = scale.getExtent(); // Optimize for large category data, avoid call `getTicks()`. + + if (scale instanceof OrdinalScale) { + tickCount = scale.count(); + } else { + realNumberScaleTicks = scale.getTicks(); + tickCount = realNumberScaleTicks.length; + } + + var axisLabelModel = axis.getLabelModel(); + var labelFormatter = makeLabelFormatter(axis); + var rect; + var step = 1; // Simple optimization for large amount of labels + + if (tickCount > 40) { + step = Math.ceil(tickCount / 40); + } + + for (var i = 0; i < tickCount; i += step) { + var tick = realNumberScaleTicks ? realNumberScaleTicks[i] : { + value: categoryScaleExtent[0] + i + }; + var label = labelFormatter(tick, i); + var unrotatedSingleRect = axisLabelModel.getTextRect(label); + var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0); + rect ? rect.union(singleRect) : rect = singleRect; + } + + return rect; + } + + function rotateTextRect(textRect, rotate) { + var rotateRadians = rotate * Math.PI / 180; + var beforeWidth = textRect.width; + var beforeHeight = textRect.height; + var afterWidth = beforeWidth * Math.abs(Math.cos(rotateRadians)) + Math.abs(beforeHeight * Math.sin(rotateRadians)); + var afterHeight = beforeWidth * Math.abs(Math.sin(rotateRadians)) + Math.abs(beforeHeight * Math.cos(rotateRadians)); + var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight); + return rotatedRect; + } + /** + * @param model axisLabelModel or axisTickModel + * @return {number|String} Can be null|'auto'|number|function + */ + + + function getOptionCategoryInterval(model) { + var interval = model.get('interval'); + return interval == null ? 'auto' : interval; + } + /** + * Set `categoryInterval` as 0 implicitly indicates that + * show all labels reguardless of overlap. + * @param {Object} axis axisModel.axis + */ + + function shouldShowAllLabels(axis) { + return axis.type === 'category' && getOptionCategoryInterval(axis.getLabelModel()) === 0; + } + function getDataDimensionsOnAxis(data, axisDim) { + // Remove duplicated dat dimensions caused by `getStackedDimension`. + var dataDimMap = {}; // Currently `mapDimensionsAll` will contain stack result dimension ('__\0ecstackresult'). + // PENDING: is it reasonable? Do we need to remove the original dim from "coord dim" since + // there has been stacked result dim? + + each(data.mapDimensionsAll(axisDim), function (dataDim) { + // For example, the extent of the original dimension + // is [0.1, 0.5], the extent of the `stackResultDimension` + // is [7, 9], the final extent should NOT include [0.1, 0.5], + // because there is no graphic corresponding to [0.1, 0.5]. + // See the case in `test/area-stack.html` `main1`, where area line + // stack needs `yAxis` not start from 0. + dataDimMap[getStackedDimension(data, dataDim)] = true; + }); + return keys(dataDimMap); + } + function unionAxisExtentFromData(dataExtent, data, axisDim) { + if (data) { + each(getDataDimensionsOnAxis(data, axisDim), function (dim) { + var seriesExtent = data.getApproximateExtent(dim); + seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]); + seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]); + }); + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var AxisModelCommonMixin = + /** @class */ + function () { + function AxisModelCommonMixin() {} + + AxisModelCommonMixin.prototype.getNeedCrossZero = function () { + var option = this.option; + return !option.scale; + }; + /** + * Should be implemented by each axis model if necessary. + * @return coordinate system model + */ + + + AxisModelCommonMixin.prototype.getCoordSysModel = function () { + return; + }; + + return AxisModelCommonMixin; + }(); + + /** + * Create a muti dimension List structure from seriesModel. + */ + + function createList(seriesModel) { + return createListFromArray(seriesModel.getSource(), seriesModel); + } // export function createGraph(seriesModel) { + var dataStack$1 = { + isDimensionStacked: isDimensionStacked, + enableDataStack: enableDataStack, + getStackedDimension: getStackedDimension + }; + /** + * Create scale + * @param {Array.} dataExtent + * @param {Object|module:echarts/Model} option If `optoin.type` + * is secified, it can only be `'value'` currently. + */ + + function createScale(dataExtent, option) { + var axisModel = option; + + if (!(option instanceof Model)) { + axisModel = new Model(option); // FIXME + // Currently AxisModelCommonMixin has nothing to do with the + // the requirements of `axisHelper.createScaleByModel`. For + // example the method `getCategories` and `getOrdinalMeta` + // are required for `'category'` axis, and ecModel are required + // for `'time'` axis. But occationally echarts-gl happened + // to only use `'value'` axis. + // zrUtil.mixin(axisModel, AxisModelCommonMixin); + } + + var scale = createScaleByModel(axisModel); + scale.setExtent(dataExtent[0], dataExtent[1]); + niceScaleExtent(scale, axisModel); + return scale; + } + /** + * Mixin common methods to axis model, + * + * Inlcude methods + * `getFormattedLabels() => Array.` + * `getCategories() => Array.` + * `getMin(origin: boolean) => number` + * `getMax(origin: boolean) => number` + * `getNeedCrossZero() => boolean` + */ + + function mixinAxisModelCommonMethods(Model) { + mixin(Model, AxisModelCommonMixin); + } + function createTextStyle$1(textStyleModel, opts) { + opts = opts || {}; + return createTextStyle(textStyleModel, null, null, opts.state !== 'normal'); + } + + var helper = /*#__PURE__*/Object.freeze({ + __proto__: null, + createList: createList, + getLayoutRect: getLayoutRect, + dataStack: dataStack$1, + createScale: createScale, + mixinAxisModelCommonMethods: mixinAxisModelCommonMethods, + getECData: getECData, + createTextStyle: createTextStyle$1, + createDimensions: createDimensions, + createSymbol: createSymbol, + enableHoverEmphasis: enableHoverEmphasis + }); + + var EPSILON$3 = 1e-8; + function isAroundEqual$1(a, b) { + return Math.abs(a - b) < EPSILON$3; + } + function contain$2(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; + } + var p0 = points[0]; + if (!isAroundEqual$1(p[0], p0[0]) || !isAroundEqual$1(p[1], p0[1])) { + w += windingLine(p[0], p[1], p0[0], p0[1], x, y); + } + return w !== 0; + } + + var Region = + /** @class */ + function () { + function Region(name, geometries, cp) { + this.name = name; + this.geometries = geometries; + + if (!cp) { + var rect = this.getBoundingRect(); + cp = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + } else { + cp = [cp[0], cp[1]]; + } + + this.center = cp; + } + + Region.prototype.getBoundingRect = function () { + var rect = this._rect; + + if (rect) { + return rect; + } + + var MAX_NUMBER = Number.MAX_VALUE; + var min$1 = [MAX_NUMBER, MAX_NUMBER]; + var max$1 = [-MAX_NUMBER, -MAX_NUMBER]; + var min2 = []; + var max2 = []; + var geometries = this.geometries; + var i = 0; + + for (; i < geometries.length; i++) { + // Only support polygon + if (geometries[i].type !== 'polygon') { + continue; + } // Doesn't consider hole + + + var exterior = geometries[i].exterior; + fromPoints(exterior, min2, max2); + min(min$1, min$1, min2); + max(max$1, max$1, max2); + } // No data + + + if (i === 0) { + min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0; + } + + return this._rect = new BoundingRect(min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1]); + }; + + Region.prototype.contain = function (coord) { + var rect = this.getBoundingRect(); + var geometries = this.geometries; + + if (!rect.contain(coord[0], coord[1])) { + return false; + } + + loopGeo: for (var i = 0, len = geometries.length; i < len; i++) { + // Only support polygon. + if (geometries[i].type !== 'polygon') { + continue; + } + + var exterior = geometries[i].exterior; + var interiors = geometries[i].interiors; + + if (contain$2(exterior, coord[0], coord[1])) { + // Not in the region if point is in the hole. + for (var k = 0; k < (interiors ? interiors.length : 0); k++) { + if (contain$2(interiors[k], coord[0], coord[1])) { + continue loopGeo; + } + } + + return true; + } + } + + return false; + }; + + Region.prototype.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 geometries = this.geometries; + + for (var i = 0; i < geometries.length; i++) { + // Only support polygon. + if (geometries[i].type !== 'polygon') { + continue; + } + + var exterior = geometries[i].exterior; + var interiors = geometries[i].interiors; + + for (var p = 0; p < exterior.length; p++) { + applyTransform(exterior[p], exterior[p], transform); + } + + for (var h = 0; h < (interiors ? interiors.length : 0); h++) { + for (var p = 0; p < interiors[h].length; p++) { + applyTransform(interiors[h][p], interiors[h][p], transform); + } + } + } + + rect = this._rect; + rect.copy(target); // Update center + + this.center = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + }; + + Region.prototype.cloneShallow = function (name) { + name == null && (name = this.name); + var newRegion = new Region(name, this.geometries, this.center); + newRegion._rect = this._rect; + newRegion.transformTo = null; // Simply avoid to be called. + + return newRegion; + }; + + return Region; + }(); + + function decode(json) { + if (!json.UTF8Encoding) { + return json; + } + + var jsonCompressed = json; + var encodeScale = jsonCompressed.UTF8Scale; + + if (encodeScale == null) { + encodeScale = 1024; + } + + var features = jsonCompressed.features; + + for (var f = 0; f < features.length; f++) { + var feature = features[f]; + var geometry = feature.geometry; + + if (geometry.type === 'Polygon') { + var coordinates = geometry.coordinates; + + for (var c = 0; c < coordinates.length; c++) { + coordinates[c] = decodePolygon(coordinates[c], geometry.encodeOffsets[c], encodeScale); + } + } else if (geometry.type === 'MultiPolygon') { + var coordinates = geometry.coordinates; + + for (var c = 0; c < coordinates.length; c++) { + var coordinate = coordinates[c]; + + for (var c2 = 0; c2 < coordinate.length; c2++) { + coordinate[c2] = decodePolygon(coordinate[c2], geometry.encodeOffsets[c][c2], encodeScale); + } + } + } + } // Has been decoded + + + jsonCompressed.UTF8Encoding = false; + return jsonCompressed; + } + + function decodePolygon(coordinate, encodeOffsets, encodeScale) { + 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 / encodeScale, y / encodeScale]); + } + + return result; + } + + function parseGeoJSON(geoJson, nameProperty) { + geoJson = decode(geoJson); + return map(filter(geoJson.features, function (featureObj) { + // Output of mapshaper may have geometry null + return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0; + }), function (featureObj) { + var properties = featureObj.properties; + var geo = featureObj.geometry; + var geometries = []; + + if (geo.type === 'Polygon') { + var coordinates = geo.coordinates; + geometries.push({ + type: 'polygon', + // According to the GeoJSON specification. + // First must be exterior, and the rest are all interior(holes). + exterior: coordinates[0], + interiors: coordinates.slice(1) + }); + } + + if (geo.type === 'MultiPolygon') { + var coordinates = geo.coordinates; + each(coordinates, function (item) { + if (item[0]) { + geometries.push({ + type: 'polygon', + exterior: item[0], + interiors: item.slice(1) + }); + } + }); + } + + var region = new Region(properties[nameProperty || 'name'], geometries, properties.cp); + region.properties = properties; + return region; + }); + } + + var number = /*#__PURE__*/Object.freeze({ + __proto__: null, + linearMap: linearMap, + round: round, + asc: asc, + getPrecision: getPrecision, + getPrecisionSafe: getPrecisionSafe, + getPixelPrecision: getPixelPrecision, + getPercentWithPrecision: getPercentWithPrecision, + MAX_SAFE_INTEGER: MAX_SAFE_INTEGER, + remRadian: remRadian, + isRadianAroundZero: isRadianAroundZero, + parseDate: parseDate, + quantity: quantity, + quantityExponent: quantityExponent, + nice: nice, + quantile: quantile, + reformIntervals: reformIntervals, + isNumeric: isNumeric, + numericToNumber: numericToNumber + }); + + var time = /*#__PURE__*/Object.freeze({ + __proto__: null, + parse: parseDate, + format: format + }); + + var graphic$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + extendShape: extendShape, + extendPath: extendPath, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath$1, + resizePath: resizePath, + createIcon: createIcon, + updateProps: updateProps, + initProps: initProps, + getTransform: getTransform, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + registerShape: registerShape, + getShapeClass: getShapeClass, + Group: Group, + Image: ZRImage, + Text: ZRText, + Circle: Circle, + Ellipse: Ellipse, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayable, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect + }); + + var format$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + addCommas: addCommas, + toCamelCase: toCamelCase, + normalizeCssArray: normalizeCssArray$1, + encodeHTML: encodeHTML, + formatTpl: formatTpl, + getTooltipMarker: getTooltipMarker, + formatTime: formatTime, + capitalFirst: capitalFirst, + truncateText: truncateText, + getTextRect: getTextRect + }); + + var util$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + map: map, + each: each, + indexOf: indexOf, + inherits: inherits, + reduce: reduce, + filter: filter, + bind: bind, + curry: curry, + isArray: isArray, + isString: isString, + isObject: isObject, + isFunction: isFunction, + extend: extend, + defaults: defaults, + clone: clone, + merge: merge + }); + + var inner$4 = makeInner(); + function createAxisLabels(axis) { + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryLabels(axis) : makeRealNumberLabels(axis); + } + /** + * @param {module:echats/coord/Axis} axis + * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea. + * @return {Object} { + * ticks: Array. + * tickCategoryInterval: number + * } + */ + + function createAxisTicks(axis, tickModel) { + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryTicks(axis, tickModel) : { + ticks: map(axis.scale.getTicks(), function (tick) { + return tick.value; + }) + }; + } + + function makeCategoryLabels(axis) { + var labelModel = axis.getLabelModel(); + var result = makeCategoryLabelsActually(axis, labelModel); + return !labelModel.get('show') || axis.scale.isBlank() ? { + labels: [], + labelCategoryInterval: result.labelCategoryInterval + } : result; + } + + function makeCategoryLabelsActually(axis, labelModel) { + var labelsCache = getListCache(axis, 'labels'); + var optionLabelInterval = getOptionCategoryInterval(labelModel); + var result = listCacheGet(labelsCache, optionLabelInterval); + + if (result) { + return result; + } + + var labels; + var numericLabelInterval; + + if (isFunction(optionLabelInterval)) { + labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval); + } else { + numericLabelInterval = optionLabelInterval === 'auto' ? makeAutoCategoryInterval(axis) : optionLabelInterval; + labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval); + } // Cache to avoid calling interval function repeatly. + + + return listCacheSet(labelsCache, optionLabelInterval, { + labels: labels, + labelCategoryInterval: numericLabelInterval + }); + } + + function makeCategoryTicks(axis, tickModel) { + var ticksCache = getListCache(axis, 'ticks'); + var optionTickInterval = getOptionCategoryInterval(tickModel); + var result = listCacheGet(ticksCache, optionTickInterval); + + if (result) { + return result; + } + + var ticks; + var tickCategoryInterval; // Optimize for the case that large category data and no label displayed, + // we should not return all ticks. + + if (!tickModel.get('show') || axis.scale.isBlank()) { + ticks = []; + } + + if (isFunction(optionTickInterval)) { + ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true); + } // Always use label interval by default despite label show. Consider this + // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows + // labels. `splitLine` and `axisTick` should be consistent in this case. + else if (optionTickInterval === 'auto') { + var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel()); + tickCategoryInterval = labelsResult.labelCategoryInterval; + ticks = map(labelsResult.labels, function (labelItem) { + return labelItem.tickValue; + }); + } else { + tickCategoryInterval = optionTickInterval; + ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true); + } // Cache to avoid calling interval function repeatly. + + + return listCacheSet(ticksCache, optionTickInterval, { + ticks: ticks, + tickCategoryInterval: tickCategoryInterval + }); + } + + function makeRealNumberLabels(axis) { + var ticks = axis.scale.getTicks(); + var labelFormatter = makeLabelFormatter(axis); + return { + labels: map(ticks, function (tick, idx) { + return { + formattedLabel: labelFormatter(tick, idx), + rawLabel: axis.scale.getLabel(tick), + tickValue: tick.value + }; + }) + }; + } + + function getListCache(axis, prop) { + // Because key can be funciton, and cache size always be small, we use array cache. + return inner$4(axis)[prop] || (inner$4(axis)[prop] = []); + } + + function listCacheGet(cache, key) { + for (var i = 0; i < cache.length; i++) { + if (cache[i].key === key) { + return cache[i].value; + } + } + } + + function listCacheSet(cache, key, value) { + cache.push({ + key: key, + value: value + }); + return value; + } + + function makeAutoCategoryInterval(axis) { + var result = inner$4(axis).autoInterval; + return result != null ? result : inner$4(axis).autoInterval = axis.calculateCategoryInterval(); + } + /** + * Calculate interval for category axis ticks and labels. + * To get precise result, at least one of `getRotate` and `isHorizontal` + * should be implemented in axis. + */ + + + function calculateCategoryInterval(axis) { + var params = fetchAutoCategoryIntervalCalculationParams(axis); + var labelFormatter = makeLabelFormatter(axis); + var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI; + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var step = 1; // Simple optimization. Empirical value: tick count should less than 40. + + if (tickCount > 40) { + step = Math.max(1, Math.floor(tickCount / 40)); + } + + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitW = Math.abs(unitSpan * Math.cos(rotation)); + var unitH = Math.abs(unitSpan * Math.sin(rotation)); + var maxW = 0; + var maxH = 0; // Caution: Performance sensitive for large category data. + // Consider dataZoom, we should make appropriate step to avoid O(n) loop. + + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + var width = 0; + var height = 0; // Not precise, do not consider align and vertical align + // and each distance from axis line yet. + + var rect = getBoundingRect(labelFormatter({ + value: tickValue + }), params.font, 'center', 'top'); // Magic number + + width = rect.width * 1.3; + height = rect.height * 1.3; // Min size, void long loop. + + maxW = Math.max(maxW, width, 7); + maxH = Math.max(maxH, height, 7); + } + + var dw = maxW / unitW; + var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity. + + isNaN(dw) && (dw = Infinity); + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(Math.min(dw, dh))); + var cache = inner$4(axis.model); + var axisExtent = axis.getExtent(); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + // For example, if all of the axis labels are `a, b, c, d, e, f, g`. + // The jitter will cause that sometimes the displayed labels are + // `a, d, g` (interval: 2) sometimes `a, c, e`(interval: 1). + + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval // If the axis change is caused by chart resize, the cache should not + // be used. Otherwise some hiden labels might not be shown again. + && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1]) { + interval = lastAutoInterval; + } // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + cache.axisExtent0 = axisExtent[0]; + cache.axisExtent1 = axisExtent[1]; + } + + return interval; + } + + function fetchAutoCategoryIntervalCalculationParams(axis) { + var labelModel = axis.getLabelModel(); + return { + axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0, + labelRotate: labelModel.get('rotate') || 0, + font: labelModel.getFont() + }; + } + + function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) { + var labelFormatter = makeLabelFormatter(axis); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); + var labelModel = axis.getLabelModel(); + var result = []; // TODO: axisType: ordinalTime, pick the tick from each month/day/year/... + + var step = Math.max((categoryInterval || 0) + 1, 1); + var startTick = ordinalExtent[0]; + var tickCount = ordinalScale.count(); // Calculate start tick based on zero if possible to keep label consistent + // while zooming and moving while interval > 0. Otherwise the selection + // of displayable ticks and symbols probably keep changing. + // 3 is empirical value. + + if (startTick !== 0 && step > 1 && tickCount / step > 2) { + startTick = Math.round(Math.ceil(startTick / step) * step); + } // (1) Only add min max label here but leave overlap checking + // to render stage, which also ensure the returned list + // suitable for splitLine and splitArea rendering. + // (2) Scales except category always contain min max label so + // do not need to perform this process. + + + var showAllLabel = shouldShowAllLabels(axis); + var includeMinLabel = labelModel.get('showMinLabel') || showAllLabel; + var includeMaxLabel = labelModel.get('showMaxLabel') || showAllLabel; + + if (includeMinLabel && startTick !== ordinalExtent[0]) { + addItem(ordinalExtent[0]); + } // Optimize: avoid generating large array by `ordinalScale.getTicks()`. + + + var tickValue = startTick; + + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + addItem(tickValue); + } + + if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) { + addItem(ordinalExtent[1]); + } + + function addItem(tickValue) { + var tickObj = { + value: tickValue + }; + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tickObj), + rawLabel: ordinalScale.getLabel(tickObj), + tickValue: tickValue + }); + } + + return result; + } + + function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) { + var ordinalScale = axis.scale; + var labelFormatter = makeLabelFormatter(axis); + var result = []; + each(ordinalScale.getTicks(), function (tick) { + var rawLabel = ordinalScale.getLabel(tick); + var tickValue = tick.value; + + if (categoryInterval(tick.value, rawLabel)) { + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tick), + rawLabel: rawLabel, + tickValue: tickValue + }); + } + }); + return result; + } + + var NORMALIZED_EXTENT = [0, 1]; + /** + * Base class of Axis. + */ + + var Axis = + /** @class */ + function () { + function Axis(dim, scale, extent) { + this.onBand = false; + this.inverse = false; + this.dim = dim; + this.scale = scale; + this._extent = extent || [0, 0]; + } + /** + * If axis extent contain given coord + */ + + + Axis.prototype.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 + */ + + + Axis.prototype.containData = function (data) { + return this.scale.contain(data); + }; + /** + * Get coord extent. + */ + + + Axis.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Get precision used for formatting + */ + + + Axis.prototype.getPixelPrecision = function (dataExtent) { + return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent); + }; + /** + * Set coord extent + */ + + + Axis.prototype.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 an ordinal scale + */ + + + Axis.prototype.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, NORMALIZED_EXTENT, extent, clamp); + }; + /** + * Convert coord to data. Data is the rank if it has an ordinal scale + */ + + + Axis.prototype.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, NORMALIZED_EXTENT, clamp); + return this.scale.scale(t); + }; + /** + * Convert pixel point to data in axis + */ + + + Axis.prototype.pointToData = function (point, clamp) { + // Should be implemented in derived class if necessary. + return; + }; + /** + * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`, + * `axis.getTicksCoords` considers `onBand`, which is used by + * `boundaryGap:true` of category axis and splitLine and splitArea. + * @param opt.tickModel default: axis.model.getModel('axisTick') + * @param opt.clamp If `true`, the first and the last + * tick must be at the axis end points. Otherwise, clip ticks + * that outside the axis extent. + */ + + + Axis.prototype.getTicksCoords = function (opt) { + opt = opt || {}; + var tickModel = opt.tickModel || this.getTickModel(); + var result = createAxisTicks(this, tickModel); + var ticks = result.ticks; + var ticksCoords = map(ticks, function (tickVal) { + return { + coord: this.dataToCoord(this.scale.type === 'ordinal' ? this.scale.getRawOrdinalNumber(tickVal) : tickVal), + tickValue: tickVal + }; + }, this); + var alignWithLabel = tickModel.get('alignWithLabel'); + fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp); + return ticksCoords; + }; + + Axis.prototype.getMinorTicksCoords = function () { + if (this.scale.type === 'ordinal') { + // Category axis doesn't support minor ticks + return []; + } + + var minorTickModel = this.model.getModel('minorTick'); + var splitNumber = minorTickModel.get('splitNumber'); // Protection. + + if (!(splitNumber > 0 && splitNumber < 100)) { + splitNumber = 5; + } + + var minorTicks = this.scale.getMinorTicks(splitNumber); + var minorTicksCoords = map(minorTicks, function (minorTicksGroup) { + return map(minorTicksGroup, function (minorTick) { + return { + coord: this.dataToCoord(minorTick), + tickValue: minorTick + }; + }, this); + }, this); + return minorTicksCoords; + }; + + Axis.prototype.getViewLabels = function () { + return createAxisLabels(this).labels; + }; + + Axis.prototype.getLabelModel = function () { + return this.model.getModel('axisLabel'); + }; + /** + * Notice here we only get the default tick model. For splitLine + * or splitArea, we should pass the splitLineModel or splitAreaModel + * manually when calling `getTicksCoords`. + * In GL, this method may be overrided to: + * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));` + */ + + + Axis.prototype.getTickModel = function () { + return this.model.getModel('axisTick'); + }; + /** + * Get width of band + */ + + + Axis.prototype.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; + }; + /** + * Only be called in category axis. + * Can be overrided, consider other axes like in 3D. + * @return Auto interval for cateogry axis tick and label + */ + + + Axis.prototype.calculateCategoryInterval = function () { + return calculateCategoryInterval(this); + }; + + return Axis; + }(); + + function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; + } // If axis has labels [1, 2, 3, 4]. Bands on the axis are + // |---1---|---2---|---3---|---4---|. + // So the displayed ticks and splitLine/splitArea should between + // each data item, otherwise cause misleading (e.g., split tow bars + // of a single data item when there are two bar series). + // Also consider if tickCategoryInterval > 0 and onBand, ticks and + // splitLine/spliteArea should layout appropriately corresponding + // to displayed labels. (So we should not use `getBandWidth` in this + // case). + + + function fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp) { + var ticksLen = ticksCoords.length; + + if (!axis.onBand || alignWithLabel || !ticksLen) { + return; + } + + var axisExtent = axis.getExtent(); + var last; + var diffSize; + + if (ticksLen === 1) { + ticksCoords[0].coord = axisExtent[0]; + last = ticksCoords[1] = { + coord: axisExtent[0] + }; + } else { + var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue; + var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen; + each(ticksCoords, function (ticksItem) { + ticksItem.coord -= shift_1 / 2; + }); + var dataExtent = axis.scale.getExtent(); + diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue; + last = { + coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize + }; + ticksCoords.push(last); + } + + var inverse = axisExtent[0] > axisExtent[1]; // Handling clamp. + + if (littleThan(ticksCoords[0].coord, axisExtent[0])) { + clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift(); + } + + if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) { + ticksCoords.unshift({ + coord: axisExtent[0] + }); + } + + if (littleThan(axisExtent[1], last.coord)) { + clamp ? last.coord = axisExtent[1] : ticksCoords.pop(); + } + + if (clamp && littleThan(last.coord, axisExtent[1])) { + ticksCoords.push({ + coord: axisExtent[1] + }); + } + + function littleThan(a, b) { + // Avoid rounding error cause calculated tick coord different with extent. + // It may cause an extra unecessary tick added. + a = round(a); + b = round(b); + return inverse ? a > b : a < b; + } + } + + // Should use `ComponentModel.extend` or `class XXXX extend ComponentModel` to create class. + // Then use `registerComponentModel` in `install` parameter when `use` this extension. For example: + // class Bar3DModel extends ComponentModel {} + // export function install(registers) { regsiters.registerComponentModel(Bar3DModel); } + // echarts.use(install); + + function extendComponentModel(proto) { + var Model = ComponentModel.extend(proto); + ComponentModel.registerClass(Model); + return Model; + } + function extendComponentView(proto) { + var View = ComponentView.extend(proto); + ComponentView.registerClass(View); + return View; + } + function extendSeriesModel(proto) { + var Model = SeriesModel.extend(proto); + SeriesModel.registerClass(Model); + return Model; + } + function extendChartView(proto) { + var View = ChartView.extend(proto); + ChartView.registerClass(View); + return View; + } + + function createElement(name) { + return document.createElementNS('http://www.w3.org/2000/svg', name); + } + + function diff(oldArr, newArr, equals) { + if (!equals) { + equals = function (a, b) { + return a === b; + }; + } + oldArr = oldArr.slice(); + newArr = newArr.slice(); + var newLen = newArr.length; + var oldLen = oldArr.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + var oldPos = extractCommon(bestPath[0], newArr, oldArr, 0, equals); + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + var indices = []; + for (var i = 0; i < newArr.length; i++) { + indices.push(i); + } + return [{ + indices: indices, + count: newArr.length, + added: false, + removed: false + }]; + } + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath; + var addPath = bestPath[diagonalPath - 1]; + var removePath = bestPath[diagonalPath + 1]; + var oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + bestPath[diagonalPath - 1] = undefined; + } + var canAdd = addPath && addPath.newPos + 1 < newLen; + var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + bestPath[diagonalPath] = undefined; + continue; + } + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + pushComponent(basePath.components, false, true); + } + else { + basePath = addPath; + basePath.newPos++; + pushComponent(basePath.components, true, false); + } + oldPos = extractCommon(basePath, newArr, oldArr, diagonalPath, equals); + if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + return buildValues(basePath.components); + } + else { + bestPath[diagonalPath] = basePath; + } + } + editLength++; + } + while (editLength <= maxEditLength) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } + } + function extractCommon(basePath, newArr, oldArr, diagonalPath, equals) { + var newLen = newArr.length; + var oldLen = oldArr.length; + var newPos = basePath.newPos; + var oldPos = newPos - diagonalPath; + var commonCount = 0; + while (newPos + 1 < newLen && oldPos + 1 < oldLen && equals(newArr[newPos + 1], oldArr[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + if (commonCount) { + basePath.components.push({ + count: commonCount, + added: false, + removed: false, + indices: [] + }); + } + basePath.newPos = newPos; + return oldPos; + } + function pushComponent(components, added, removed) { + var last = components[components.length - 1]; + if (last && last.added === added && last.removed === removed) { + components[components.length - 1] = { + count: last.count + 1, + added: added, + removed: removed, + indices: [] + }; + } + else { + components.push({ + count: 1, + added: added, + removed: removed, + indices: [] + }); + } + } + function buildValues(components) { + var componentPos = 0; + var componentLen = components.length; + var newPos = 0; + var oldPos = 0; + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + var indices = []; + for (var i = newPos; i < newPos + component.count; i++) { + indices.push(i); + } + component.indices = indices; + newPos += component.count; + if (!component.added) { + oldPos += component.count; + } + } + else { + for (var i = oldPos; i < oldPos + component.count; i++) { + component.indices.push(i); + } + oldPos += component.count; + } + } + return components; + } + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function arrayDiff(oldArr, newArr, equal) { + return diff(oldArr, newArr, equal); + } + + var NONE = 'none'; + var mathRound = Math.round; + var mathSin$4 = Math.sin; + var mathCos$4 = Math.cos; + var PI$4 = Math.PI; + var PI2$7 = Math.PI * 2; + var degree = 180 / PI$4; + var EPSILON$4 = 1e-4; + function round3(val) { + return mathRound(val * 1e3) / 1e3; + } + function round4(val) { + return mathRound(val * 1e4) / 1e4; + } + function isAroundZero$1(val) { + return val < EPSILON$4 && val > -EPSILON$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; + } + function setTransform(svgEl, m) { + if (m) { + attr(svgEl, 'transform', 'matrix(' + + round3(m[0]) + ',' + + round3(m[1]) + ',' + + round3(m[2]) + ',' + + round3(m[3]) + ',' + + round4(m[4]) + ',' + + round4(m[5]) + + ')'); + } + } + function attr(el, key, val) { + if (!val || val.type !== 'linear' && val.type !== 'radial') { + el.setAttribute(key, val); + } + } + function attrXLink(el, key, val) { + el.setAttributeNS('http://www.w3.org/1999/xlink', key, val); + } + function attrXML(el, key, val) { + el.setAttributeNS('http://www.w3.org/XML/1998/namespace', key, val); + } + function bindStyle(svgEl, style, el) { + var opacity = style.opacity == null ? 1 : style.opacity; + if (el instanceof ZRImage) { + svgEl.style.opacity = opacity + ''; + return; + } + if (pathHasFill(style)) { + var fill = style.fill; + fill = fill === 'transparent' ? NONE : fill; + attr(svgEl, 'fill', fill); + attr(svgEl, 'fill-opacity', (style.fillOpacity != null ? style.fillOpacity * opacity : opacity) + ''); + } + else { + attr(svgEl, 'fill', NONE); + } + if (pathHasStroke(style)) { + var stroke = style.stroke; + stroke = stroke === 'transparent' ? NONE : stroke; + attr(svgEl, 'stroke', stroke); + var strokeWidth = style.lineWidth; + var strokeScale_1 = style.strokeNoScale + ? el.getLineScale() + : 1; + attr(svgEl, 'stroke-width', (strokeScale_1 ? strokeWidth / strokeScale_1 : 0) + ''); + attr(svgEl, 'paint-order', style.strokeFirst ? 'stroke' : 'fill'); + attr(svgEl, 'stroke-opacity', (style.strokeOpacity != null ? style.strokeOpacity * opacity : opacity) + ''); + var lineDash = style.lineDash && strokeWidth > 0 && normalizeLineDash(style.lineDash, strokeWidth); + if (lineDash) { + var lineDashOffset = style.lineDashOffset; + if (strokeScale_1 && strokeScale_1 !== 1) { + lineDash = map(lineDash, function (rawVal) { + return rawVal / strokeScale_1; + }); + if (lineDashOffset) { + lineDashOffset /= strokeScale_1; + lineDashOffset = mathRound(lineDashOffset); + } + } + attr(svgEl, 'stroke-dasharray', lineDash.join(',')); + attr(svgEl, 'stroke-dashoffset', (lineDashOffset || 0) + ''); + } + else { + attr(svgEl, 'stroke-dasharray', ''); + } + style.lineCap && attr(svgEl, 'stroke-linecap', style.lineCap); + style.lineJoin && attr(svgEl, 'stroke-linejoin', style.lineJoin); + style.miterLimit && attr(svgEl, 'stroke-miterlimit', style.miterLimit + ''); + } + else { + attr(svgEl, 'stroke', NONE); + } + } + var SVGPathRebuilder = (function () { + function SVGPathRebuilder() { + } + SVGPathRebuilder.prototype.reset = function () { + this._d = []; + this._str = ''; + }; + SVGPathRebuilder.prototype.moveTo = function (x, y) { + this._add('M', x, y); + }; + SVGPathRebuilder.prototype.lineTo = function (x, y) { + this._add('L', x, y); + }; + SVGPathRebuilder.prototype.bezierCurveTo = function (x, y, x2, y2, x3, y3) { + this._add('C', x, y, x2, y2, x3, y3); + }; + SVGPathRebuilder.prototype.quadraticCurveTo = function (x, y, x2, y2) { + this._add('Q', x, y, x2, y2); + }; + SVGPathRebuilder.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this.ellipse(cx, cy, r, r, 0, startAngle, endAngle, anticlockwise); + }; + SVGPathRebuilder.prototype.ellipse = function (cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise) { + var firstCmd = this._d.length === 0; + var dTheta = endAngle - startAngle; + var clockwise = !anticlockwise; + var dThetaPositive = Math.abs(dTheta); + var isCircle = isAroundZero$1(dThetaPositive - PI2$7) + || (clockwise ? dTheta >= PI2$7 : -dTheta >= PI2$7); + var unifiedTheta = dTheta > 0 ? dTheta % PI2$7 : (dTheta % PI2$7 + PI2$7); + var large = false; + if (isCircle) { + large = true; + } + else if (isAroundZero$1(dThetaPositive)) { + large = false; + } + else { + large = (unifiedTheta >= PI$4) === !!clockwise; + } + var x0 = round4(cx + rx * mathCos$4(startAngle)); + var y0 = round4(cy + ry * mathSin$4(startAngle)); + if (isCircle) { + if (clockwise) { + dTheta = PI2$7 - 1e-4; + } + else { + dTheta = -PI2$7 + 1e-4; + } + large = true; + if (firstCmd) { + this._d.push('M', x0, y0); + } + } + var x = round4(cx + rx * mathCos$4(startAngle + dTheta)); + var y = round4(cy + ry * mathSin$4(startAngle + dTheta)); + if (isNaN(x0) || isNaN(y0) || isNaN(rx) || isNaN(ry) || isNaN(psi) || isNaN(degree) || isNaN(x) || isNaN(y)) { + return ''; + } + this._d.push('A', round4(rx), round4(ry), mathRound(psi * degree), +large, +clockwise, x, y); + }; + SVGPathRebuilder.prototype.rect = function (x, y, w, h) { + this._add('M', x, y); + this._add('L', x + w, y); + this._add('L', x + w, y + h); + this._add('L', x, y + h); + this._add('L', x, y); + }; + SVGPathRebuilder.prototype.closePath = function () { + if (this._d.length > 0) { + this._add('Z'); + } + }; + SVGPathRebuilder.prototype._add = function (cmd, a, b, c, d, e, f, g, h) { + this._d.push(cmd); + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isNaN(val)) { + this._invalid = true; + return; + } + this._d.push(round4(val)); + } + }; + SVGPathRebuilder.prototype.generateStr = function () { + this._str = this._invalid ? '' : this._d.join(' '); + this._d = []; + }; + SVGPathRebuilder.prototype.getStr = function () { + return this._str; + }; + return SVGPathRebuilder; + }()); + var svgPath = { + brush: function (el) { + var style = el.style; + var svgEl = el.__svgEl; + if (!svgEl) { + svgEl = createElement('path'); + el.__svgEl = svgEl; + } + if (!el.path) { + el.createPathProxy(); + } + var path = el.path; + if (el.shapeChanged()) { + path.beginPath(); + el.buildPath(path, el.shape); + el.pathUpdated(); + } + var pathVersion = path.getVersion(); + var elExt = el; + var svgPathBuilder = elExt.__svgPathBuilder; + if (elExt.__svgPathVersion !== pathVersion || !svgPathBuilder || el.style.strokePercent < 1) { + if (!svgPathBuilder) { + svgPathBuilder = elExt.__svgPathBuilder = new SVGPathRebuilder(); + } + svgPathBuilder.reset(); + path.rebuildPath(svgPathBuilder, el.style.strokePercent); + svgPathBuilder.generateStr(); + elExt.__svgPathVersion = pathVersion; + } + attr(svgEl, 'd', svgPathBuilder.getStr()); + bindStyle(svgEl, style, el); + setTransform(svgEl, el.transform); + } + }; + var svgImage = { + brush: function (el) { + var style = el.style; + var image = style.image; + if (image instanceof HTMLImageElement) { + image = image.src; + } + else if (image instanceof HTMLCanvasElement) { + image = image.toDataURL(); + } + if (!image) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var dw = style.width; + var dh = style.height; + var svgEl = el.__svgEl; + if (!svgEl) { + svgEl = createElement('image'); + el.__svgEl = svgEl; + } + if (image !== el.__imageSrc) { + attrXLink(svgEl, 'href', image); + el.__imageSrc = image; + } + attr(svgEl, 'width', dw + ''); + attr(svgEl, 'height', dh + ''); + attr(svgEl, 'x', x + ''); + attr(svgEl, 'y', y + ''); + bindStyle(svgEl, style, el); + setTransform(svgEl, el.transform); + } + }; + var TEXT_ALIGN_TO_ANCHOR = { + left: 'start', + right: 'end', + center: 'middle', + middle: 'middle' + }; + function adjustTextY$1(y, lineHeight, textBaseline) { + if (textBaseline === 'top') { + y += lineHeight / 2; + } + else if (textBaseline === 'bottom') { + y -= lineHeight / 2; + } + return y; + } + var svgText = { + brush: function (el) { + var style = el.style; + var text = style.text; + text != null && (text += ''); + if (!text || isNaN(style.x) || isNaN(style.y)) { + return; + } + var textSvgEl = el.__svgEl; + if (!textSvgEl) { + textSvgEl = createElement('text'); + attrXML(textSvgEl, 'xml:space', 'preserve'); + el.__svgEl = textSvgEl; + } + var font = style.font || DEFAULT_FONT; + var textSvgElStyle = textSvgEl.style; + textSvgElStyle.font = font; + textSvgEl.textContent = text; + bindStyle(textSvgEl, style, el); + setTransform(textSvgEl, el.transform); + var x = style.x || 0; + var y = adjustTextY$1(style.y || 0, getLineHeight(font), style.textBaseline); + var textAlign = TEXT_ALIGN_TO_ANCHOR[style.textAlign] + || style.textAlign; + attr(textSvgEl, 'dominant-baseline', 'central'); + attr(textSvgEl, 'text-anchor', textAlign); + attr(textSvgEl, 'x', x + ''); + attr(textSvgEl, 'y', y + ''); + } + }; + + var MARK_UNUSED = '0'; + var MARK_USED = '1'; + var Definable = (function () { + function Definable(zrId, svgRoot, tagNames, markLabel, domName) { + this.nextId = 0; + this._domName = '_dom'; + this.createElement = createElement; + this._zrId = zrId; + this._svgRoot = svgRoot; + this._tagNames = typeof tagNames === 'string' ? [tagNames] : tagNames; + this._markLabel = markLabel; + if (domName) { + this._domName = domName; + } + } + Definable.prototype.getDefs = function (isForceCreating) { + var svgRoot = this._svgRoot; + var defs = this._svgRoot.getElementsByTagName('defs'); + if (defs.length === 0) { + if (isForceCreating) { + var defs_1 = svgRoot.insertBefore(this.createElement('defs'), svgRoot.firstChild); + if (!defs_1.contains) { + defs_1.contains = function (el) { + var children = defs_1.children; + if (!children) { + return false; + } + for (var i = children.length - 1; i >= 0; --i) { + if (children[i] === el) { + return true; + } + } + return false; + }; + } + return defs_1; + } + else { + return null; + } + } + else { + return defs[0]; + } + }; + Definable.prototype.doUpdate = function (target, onUpdate) { + if (!target) { + return; + } + var defs = this.getDefs(false); + if (target[this._domName] && defs.contains(target[this._domName])) { + if (typeof onUpdate === 'function') { + onUpdate(target); + } + } + else { + var dom = this.add(target); + if (dom) { + target[this._domName] = dom; + } + } + }; + Definable.prototype.add = function (target) { + return null; + }; + Definable.prototype.addDom = function (dom) { + var defs = this.getDefs(true); + if (dom.parentNode !== defs) { + defs.appendChild(dom); + } + }; + Definable.prototype.removeDom = function (target) { + var defs = this.getDefs(false); + if (defs && target[this._domName]) { + defs.removeChild(target[this._domName]); + target[this._domName] = null; + } + }; + Definable.prototype.getDoms = function () { + var defs = this.getDefs(false); + if (!defs) { + return []; + } + var doms = []; + each(this._tagNames, function (tagName) { + var tags = defs.getElementsByTagName(tagName); + for (var i = 0; i < tags.length; i++) { + doms.push(tags[i]); + } + }); + return doms; + }; + Definable.prototype.markAllUnused = function () { + var doms = this.getDoms(); + var that = this; + each(doms, function (dom) { + dom[that._markLabel] = MARK_UNUSED; + }); + }; + Definable.prototype.markDomUsed = function (dom) { + dom && (dom[this._markLabel] = MARK_USED); + }; + Definable.prototype.markDomUnused = function (dom) { + dom && (dom[this._markLabel] = MARK_UNUSED); + }; + Definable.prototype.isDomUnused = function (dom) { + return dom && dom[this._markLabel] !== MARK_USED; + }; + Definable.prototype.removeUnused = function () { + var _this = this; + var defs = this.getDefs(false); + if (!defs) { + return; + } + var doms = this.getDoms(); + each(doms, function (dom) { + if (_this.isDomUnused(dom)) { + defs.removeChild(dom); + } + }); + }; + Definable.prototype.getSvgProxy = function (displayable) { + if (displayable instanceof Path) { + return svgPath; + } + else if (displayable instanceof ZRImage) { + return svgImage; + } + else if (displayable instanceof TSpan) { + return svgText; + } + else { + return svgPath; + } + }; + Definable.prototype.getSvgElement = function (displayable) { + return displayable.__svgEl; + }; + return Definable; + }()); + + function isLinearGradient(value) { + return value.type === 'linear'; + } + function isRadialGradient(value) { + return value.type === 'radial'; + } + function isGradient(value) { + return value && (value.type === 'linear' + || value.type === 'radial'); + } + var GradientManager = (function (_super) { + __extends(GradientManager, _super); + function GradientManager(zrId, svgRoot) { + return _super.call(this, zrId, svgRoot, ['linearGradient', 'radialGradient'], '__gradient_in_use__') || this; + } + GradientManager.prototype.addWithoutUpdate = function (svgElement, displayable) { + if (displayable && displayable.style) { + var that_1 = this; + each(['fill', 'stroke'], function (fillOrStroke) { + var value = displayable.style[fillOrStroke]; + if (isGradient(value)) { + var gradient = value; + var defs = that_1.getDefs(true); + var dom = void 0; + if (gradient.__dom) { + dom = gradient.__dom; + if (!defs.contains(gradient.__dom)) { + that_1.addDom(dom); + } + } + else { + dom = that_1.add(gradient); + } + that_1.markUsed(displayable); + var id = dom.getAttribute('id'); + svgElement.setAttribute(fillOrStroke, 'url(#' + id + ')'); + } + }); + } + }; + GradientManager.prototype.add = function (gradient) { + var dom; + if (isLinearGradient(gradient)) { + dom = this.createElement('linearGradient'); + } + else if (isRadialGradient(gradient)) { + dom = this.createElement('radialGradient'); + } + else { + logError('Illegal gradient type.'); + return null; + } + gradient.id = gradient.id || this.nextId++; + dom.setAttribute('id', 'zr' + this._zrId + + '-gradient-' + gradient.id); + this.updateDom(gradient, dom); + this.addDom(dom); + return dom; + }; + GradientManager.prototype.update = function (gradient) { + if (!isGradient(gradient)) { + return; + } + var that = this; + this.doUpdate(gradient, function () { + var dom = gradient.__dom; + if (!dom) { + return; + } + var tagName = dom.tagName; + var type = gradient.type; + if (type === 'linear' && tagName === 'linearGradient' + || type === 'radial' && tagName === 'radialGradient') { + that.updateDom(gradient, gradient.__dom); + } + else { + that.removeDom(gradient); + that.add(gradient); + } + }); + }; + GradientManager.prototype.updateDom = function (gradient, dom) { + if (isLinearGradient(gradient)) { + dom.setAttribute('x1', gradient.x + ''); + dom.setAttribute('y1', gradient.y + ''); + dom.setAttribute('x2', gradient.x2 + ''); + dom.setAttribute('y2', gradient.y2 + ''); + } + else if (isRadialGradient(gradient)) { + dom.setAttribute('cx', gradient.x + ''); + dom.setAttribute('cy', gradient.y + ''); + dom.setAttribute('r', gradient.r + ''); + } + else { + logError('Illegal gradient type.'); + return; + } + if (gradient.global) { + dom.setAttribute('gradientUnits', 'userSpaceOnUse'); + } + else { + dom.setAttribute('gradientUnits', 'objectBoundingBox'); + } + dom.innerHTML = ''; + var colors = gradient.colorStops; + for (var i = 0, len = colors.length; i < len; ++i) { + var stop_1 = this.createElement('stop'); + stop_1.setAttribute('offset', colors[i].offset * 100 + '%'); + var color$1 = colors[i].color; + if (color$1.indexOf('rgba') > -1) { + var opacity = parse(color$1)[3]; + var hex = toHex(color$1); + stop_1.setAttribute('stop-color', '#' + hex); + stop_1.setAttribute('stop-opacity', opacity + ''); + } + else { + stop_1.setAttribute('stop-color', colors[i].color); + } + dom.appendChild(stop_1); + } + gradient.__dom = dom; + }; + GradientManager.prototype.markUsed = function (displayable) { + if (displayable.style) { + var gradient = displayable.style.fill; + if (gradient && gradient.__dom) { + _super.prototype.markDomUsed.call(this, gradient.__dom); + } + gradient = displayable.style.stroke; + if (gradient && gradient.__dom) { + _super.prototype.markDomUsed.call(this, gradient.__dom); + } + } + }; + return GradientManager; + }(Definable)); + + function isPattern(value) { + return value && (!!value.image || !!value.svgElement); + } + var patternDomMap = new WeakMap(); + var PatternManager = (function (_super) { + __extends(PatternManager, _super); + function PatternManager(zrId, svgRoot) { + return _super.call(this, zrId, svgRoot, ['pattern'], '__pattern_in_use__') || this; + } + PatternManager.prototype.addWithoutUpdate = function (svgElement, displayable) { + if (displayable && displayable.style) { + var that_1 = this; + each(['fill', 'stroke'], function (fillOrStroke) { + var pattern = displayable.style[fillOrStroke]; + if (isPattern(pattern)) { + var defs = that_1.getDefs(true); + var dom = patternDomMap.get(pattern); + if (dom) { + if (!defs.contains(dom)) { + that_1.addDom(dom); + } + } + else { + dom = that_1.add(pattern); + } + that_1.markUsed(displayable); + var id = dom.getAttribute('id'); + svgElement.setAttribute(fillOrStroke, 'url(#' + id + ')'); + } + }); + } + }; + PatternManager.prototype.add = function (pattern) { + if (!isPattern(pattern)) { + return; + } + var dom = this.createElement('pattern'); + pattern.id = pattern.id == null ? this.nextId++ : pattern.id; + dom.setAttribute('id', 'zr' + this._zrId + + '-pattern-' + pattern.id); + dom.setAttribute('x', '0'); + dom.setAttribute('y', '0'); + dom.setAttribute('patternUnits', 'userSpaceOnUse'); + this.updateDom(pattern, dom); + this.addDom(dom); + return dom; + }; + PatternManager.prototype.update = function (pattern) { + if (!isPattern(pattern)) { + return; + } + var that = this; + this.doUpdate(pattern, function () { + var dom = patternDomMap.get(pattern); + that.updateDom(pattern, dom); + }); + }; + PatternManager.prototype.updateDom = function (pattern, patternDom) { + var svgElement = pattern.svgElement; + if (svgElement instanceof SVGElement) { + if (svgElement.parentNode !== patternDom) { + patternDom.innerHTML = ''; + patternDom.appendChild(svgElement); + patternDom.setAttribute('width', pattern.svgWidth + ''); + patternDom.setAttribute('height', pattern.svgHeight + ''); + } + } + else { + var img = void 0; + var prevImage = patternDom.getElementsByTagName('image'); + if (prevImage.length) { + if (pattern.image) { + img = prevImage[0]; + } + else { + patternDom.removeChild(prevImage[0]); + return; + } + } + else if (pattern.image) { + img = this.createElement('image'); + } + if (img) { + var imageSrc = void 0; + if (typeof pattern.image === 'string') { + imageSrc = pattern.image; + } + else if (pattern.image instanceof HTMLImageElement) { + imageSrc = pattern.image.src; + } + else if (pattern.image instanceof HTMLCanvasElement) { + imageSrc = pattern.image.toDataURL(); + } + if (imageSrc) { + img.setAttribute('href', imageSrc); + img.setAttribute('x', '0'); + img.setAttribute('y', '0'); + var hostEl = { + dirty: function () { } + }; + var createdImage = createOrUpdateImage(imageSrc, img, hostEl, function (img) { + patternDom.setAttribute('width', img.width + ''); + patternDom.setAttribute('height', img.height + ''); + }); + if (createdImage && createdImage.width && createdImage.height) { + patternDom.setAttribute('width', createdImage.width + ''); + patternDom.setAttribute('height', createdImage.height + ''); + } + patternDom.appendChild(img); + } + } + } + var x = pattern.x || 0; + var y = pattern.y || 0; + var rotation = (pattern.rotation || 0) / Math.PI * 180; + var scaleX = pattern.scaleX || 1; + var scaleY = pattern.scaleY || 1; + var transform = "translate(" + x + ", " + y + ") rotate(" + rotation + ") scale(" + scaleX + ", " + scaleY + ")"; + patternDom.setAttribute('patternTransform', transform); + patternDomMap.set(pattern, patternDom); + }; + PatternManager.prototype.markUsed = function (displayable) { + if (displayable.style) { + if (isPattern(displayable.style.fill)) { + _super.prototype.markDomUsed.call(this, patternDomMap.get(displayable.style.fill)); + } + if (isPattern(displayable.style.stroke)) { + _super.prototype.markDomUsed.call(this, patternDomMap.get(displayable.style.stroke)); + } + } + }; + return PatternManager; + }(Definable)); + + function generateClipPathsKey(clipPaths) { + var key = []; + if (clipPaths) { + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + key.push(clipPath.id); + } + } + return key.join(','); + } + function hasClipPath(displayable) { + var clipPaths = displayable.__clipPaths; + return clipPaths && clipPaths.length > 0; + } + var ClippathManager = (function (_super) { + __extends(ClippathManager, _super); + function ClippathManager(zrId, svgRoot) { + var _this = _super.call(this, zrId, svgRoot, 'clipPath', '__clippath_in_use__') || this; + _this._refGroups = {}; + _this._keyDuplicateCount = {}; + return _this; + } + ClippathManager.prototype.markAllUnused = function () { + _super.prototype.markAllUnused.call(this); + for (var key in this._refGroups) { + this.markDomUnused(this._refGroups[key]); + } + this._keyDuplicateCount = {}; + }; + ClippathManager.prototype._getClipPathGroup = function (displayable, prevDisplayable) { + if (!hasClipPath(displayable)) { + return; + } + var clipPaths = displayable.__clipPaths; + var keyDuplicateCount = this._keyDuplicateCount; + var clipPathKey = generateClipPathsKey(clipPaths); + if (isClipPathChanged(clipPaths, prevDisplayable && prevDisplayable.__clipPaths)) { + keyDuplicateCount[clipPathKey] = keyDuplicateCount[clipPathKey] || 0; + keyDuplicateCount[clipPathKey] && (clipPathKey += '-' + keyDuplicateCount[clipPathKey]); + keyDuplicateCount[clipPathKey]++; + } + return this._refGroups[clipPathKey] + || (this._refGroups[clipPathKey] = this.createElement('g')); + }; + ClippathManager.prototype.update = function (displayable, prevDisplayable) { + var clipGroup = this._getClipPathGroup(displayable, prevDisplayable); + if (clipGroup) { + this.markDomUsed(clipGroup); + this.updateDom(clipGroup, displayable.__clipPaths); + } + return clipGroup; + }; + ClippathManager.prototype.updateDom = function (parentEl, clipPaths) { + if (clipPaths && clipPaths.length > 0) { + var defs = this.getDefs(true); + var clipPath = clipPaths[0]; + var clipPathEl = void 0; + var id = void 0; + if (clipPath._dom) { + id = clipPath._dom.getAttribute('id'); + clipPathEl = clipPath._dom; + if (!defs.contains(clipPathEl)) { + defs.appendChild(clipPathEl); + } + } + else { + id = 'zr' + this._zrId + '-clip-' + this.nextId; + ++this.nextId; + clipPathEl = this.createElement('clipPath'); + clipPathEl.setAttribute('id', id); + defs.appendChild(clipPathEl); + clipPath._dom = clipPathEl; + } + var svgProxy = this.getSvgProxy(clipPath); + svgProxy.brush(clipPath); + var pathEl = this.getSvgElement(clipPath); + clipPathEl.innerHTML = ''; + clipPathEl.appendChild(pathEl); + parentEl.setAttribute('clip-path', 'url(#' + id + ')'); + if (clipPaths.length > 1) { + this.updateDom(clipPathEl, clipPaths.slice(1)); + } + } + else { + if (parentEl) { + parentEl.setAttribute('clip-path', 'none'); + } + } + }; + ClippathManager.prototype.markUsed = function (displayable) { + var _this = this; + if (displayable.__clipPaths) { + each(displayable.__clipPaths, function (clipPath) { + if (clipPath._dom) { + _super.prototype.markDomUsed.call(_this, clipPath._dom); + } + }); + } + }; + ClippathManager.prototype.removeUnused = function () { + _super.prototype.removeUnused.call(this); + var newRefGroupsMap = {}; + for (var key in this._refGroups) { + var group = this._refGroups[key]; + if (!this.isDomUnused(group)) { + newRefGroupsMap[key] = group; + } + else if (group.parentNode) { + group.parentNode.removeChild(group); + } + } + this._refGroups = newRefGroupsMap; + }; + return ClippathManager; + }(Definable)); + + var ShadowManager = (function (_super) { + __extends(ShadowManager, _super); + function ShadowManager(zrId, svgRoot) { + var _this = _super.call(this, zrId, svgRoot, ['filter'], '__filter_in_use__', '_shadowDom') || this; + _this._shadowDomMap = {}; + _this._shadowDomPool = []; + return _this; + } + ShadowManager.prototype._getFromPool = function () { + var shadowDom = this._shadowDomPool.pop(); + if (!shadowDom) { + shadowDom = this.createElement('filter'); + shadowDom.setAttribute('id', 'zr' + this._zrId + '-shadow-' + this.nextId++); + var domChild = this.createElement('feDropShadow'); + shadowDom.appendChild(domChild); + this.addDom(shadowDom); + } + return shadowDom; + }; + ShadowManager.prototype.update = function (svgElement, displayable) { + var style = displayable.style; + if (hasShadow(style)) { + var shadowKey = getShadowKey(displayable); + var shadowDom = displayable._shadowDom = this._shadowDomMap[shadowKey]; + if (!shadowDom) { + shadowDom = this._getFromPool(); + this._shadowDomMap[shadowKey] = shadowDom; + } + this.updateDom(svgElement, displayable, shadowDom); + } + else { + this.remove(svgElement, displayable); + } + }; + ShadowManager.prototype.remove = function (svgElement, displayable) { + if (displayable._shadowDom != null) { + displayable._shadowDom = null; + svgElement.style.filter = ''; + } + }; + ShadowManager.prototype.updateDom = function (svgElement, displayable, shadowDom) { + var domChild = shadowDom.children[0]; + var style = displayable.style; + var globalScale = displayable.getGlobalScale(); + var scaleX = globalScale[0]; + var scaleY = globalScale[1]; + if (!scaleX || !scaleY) { + return; + } + var offsetX = style.shadowOffsetX || 0; + var offsetY = style.shadowOffsetY || 0; + var blur = style.shadowBlur; + var color = style.shadowColor; + domChild.setAttribute('dx', offsetX / scaleX + ''); + domChild.setAttribute('dy', offsetY / scaleY + ''); + domChild.setAttribute('flood-color', color); + var stdDx = blur / 2 / scaleX; + var stdDy = blur / 2 / scaleY; + var stdDeviation = stdDx + ' ' + stdDy; + domChild.setAttribute('stdDeviation', stdDeviation); + shadowDom.setAttribute('x', '-100%'); + shadowDom.setAttribute('y', '-100%'); + shadowDom.setAttribute('width', '300%'); + shadowDom.setAttribute('height', '300%'); + displayable._shadowDom = shadowDom; + var id = shadowDom.getAttribute('id'); + svgElement.style.filter = 'url(#' + id + ')'; + }; + ShadowManager.prototype.removeUnused = function () { + var defs = this.getDefs(false); + if (!defs) { + return; + } + var shadowDomsPool = this._shadowDomPool; + for (var key in this._shadowDomMap) { + var dom = this._shadowDomMap[key]; + shadowDomsPool.push(dom); + } + this._shadowDomMap = {}; + }; + return ShadowManager; + }(Definable)); + function hasShadow(style) { + return style + && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY); + } + function getShadowKey(displayable) { + var style = displayable.style; + var globalScale = displayable.getGlobalScale(); + return [ + style.shadowColor, + (style.shadowBlur || 0).toFixed(2), + (style.shadowOffsetX || 0).toFixed(2), + (style.shadowOffsetY || 0).toFixed(2), + globalScale[0], + globalScale[1] + ].join(','); + } + + function parseInt10(val) { + return parseInt(val, 10); + } + function getSvgProxy(el) { + if (el instanceof Path) { + return svgPath; + } + else if (el instanceof ZRImage) { + return svgImage; + } + else if (el instanceof TSpan) { + return svgText; + } + else { + return svgPath; + } + } + function checkParentAvailable(parent, child) { + return child && parent && child.parentNode !== parent; + } + function insertAfter(parent, child, prevSibling) { + if (checkParentAvailable(parent, child) && prevSibling) { + var nextSibling = prevSibling.nextSibling; + nextSibling ? parent.insertBefore(child, nextSibling) + : parent.appendChild(child); + } + } + function prepend(parent, child) { + if (checkParentAvailable(parent, child)) { + var firstChild = parent.firstChild; + firstChild ? parent.insertBefore(child, firstChild) + : parent.appendChild(child); + } + } + function remove(parent, child) { + if (child && parent && child.parentNode === parent) { + parent.removeChild(child); + } + } + function removeFromMyParent(child) { + if (child && child.parentNode) { + child.parentNode.removeChild(child); + } + } + function getSvgElement(displayable) { + return displayable.__svgEl; + } + var SVGPainter = (function () { + function SVGPainter(root, storage, opts, zrId) { + this.type = 'svg'; + this.refreshHover = createMethodNotSupport('refreshHover'); + this.pathToImage = createMethodNotSupport('pathToImage'); + this.configLayer = createMethodNotSupport('configLayer'); + this.root = root; + this.storage = storage; + this._opts = opts = extend({}, opts || {}); + var svgDom = createElement('svg'); + svgDom.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', 'http://www.w3.org/2000/svg'); + svgDom.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', 'http://www.w3.org/1999/xlink'); + svgDom.setAttribute('version', '1.1'); + svgDom.setAttribute('baseProfile', 'full'); + svgDom.style.cssText = 'user-select:none;position:absolute;left:0;top:0;'; + var bgRoot = createElement('g'); + svgDom.appendChild(bgRoot); + var svgRoot = createElement('g'); + svgDom.appendChild(svgRoot); + this._gradientManager = new GradientManager(zrId, svgRoot); + this._patternManager = new PatternManager(zrId, svgRoot); + this._clipPathManager = new ClippathManager(zrId, svgRoot); + this._shadowManager = new ShadowManager(zrId, svgRoot); + var viewport = document.createElement('div'); + viewport.style.cssText = 'overflow:hidden;position:relative'; + this._svgDom = svgDom; + this._svgRoot = svgRoot; + this._backgroundRoot = bgRoot; + this._viewport = viewport; + root.appendChild(viewport); + viewport.appendChild(svgDom); + this.resize(opts.width, opts.height); + this._visibleList = []; + } + SVGPainter.prototype.getType = function () { + return 'svg'; + }; + SVGPainter.prototype.getViewportRoot = function () { + return this._viewport; + }; + SVGPainter.prototype.getSvgDom = function () { + return this._svgDom; + }; + SVGPainter.prototype.getSvgRoot = function () { + return this._svgRoot; + }; + SVGPainter.prototype.getViewportRootOffset = function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + SVGPainter.prototype.refresh = function () { + var list = this.storage.getDisplayList(true); + this._paintList(list); + }; + SVGPainter.prototype.setBackgroundColor = function (backgroundColor) { + if (this._backgroundRoot && this._backgroundNode) { + this._backgroundRoot.removeChild(this._backgroundNode); + } + var bgNode = createElement('rect'); + bgNode.setAttribute('width', this.getWidth()); + bgNode.setAttribute('height', this.getHeight()); + bgNode.setAttribute('x', 0); + bgNode.setAttribute('y', 0); + bgNode.setAttribute('id', 0); + bgNode.style.fill = backgroundColor; + this._backgroundRoot.appendChild(bgNode); + this._backgroundNode = bgNode; + }; + SVGPainter.prototype.createSVGElement = function (tag) { + return createElement(tag); + }; + SVGPainter.prototype.paintOne = function (el) { + var svgProxy = getSvgProxy(el); + svgProxy && svgProxy.brush(el); + return getSvgElement(el); + }; + SVGPainter.prototype._paintList = function (list) { + var gradientManager = this._gradientManager; + var patternManager = this._patternManager; + var clipPathManager = this._clipPathManager; + var shadowManager = this._shadowManager; + gradientManager.markAllUnused(); + patternManager.markAllUnused(); + clipPathManager.markAllUnused(); + shadowManager.markAllUnused(); + var svgRoot = this._svgRoot; + var visibleList = this._visibleList; + var listLen = list.length; + var newVisibleList = []; + for (var i = 0; i < listLen; i++) { + var displayable = list[i]; + var svgProxy = getSvgProxy(displayable); + var svgElement = getSvgElement(displayable); + if (!displayable.invisible) { + if (displayable.__dirty || !svgElement) { + svgProxy && svgProxy.brush(displayable); + svgElement = getSvgElement(displayable); + if (svgElement && displayable.style) { + gradientManager.update(displayable.style.fill); + gradientManager.update(displayable.style.stroke); + patternManager.update(displayable.style.fill); + patternManager.update(displayable.style.stroke); + shadowManager.update(svgElement, displayable); + } + displayable.__dirty = 0; + } + if (svgElement) { + newVisibleList.push(displayable); + } + } + } + var diff = arrayDiff(visibleList, newVisibleList); + var prevSvgElement; + var topPrevSvgElement; + for (var i = 0; i < diff.length; i++) { + var item = diff[i]; + if (item.removed) { + for (var k = 0; k < item.count; k++) { + var displayable = visibleList[item.indices[k]]; + var svgElement = getSvgElement(displayable); + hasClipPath(displayable) ? removeFromMyParent(svgElement) + : remove(svgRoot, svgElement); + } + } + } + var prevDisplayable; + var currentClipGroup; + for (var i = 0; i < diff.length; i++) { + var item = diff[i]; + if (item.removed) { + continue; + } + for (var k = 0; k < item.count; k++) { + var displayable = newVisibleList[item.indices[k]]; + var clipGroup = clipPathManager.update(displayable, prevDisplayable); + if (clipGroup !== currentClipGroup) { + prevSvgElement = topPrevSvgElement; + if (clipGroup) { + prevSvgElement ? insertAfter(svgRoot, clipGroup, prevSvgElement) + : prepend(svgRoot, clipGroup); + topPrevSvgElement = clipGroup; + prevSvgElement = null; + } + currentClipGroup = clipGroup; + } + var svgElement = getSvgElement(displayable); + prevSvgElement + ? insertAfter(currentClipGroup || svgRoot, svgElement, prevSvgElement) + : prepend(currentClipGroup || svgRoot, svgElement); + prevSvgElement = svgElement || prevSvgElement; + if (!currentClipGroup) { + topPrevSvgElement = prevSvgElement; + } + gradientManager.markUsed(displayable); + gradientManager.addWithoutUpdate(svgElement, displayable); + patternManager.markUsed(displayable); + patternManager.addWithoutUpdate(svgElement, displayable); + clipPathManager.markUsed(displayable); + prevDisplayable = displayable; + } + } + gradientManager.removeUnused(); + patternManager.removeUnused(); + clipPathManager.removeUnused(); + shadowManager.removeUnused(); + this._visibleList = newVisibleList; + }; + SVGPainter.prototype._getDefs = function (isForceCreating) { + var svgRoot = this._svgDom; + var defs = svgRoot.getElementsByTagName('defs'); + if (defs.length === 0) { + if (isForceCreating) { + var defs_1 = svgRoot.insertBefore(createElement('defs'), svgRoot.firstChild); + if (!defs_1.contains) { + defs_1.contains = function (el) { + var children = defs_1.children; + if (!children) { + return false; + } + for (var i = children.length - 1; i >= 0; --i) { + if (children[i] === el) { + return true; + } + } + return false; + }; + } + return defs_1; + } + else { + return null; + } + } + else { + return defs[0]; + } + }; + SVGPainter.prototype.resize = function (width, height) { + var viewport = this._viewport; + viewport.style.display = 'none'; + var opts = this._opts; + width != null && (opts.width = width); + height != null && (opts.height = height); + width = this._getSize(0); + height = this._getSize(1); + viewport.style.display = ''; + if (this._width !== width || this._height !== height) { + this._width = width; + this._height = height; + var viewportStyle = viewport.style; + viewportStyle.width = width + 'px'; + viewportStyle.height = height + 'px'; + var svgRoot = this._svgDom; + svgRoot.setAttribute('width', width + ''); + svgRoot.setAttribute('height', height + ''); + } + if (this._backgroundNode) { + this._backgroundNode.setAttribute('width', width); + this._backgroundNode.setAttribute('height', height); + } + }; + SVGPainter.prototype.getWidth = function () { + return this._width; + }; + SVGPainter.prototype.getHeight = function () { + return this._height; + }; + SVGPainter.prototype._getSize = function (whIdx) { + var opts = this._opts; + var wh = ['width', 'height'][whIdx]; + var cwh = ['clientWidth', 'clientHeight'][whIdx]; + var plt = ['paddingLeft', 'paddingTop'][whIdx]; + var prb = ['paddingRight', 'paddingBottom'][whIdx]; + if (opts[wh] != null && opts[wh] !== 'auto') { + return parseFloat(opts[wh]); + } + var root = this.root; + var stl = document.defaultView.getComputedStyle(root); + return ((root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh])) + - (parseInt10(stl[plt]) || 0) + - (parseInt10(stl[prb]) || 0)) | 0; + }; + SVGPainter.prototype.dispose = function () { + this.root.innerHTML = ''; + this._svgRoot + = this._backgroundRoot + = this._svgDom + = this._backgroundNode + = this._viewport + = this.storage + = null; + }; + SVGPainter.prototype.clear = function () { + var viewportNode = this._viewport; + if (viewportNode && viewportNode.parentNode) { + viewportNode.parentNode.removeChild(viewportNode); + } + }; + SVGPainter.prototype.toDataURL = function () { + this.refresh(); + var svgDom = this._svgDom; + var outerHTML = svgDom.outerHTML + || (svgDom.parentNode && svgDom.parentNode).innerHTML; + var html = encodeURIComponent(outerHTML.replace(/>\n\r<')); + return 'data:image/svg+xml;charset=UTF-8,' + html; + }; + return SVGPainter; + }()); + function createMethodNotSupport(method) { + return function () { + logError('In SVG mode painter not support method "' + method + '"'); + }; + } + + function install(registers) { + registers.registerPainter('svg', SVGPainter); + } + + function returnFalse() { + return false; + } + function createDom(id, painter, dpr) { + var newDom = createCanvas(); + var width = painter.getWidth(); + var height = painter.getHeight(); + var newDomStyle = newDom.style; + if (newDomStyle) { + newDomStyle.position = 'absolute'; + newDomStyle.left = '0'; + newDomStyle.top = '0'; + newDomStyle.width = width + 'px'; + newDomStyle.height = height + 'px'; + newDom.setAttribute('data-zr-dom-id', id); + } + newDom.width = width * dpr; + newDom.height = height * dpr; + return newDom; + } + var Layer = (function (_super) { + __extends(Layer, _super); + function Layer(id, painter, dpr) { + var _this = _super.call(this) || this; + _this.motionBlur = false; + _this.lastFrameAlpha = 0.7; + _this.dpr = 1; + _this.virtual = false; + _this.config = {}; + _this.incremental = false; + _this.zlevel = 0; + _this.maxRepaintRectCount = 5; + _this.__dirty = true; + _this.__firstTimePaint = true; + _this.__used = false; + _this.__drawIndex = 0; + _this.__startIndex = 0; + _this.__endIndex = 0; + _this.__prevStartIndex = null; + _this.__prevEndIndex = null; + var dom; + dpr = dpr || devicePixelRatio; + if (typeof id === 'string') { + dom = createDom(id, painter, dpr); + } + else if (isObject(id)) { + dom = id; + id = dom.id; + } + _this.id = id; + _this.dom = dom; + var domStyle = dom.style; + if (domStyle) { + dom.onselectstart = returnFalse; + domStyle.webkitUserSelect = 'none'; + domStyle.userSelect = 'none'; + domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)'; + domStyle['-webkit-touch-callout'] = 'none'; + domStyle.padding = '0'; + domStyle.margin = '0'; + domStyle.borderWidth = '0'; + } + _this.domBack = null; + _this.ctxBack = null; + _this.painter = painter; + _this.config = null; + _this.dpr = dpr; + return _this; + } + Layer.prototype.getElementCount = function () { + return this.__endIndex - this.__startIndex; + }; + Layer.prototype.afterBrush = function () { + this.__prevStartIndex = this.__startIndex; + this.__prevEndIndex = this.__endIndex; + }; + Layer.prototype.initContext = function () { + this.ctx = this.dom.getContext('2d'); + this.ctx.dpr = this.dpr; + }; + Layer.prototype.setUnpainted = function () { + this.__firstTimePaint = true; + }; + Layer.prototype.createBackBuffer = function () { + var dpr = this.dpr; + this.domBack = createDom('back-' + this.id, this.painter, dpr); + this.ctxBack = this.domBack.getContext('2d'); + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + }; + Layer.prototype.createRepaintRects = function (displayList, prevList, viewWidth, viewHeight) { + if (this.__firstTimePaint) { + this.__firstTimePaint = false; + return null; + } + var mergedRepaintRects = []; + var maxRepaintRectCount = this.maxRepaintRectCount; + var full = false; + var pendingRect = new BoundingRect(0, 0, 0, 0); + function addRectToMergePool(rect) { + if (!rect.isFinite() || rect.isZero()) { + return; + } + if (mergedRepaintRects.length === 0) { + var boundingRect = new BoundingRect(0, 0, 0, 0); + boundingRect.copy(rect); + mergedRepaintRects.push(boundingRect); + } + else { + var isMerged = false; + var minDeltaArea = Infinity; + var bestRectToMergeIdx = 0; + for (var i = 0; i < mergedRepaintRects.length; ++i) { + var mergedRect = mergedRepaintRects[i]; + if (mergedRect.intersect(rect)) { + var pendingRect_1 = new BoundingRect(0, 0, 0, 0); + pendingRect_1.copy(mergedRect); + pendingRect_1.union(rect); + mergedRepaintRects[i] = pendingRect_1; + isMerged = true; + break; + } + else if (full) { + pendingRect.copy(rect); + pendingRect.union(mergedRect); + var aArea = rect.width * rect.height; + var bArea = mergedRect.width * mergedRect.height; + var pendingArea = pendingRect.width * pendingRect.height; + var deltaArea = pendingArea - aArea - bArea; + if (deltaArea < minDeltaArea) { + minDeltaArea = deltaArea; + bestRectToMergeIdx = i; + } + } + } + if (full) { + mergedRepaintRects[bestRectToMergeIdx].union(rect); + isMerged = true; + } + if (!isMerged) { + var boundingRect = new BoundingRect(0, 0, 0, 0); + boundingRect.copy(rect); + mergedRepaintRects.push(boundingRect); + } + if (!full) { + full = mergedRepaintRects.length >= maxRepaintRectCount; + } + } + } + for (var i = this.__startIndex; i < this.__endIndex; ++i) { + var el = displayList[i]; + if (el) { + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + var prevRect = el.__isRendered && ((el.__dirty & Element.REDARAW_BIT) || !shouldPaint) + ? el.getPrevPaintRect() + : null; + if (prevRect) { + addRectToMergePool(prevRect); + } + var curRect = shouldPaint && ((el.__dirty & Element.REDARAW_BIT) || !el.__isRendered) + ? el.getPaintRect() + : null; + if (curRect) { + addRectToMergePool(curRect); + } + } + } + for (var i = this.__prevStartIndex; i < this.__prevEndIndex; ++i) { + var el = prevList[i]; + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + if (el && (!shouldPaint || !el.__zr) && el.__isRendered) { + var prevRect = el.getPrevPaintRect(); + if (prevRect) { + addRectToMergePool(prevRect); + } + } + } + var hasIntersections; + do { + hasIntersections = false; + for (var i = 0; i < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].isZero()) { + mergedRepaintRects.splice(i, 1); + continue; + } + for (var j = i + 1; j < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].intersect(mergedRepaintRects[j])) { + hasIntersections = true; + mergedRepaintRects[i].union(mergedRepaintRects[j]); + mergedRepaintRects.splice(j, 1); + } + else { + j++; + } + } + i++; + } + } while (hasIntersections); + this._paintRects = mergedRepaintRects; + return mergedRepaintRects; + }; + Layer.prototype.debugGetPaintRects = function () { + return (this._paintRects || []).slice(); + }; + Layer.prototype.resize = function (width, height) { + var dpr = this.dpr; + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + if (domStyle) { + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + } + dom.width = width * dpr; + dom.height = height * dpr; + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }; + Layer.prototype.clear = function (clearAll, clearColor, repaintRects) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + clearColor = clearColor || this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + var dpr = this.dpr; + var self = this; + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr); + } + var domBack = this.domBack; + function doClear(x, y, width, height) { + ctx.clearRect(x, y, width, height); + if (clearColor && clearColor !== 'transparent') { + var clearColorGradientOrPattern = void 0; + if (isGradientObject(clearColor)) { + clearColorGradientOrPattern = clearColor.__canvasGradient + || getCanvasGradient(ctx, clearColor, { + x: 0, + y: 0, + width: width, + height: height + }); + clearColor.__canvasGradient = clearColorGradientOrPattern; + } + else if (isPatternObject(clearColor)) { + clearColorGradientOrPattern = createCanvasPattern(ctx, clearColor, { + dirty: function () { + self.setUnpainted(); + self.__painter.refresh(); + } + }); + } + ctx.save(); + ctx.fillStyle = clearColorGradientOrPattern || clearColor; + ctx.fillRect(x, y, width, height); + ctx.restore(); + } + if (haveMotionBLur) { + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, x, y, width, height); + ctx.restore(); + } + } + if (!repaintRects || haveMotionBLur) { + doClear(0, 0, width, height); + } + else if (repaintRects.length) { + each(repaintRects, function (rect) { + doClear(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + }); + } + }; + return Layer; + }(Eventful)); + + var HOVER_LAYER_ZLEVEL = 1e5; + var CANVAS_ZLEVEL = 314159; + var EL_AFTER_INCREMENTAL_INC = 0.01; + var INCREMENTAL_INC = 0.001; + function parseInt10$1(val) { + return parseInt(val, 10); + } + function isLayerValid(layer) { + if (!layer) { + return false; + } + if (layer.__builtin__) { + return true; + } + if (typeof (layer.resize) !== 'function' + || typeof (layer.refresh) !== 'function') { + return false; + } + return true; + } + function createRoot(width, height) { + var domRoot = document.createElement('div'); + domRoot.style.cssText = [ + 'position:relative', + 'width:' + width + 'px', + 'height:' + height + 'px', + 'padding:0', + 'margin:0', + 'border-width:0' + ].join(';') + ';'; + return domRoot; + } + var CanvasPainter = (function () { + function CanvasPainter(root, storage, opts, id) { + this.type = 'canvas'; + this._zlevelList = []; + this._prevDisplayList = []; + this._layers = {}; + this._layerConfig = {}; + this._needsManuallyCompositing = false; + this.type = 'canvas'; + var singleCanvas = !root.nodeName + || root.nodeName.toUpperCase() === 'CANVAS'; + this._opts = opts = extend({}, opts || {}); + this.dpr = opts.devicePixelRatio || devicePixelRatio; + this._singleCanvas = singleCanvas; + this.root = root; + var rootStyle = root.style; + if (rootStyle) { + rootStyle.webkitTapHighlightColor = 'transparent'; + rootStyle.webkitUserSelect = 'none'; + rootStyle.userSelect = 'none'; + rootStyle['-webkit-touch-callout'] = 'none'; + root.innerHTML = ''; + } + this.storage = storage; + var zlevelList = this._zlevelList; + this._prevDisplayList = []; + var layers = this._layers; + if (!singleCanvas) { + this._width = this._getSize(0); + this._height = this._getSize(1); + var domRoot = this._domRoot = createRoot(this._width, this._height); + root.appendChild(domRoot); + } + else { + var rootCanvas = root; + var width = rootCanvas.width; + var height = rootCanvas.height; + if (opts.width != null) { + width = opts.width; + } + if (opts.height != null) { + height = opts.height; + } + this.dpr = opts.devicePixelRatio || 1; + rootCanvas.width = width * this.dpr; + rootCanvas.height = height * this.dpr; + this._width = width; + this._height = height; + var mainLayer = new Layer(rootCanvas, this, this.dpr); + mainLayer.__builtin__ = true; + mainLayer.initContext(); + layers[CANVAS_ZLEVEL] = mainLayer; + mainLayer.zlevel = CANVAS_ZLEVEL; + zlevelList.push(CANVAS_ZLEVEL); + this._domRoot = root; + } + } + CanvasPainter.prototype.getType = function () { + return 'canvas'; + }; + CanvasPainter.prototype.isSingleCanvas = function () { + return this._singleCanvas; + }; + CanvasPainter.prototype.getViewportRoot = function () { + return this._domRoot; + }; + CanvasPainter.prototype.getViewportRootOffset = function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + CanvasPainter.prototype.refresh = function (paintAll) { + var list = this.storage.getDisplayList(true); + var prevList = this._prevDisplayList; + var zlevelList = this._zlevelList; + this._redrawId = Math.random(); + this._paintList(list, prevList, paintAll, this._redrawId); + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__ && layer.refresh) { + var clearColor = i === 0 ? this._backgroundColor : null; + layer.refresh(clearColor); + } + } + if (this._opts.useDirtyRect) { + this._prevDisplayList = list.slice(); + } + return this; + }; + CanvasPainter.prototype.refreshHover = function () { + this._paintHoverList(this.storage.getDisplayList(false)); + }; + CanvasPainter.prototype._paintHoverList = function (list) { + var len = list.length; + var hoverLayer = this._hoverlayer; + hoverLayer && hoverLayer.clear(); + if (!len) { + return; + } + var scope = { + inHover: true, + viewWidth: this._width, + viewHeight: this._height + }; + var ctx; + for (var i = 0; i < len; i++) { + var el = list[i]; + if (el.__inHover) { + if (!hoverLayer) { + hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL); + } + if (!ctx) { + ctx = hoverLayer.ctx; + ctx.save(); + } + brush(ctx, el, scope, i === len - 1); + } + } + if (ctx) { + ctx.restore(); + } + }; + CanvasPainter.prototype.getHoverLayer = function () { + return this.getLayer(HOVER_LAYER_ZLEVEL); + }; + CanvasPainter.prototype.paintOne = function (ctx, el) { + brushSingle(ctx, el); + }; + CanvasPainter.prototype._paintList = function (list, prevList, paintAll, redrawId) { + if (this._redrawId !== redrawId) { + return; + } + paintAll = paintAll || false; + this._updateLayerStatus(list); + var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, needsRefreshHover = _a.needsRefreshHover; + if (this._needsManuallyCompositing) { + this._compositeManually(); + } + if (needsRefreshHover) { + this._paintHoverList(list); + } + if (!finished) { + var self_1 = this; + requestAnimationFrame$1(function () { + self_1._paintList(list, prevList, paintAll, redrawId); + }); + } + else { + this.eachLayer(function (layer) { + layer.afterBrush && layer.afterBrush(); + }); + } + }; + CanvasPainter.prototype._compositeManually = function () { + var ctx = this.getLayer(CANVAS_ZLEVEL).ctx; + var width = this._domRoot.width; + var height = this._domRoot.height; + ctx.clearRect(0, 0, width, height); + this.eachBuiltinLayer(function (layer) { + if (layer.virtual) { + ctx.drawImage(layer.dom, 0, 0, width, height); + } + }); + }; + CanvasPainter.prototype._doPaintList = function (list, prevList, paintAll) { + var _this = this; + var layerList = []; + var useDirtyRect = this._opts.useDirtyRect; + for (var zi = 0; zi < this._zlevelList.length; zi++) { + var zlevel = this._zlevelList[zi]; + var layer = this._layers[zlevel]; + if (layer.__builtin__ + && layer !== this._hoverlayer + && (layer.__dirty || paintAll)) { + layerList.push(layer); + } + } + var finished = true; + var needsRefreshHover = false; + var _loop_1 = function (k) { + var layer = layerList[k]; + var ctx = layer.ctx; + var repaintRects = useDirtyRect + && layer.createRepaintRects(list, prevList, this_1._width, this_1._height); + ctx.save(); + var start = paintAll ? layer.__startIndex : layer.__drawIndex; + var useTimer = !paintAll && layer.incremental && Date.now; + var startTime = useTimer && Date.now(); + var clearColor = layer.zlevel === this_1._zlevelList[0] + ? this_1._backgroundColor : null; + if (layer.__startIndex === layer.__endIndex) { + layer.clear(false, clearColor, repaintRects); + } + else if (start === layer.__startIndex) { + var firstEl = list[start]; + if (!firstEl.incremental || !firstEl.notClear || paintAll) { + layer.clear(false, clearColor, repaintRects); + } + } + if (start === -1) { + console.error('For some unknown reason. drawIndex is -1'); + start = layer.__startIndex; + } + var i; + var repaint = function (repaintRect) { + var scope = { + inHover: false, + allClipped: false, + prevEl: null, + viewWidth: _this._width, + viewHeight: _this._height + }; + for (i = start; i < layer.__endIndex; i++) { + var el = list[i]; + if (el.__inHover) { + needsRefreshHover = true; + } + _this._doPaintEl(el, layer, useDirtyRect, repaintRect, scope, i === layer.__endIndex - 1); + if (useTimer) { + var dTime = Date.now() - startTime; + if (dTime > 15) { + break; + } + } + } + if (scope.prevElClipPaths) { + ctx.restore(); + } + }; + if (repaintRects) { + if (repaintRects.length === 0) { + i = layer.__endIndex; + } + else { + var dpr = this_1.dpr; + for (var r = 0; r < repaintRects.length; ++r) { + var rect = repaintRects[r]; + ctx.save(); + ctx.beginPath(); + ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + ctx.clip(); + repaint(rect); + ctx.restore(); + } + } + } + else { + ctx.save(); + repaint(); + ctx.restore(); + } + layer.__drawIndex = i; + if (layer.__drawIndex < layer.__endIndex) { + finished = false; + } + }; + var this_1 = this; + for (var k = 0; k < layerList.length; k++) { + _loop_1(k); + } + if (env.wxa) { + each(this._layers, function (layer) { + if (layer && layer.ctx && layer.ctx.draw) { + layer.ctx.draw(); + } + }); + } + return { + finished: finished, + needsRefreshHover: needsRefreshHover + }; + }; + CanvasPainter.prototype._doPaintEl = function (el, currentLayer, useDirtyRect, repaintRect, scope, isLast) { + var ctx = currentLayer.ctx; + if (useDirtyRect) { + var paintRect = el.getPaintRect(); + if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) { + brush(ctx, el, scope, isLast); + el.setPrevPaintRect(paintRect); + } + } + else { + brush(ctx, el, scope, isLast); + } + }; + CanvasPainter.prototype.getLayer = function (zlevel, virtual) { + if (this._singleCanvas && !this._needsManuallyCompositing) { + zlevel = CANVAS_ZLEVEL; + } + var layer = this._layers[zlevel]; + if (!layer) { + layer = new Layer('zr_' + zlevel, this, this.dpr); + layer.zlevel = zlevel; + layer.__builtin__ = true; + if (this._layerConfig[zlevel]) { + merge(layer, this._layerConfig[zlevel], true); + } + else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) { + merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true); + } + if (virtual) { + layer.virtual = virtual; + } + this.insertLayer(zlevel, layer); + layer.initContext(); + } + return layer; + }; + CanvasPainter.prototype.insertLayer = function (zlevel, layer) { + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var domRoot = this._domRoot; + var prevLayer = null; + var i = -1; + if (layersMap[zlevel]) { + logError('ZLevel ' + zlevel + ' has been used already'); + return; + } + if (!isLayerValid(layer)) { + logError('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); + layersMap[zlevel] = layer; + if (!layer.virtual) { + 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); + } + } + } + layer.__painter = this; + }; + CanvasPainter.prototype.eachLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }; + CanvasPainter.prototype.eachBuiltinLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter.prototype.eachOtherLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter.prototype.getLayers = function () { + return this._layers; + }; + CanvasPainter.prototype._updateLayerStatus = function (list) { + this.eachBuiltinLayer(function (layer, z) { + layer.__dirty = layer.__used = false; + }); + function updatePrevLayer(idx) { + if (prevLayer) { + if (prevLayer.__endIndex !== idx) { + prevLayer.__dirty = true; + } + prevLayer.__endIndex = idx; + } + } + if (this._singleCanvas) { + for (var i_1 = 1; i_1 < list.length; i_1++) { + var el = list[i_1]; + if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) { + this._needsManuallyCompositing = true; + break; + } + } + } + var prevLayer = null; + var incrementalLayerCount = 0; + var prevZlevel; + var i; + for (i = 0; i < list.length; i++) { + var el = list[i]; + var zlevel = el.zlevel; + var layer = void 0; + if (prevZlevel !== zlevel) { + prevZlevel = zlevel; + incrementalLayerCount = 0; + } + if (el.incremental) { + layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing); + layer.incremental = true; + incrementalLayerCount = 1; + } + else { + layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing); + } + if (!layer.__builtin__) { + logError('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id); + } + if (layer !== prevLayer) { + layer.__used = true; + if (layer.__startIndex !== i) { + layer.__dirty = true; + } + layer.__startIndex = i; + if (!layer.incremental) { + layer.__drawIndex = i; + } + else { + layer.__drawIndex = -1; + } + updatePrevLayer(i); + prevLayer = layer; + } + if ((el.__dirty & Element.REDARAW_BIT) && !el.__inHover) { + layer.__dirty = true; + if (layer.incremental && layer.__drawIndex < 0) { + layer.__drawIndex = i; + } + } + } + updatePrevLayer(i); + this.eachBuiltinLayer(function (layer, z) { + if (!layer.__used && layer.getElementCount() > 0) { + layer.__dirty = true; + layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0; + } + if (layer.__dirty && layer.__drawIndex < 0) { + layer.__drawIndex = layer.__startIndex; + } + }); + }; + CanvasPainter.prototype.clear = function () { + this.eachBuiltinLayer(this._clearLayer); + return this; + }; + CanvasPainter.prototype._clearLayer = function (layer) { + layer.clear(); + }; + CanvasPainter.prototype.setBackgroundColor = function (backgroundColor) { + this._backgroundColor = backgroundColor; + each(this._layers, function (layer) { + layer.setUnpainted(); + }); + }; + CanvasPainter.prototype.configLayer = function (zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } + else { + merge(layerConfig[zlevel], config, true); + } + for (var i = 0; i < this._zlevelList.length; i++) { + var _zlevel = this._zlevelList[i]; + if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) { + var layer = this._layers[_zlevel]; + merge(layer, layerConfig[zlevel], true); + } + } + } + }; + CanvasPainter.prototype.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(indexOf(zlevelList, zlevel), 1); + }; + CanvasPainter.prototype.resize = function (width, height) { + if (!this._domRoot.style) { + if (width == null || height == null) { + return; + } + this._width = width; + this._height = height; + this.getLayer(CANVAS_ZLEVEL).resize(width, height); + } + else { + var domRoot = this._domRoot; + domRoot.style.display = 'none'; + var opts = this._opts; + width != null && (opts.width = width); + height != null && (opts.height = height); + width = this._getSize(0); + height = this._getSize(1); + domRoot.style.display = ''; + if (this._width !== width || height !== this._height) { + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + for (var id in this._layers) { + if (this._layers.hasOwnProperty(id)) { + this._layers[id].resize(width, height); + } + } + this.refresh(true); + } + this._width = width; + this._height = height; + } + return this; + }; + CanvasPainter.prototype.clearLayer = function (zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }; + CanvasPainter.prototype.dispose = function () { + this.root.innerHTML = ''; + this.root = + this.storage = + this._domRoot = + this._layers = null; + }; + CanvasPainter.prototype.getRenderedCanvas = function (opts) { + opts = opts || {}; + if (this._singleCanvas && !this._compositeManually) { + return this._layers[CANVAS_ZLEVEL].dom; + } + var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + imageLayer.clear(false, opts.backgroundColor || this._backgroundColor); + var ctx = imageLayer.ctx; + if (opts.pixelRatio <= this.dpr) { + this.refresh(); + var width_1 = imageLayer.dom.width; + var height_1 = imageLayer.dom.height; + this.eachLayer(function (layer) { + if (layer.__builtin__) { + ctx.drawImage(layer.dom, 0, 0, width_1, height_1); + } + else if (layer.renderToCanvas) { + ctx.save(); + layer.renderToCanvas(ctx); + ctx.restore(); + } + }); + } + else { + var scope = { + inHover: false, + viewWidth: this._width, + viewHeight: this._height + }; + var displayList = this.storage.getDisplayList(true); + for (var i = 0, len = displayList.length; i < len; i++) { + var el = displayList[i]; + brush(ctx, el, scope, i === len - 1); + } + } + return imageLayer.dom; + }; + CanvasPainter.prototype.getWidth = function () { + return this._width; + }; + CanvasPainter.prototype.getHeight = function () { + return this._height; + }; + CanvasPainter.prototype._getSize = function (whIdx) { + var opts = this._opts; + var wh = ['width', 'height'][whIdx]; + var cwh = ['clientWidth', 'clientHeight'][whIdx]; + var plt = ['paddingLeft', 'paddingTop'][whIdx]; + var prb = ['paddingRight', 'paddingBottom'][whIdx]; + if (opts[wh] != null && opts[wh] !== 'auto') { + return parseFloat(opts[wh]); + } + var root = this.root; + var stl = document.defaultView.getComputedStyle(root); + return ((root[cwh] || parseInt10$1(stl[wh]) || parseInt10$1(root.style[wh])) + - (parseInt10$1(stl[plt]) || 0) + - (parseInt10$1(stl[prb]) || 0)) | 0; + }; + CanvasPainter.prototype.pathToImage = function (path, dpr) { + dpr = dpr || this.dpr; + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + var rect = path.getBoundingRect(); + var style = path.style; + var shadowBlurSize = style.shadowBlur * dpr; + var shadowOffsetX = style.shadowOffsetX * dpr; + var shadowOffsetY = style.shadowOffsetY * dpr; + var lineWidth = path.hasStroke() ? style.lineWidth : 0; + var leftMargin = Math.max(lineWidth / 2, -shadowOffsetX + shadowBlurSize); + var rightMargin = Math.max(lineWidth / 2, shadowOffsetX + shadowBlurSize); + var topMargin = Math.max(lineWidth / 2, -shadowOffsetY + shadowBlurSize); + var bottomMargin = Math.max(lineWidth / 2, shadowOffsetY + shadowBlurSize); + var width = rect.width + leftMargin + rightMargin; + var height = rect.height + topMargin + bottomMargin; + canvas.width = width * dpr; + canvas.height = height * dpr; + ctx.scale(dpr, dpr); + ctx.clearRect(0, 0, width, height); + ctx.dpr = dpr; + var pathTransform = { + x: path.x, + y: path.y, + scaleX: path.scaleX, + scaleY: path.scaleY, + rotation: path.rotation, + originX: path.originX, + originY: path.originY + }; + path.x = leftMargin - rect.x; + path.y = topMargin - rect.y; + path.rotation = 0; + path.scaleX = 1; + path.scaleY = 1; + path.updateTransform(); + if (path) { + brush(ctx, path, { + inHover: false, + viewWidth: this._width, + viewHeight: this._height + }, true); + } + var imgShape = new ZRImage({ + style: { + x: 0, + y: 0, + image: canvas + } + }); + extend(path, pathTransform); + return imgShape; + }; + return CanvasPainter; + }()); + + function install$1(registers) { + registers.registerPainter('canvas', CanvasPainter); + } + + var LineSeriesModel = + /** @class */ + function (_super) { + __extends(LineSeriesModel, _super); + + function LineSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LineSeriesModel.type; + _this.hasSymbolVisual = true; + _this.legendSymbol = 'line'; + return _this; + } + + LineSeriesModel.prototype.getInitialData = function (option) { + if ("development" !== 'production') { + var coordSys = option.coordinateSystem; + + if (coordSys !== 'polar' && coordSys !== 'cartesian2d') { + throw new Error('Line not support coordinateSystem besides cartesian and polar'); + } + } + + return createListFromArray(this.getSource(), this, { + useEncodeDefaulter: true + }); + }; + + LineSeriesModel.type = 'series.line'; + LineSeriesModel.dependencies = ['grid', 'polar']; + LineSeriesModel.defaultOption = { + zlevel: 0, + z: 3, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + clip: true, + label: { + position: 'top' + }, + endLabel: { + show: false, + valueAnimation: true, + distance: 8 + }, + lineStyle: { + width: 2, + type: 'solid' + }, + emphasis: { + scale: true, + lineStyle: { + width: 'bolder' + } + }, + // areaStyle: { + // origin of areaStyle. Valid values: + // `'auto'/null/undefined`: from axisLine to data + // `'start'`: from min to data + // `'end'`: from data to max + // origin: 'auto' + // }, + // false, 'start', 'end', 'middle' + step: false, + // Disabled if step is true + smooth: false, + smoothMonotone: null, + symbol: 'emptyCircle', + symbolSize: 4, + symbolRotate: null, + showSymbol: true, + // `false`: follow the label interval strategy. + // `true`: show all symbols. + // `'auto'`: If possible, show all symbols, otherwise + // follow the label interval strategy. + showAllSymbol: 'auto', + // Whether to connect break point. + connectNulls: false, + // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'. + sampling: 'none', + animationEasing: 'linear', + // Disable progressive + progressive: 0, + hoverLayerThreshold: Infinity + }; + return LineSeriesModel; + }(SeriesModel); + + /** + * @return label string. Not null/undefined + */ + + function getDefaultLabel(data, dataIndex) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + var len = labelDims.length; // Simple optimization (in lots of cases, label dims length is 1) + + if (len === 1) { + var rawVal = retrieveRawValue(data, dataIndex, labelDims[0]); + return rawVal != null ? rawVal + '' : null; + } else if (len) { + var vals = []; + + for (var i = 0; i < labelDims.length; i++) { + vals.push(retrieveRawValue(data, dataIndex, labelDims[i])); + } + + return vals.join(' '); + } + } + function getDefaultInterpolatedLabel(data, interpolatedValue) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + + if (!isArray(interpolatedValue)) { + return interpolatedValue + ''; + } + + var vals = []; + + for (var i = 0; i < labelDims.length; i++) { + var dimInfo = data.getDimensionInfo(labelDims[i]); + + if (dimInfo) { + vals.push(interpolatedValue[dimInfo.index]); + } + } + + return vals.join(' '); + } + + var Symbol = + /** @class */ + function (_super) { + __extends(Symbol, _super); + + function Symbol(data, idx, seriesScope, opts) { + var _this = _super.call(this) || this; + + _this.updateData(data, idx, seriesScope, opts); + + return _this; + } + + Symbol.prototype._createSymbol = function (symbolType, data, idx, symbolSize, keepAspect) { + // Remove paths created before + this.removeAll(); // let symbolPath = createSymbol( + // symbolType, -0.5, -0.5, 1, 1, color + // ); + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4150. + + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, null, keepAspect); + symbolPath.attr({ + z2: 100, + culling: true, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }); // Rewrite drift method + + symbolPath.drift = driftSymbol; + this._symbolType = symbolType; + this.add(symbolPath); + }; + /** + * Stop animation + * @param {boolean} toLastFrame + */ + + + Symbol.prototype.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(null, toLastFrame); + }; + /** + * FIXME: + * Caution: This method breaks the encapsulation of this module, + * but it indeed brings convenience. So do not use the method + * unless you detailedly know all the implements of `Symbol`, + * especially animation. + * + * Get symbol path element. + */ + + + Symbol.prototype.getSymbolPath = function () { + return this.childAt(0); + }; + /** + * Highlight symbol + */ + + + Symbol.prototype.highlight = function () { + enterEmphasis(this.childAt(0)); + }; + /** + * Downplay symbol + */ + + + Symbol.prototype.downplay = function () { + leaveEmphasis(this.childAt(0)); + }; + /** + * @param {number} zlevel + * @param {number} z + */ + + + Symbol.prototype.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; + }; + + Symbol.prototype.setDraggable = function (draggable) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = draggable ? 'move' : symbolPath.cursor; + }; + /** + * Update symbol properties + */ + + + Symbol.prototype.updateData = function (data, idx, seriesScope, opts) { + this.silent = false; + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = Symbol.getSymbolSize(data, idx); + var isInit = symbolType !== this._symbolType; + var disableAnimation = opts && opts.disableAnimation; + + if (isInit) { + var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect'); + + this._createSymbol(symbolType, data, idx, symbolSize, keepAspect); + } else { + var symbolPath = this.childAt(0); + symbolPath.silent = false; + var target = { + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }; + disableAnimation ? symbolPath.attr(target) : updateProps(symbolPath, target, seriesModel, idx); + } + + this._updateCommon(data, idx, symbolSize, seriesScope, opts); + + if (isInit) { + var symbolPath = this.childAt(0); + + if (!disableAnimation) { + var target = { + scaleX: this._sizeX, + scaleY: this._sizeY, + style: { + // Always fadeIn. Because it has fadeOut animation when symbol is removed.. + opacity: symbolPath.style.opacity + } + }; + symbolPath.scaleX = symbolPath.scaleY = 0; + symbolPath.style.opacity = 0; + initProps(symbolPath, target, seriesModel, idx); + } + } + + if (disableAnimation) { + // Must stop remove animation manually if don't call initProps or updateProps. + this.childAt(0).stopAnimation('remove'); + } + + this._seriesModel = seriesModel; + }; + + Symbol.prototype._updateCommon = function (data, idx, symbolSize, seriesScope, opts) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var emphasisItemStyle; + var blurItemStyle; + var selectItemStyle; + var focus; + var blurScope; + var symbolOffset; + var labelStatesModels; + var hoverScale; + var cursorStyle; + + if (seriesScope) { + emphasisItemStyle = seriesScope.emphasisItemStyle; + blurItemStyle = seriesScope.blurItemStyle; + selectItemStyle = seriesScope.selectItemStyle; + focus = seriesScope.focus; + blurScope = seriesScope.blurScope; + symbolOffset = seriesScope.symbolOffset; + labelStatesModels = seriesScope.labelStatesModels; + hoverScale = seriesScope.hoverScale; + cursorStyle = seriesScope.cursorStyle; + } + + if (!seriesScope || data.hasItemOption) { + var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + selectItemStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + blurItemStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + symbolOffset = itemModel.getShallow('symbolOffset'); + labelStatesModels = getLabelStatesModels(itemModel); + hoverScale = emphasisModel.getShallow('scale'); + cursorStyle = itemModel.getShallow('cursor'); + } + + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0); + + if (symbolOffset) { + symbolPath.x = parsePercent$1(symbolOffset[0], symbolSize[0]); + symbolPath.y = parsePercent$1(symbolOffset[1], symbolSize[1]); + } + + cursorStyle && symbolPath.attr('cursor', cursorStyle); + var symbolStyle = data.getItemVisual(idx, 'style'); + var visualColor = symbolStyle.fill; + + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolStyle)); + } else { + if (symbolPath.__isEmptyBrush) { + // fill and stroke will be swapped if it's empty. + // So we cloned a new style to avoid it affecting the original style in visual storage. + // TODO Better implementation. No empty logic! + symbolPath.useStyle(extend({}, symbolStyle)); + } else { + symbolPath.useStyle(symbolStyle); + } // Disable decal because symbol scale will been applied on the decal. + + + symbolPath.style.decal = null; + symbolPath.setColor(visualColor, opts && opts.symbolInnerColor); + symbolPath.style.strokeNoScale = true; + } + + var liftZ = data.getItemVisual(idx, 'liftZ'); + var z2Origin = this._z2; + + if (liftZ != null) { + if (z2Origin == null) { + this._z2 = symbolPath.z2; + symbolPath.z2 += liftZ; + } + } else if (z2Origin != null) { + symbolPath.z2 = z2Origin; + this._z2 = null; + } + + var useNameLabel = opts && opts.useNameLabel; + setLabelStyle(symbolPath, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultText: getLabelDefaultText, + inheritColor: visualColor, + defaultOpacity: symbolStyle.opacity + }); // Do not execute util needed. + + function getLabelDefaultText(idx) { + return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx); + } + + this._sizeX = symbolSize[0] / 2; + this._sizeY = symbolSize[1] / 2; + var emphasisState = symbolPath.ensureState('emphasis'); + emphasisState.style = emphasisItemStyle; + symbolPath.ensureState('select').style = selectItemStyle; + symbolPath.ensureState('blur').style = blurItemStyle; + + if (hoverScale) { + var scaleRatio = Math.max(1.1, 3 / this._sizeY); + emphasisState.scaleX = this._sizeX * scaleRatio; + emphasisState.scaleY = this._sizeY * scaleRatio; + } + + this.setSymbolScale(1); + enableHoverEmphasis(this, focus, blurScope); + }; + + Symbol.prototype.setSymbolScale = function (scale) { + this.scaleX = this.scaleY = scale; + }; + + Symbol.prototype.fadeOut = function (cb, opt) { + var symbolPath = this.childAt(0); + var seriesModel = this._seriesModel; + var dataIndex = getECData(this).dataIndex; + var animationOpt = opt && opt.animation; // Avoid mistaken hover when fading out + + this.silent = symbolPath.silent = true; // Not show text when animating + + if (opt && opt.fadeLabel) { + var textContent = symbolPath.getTextContent(); + + if (textContent) { + removeElement(textContent, { + style: { + opacity: 0 + } + }, seriesModel, { + dataIndex: dataIndex, + removeOpt: animationOpt, + cb: function () { + symbolPath.removeTextContent(); + } + }); + } + } else { + symbolPath.removeTextContent(); + } + + removeElement(symbolPath, { + style: { + opacity: 0 + }, + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: dataIndex, + cb: cb, + removeOpt: animationOpt + }); + }; + + Symbol.getSymbolSize = function (data, idx) { + var symbolSize = data.getItemVisual(idx, 'symbolSize'); + return symbolSize instanceof Array ? symbolSize.slice() : [+symbolSize, +symbolSize]; + }; + + return Symbol; + }(Group); + + function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); + } + + function symbolNeedsDraw(data, point, idx, opt) { + return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx)) // We do not set clipShape on group, because it will cut part of + // the symbol element shape. We use the same clip shape here as + // the line clip. + && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, 'symbol') !== 'none'; + } + + function normalizeUpdateOpt(opt) { + if (opt != null && !isObject(opt)) { + opt = { + isIgnore: opt + }; + } + + return opt || {}; + } + + function makeSeriesScope(data) { + var seriesModel = data.hostModel; + var emphasisModel = seriesModel.getModel('emphasis'); + return { + emphasisItemStyle: emphasisModel.getModel('itemStyle').getItemStyle(), + blurItemStyle: seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(), + selectItemStyle: seriesModel.getModel(['select', 'itemStyle']).getItemStyle(), + focus: emphasisModel.get('focus'), + blurScope: emphasisModel.get('blurScope'), + symbolRotate: seriesModel.get('symbolRotate'), + symbolOffset: seriesModel.get('symbolOffset'), + hoverScale: emphasisModel.get('scale'), + labelStatesModels: getLabelStatesModels(seriesModel), + cursorStyle: seriesModel.get('cursor') + }; + } + + var SymbolDraw = + /** @class */ + function () { + function SymbolDraw(SymbolCtor) { + this.group = new Group(); + this._SymbolCtor = SymbolCtor || Symbol; + } + /** + * Update symbols draw by new data + */ + + + SymbolDraw.prototype.updateData = function (data, opt) { + opt = normalizeUpdateOpt(opt); + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + var SymbolCtor = this._SymbolCtor; + var disableAnimation = opt.disableAnimation; + var seriesScope = makeSeriesScope(data); + var symbolUpdateOpt = { + disableAnimation: disableAnimation + }; + + var getSymbolPoint = opt.getSymbolPoint || function (idx) { + return data.getItemLayout(idx); + }; // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + + if (!oldData) { + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + var point = getSymbolPoint(newIdx); + + if (symbolNeedsDraw(data, point, newIdx, opt)) { + var symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = getSymbolPoint(newIdx); + + if (!symbolNeedsDraw(data, point, newIdx, opt)) { + group.remove(symbolEl); + return; + } + + if (!symbolEl) { + symbolEl = new SymbolCtor(data, newIdx); + symbolEl.setPosition(point); + } else { + symbolEl.updateData(data, newIdx, seriesScope, symbolUpdateOpt); + var target = { + x: point[0], + y: point[1] + }; + disableAnimation ? symbolEl.attr(target) : updateProps(symbolEl, target, 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._getSymbolPoint = getSymbolPoint; + this._data = data; + }; + + SymbolDraw.prototype.isPersistent = function () { + return true; + }; + + SymbolDraw.prototype.updateLayout = function () { + var _this = this; + + var data = this._data; + + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + var point = _this._getSymbolPoint(idx); + + el.setPosition(point); + el.markRedraw(); + }); + } + }; + + SymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this._seriesScope = makeSeriesScope(data); + this._data = null; + this.group.removeAll(); + }; + /** + * Update symbols draw by new data + */ + + SymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + opt = normalizeUpdateOpt(opt); + + function updateIncrementalAndHover(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var point = data.getItemLayout(idx); + + if (symbolNeedsDraw(data, point, idx, opt)) { + var el = new this._SymbolCtor(data, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + el.setPosition(point); + this.group.add(el); + data.setItemGraphicEl(idx, el); + } + } + }; + + SymbolDraw.prototype.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; // Incremental model do not have this._data. + + if (data && enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }); + }); + } else { + group.removeAll(); + } + }; + return SymbolDraw; + }(); + + function prepareDataCoordInfo(coordSys, data, valueOrigin) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = getValueStart(valueAxis, valueOrigin); + var baseAxisDim = baseAxis.dim; + var valueAxisDim = valueAxis.dim; + var valueDim = data.mapDimension(valueAxisDim); + var baseDim = data.mapDimension(baseAxisDim); + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var dims = map(coordSys.dimensions, function (coordDim) { + return data.mapDimension(coordDim); + }); + var stacked = false; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + + if (isDimensionStacked(data, dims[0] + /*, dims[1]*/ + )) { + // jshint ignore:line + stacked = true; + dims[0] = stackResultDim; + } + + if (isDimensionStacked(data, dims[1] + /*, dims[0]*/ + )) { + // jshint ignore:line + stacked = true; + dims[1] = stackResultDim; + } + + return { + dataDimsForPoint: dims, + valueStart: valueStart, + valueAxisDim: valueAxisDim, + baseAxisDim: baseAxisDim, + stacked: !!stacked, + valueDim: valueDim, + baseDim: baseDim, + baseDataOffset: baseDataOffset, + stackedOverDimension: data.getCalculationInfo('stackedOverDimension') + }; + } + + function getValueStart(valueAxis, valueOrigin) { + var valueStart = 0; + var extent = valueAxis.scale.getExtent(); + + if (valueOrigin === 'start') { + valueStart = extent[0]; + } else if (valueOrigin === 'end') { + valueStart = extent[1]; + } // auto + else { + // Both positive + if (extent[0] > 0) { + valueStart = extent[0]; + } // Both negative + else if (extent[1] < 0) { + valueStart = extent[1]; + } // If is one positive, and one negative, onZero shall be true + + } + + return valueStart; + } + + function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) { + var value = NaN; + + if (dataCoordInfo.stacked) { + value = data.get(data.getCalculationInfo('stackedOverDimension'), idx); + } + + if (isNaN(value)) { + value = dataCoordInfo.valueStart; + } + + var baseDataOffset = dataCoordInfo.baseDataOffset; + var stackedData = []; + stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); + stackedData[1 - baseDataOffset] = value; + return coordSys.dataToPoint(stackedData); + } + + /* global Float32Array */ + + var supportFloat32Array = typeof Float32Array !== 'undefined'; + var Float32ArrayCtor = !supportFloat32Array ? Array : Float32Array; + function createFloat32Array(arg) { + if (isArray(arg)) { + // Return self directly if don't support TypedArray. + return supportFloat32Array ? new Float32Array(arg) : arg; + } // Else is number + + + return new Float32ArrayCtor(arg); + } + + 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; + } + + function lineAnimationDiff(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) { + var diff = diffData(oldData, newData); // let newIdList = newData.mapArray(newData.getId); + // let 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 newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin); + var oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin); + var oldPoints = oldData.getLayout('points') || []; + var newPoints = newData.getLayout('points') || []; + + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + var oldIdx2 = void 0; + var newIdx2 = void 0; // 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 '=': + oldIdx2 = diffItem.idx * 2; + newIdx2 = diffItem.idx1 * 2; + var currentX = oldPoints[oldIdx2]; + var currentY = oldPoints[oldIdx2 + 1]; + var nextX = newPoints[newIdx2]; + var nextY = newPoints[newIdx2 + 1]; // If previous data is NaN, use next point directly + + if (isNaN(currentX) || isNaN(currentY)) { + currentX = nextX; + currentY = nextY; + } + + currPoints.push(currentX, currentY); + nextPoints.push(nextX, nextY); + currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + + case '+': + var newIdx = diffItem.idx; + var newDataDimsForPoint = newDataOldCoordInfo.dataDimsForPoint; + var oldPt = oldCoordSys.dataToPoint([newData.get(newDataDimsForPoint[0], newIdx), newData.get(newDataDimsForPoint[1], newIdx)]); + newIdx2 = newIdx * 2; + currPoints.push(oldPt[0], oldPt[1]); + nextPoints.push(newPoints[newIdx2], newPoints[newIdx2 + 1]); + var stackedOnPoint = getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, newIdx); + currStackedPoints.push(stackedOnPoint[0], stackedOnPoint[1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(newIdx)); + break; + + case '-': + var oldIdx = diffItem.idx; + var rawIndex = oldData.getRawIndex(oldIdx); + var oldDataDimsForPoint = oldDataNewCoordInfo.dataDimsForPoint; + oldIdx2 = oldIdx * 2; // Data is replaced. In the case of dynamic data queue + // FIXME FIXME FIXME + + if (rawIndex !== oldIdx) { + var newPt = newCoordSys.dataToPoint([oldData.get(oldDataDimsForPoint[0], oldIdx), oldData.get(oldDataDimsForPoint[1], oldIdx)]); + var newStackedOnPt = getStackedOnPoint(oldDataNewCoordInfo, newCoordSys, oldData, oldIdx); + currPoints.push(oldPoints[oldIdx2], oldPoints[oldIdx2 + 1]); + nextPoints.push(newPt[0], newPt[1]); + currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]); + nextStackedPoints.push(newStackedOnPt[0], newStackedOnPt[1]); + 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 len = currPoints.length; + var sortedCurrPoints = createFloat32Array(len); + var sortedNextPoints = createFloat32Array(len); + var sortedCurrStackedPoints = createFloat32Array(len); + var sortedNextStackedPoints = createFloat32Array(len); + var sortedStatus = []; + + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + var i2 = i * 2; + var idx2 = idx * 2; + sortedCurrPoints[i2] = currPoints[idx2]; + sortedCurrPoints[i2 + 1] = currPoints[idx2 + 1]; + sortedNextPoints[i2] = nextPoints[idx2]; + sortedNextPoints[i2 + 1] = nextPoints[idx2 + 1]; + sortedCurrStackedPoints[i2] = currStackedPoints[idx2]; + sortedCurrStackedPoints[i2 + 1] = currStackedPoints[idx2 + 1]; + sortedNextStackedPoints[i2] = nextStackedPoints[idx2]; + sortedNextStackedPoints[i2 + 1] = nextStackedPoints[idx2 + 1]; + sortedStatus[i] = status[idx]; + } + + return { + current: sortedCurrPoints, + next: sortedNextPoints, + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + status: sortedStatus + }; + } + + var mathMin$5 = Math.min; + var mathMax$5 = Math.max; + + function isPointNull(x, y) { + return isNaN(x) || isNaN(y); + } + /** + * Draw smoothed line in non-monotone, in may cause undesired curve in extreme + * situations. This should be used when points are non-monotone neither in x or + * y dimension. + */ + + + function drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) { + var prevX; + var prevY; + var cpx0; + var cpy0; + var cpx1; + var cpy1; + var idx = start; + var k = 0; + + for (; k < segLen; k++) { + var x = points[idx * 2]; + var y = points[idx * 2 + 1]; + + if (idx >= allLen || idx < 0) { + break; + } + + if (isPointNull(x, y)) { + if (connectNulls) { + idx += dir; + continue; + } + + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y); + cpx0 = x; + cpy0 = y; + } else { + var dx = x - prevX; + var dy = y - prevY; // Ignore tiny segment. + + if (dx * dx + dy * dy < 0.5) { + idx += dir; + continue; + } + + if (smooth > 0) { + var nextIdx = idx + dir; + var nextX = points[nextIdx * 2]; + var nextY = points[nextIdx * 2 + 1]; + var tmpK = k + 1; + + if (connectNulls) { + // Find next point not null + while (isPointNull(nextX, nextY) && tmpK < segLen) { + tmpK++; + nextIdx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + } + } + + var ratioNextSeg = 0.5; + var vx = 0; + var vy = 0; + var nextCpx0 = void 0; + var nextCpy0 = void 0; // Is last point + + if (tmpK >= segLen || isPointNull(nextX, nextY)) { + cpx1 = x; + cpy1 = y; + } else { + vx = nextX - prevX; + vy = nextY - prevY; + var dx0 = x - prevX; + var dx1 = nextX - x; + var dy0 = y - prevY; + var dy1 = nextY - y; + var lenPrevSeg = void 0; + var lenNextSeg = void 0; + + if (smoothMonotone === 'x') { + lenPrevSeg = Math.abs(dx0); + lenNextSeg = Math.abs(dx1); + cpx1 = x - lenPrevSeg * smooth; + cpy1 = y; + nextCpx0 = x + lenPrevSeg * smooth; + nextCpy0 = y; + } else if (smoothMonotone === 'y') { + lenPrevSeg = Math.abs(dy0); + lenNextSeg = Math.abs(dy1); + cpx1 = x; + cpy1 = y - lenPrevSeg * smooth; + nextCpx0 = x; + nextCpy0 = y + lenPrevSeg * smooth; + } else { + lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0); + lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1); // Use ratio of seg length + + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + cpx1 = x - vx * smooth * (1 - ratioNextSeg); + cpy1 = y - vy * smooth * (1 - ratioNextSeg); // cp0 of next segment + + nextCpx0 = x + vx * smooth * ratioNextSeg; + nextCpy0 = y + vy * smooth * ratioNextSeg; // Smooth constraint between point and next point. + // Avoid exceeding extreme after smoothing. + + nextCpx0 = mathMin$5(nextCpx0, mathMax$5(nextX, x)); + nextCpy0 = mathMin$5(nextCpy0, mathMax$5(nextY, y)); + nextCpx0 = mathMax$5(nextCpx0, mathMin$5(nextX, x)); + nextCpy0 = mathMax$5(nextCpy0, mathMin$5(nextY, y)); // Reclaculate cp1 based on the adjusted cp0 of next seg. + + vx = nextCpx0 - x; + vy = nextCpy0 - y; + cpx1 = x - vx * lenPrevSeg / lenNextSeg; + cpy1 = y - vy * lenPrevSeg / lenNextSeg; // Smooth constraint between point and prev point. + // Avoid exceeding extreme after smoothing. + + cpx1 = mathMin$5(cpx1, mathMax$5(prevX, x)); + cpy1 = mathMin$5(cpy1, mathMax$5(prevY, y)); + cpx1 = mathMax$5(cpx1, mathMin$5(prevX, x)); + cpy1 = mathMax$5(cpy1, mathMin$5(prevY, y)); // Adjust next cp0 again. + + vx = x - cpx1; + vy = y - cpy1; + nextCpx0 = x + vx * lenNextSeg / lenPrevSeg; + nextCpy0 = y + vy * lenNextSeg / lenPrevSeg; + } + } + + ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y); + cpx0 = nextCpx0; + cpy0 = nextCpy0; + } else { + ctx.lineTo(x, y); + } + } + + prevX = x; + prevY = y; + idx += dir; + } + + return k; + } + + var ECPolylineShape = + /** @class */ + function () { + function ECPolylineShape() { + this.smooth = 0; + this.smoothConstraint = true; + } + + return ECPolylineShape; + }(); + + var ECPolyline = + /** @class */ + function (_super) { + __extends(ECPolyline, _super); + + function ECPolyline(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-polyline'; + return _this; + } + + ECPolyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + ECPolyline.prototype.getDefaultShape = function () { + return new ECPolylineShape(); + }; + + ECPolyline.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var i = 0; + var len = points.length / 2; // const result = getBoundingBox(points, shape.smoothConstraint); + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + for (; i < len; i++) { + if (!isPointNull(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + + while (i < len) { + i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1; + } + }; + + ECPolyline.prototype.getPointOn = function (xOrY, dim) { + if (!this.path) { + this.createPathProxy(); + this.buildPath(this.path, this.shape); + } + + var path = this.path; + var data = path.data; + var CMD = PathProxy.CMD; + var x0; + var y0; + var isDimX = dim === 'x'; + var roots = []; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + var x = void 0; + var y = void 0; + var x2 = void 0; + var y2 = void 0; + var x3 = void 0; + var y3 = void 0; + var t = void 0; + + switch (cmd) { + case CMD.M: + x0 = data[i++]; + y0 = data[i++]; + break; + + case CMD.L: + x = data[i++]; + y = data[i++]; + t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0); + + if (t <= 1 && t >= 0) { + var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0; + return isDimX ? [xOrY, val] : [val, xOrY]; + } + + x0 = x; + y0 = y; + break; + + case CMD.C: + x = data[i++]; + y = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + x3 = data[i++]; + y3 = data[i++]; + var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots); + + if (nRoot > 0) { + for (var i_1 = 0; i_1 < nRoot; i_1++) { + var t_1 = roots[i_1]; + + if (t_1 <= 1 && t_1 >= 0) { + var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1); + return isDimX ? [xOrY, val] : [val, xOrY]; + } + } + } + + x0 = x3; + y0 = y3; + break; + } + } + }; + + return ECPolyline; + }(Path); + + var ECPolygonShape = + /** @class */ + function (_super) { + __extends(ECPolygonShape, _super); + + function ECPolygonShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return ECPolygonShape; + }(ECPolylineShape); + + var ECPolygon = + /** @class */ + function (_super) { + __extends(ECPolygon, _super); + + function ECPolygon(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-polygon'; + return _this; + } + + ECPolygon.prototype.getDefaultShape = function () { + return new ECPolygonShape(); + }; + + ECPolygon.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + var i = 0; + var len = points.length / 2; + var smoothMonotone = shape.smoothMonotone; + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + for (; i < len; i++) { + if (!isPointNull(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + + while (i < len) { + var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls); + drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls); + i += k + 1; + ctx.closePath(); + } + }; + + return ECPolygon; + }(Path); + + function createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) { + var rect = cartesian.getArea(); + var x = rect.x; + var y = rect.y; + var width = rect.width; + var height = rect.height; + var lineWidth = seriesModel.get(['lineStyle', 'width']) || 2; // Expand the clip path a bit to avoid the border is clipped and looks thinner + + x -= lineWidth / 2; + y -= lineWidth / 2; + width += lineWidth; + height += lineWidth; // fix: https://github.com/apache/incubator-echarts/issues/11369 + + x = Math.floor(x); + width = Math.round(width); + var clipPath = new Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + + if (hasAnimation) { + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isAxisInversed = baseAxis.inverse; + + if (isHorizontal) { + if (isAxisInversed) { + clipPath.shape.x += width; + } + + clipPath.shape.width = 0; + } else { + if (!isAxisInversed) { + clipPath.shape.y += height; + } + + clipPath.shape.height = 0; + } + + var duringCb = typeof during === 'function' ? function (percent) { + during(percent, clipPath); + } : null; + initProps(clipPath, { + shape: { + width: width, + height: height, + x: x, + y: y + } + }, seriesModel, null, done, duringCb); + } + + return clipPath; + } + + function createPolarClipPath(polar, hasAnimation, seriesModel) { + var sectorArea = polar.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent. + + var r0 = round(sectorArea.r0, 1); + var r = round(sectorArea.r, 1); + var clipPath = new Sector({ + shape: { + cx: round(polar.cx, 1), + cy: round(polar.cy, 1), + r0: r0, + r: r, + startAngle: sectorArea.startAngle, + endAngle: sectorArea.endAngle, + clockwise: sectorArea.clockwise + } + }); + + if (hasAnimation) { + var isRadial = polar.getBaseAxis().dim === 'angle'; + + if (isRadial) { + clipPath.shape.endAngle = sectorArea.startAngle; + } else { + clipPath.shape.r = r0; + } + + initProps(clipPath, { + shape: { + endAngle: sectorArea.endAngle, + r: r + } + }, seriesModel); + } + + return clipPath; + } + + function createClipPath(coordSys, hasAnimation, seriesModel, done, during) { + if (!coordSys) { + return null; + } else if (coordSys.type === 'polar') { + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } else if (coordSys.type === 'cartesian2d') { + return createGridClipPath(coordSys, hasAnimation, seriesModel, done, during); + } + + return null; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function isCoordinateSystemType(coordSys, type) { + return coordSys.type === type; + } + + function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + + for (var i = 0; i < points1.length; i++) { + if (points1[i] !== points2[i]) { + return; + } + } + + return true; + } + + function bboxFromPoints(points) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (!isNaN(x)) { + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + } + + if (!isNaN(y)) { + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + } + + return [[minX, minY], [maxX, maxY]]; + } + + function getBoundingDiff(points1, points2) { + var _a = bboxFromPoints(points1), + min1 = _a[0], + max1 = _a[1]; + + var _b = bboxFromPoints(points2), + min2 = _b[0], + max2 = _b[1]; // Get a max value from each corner of two boundings. + + + return Math.max(Math.abs(min1[0] - min2[0]), Math.abs(min1[1] - min2[1]), Math.abs(max1[0] - max2[0]), Math.abs(max1[1] - max2[1])); + } + + function getSmooth(smooth) { + return typeof smooth === 'number' ? smooth : smooth ? 0.5 : 0; + } + + function getStackedOnPoints(coordSys, data, dataCoordInfo) { + if (!dataCoordInfo.valueDim) { + return []; + } + + var len = data.count(); + var points = createFloat32Array(len * 2); + + for (var idx = 0; idx < len; idx++) { + var pt = getStackedOnPoint(dataCoordInfo, coordSys, data, idx); + points[idx * 2] = pt[0]; + points[idx * 2 + 1] = pt[1]; + } + + return points; + } + + function turnPointsIntoStep(points, coordSys, stepTurnAt) { + var baseAxis = coordSys.getBaseAxis(); + var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1; + var stepPoints = []; + var i = 0; + var stepPt = []; + var pt = []; + var nextPt = []; + + for (; i < points.length - 2; i += 2) { + nextPt[0] = points[i + 2]; + nextPt[1] = points[i + 3]; + pt[0] = points[i]; + pt[1] = points[i + 1]; + stepPoints.push(pt[0], pt[1]); + + switch (stepTurnAt) { + case 'end': + stepPt[baseIndex] = nextPt[baseIndex]; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + break; + + case 'middle': + var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2; + var stepPt2 = []; + stepPt[baseIndex] = stepPt2[baseIndex] = middle; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPt2[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + stepPoints.push(stepPt2[0], stepPt2[1]); + break; + + default: + // default is start + stepPt[baseIndex] = pt[baseIndex]; + stepPt[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + } + } // Last points + + + stepPoints.push(points[i++], points[i++]); + return stepPoints; + } + + function getVisualGradient(data, coordSys) { + var visualMetaList = data.getVisual('visualMeta'); + + if (!visualMetaList || !visualMetaList.length || !data.count()) { + // When data.count() is 0, gradient range can not be calculated. + return; + } + + if (coordSys.type !== 'cartesian2d') { + if ("development" !== 'production') { + console.warn('Visual map on line style is only supported on cartesian2d.'); + } + + return; + } + + var coordDim; + var visualMeta; + + for (var i = visualMetaList.length - 1; i >= 0; i--) { + var dimIndex = visualMetaList[i].dimension; + var dimName = data.dimensions[dimIndex]; + var dimInfo = data.getDimensionInfo(dimName); + coordDim = dimInfo && dimInfo.coordDim; // Can only be x or y + + if (coordDim === 'x' || coordDim === 'y') { + visualMeta = visualMetaList[i]; + break; + } + } + + if (!visualMeta) { + if ("development" !== 'production') { + console.warn('Visual map on line style only support x or y dimension.'); + } + + return; + } // If the area to be rendered is bigger than area defined by LinearGradient, + // the canvas spec prescribes that the color of the first stop and the last + // stop should be used. But if two stops are added at offset 0, in effect + // browsers use the color of the second stop to render area outside + // LinearGradient. So we can only infinitesimally extend area defined in + // LinearGradient to render `outerColors`. + + + var axis = coordSys.getAxis(coordDim); // dataToCoor mapping may not be linear, but must be monotonic. + + var colorStops = map(visualMeta.stops, function (stop) { + return { + offset: 0, + coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)), + color: stop.color + }; + }); + var stopLen = colorStops.length; + var outerColors = visualMeta.outerColors.slice(); + + if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) { + colorStops.reverse(); + outerColors.reverse(); + } + + var tinyExtent = 10; // Arbitrary value: 10px + + var minCoord = colorStops[0].coord - tinyExtent; + var maxCoord = colorStops[stopLen - 1].coord + tinyExtent; + var coordSpan = maxCoord - minCoord; + + if (coordSpan < 1e-3) { + return 'transparent'; + } + + each(colorStops, function (stop) { + stop.offset = (stop.coord - minCoord) / coordSpan; + }); + colorStops.push({ + offset: stopLen ? colorStops[stopLen - 1].offset : 0.5, + color: outerColors[1] || 'transparent' + }); + colorStops.unshift({ + offset: stopLen ? colorStops[0].offset : 0.5, + color: outerColors[0] || 'transparent' + }); // zrUtil.each(colorStops, function (colorStop) { + // // Make sure each offset has rounded px to avoid not sharp edge + // colorStop.offset = (Math.round(colorStop.offset * (end - start) + start) - start) / (end - start); + // }); + + var gradient = new LinearGradient(0, 0, 0, 0, colorStops, true); + gradient[coordDim] = minCoord; + gradient[coordDim + '2'] = maxCoord; + return gradient; + } + + function getIsIgnoreFunc(seriesModel, data, coordSys) { + var showAllSymbol = seriesModel.get('showAllSymbol'); + var isAuto = showAllSymbol === 'auto'; + + if (showAllSymbol && !isAuto) { + return; + } + + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + + if (!categoryAxis) { + return; + } // Note that category label interval strategy might bring some weird effect + // in some scenario: users may wonder why some of the symbols are not + // displayed. So we show all symbols as possible as we can. + + + if (isAuto // Simplify the logic, do not determine label overlap here. + && canShowAllSymbolForCategory(categoryAxis, data)) { + return; + } // Otherwise follow the label interval strategy on category axis. + + + var categoryDataDim = data.mapDimension(categoryAxis.dim); + var labelMap = {}; + each(categoryAxis.getViewLabels(), function (labelItem) { + var ordinalNumber = categoryAxis.scale.getRawOrdinalNumber(labelItem.tickValue); + labelMap[ordinalNumber] = 1; + }); + return function (dataIndex) { + return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex)); + }; + } + + function canShowAllSymbolForCategory(categoryAxis, data) { + // In mose cases, line is monotonous on category axis, and the label size + // is close with each other. So we check the symbol size and some of the + // label size alone with the category axis to estimate whether all symbol + // can be shown without overlap. + var axisExtent = categoryAxis.getExtent(); + var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count(); + isNaN(availSize) && (availSize = 0); // 0/0 is NaN. + // Sampling some points, max 5. + + var dataLen = data.count(); + var step = Math.max(1, Math.round(dataLen / 5)); + + for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) { + if (Symbol.getSymbolSize(data, dataIndex // Only for cartesian, where `isHorizontal` exists. + )[categoryAxis.isHorizontal() ? 1 : 0] // Empirical number + * 1.5 > availSize) { + return false; + } + } + + return true; + } + + function isPointNull$1(x, y) { + return isNaN(x) || isNaN(y); + } + + function getLastIndexNotNull(points) { + var len = points.length / 2; + + for (; len > 0; len--) { + if (!isPointNull$1(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + return len - 1; + } + + function getPointAtIndex(points, idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + + function getIndexRange(points, xOrY, dim) { + var len = points.length / 2; + var dimIdx = dim === 'x' ? 0 : 1; + var a; + var b; + var prevIndex = 0; + var nextIndex = -1; + + for (var i = 0; i < len; i++) { + b = points[i * 2 + dimIdx]; + + if (isNaN(b) || isNaN(points[i * 2 + 1 - dimIdx])) { + continue; + } + + if (i === 0) { + a = b; + continue; + } + + if (a <= xOrY && b >= xOrY || a >= xOrY && b <= xOrY) { + nextIndex = i; + break; + } + + prevIndex = i; + a = b; + } + + return { + range: [prevIndex, nextIndex], + t: (xOrY - a) / (b - a) + }; + } + + function createLineClipPath(lineView, coordSys, hasAnimation, seriesModel) { + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + var endLabelModel_1 = seriesModel.getModel('endLabel'); + var showEndLabel = endLabelModel_1.get('show'); + var valueAnimation_1 = endLabelModel_1.get('valueAnimation'); + var data_1 = seriesModel.getData(); + var labelAnimationRecord_1 = { + lastFrameIndex: 0 + }; + var during = showEndLabel ? function (percent, clipRect) { + lineView._endLabelOnDuring(percent, clipRect, data_1, labelAnimationRecord_1, valueAnimation_1, endLabelModel_1, coordSys); + } : null; + var isHorizontal = coordSys.getBaseAxis().isHorizontal(); + var clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel, function () { + var endLabel = lineView._endLabel; + + if (endLabel && hasAnimation) { + if (labelAnimationRecord_1.originalX != null) { + endLabel.attr({ + x: labelAnimationRecord_1.originalX, + y: labelAnimationRecord_1.originalY + }); + } + } + }, during); // Expand clip shape to avoid clipping when line value exceeds axis + + if (!seriesModel.get('clip', true)) { + var rectShape = clipPath.shape; + var expandSize = Math.max(rectShape.width, rectShape.height); + + if (isHorizontal) { + rectShape.y -= expandSize; + rectShape.height += expandSize * 2; + } else { + rectShape.x -= expandSize; + rectShape.width += expandSize * 2; + } + } // Set to the final frame. To make sure label layout is right. + + + if (during) { + during(1, clipPath); + } + + return clipPath; + } else { + if ("development" !== 'production') { + if (seriesModel.get(['endLabel', 'show'])) { + console.warn('endLabel is not supported for lines in polar systems.'); + } + } + + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } + } + + function getEndLabelStateSpecified(endLabelModel, coordSys) { + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var align = isHorizontal ? isBaseInversed ? 'right' : 'left' : 'center'; + var verticalAlign = isHorizontal ? 'middle' : isBaseInversed ? 'top' : 'bottom'; + return { + normal: { + align: endLabelModel.get('align') || align, + verticalAlign: endLabelModel.get('verticalAlign') || verticalAlign + } + }; + } + + var LineView = + /** @class */ + function (_super) { + __extends(LineView, _super); + + function LineView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + LineView.prototype.init = function () { + var lineGroup = new Group(); + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + }; + + LineView.prototype.render = function (seriesModel, ecModel, api) { + var _this = this; + + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel('lineStyle'); + var areaStyleModel = seriesModel.getModel('areaStyle'); + var points = data.getLayout('points') || []; + 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 valueOrigin = areaStyleModel.get('origin'); + var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin); + var stackedOnPoints = isAreaChart && getStackedOnPoints(coordSys, data, dataCoordInfo); + var showSymbol = seriesModel.get('showSymbol'); + var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, 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); // FIXME step not support polar + + var step = !isCoordSysPolar ? seriesModel.get('step') : false; + var clipShapeForSymbol; + + if (coordSys && coordSys.getArea && seriesModel.get('clip', true)) { + clipShapeForSymbol = coordSys.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent. + // See #7913 and `test/dataZoom-clip.html`. + + if (clipShapeForSymbol.width != null) { + clipShapeForSymbol.x -= 0.1; + clipShapeForSymbol.y -= 0.1; + clipShapeForSymbol.width += 0.2; + clipShapeForSymbol.height += 0.2; + } else if (clipShapeForSymbol.r0) { + clipShapeForSymbol.r0 -= 0.5; + clipShapeForSymbol.r += 0.5; + } + } + + this._clipShapeForSymbol = clipShapeForSymbol; + var visualColor = getVisualGradient(data, coordSys) || data.getVisual('style')[data.getVisual('drawType')]; // Initialization animation or coordinate system changed + + if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) { + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function (idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); + hasAnimation && this._initSymbolLabelAnimation(data, coordSys, clipShapeForSymbol); + + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step); + + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step); + } + } + + polyline = this._newPolyline(points); + + if (isAreaChart) { + polygon = this._newPolygon(points, stackedOnPoints); + } // NOTE: Must update _endLabel before setClipPath. + + + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } + + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } else { + if (isAreaChart && !polygon) { + // If areaStyle is added + polygon = this._newPolygon(points, stackedOnPoints); + } else if (polygon && !isAreaChart) { + // If areaStyle is removed + lineGroup.remove(polygon); + polygon = this._polygon = null; + } // NOTE: Must update _endLabel before setClipPath. + + + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } // Update clipPath + + + lineGroup.setClipPath(createLineClipPath(this, coordSys, false, seriesModel)); // Always update, or it is wrong in the case turning on legend + // because points are not changed + + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function (idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); // 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._doUpdateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin); + } else { + // Not do it in update with animation + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step); + + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step); + } + } + + polyline.setShape({ + points: points + }); + polygon && polygon.setShape({ + points: points, + stackedOnPoints: stackedOnPoints + }); + } + } + } + + var focus = seriesModel.get(['emphasis', 'focus']); + var blurScope = seriesModel.get(['emphasis', 'blurScope']); + polyline.useStyle(defaults( // Use color in lineStyle first + lineStyleModel.getLineStyle(), { + fill: 'none', + stroke: visualColor, + lineJoin: 'bevel' + })); + setStatesStylesFromModel(polyline, seriesModel, 'lineStyle'); + + if (polyline.style.lineWidth > 0 && seriesModel.get(['emphasis', 'lineStyle', 'width']) === 'bolder') { + var emphasisLineStyle = polyline.getState('emphasis').style; + emphasisLineStyle.lineWidth = polyline.style.lineWidth + 1; + } // Needs seriesIndex for focus + + + getECData(polyline).seriesIndex = seriesModel.seriesIndex; + enableHoverEmphasis(polyline, focus, blurScope); + var smooth = getSmooth(seriesModel.get('smooth')); + var smoothMonotone = seriesModel.get('smoothMonotone'); + var connectNulls = seriesModel.get('connectNulls'); + polyline.setShape({ + smooth: smooth, + smoothMonotone: smoothMonotone, + connectNulls: connectNulls + }); + + if (polygon) { + var stackedOnSeries = data.getCalculationInfo('stackedOnSeries'); + var stackedOnSmooth = 0; + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: visualColor, + opacity: 0.7, + lineJoin: 'bevel', + decal: data.getVisual('style').decal + })); + + if (stackedOnSeries) { + stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth')); + } + + polygon.setShape({ + smooth: smooth, + stackedOnSmooth: stackedOnSmooth, + smoothMonotone: smoothMonotone, + connectNulls: connectNulls + }); + setStatesStylesFromModel(polygon, seriesModel, 'areaStyle'); // Needs seriesIndex for focus + + getECData(polygon).seriesIndex = seriesModel.seriesIndex; + enableHoverEmphasis(polygon, focus, blurScope); + } + + var changePolyState = function (toState) { + _this._changePolyState(toState); + }; + + data.eachItemGraphicEl(function (el) { + // Switch polyline / polygon state if element changed its state. + el && (el.onHoverStateChange = changePolyState); + }); + this._polyline.onHoverStateChange = changePolyState; + this._data = data; // Save the coordinate system for transition animation when data changed + + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + this._step = step; + this._valueOrigin = valueOrigin; + }; + + LineView.prototype.dispose = function () {}; + + LineView.prototype.highlight = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + this._changePolyState('emphasis'); + + if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) { + var points = data.getLayout('points'); + var symbol = data.getItemGraphicEl(dataIndex); + + if (!symbol) { + // Create a temporary symbol if it is not exists + var x = points[dataIndex * 2]; + var y = points[dataIndex * 2 + 1]; + + if (isNaN(x) || isNaN(y)) { + // Null data + return; + } // fix #11360: should't draw symbol outside clipShapeForSymbol + + + if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) { + return; + } + + symbol = new Symbol(data, dataIndex); + symbol.x = x; + symbol.y = y; + symbol.setZ(seriesModel.get('zlevel'), seriesModel.get('z')); + 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); + } + }; + + LineView.prototype.downplay = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + this._changePolyState('normal'); + + 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 { + // FIXME + // can not downplay completely. + // Downplay whole series + ChartView.prototype.downplay.call(this, seriesModel, ecModel, api, payload); + } + }; + + LineView.prototype._changePolyState = function (toState) { + var polygon = this._polygon; + setStatesFlag(this._polyline, toState); + polygon && setStatesFlag(polygon, toState); + }; + + LineView.prototype._newPolyline = function (points) { + var polyline = this._polyline; // Remove previous created polyline + + if (polyline) { + this._lineGroup.remove(polyline); + } + + polyline = new ECPolyline({ + shape: { + points: points + }, + segmentIgnoreThreshold: 2, + z2: 10 + }); + + this._lineGroup.add(polyline); + + this._polyline = polyline; + return polyline; + }; + + LineView.prototype._newPolygon = function (points, stackedOnPoints) { + var polygon = this._polygon; // Remove previous created polygon + + if (polygon) { + this._lineGroup.remove(polygon); + } + + polygon = new ECPolygon({ + shape: { + points: points, + stackedOnPoints: stackedOnPoints + }, + segmentIgnoreThreshold: 2 + }); + + this._lineGroup.add(polygon); + + this._polygon = polygon; + return polygon; + }; + + LineView.prototype._initSymbolLabelAnimation = function (data, coordSys, clipShape) { + var isHorizontalOrRadial; + var isCoordSysPolar; + var baseAxis = coordSys.getBaseAxis(); + var isAxisInverse = baseAxis.inverse; + + if (coordSys.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + isCoordSysPolar = false; + } else if (coordSys.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + isCoordSysPolar = true; + } + + var seriesModel = data.hostModel; + var seriesDuration = seriesModel.get('animationDuration'); + + if (typeof seriesDuration === 'function') { + seriesDuration = seriesDuration(null); + } + + var seriesDalay = seriesModel.get('animationDelay') || 0; + var seriesDalayValue = typeof seriesDalay === 'function' ? seriesDalay(null) : seriesDalay; + data.eachItemGraphicEl(function (symbol, idx) { + var el = symbol; + + if (el) { + var point = [symbol.x, symbol.y]; + var start = void 0; + var end = void 0; + var current = void 0; + + if (isCoordSysPolar) { + var polarClip = clipShape; + var coord = coordSys.pointToCoord(point); + + if (isHorizontalOrRadial) { + start = polarClip.startAngle; + end = polarClip.endAngle; + current = -coord[1] / 180 * Math.PI; + } else { + start = polarClip.r0; + end = polarClip.r; + current = coord[0]; + } + } else { + var gridClip = clipShape; + + if (isHorizontalOrRadial) { + start = gridClip.x; + end = gridClip.x + gridClip.width; + current = symbol.x; + } else { + start = gridClip.y + gridClip.height; + end = gridClip.y; + current = symbol.y; + } + } + + var ratio = end === start ? 0 : (current - start) / (end - start); + + if (isAxisInverse) { + ratio = 1 - ratio; + } + + var delay = typeof seriesDalay === 'function' ? seriesDalay(idx) : seriesDuration * ratio + seriesDalayValue; + var symbolPath = el.getSymbolPath(); + var text = symbolPath.getTextContent(); + el.attr({ + scaleX: 0, + scaleY: 0 + }); + el.animateTo({ + scaleX: 1, + scaleY: 1 + }, { + duration: 200, + delay: delay + }); + + if (text) { + text.animateFrom({ + style: { + opacity: 0 + } + }, { + duration: 300, + delay: delay + }); + } + + symbolPath.disableLabelAnimation = true; + } + }); + }; + + LineView.prototype._initOrUpdateEndLabel = function (seriesModel, coordSys, inheritColor) { + var endLabelModel = seriesModel.getModel('endLabel'); + + if (endLabelModel.get('show')) { + var data_2 = seriesModel.getData(); + var polyline = this._polyline; + var endLabel = this._endLabel; + + if (!endLabel) { + endLabel = this._endLabel = new ZRText({ + z2: 200 // should be higher than item symbol + + }); + endLabel.ignoreClip = true; + polyline.setTextContent(this._endLabel); + polyline.disableLabelAnimation = true; + } // Find last non-NaN data to display data + + + var dataIndex = getLastIndexNotNull(data_2.getLayout('points')); + + if (dataIndex >= 0) { + setLabelStyle(polyline, getLabelStatesModels(seriesModel, 'endLabel'), { + inheritColor: inheritColor, + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: function (dataIndex, opt, interpolatedValue) { + return interpolatedValue != null ? getDefaultInterpolatedLabel(data_2, interpolatedValue) : getDefaultLabel(data_2, dataIndex); + }, + enableTextSetter: true + }, getEndLabelStateSpecified(endLabelModel, coordSys)); + polyline.textConfig.position = null; + } + } else if (this._endLabel) { + this._polyline.removeTextContent(); + + this._endLabel = null; + } + }; + + LineView.prototype._endLabelOnDuring = function (percent, clipRect, data, animationRecord, valueAnimation, endLabelModel, coordSys) { + var endLabel = this._endLabel; + var polyline = this._polyline; + + if (endLabel) { + // NOTE: Don't remove percent < 1. percent === 1 means the first frame during render. + // The label is not prepared at this time. + if (percent < 1 && animationRecord.originalX == null) { + animationRecord.originalX = endLabel.x; + animationRecord.originalY = endLabel.y; + } + + var points = data.getLayout('points'); + var seriesModel = data.hostModel; + var connectNulls = seriesModel.get('connectNulls'); + var precision = endLabelModel.get('precision'); + var distance = endLabelModel.get('distance') || 0; + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var clipShape = clipRect.shape; + var xOrY = isBaseInversed ? isHorizontal ? clipShape.x : clipShape.y + clipShape.height : isHorizontal ? clipShape.x + clipShape.width : clipShape.y; + var distanceX = (isHorizontal ? distance : 0) * (isBaseInversed ? -1 : 1); + var distanceY = (isHorizontal ? 0 : -distance) * (isBaseInversed ? -1 : 1); + var dim = isHorizontal ? 'x' : 'y'; + var dataIndexRange = getIndexRange(points, xOrY, dim); + var indices = dataIndexRange.range; + var diff = indices[1] - indices[0]; + var value = void 0; + + if (diff >= 1) { + // diff > 1 && connectNulls, which is on the null data. + if (diff > 1 && !connectNulls) { + var pt = getPointAtIndex(points, indices[0]); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + valueAnimation && (value = seriesModel.getRawValue(indices[0])); + } else { + var pt = polyline.getPointOn(xOrY, dim); + pt && endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + var startValue = seriesModel.getRawValue(indices[0]); + var endValue = seriesModel.getRawValue(indices[1]); + valueAnimation && (value = interpolateRawValues(data, precision, startValue, endValue, dataIndexRange.t)); + } + + animationRecord.lastFrameIndex = indices[0]; + } else { + // If diff <= 0, which is the range is not found(Include NaN) + // Choose the first point or last point. + var idx = percent === 1 || animationRecord.lastFrameIndex > 0 ? indices[0] : 0; + var pt = getPointAtIndex(points, idx); + valueAnimation && (value = seriesModel.getRawValue(idx)); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + } + + if (valueAnimation) { + labelInner(endLabel).setLabelText(value); + } + } + }; + /** + * @private + */ + // FIXME Two value axis + + + LineView.prototype._doUpdateAnimation = function (data, stackedOnPoints, coordSys, api, step, valueOrigin) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin, valueOrigin); + var current = diff.current; + var stackedOnCurrent = diff.stackedOnCurrent; + var next = diff.next; + var stackedOnNext = diff.stackedOnNext; + + if (step) { + // TODO If stacked series is not step + current = turnPointsIntoStep(diff.current, coordSys, step); + stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step); + next = turnPointsIntoStep(diff.next, coordSys, step); + stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step); + } // Don't apply animation if diff is large. + // For better result and avoid memory explosion problems like + // https://github.com/apache/incubator-echarts/issues/12229 + + + if (getBoundingDiff(current, next) > 3000 || polygon && getBoundingDiff(stackedOnCurrent, stackedOnNext) > 3000) { + polyline.setShape({ + points: next + }); + + if (polygon) { + polygon.setShape({ + points: next, + stackedOnPoints: stackedOnNext + }); + } + + return; + } + + polyline.shape.__points = diff.current; + polyline.shape.points = current; + var target = { + shape: { + points: next + } + }; // Also animate the original points. + // If points reference is changed when turning into step line. + + if (diff.current !== current) { + target.shape.__points = diff.next; + } // Stop previous animation. + + + polyline.stopAnimation(); + updateProps(polyline, target, seriesModel); + + if (polygon) { + polygon.setShape({ + // Reuse the points with polyline. + points: current, + stackedOnPoints: stackedOnCurrent + }); + polygon.stopAnimation(); + updateProps(polygon, { + shape: { + stackedOnPoints: stackedOnNext + } + }, seriesModel); // If use attr directly in updateProps. + + if (polyline.shape.points !== polygon.shape.points) { + polygon.shape.points = polyline.shape.points; + } + } + + 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 () { + polygon && polygon.dirtyShape(); + var points = polyline.shape.__points; + + for (var i = 0; i < updatedDataInfo.length; i++) { + var el = updatedDataInfo[i].el; + var offset = updatedDataInfo[i].ptIdx * 2; + el.x = points[offset]; + el.y = points[offset + 1]; + el.markRedraw(); + } + }); + } + }; + + LineView.prototype.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._endLabel = this._data = null; + }; + + LineView.type = 'line'; + return LineView; + }(ChartView); + + function pointsLayout(seriesType, forceStoreInTypedArray) { + return { + seriesType: seriesType, + plan: createRenderPlanner(), + reset: function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var pipelineContext = seriesModel.pipelineContext; + var useTypedArray = forceStoreInTypedArray || pipelineContext.large; + + if (!coordSys) { + return; + } + + var dims = map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }).slice(0, 2); + var dimLen = dims.length; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + + if (isDimensionStacked(data, dims[0] + /*, dims[1]*/ + )) { + dims[0] = stackResultDim; + } + + if (isDimensionStacked(data, dims[1] + /*, dims[0]*/ + )) { + dims[1] = stackResultDim; + } + + var dimInfo0 = data.getDimensionInfo(dims[0]); + var dimInfo1 = data.getDimensionInfo(dims[1]); + var dimIdx0 = dimInfo0 && dimInfo0.index; + var dimIdx1 = dimInfo1 && dimInfo1.index; + return dimLen && { + progress: function (params, data) { + var segCount = params.end - params.start; + var points = useTypedArray && createFloat32Array(segCount * dimLen); + var tmpIn = []; + var tmpOut = []; + + for (var i = params.start, offset = 0; i < params.end; i++) { + var point = void 0; + + if (dimLen === 1) { + var x = data.getByDimIdx(dimIdx0, i); // NOTE: Make sure the second parameter is null to use default strategy. + + point = coordSys.dataToPoint(x, null, tmpOut); + } else { + tmpIn[0] = data.getByDimIdx(dimIdx0, i); + tmpIn[1] = data.getByDimIdx(dimIdx1, i); // Let coordinate system to handle the NaN data. + + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + } + + if (useTypedArray) { + points[offset++] = point[0]; + points[offset++] = point[1]; + } else { + data.setItemLayout(i, point.slice()); + } + } + + useTypedArray && data.setLayout('points', points); + } + }; + } + }; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + 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]); + } // NaN will cause illegal axis extent. + + + return isFinite(max) ? max : NaN; + }, + min: function (frame) { + var min = Infinity; + + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } // NaN will cause illegal axis extent. + + + return isFinite(min) ? min : NaN; + }, + // TODO + // Median + nearest: function (frame) { + return frame[0]; + } + }; + + var indexSampler = function (frame) { + return Math.round(frame.length / 2); + }; + + function dataSample(seriesType) { + return { + seriesType: seriesType, + // FIXME:TS never used, so comment it + // modifyOutputEnd: true, + reset: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + var count = data.count(); // Only cartesian2d support down sampling. Disable it when there is few data. + + if (count > 10 && coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + var dpr = api.getDevicePixelRatio(); // Coordinste system has been resized + + var size = Math.abs(extent[1] - extent[0]) * (dpr || 1); + var rate = Math.round(count / size); + + if (rate > 1) { + if (sampling === 'lttb') { + seriesModel.setData(data.lttbDownSample(data.mapDimension(valueAxis.dim), 1 / rate)); + } + + var sampler = void 0; + + if (typeof sampling === 'string') { + sampler = samplers[sampling]; + } else if (typeof sampling === 'function') { + sampler = sampling; + } + + if (sampler) { + // Only support sample the first dim mapped from value axis. + seriesModel.setData(data.downSample(data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler)); + } + } + } + } + }; + } + + function install$2(registers) { + registers.registerChartView(LineView); + registers.registerSeriesModel(LineSeriesModel); + registers.registerLayout(pointsLayout('line', true)); // Down sample after filter + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('line')); + } + + var BaseBarSeriesModel = + /** @class */ + function (_super) { + __extends(BaseBarSeriesModel, _super); + + function BaseBarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BaseBarSeriesModel.type; + return _this; + } + + BaseBarSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListFromArray(this.getSource(), this, { + useEncodeDefaulter: true + }); + }; + + BaseBarSeriesModel.prototype.getMarkerPosition = function (value) { + var coordSys = this.coordinateSystem; + + if (coordSys) { + // PENDING if clamp ? + var pt = coordSys.dataToPoint(coordSys.clampData(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]; + }; + + BaseBarSeriesModel.type = 'series.__base_bar__'; + BaseBarSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // stack: null + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + barMinHeight: 0, + barMinAngle: 0, + // cursor: null, + large: false, + largeThreshold: 400, + progressive: 3e3, + progressiveChunkMode: 'mod' + }; + return BaseBarSeriesModel; + }(SeriesModel); + + SeriesModel.registerClass(BaseBarSeriesModel); + + var BarSeriesModel = + /** @class */ + function (_super) { + __extends(BarSeriesModel, _super); + + function BarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BarSeriesModel.type; + return _this; + } + + BarSeriesModel.prototype.getInitialData = function () { + return createListFromArray(this.getSource(), this, { + useEncodeDefaulter: true, + createInvertedIndices: !!this.get('realtimeSort', true) || null + }); + }; + /** + * @override + */ + + + BarSeriesModel.prototype.getProgressive = function () { + // Do not support progressive in normal mode. + return this.get('large') ? this.get('progressive') : false; + }; + /** + * @override + */ + + + BarSeriesModel.prototype.getProgressiveThreshold = function () { + // Do not support progressive in normal mode. + var progressiveThreshold = this.get('progressiveThreshold'); + var largeThreshold = this.get('largeThreshold'); + + if (largeThreshold > progressiveThreshold) { + progressiveThreshold = largeThreshold; + } + + return progressiveThreshold; + }; + + BarSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.rect(data.getItemLayout(dataIndex)); + }; + + BarSeriesModel.type = 'series.bar'; + BarSeriesModel.dependencies = ['grid', 'polar']; + BarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { + // If clipped + // Only available on cartesian2d + clip: true, + roundCap: false, + showBackground: false, + backgroundStyle: { + color: 'rgba(180, 180, 180, 0.2)', + borderColor: null, + borderWidth: 0, + borderType: 'solid', + borderRadius: 0, + shadowBlur: 0, + shadowColor: null, + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + realtimeSort: false + }); + return BarSeriesModel; + }(BaseBarSeriesModel); + + /** + * Sausage: similar to sector, but have half circle on both sides + */ + + var SausageShape = + /** @class */ + function () { + function SausageShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + + return SausageShape; + }(); + + var SausagePath = + /** @class */ + function (_super) { + __extends(SausagePath, _super); + + function SausagePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'sausage'; + return _this; + } + + SausagePath.prototype.getDefaultShape = function () { + return new SausageShape(); + }; + + SausagePath.prototype.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 dr = (r - r0) * 0.5; + var rCenter = r0 + dr; + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + var unitStartX = Math.cos(startAngle); + var unitStartY = Math.sin(startAngle); + var unitEndX = Math.cos(endAngle); + var unitEndY = Math.sin(endAngle); + var lessThanCircle = clockwise ? endAngle - startAngle < Math.PI * 2 : startAngle - endAngle < Math.PI * 2; + + if (lessThanCircle) { + ctx.moveTo(unitStartX * r0 + x, unitStartY * r0 + y); + ctx.arc(unitStartX * rCenter + x, unitStartY * rCenter + y, dr, -Math.PI + startAngle, startAngle, !clockwise); + } + + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + ctx.moveTo(unitEndX * r + x, unitEndY * r + y); + ctx.arc(unitEndX * rCenter + x, unitEndY * rCenter + y, dr, endAngle - Math.PI * 2, endAngle - Math.PI, !clockwise); + + if (r0 !== 0) { + ctx.arc(x, y, r0, endAngle, startAngle, clockwise); + ctx.moveTo(unitStartX * r0 + x, unitEndY * r0 + y); + } + + ctx.closePath(); + }; + + return SausagePath; + }(Path); + + var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'borderWidth']; + var BAR_BORDER_RADIUS_QUERY = ['itemStyle', 'borderRadius']; + var _eventPos = [0, 0]; + var mathMax$6 = Math.max; + var mathMin$6 = Math.min; + + function getClipArea(coord, data) { + var coordSysClipArea = coord.getArea && coord.getArea(); + + if (isCoordinateSystemType(coord, 'cartesian2d')) { + var baseAxis = coord.getBaseAxis(); // When boundaryGap is false or using time axis. bar may exceed the grid. + // We should not clip this part. + // See test/bar2.html + + if (baseAxis.type !== 'category' || !baseAxis.onBand) { + var expandWidth = data.getLayout('bandWidth'); + + if (baseAxis.isHorizontal()) { + coordSysClipArea.x -= expandWidth; + coordSysClipArea.width += expandWidth * 2; + } else { + coordSysClipArea.y -= expandWidth; + coordSysClipArea.height += expandWidth * 2; + } + } + } + + return coordSysClipArea; + } + + var BarView = + /** @class */ + function (_super) { + __extends(BarView, _super); + + function BarView() { + var _this = _super.call(this) || this; + + _this.type = BarView.type; + _this._isFirstFrame = true; + return _this; + } + + BarView.prototype.render = function (seriesModel, ecModel, api, payload) { + this._model = seriesModel; + + this._removeOnRenderedListener(api); + + this._updateDrawMode(seriesModel); + + var coordinateSystemType = seriesModel.get('coordinateSystem'); + + if (coordinateSystemType === 'cartesian2d' || coordinateSystemType === 'polar') { + this._isLargeDraw ? this._renderLarge(seriesModel, ecModel, api) : this._renderNormal(seriesModel, ecModel, api, payload); + } else if ("development" !== 'production') { + warn('Only cartesian2d and polar supported for bar.'); + } + }; + + BarView.prototype.incrementalPrepareRender = function (seriesModel) { + this._clear(); + + this._updateDrawMode(seriesModel); // incremental also need to clip, otherwise might be overlow. + // But must not set clip in each frame, otherwise all of the children will be marked redraw. + + + this._updateLargeClip(seriesModel); + }; + + BarView.prototype.incrementalRender = function (params, seriesModel) { + // Do not support progressive in normal mode. + this._incrementalRenderLarge(params, seriesModel); + }; + + BarView.prototype._updateDrawMode = function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + + if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + + this._clear(); + } + }; + + BarView.prototype._renderNormal = function (seriesModel, ecModel, api, payload) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + var coord = seriesModel.coordinateSystem; + var baseAxis = coord.getBaseAxis(); + var isHorizontalOrRadial; + + if (coord.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + } else if (coord.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + } + + var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null; + var realtimeSortCfg = shouldRealtimeSort(seriesModel, coord); + + if (realtimeSortCfg) { + this._enableRealtimeSort(realtimeSortCfg, data, api); + } + + var needsClip = seriesModel.get('clip', true) || realtimeSortCfg; + var coordSysClipArea = getClipArea(coord, data); // If there is clipPath created in large mode. Remove it. + + group.removeClipPath(); // We don't use clipPath in normal mode because we needs a perfect animation + // And don't want the label are clipped. + + var roundCap = seriesModel.get('roundCap', true); + var drawBackground = seriesModel.get('showBackground', true); + var backgroundModel = seriesModel.getModel('backgroundStyle'); + var barBorderRadius = backgroundModel.get('borderRadius') || 0; + var bgEls = []; + var oldBgEls = this._backgroundEls; + var isInitSort = payload && payload.isInitSort; + var isChangeOrder = payload && payload.type === 'changeAxisOrder'; + + function createBackground(dataIndex) { + var bgLayout = getLayout[coord.type](data, dataIndex); + var bgEl = createBackgroundEl(coord, isHorizontalOrRadial, bgLayout); + bgEl.useStyle(backgroundModel.getItemStyle()); // Only cartesian2d support borderRadius. + + if (coord.type === 'cartesian2d') { + bgEl.setShape('r', barBorderRadius); + } + + bgEls[dataIndex] = bgEl; + return bgEl; + } + data.diff(oldData).add(function (dataIndex) { + var itemModel = data.getItemModel(dataIndex); + var layout = getLayout[coord.type](data, dataIndex, itemModel); + + if (drawBackground) { + createBackground(dataIndex); + } // If dataZoom in filteMode: 'empty', the baseValue can be set as NaN in "axisProxy". + + + if (!data.hasValue(dataIndex)) { + return; + } + + var isClipped = false; + + if (needsClip) { + // Clip will modify the layout params. + // And return a boolean to determine if the shape are fully clipped. + isClipped = clip[coord.type](coordSysClipArea, layout); + } + + var el = elementCreator[coord.type](seriesModel, data, dataIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, false, roundCap); + updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar'); + + if (isInitSort) { + el.attr({ + shape: layout + }); + } else if (realtimeSortCfg) { + updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, dataIndex, isHorizontalOrRadial, false, false); + } else { + initProps(el, { + shape: layout + }, seriesModel, dataIndex); + } + + data.setItemGraphicEl(dataIndex, el); + group.add(el); + el.ignore = isClipped; + }).update(function (newIndex, oldIndex) { + var itemModel = data.getItemModel(newIndex); + var layout = getLayout[coord.type](data, newIndex, itemModel); + + if (drawBackground) { + var bgEl = void 0; + + if (oldBgEls.length === 0) { + bgEl = createBackground(oldIndex); + } else { + bgEl = oldBgEls[oldIndex]; + bgEl.useStyle(backgroundModel.getItemStyle()); // Only cartesian2d support borderRadius. + + if (coord.type === 'cartesian2d') { + bgEl.setShape('r', barBorderRadius); + } + + bgEls[newIndex] = bgEl; + } + + var bgLayout = getLayout[coord.type](data, newIndex); + var shape = createBackgroundShape(isHorizontalOrRadial, bgLayout, coord); + updateProps(bgEl, { + shape: shape + }, animationModel, newIndex); + } + + var el = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex)) { + group.remove(el); + el = null; + return; + } + + var isClipped = false; + + if (needsClip) { + isClipped = clip[coord.type](coordSysClipArea, layout); + + if (isClipped) { + group.remove(el); + } + } + + if (!el) { + el = elementCreator[coord.type](seriesModel, data, newIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, !!el, roundCap); + } // Not change anything if only order changed. + // Especially not change label. + + + if (!isChangeOrder) { + updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar'); + } + + if (isInitSort) { + el.attr({ + shape: layout + }); + } else if (realtimeSortCfg) { + updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, newIndex, isHorizontalOrRadial, true, isChangeOrder); + } else { + updateProps(el, { + shape: layout + }, seriesModel, newIndex, null); + } + + data.setItemGraphicEl(newIndex, el); + el.ignore = isClipped; + group.add(el); + }).remove(function (dataIndex) { + var el = oldData.getItemGraphicEl(dataIndex); + el && removeElementWithFadeOut(el, seriesModel, dataIndex); + }).execute(); + var bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group()); + bgGroup.removeAll(); + + for (var i = 0; i < bgEls.length; ++i) { + bgGroup.add(bgEls[i]); + } + + group.add(bgGroup); + this._backgroundEls = bgEls; + this._data = data; + }; + + BarView.prototype._renderLarge = function (seriesModel, ecModel, api) { + this._clear(); + + createLarge(seriesModel, this.group); + + this._updateLargeClip(seriesModel); + }; + + BarView.prototype._incrementalRenderLarge = function (params, seriesModel) { + this._removeBackground(); + + createLarge(seriesModel, this.group, true); + }; + + BarView.prototype._updateLargeClip = function (seriesModel) { + // Use clipPath in large mode. + var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null; + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + }; + + BarView.prototype._enableRealtimeSort = function (realtimeSortCfg, data, api) { + var _this = this; // If no data in the first frame, wait for data to initSort + + + if (!data.count()) { + return; + } + + var baseAxis = realtimeSortCfg.baseAxis; + + if (this._isFirstFrame) { + this._dispatchInitSort(data, realtimeSortCfg, api); + + this._isFirstFrame = false; + } else { + var orderMapping_1 = function (idx) { + var el = data.getItemGraphicEl(idx); + + if (el) { + var shape = el.shape; // If data is NaN, shape.xxx may be NaN, so use || 0 here in case + + return (baseAxis.isHorizontal() // The result should be consistent with the initial sort by data value. + // Do not support the case that both positive and negative exist. + ? Math.abs(shape.height) : Math.abs(shape.width)) || 0; + } else { + return 0; + } + }; + + this._onRendered = function () { + _this._updateSortWithinSameData(data, orderMapping_1, baseAxis, api); + }; + + api.getZr().on('rendered', this._onRendered); + } + }; + + BarView.prototype._dataSort = function (data, baseAxis, orderMapping) { + var info = []; + data.each(data.mapDimension(baseAxis.dim), function (ordinalNumber, dataIdx) { + var mappedValue = orderMapping(dataIdx); + mappedValue = mappedValue == null ? NaN : mappedValue; + info.push({ + dataIndex: dataIdx, + mappedValue: mappedValue, + ordinalNumber: ordinalNumber + }); + }); + info.sort(function (a, b) { + // If NaN, it will be treated as min val. + return b.mappedValue - a.mappedValue; + }); + return { + ordinalNumbers: map(info, function (item) { + return item.ordinalNumber; + }) + }; + }; + + BarView.prototype._isOrderChangedWithinSameData = function (data, orderMapping, baseAxis) { + var scale = baseAxis.scale; + var ordinalDataDim = data.mapDimension(baseAxis.dim); + var lastValue = Number.MAX_VALUE; + + for (var tickNum = 0, len = scale.getOrdinalMeta().categories.length; tickNum < len; ++tickNum) { + var rawIdx = data.rawIndexOf(ordinalDataDim, scale.getRawOrdinalNumber(tickNum)); + var value = rawIdx < 0 // If some tick have no bar, the tick will be treated as min. + ? Number.MIN_VALUE // PENDING: if dataZoom on baseAxis exits, is it a performance issue? + : orderMapping(data.indexOfRawIndex(rawIdx)); + + if (value > lastValue) { + return true; + } + + lastValue = value; + } + + return false; + }; + /* + * Consider the case when A and B changed order, whose representing + * bars are both out of sight, we don't wish to trigger reorder action + * as long as the order in the view doesn't change. + */ + + + BarView.prototype._isOrderDifferentInView = function (orderInfo, baseAxis) { + var scale = baseAxis.scale; + var extent = scale.getExtent(); + var tickNum = Math.max(0, extent[0]); + var tickMax = Math.min(extent[1], scale.getOrdinalMeta().categories.length - 1); + + for (; tickNum <= tickMax; ++tickNum) { + if (orderInfo.ordinalNumbers[tickNum] !== scale.getRawOrdinalNumber(tickNum)) { + return true; + } + } + }; + + BarView.prototype._updateSortWithinSameData = function (data, orderMapping, baseAxis, api) { + if (!this._isOrderChangedWithinSameData(data, orderMapping, baseAxis)) { + return; + } + + var sortInfo = this._dataSort(data, baseAxis, orderMapping); + + if (this._isOrderDifferentInView(sortInfo, baseAxis)) { + this._removeOnRenderedListener(api); + + api.dispatchAction({ + type: 'changeAxisOrder', + componentType: baseAxis.dim + 'Axis', + axisId: baseAxis.index, + sortInfo: sortInfo + }); + } + }; + + BarView.prototype._dispatchInitSort = function (data, realtimeSortCfg, api) { + var baseAxis = realtimeSortCfg.baseAxis; + + var sortResult = this._dataSort(data, baseAxis, function (dataIdx) { + return data.get(data.mapDimension(realtimeSortCfg.otherAxis.dim), dataIdx); + }); + + api.dispatchAction({ + type: 'changeAxisOrder', + componentType: baseAxis.dim + 'Axis', + isInitSort: true, + axisId: baseAxis.index, + sortInfo: sortResult, + animation: { + // Update the axis label from the natural initial layout to + // sorted layout should has no animation. + duration: 0 + } + }); + }; + + BarView.prototype.remove = function (ecModel, api) { + this._clear(this._model); + + this._removeOnRenderedListener(api); + }; + + BarView.prototype.dispose = function (ecModel, api) { + this._removeOnRenderedListener(api); + }; + + BarView.prototype._removeOnRenderedListener = function (api) { + if (this._onRendered) { + api.getZr().off('rendered', this._onRendered); + this._onRendered = null; + } + }; + + BarView.prototype._clear = function (model) { + var group = this.group; + var data = this._data; + + if (model && model.isAnimationEnabled() && data && !this._isLargeDraw) { + this._removeBackground(); + + this._backgroundEls = []; + data.eachItemGraphicEl(function (el) { + removeElementWithFadeOut(el, model, getECData(el).dataIndex); + }); + } else { + group.removeAll(); + } + + this._data = null; + this._isFirstFrame = true; + }; + + BarView.prototype._removeBackground = function () { + this.group.remove(this._backgroundGroup); + this._backgroundGroup = null; + }; + + BarView.type = 'bar'; + return BarView; + }(ChartView); + + var clip = { + cartesian2d: function (coordSysBoundingRect, layout) { + var signWidth = layout.width < 0 ? -1 : 1; + var signHeight = layout.height < 0 ? -1 : 1; // Needs positive width and height + + if (signWidth < 0) { + layout.x += layout.width; + layout.width = -layout.width; + } + + if (signHeight < 0) { + layout.y += layout.height; + layout.height = -layout.height; + } + + var coordSysX2 = coordSysBoundingRect.x + coordSysBoundingRect.width; + var coordSysY2 = coordSysBoundingRect.y + coordSysBoundingRect.height; + var x = mathMax$6(layout.x, coordSysBoundingRect.x); + var x2 = mathMin$6(layout.x + layout.width, coordSysX2); + var y = mathMax$6(layout.y, coordSysBoundingRect.y); + var y2 = mathMin$6(layout.y + layout.height, coordSysY2); + var xClipped = x2 < x; + var yClipped = y2 < y; // When xClipped or yClipped, the element will be marked as `ignore`. + // But we should also place the element at the edge of the coord sys bounding rect. + // Beause if data changed and the bar show again, its transition animaiton + // will begin at this place. + + layout.x = xClipped && x > coordSysX2 ? x2 : x; + layout.y = yClipped && y > coordSysY2 ? y2 : y; + layout.width = xClipped ? 0 : x2 - x; + layout.height = yClipped ? 0 : y2 - y; // Reverse back + + if (signWidth < 0) { + layout.x += layout.width; + layout.width = -layout.width; + } + + if (signHeight < 0) { + layout.y += layout.height; + layout.height = -layout.height; + } + + return xClipped || yClipped; + }, + polar: function (coordSysClipArea, layout) { + var signR = layout.r0 <= layout.r ? 1 : -1; // Make sure r is larger than r0 + + if (signR < 0) { + var tmp = layout.r; + layout.r = layout.r0; + layout.r0 = tmp; + } + + var r = mathMin$6(layout.r, coordSysClipArea.r); + var r0 = mathMax$6(layout.r0, coordSysClipArea.r0); + layout.r = r; + layout.r0 = r0; + var clipped = r - r0 < 0; // Reverse back + + if (signR < 0) { + var tmp = layout.r; + layout.r = layout.r0; + layout.r0 = tmp; + } + + return clipped; + } + }; + var elementCreator = { + cartesian2d: function (seriesModel, data, newIndex, layout, isHorizontal, animationModel, axisModel, isUpdate, roundCap) { + var rect = new Rect({ + shape: extend({}, layout), + z2: 1 + }); + rect.__dataIndex = newIndex; + rect.name = 'item'; + + if (animationModel) { + var rectShape = rect.shape; + var animateProperty = isHorizontal ? 'height' : 'width'; + rectShape[animateProperty] = 0; + } + + return rect; + }, + polar: function (seriesModel, data, newIndex, layout, isRadial, animationModel, axisModel, isUpdate, roundCap) { + // Keep the same logic with bar in catesion: use end value to control + // direction. Notice that if clockwise is true (by default), the sector + // will always draw clockwisely, no matter whether endAngle is greater + // or less than startAngle. + var clockwise = layout.startAngle < layout.endAngle; + var ShapeClass = !isRadial && roundCap ? SausagePath : Sector; + var sector = new ShapeClass({ + shape: defaults({ + clockwise: clockwise + }, layout), + z2: 1 + }); + sector.name = 'item'; // Animation + + if (animationModel) { + var sectorShape = sector.shape; + var animateProperty = isRadial ? 'r' : 'endAngle'; + var animateTarget = {}; + sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle; + animateTarget[animateProperty] = layout[animateProperty]; + (isUpdate ? updateProps : initProps)(sector, { + shape: animateTarget // __value: typeof dataValue === 'string' ? parseInt(dataValue, 10) : dataValue + + }, animationModel); + } + + return sector; + } + }; + + function shouldRealtimeSort(seriesModel, coordSys) { + var realtimeSortOption = seriesModel.get('realtimeSort', true); + var baseAxis = coordSys.getBaseAxis(); + + if ("development" !== 'production') { + if (realtimeSortOption) { + if (baseAxis.type !== 'category') { + warn('`realtimeSort` will not work because this bar series is not based on a category axis.'); + } + + if (coordSys.type !== 'cartesian2d') { + warn('`realtimeSort` will not work because this bar series is not on cartesian2d.'); + } + } + } + + if (realtimeSortOption && baseAxis.type === 'category' && coordSys.type === 'cartesian2d') { + return { + baseAxis: baseAxis, + otherAxis: coordSys.getOtherAxis(baseAxis) + }; + } + } + + function updateRealtimeAnimation(realtimeSortCfg, seriesAnimationModel, el, layout, newIndex, isHorizontal, isUpdate, isChangeOrder) { + var seriesTarget; + var axisTarget; + + if (isHorizontal) { + axisTarget = { + x: layout.x, + width: layout.width + }; + seriesTarget = { + y: layout.y, + height: layout.height + }; + } else { + axisTarget = { + y: layout.y, + height: layout.height + }; + seriesTarget = { + x: layout.x, + width: layout.width + }; + } + + if (!isChangeOrder) { + // Keep the original growth animation if only axis order changed. + // Not start a new animation. + (isUpdate ? updateProps : initProps)(el, { + shape: seriesTarget + }, seriesAnimationModel, newIndex, null); + } + + var axisAnimationModel = seriesAnimationModel ? realtimeSortCfg.baseAxis.model : null; + (isUpdate ? updateProps : initProps)(el, { + shape: axisTarget + }, axisAnimationModel, newIndex); + } + + var getLayout = { + // itemModel is only used to get borderWidth, which is not needed + // when calculating bar background layout. + cartesian2d: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + var fixedLineWidth = itemModel ? getLineWidth(itemModel, layout) : 0; // fix layout with lineWidth + + var signX = layout.width > 0 ? 1 : -1; + var signY = layout.height > 0 ? 1 : -1; + return { + x: layout.x + signX * fixedLineWidth / 2, + y: layout.y + signY * fixedLineWidth / 2, + width: layout.width - signX * fixedLineWidth, + height: layout.height - signY * fixedLineWidth + }; + }, + polar: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + return { + cx: layout.cx, + cy: layout.cy, + r0: layout.r0, + r: layout.r, + startAngle: layout.startAngle, + endAngle: layout.endAngle + }; + } + }; + + function isZeroOnPolar(layout) { + return layout.startAngle != null && layout.endAngle != null && layout.startAngle === layout.endAngle; + } + + function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal, isPolar) { + var style = data.getItemVisual(dataIndex, 'style'); + + if (!isPolar) { + el.setShape('r', itemModel.get(BAR_BORDER_RADIUS_QUERY) || 0); + } + + el.useStyle(style); + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && el.attr('cursor', cursorStyle); + + if (!isPolar) { + var labelPositionOutside = isHorizontal ? layout.height > 0 ? 'bottom' : 'top' : layout.width > 0 ? 'left' : 'right'; + var labelStatesModels = getLabelStatesModels(itemModel); + setLabelStyle(el, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(seriesModel.getData(), dataIndex), + inheritColor: style.fill, + defaultOpacity: style.opacity, + defaultOutsidePosition: labelPositionOutside + }); + var label = el.getTextContent(); + setLabelValueAnimation(label, labelStatesModels, seriesModel.getRawValue(dataIndex), function (value) { + return getDefaultInterpolatedLabel(data, value); + }); + } + + var emphasisModel = itemModel.getModel(['emphasis']); + enableHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + setStatesStylesFromModel(el, itemModel); + + if (isZeroOnPolar(layout)) { + el.style.fill = 'none'; + el.style.stroke = 'none'; + each(el.states, function (state) { + if (state.style) { + state.style.fill = state.style.stroke = 'none'; + } + }); + } + } // In case width or height are too small. + + + function getLineWidth(itemModel, rawLayout) { + var lineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0; // width or height may be NaN for empty data + + var width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width); + var height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height); + return Math.min(lineWidth, width, height); + } + + var LagePathShape = + /** @class */ + function () { + function LagePathShape() {} + + return LagePathShape; + }(); + + var LargePath = + /** @class */ + function (_super) { + __extends(LargePath, _super); + + function LargePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'largeBar'; + return _this; + } + + LargePath.prototype.getDefaultShape = function () { + return new LagePathShape(); + }; + + LargePath.prototype.buildPath = function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + var startPoint = this.__startPoint; + var baseDimIdx = this.__baseDimIdx; + + for (var i = 0; i < points.length; i += 2) { + startPoint[baseDimIdx] = points[i + baseDimIdx]; + ctx.moveTo(startPoint[0], startPoint[1]); + ctx.lineTo(points[i], points[i + 1]); + } + }; + + return LargePath; + }(Path); + + function createLarge(seriesModel, group, incremental) { + // TODO support polar + var data = seriesModel.getData(); + var startPoint = []; + var baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0; + startPoint[1 - baseDimIdx] = data.getLayout('valueAxisStart'); + var largeDataIndices = data.getLayout('largeDataIndices'); + var barWidth = data.getLayout('barWidth'); + var backgroundModel = seriesModel.getModel('backgroundStyle'); + var drawBackground = seriesModel.get('showBackground', true); + + if (drawBackground) { + var points = data.getLayout('largeBackgroundPoints'); + var backgroundStartPoint = []; + backgroundStartPoint[1 - baseDimIdx] = data.getLayout('backgroundStart'); + var bgEl = new LargePath({ + shape: { + points: points + }, + incremental: !!incremental, + silent: true, + z2: 0 + }); + bgEl.__startPoint = backgroundStartPoint; + bgEl.__baseDimIdx = baseDimIdx; + bgEl.__largeDataIndices = largeDataIndices; + bgEl.__barWidth = barWidth; + setLargeBackgroundStyle(bgEl, backgroundModel, data); + group.add(bgEl); + } + + var el = new LargePath({ + shape: { + points: data.getLayout('largePoints') + }, + incremental: !!incremental + }); + el.__startPoint = startPoint; + el.__baseDimIdx = baseDimIdx; + el.__largeDataIndices = largeDataIndices; + el.__barWidth = barWidth; + group.add(el); + setLargeStyle(el, seriesModel, data); // Enable tooltip and user mouse/touch event handlers. + + getECData(el).seriesIndex = seriesModel.seriesIndex; + + if (!seriesModel.get('silent')) { + el.on('mousedown', largePathUpdateDataIndex); + el.on('mousemove', largePathUpdateDataIndex); + } + } // Use throttle to avoid frequently traverse to find dataIndex. + + + var largePathUpdateDataIndex = throttle(function (event) { + var largePath = this; + var dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY); + getECData(largePath).dataIndex = dataIndex >= 0 ? dataIndex : null; + }, 30, false); + + function largePathFindDataIndex(largePath, x, y) { + var baseDimIdx = largePath.__baseDimIdx; + var valueDimIdx = 1 - baseDimIdx; + var points = largePath.shape.points; + var largeDataIndices = largePath.__largeDataIndices; + var barWidthHalf = Math.abs(largePath.__barWidth / 2); + var startValueVal = largePath.__startPoint[valueDimIdx]; + _eventPos[0] = x; + _eventPos[1] = y; + var pointerBaseVal = _eventPos[baseDimIdx]; + var pointerValueVal = _eventPos[1 - baseDimIdx]; + var baseLowerBound = pointerBaseVal - barWidthHalf; + var baseUpperBound = pointerBaseVal + barWidthHalf; + + for (var i = 0, len = points.length / 2; i < len; i++) { + var ii = i * 2; + var barBaseVal = points[ii + baseDimIdx]; + var barValueVal = points[ii + valueDimIdx]; + + if (barBaseVal >= baseLowerBound && barBaseVal <= baseUpperBound && (startValueVal <= barValueVal ? pointerValueVal >= startValueVal && pointerValueVal <= barValueVal : pointerValueVal >= barValueVal && pointerValueVal <= startValueVal)) { + return largeDataIndices[i]; + } + } + + return -1; + } + + function setLargeStyle(el, seriesModel, data) { + var globalStyle = data.getVisual('style'); + el.useStyle(extend({}, globalStyle)); // Use stroke instead of fill. + + el.style.fill = null; + el.style.stroke = globalStyle.fill; + el.style.lineWidth = data.getLayout('barWidth'); + } + + function setLargeBackgroundStyle(el, backgroundModel, data) { + var borderColor = backgroundModel.get('borderColor') || backgroundModel.get('color'); + var itemStyle = backgroundModel.getItemStyle(); + el.useStyle(itemStyle); + el.style.fill = null; + el.style.stroke = borderColor; + el.style.lineWidth = data.getLayout('barWidth'); + } + + function createBackgroundShape(isHorizontalOrRadial, layout, coord) { + if (isCoordinateSystemType(coord, 'cartesian2d')) { + var rectShape = layout; + var coordLayout = coord.getArea(); + return { + x: isHorizontalOrRadial ? rectShape.x : coordLayout.x, + y: isHorizontalOrRadial ? coordLayout.y : rectShape.y, + width: isHorizontalOrRadial ? rectShape.width : coordLayout.width, + height: isHorizontalOrRadial ? coordLayout.height : rectShape.height + }; + } else { + var coordLayout = coord.getArea(); + var sectorShape = layout; + return { + cx: coordLayout.cx, + cy: coordLayout.cy, + r0: isHorizontalOrRadial ? coordLayout.r0 : sectorShape.r0, + r: isHorizontalOrRadial ? coordLayout.r : sectorShape.r, + startAngle: isHorizontalOrRadial ? sectorShape.startAngle : 0, + endAngle: isHorizontalOrRadial ? sectorShape.endAngle : Math.PI * 2 + }; + } + } + + function createBackgroundEl(coord, isHorizontalOrRadial, layout) { + var ElementClz = coord.type === 'polar' ? Sector : Rect; + return new ElementClz({ + shape: createBackgroundShape(isHorizontalOrRadial, layout, coord), + silent: true, + z2: 0 + }); + } + + function install$3(registers) { + registers.registerChartView(BarView); + registers.registerSeriesModel(BarSeriesModel); + registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'bar')); // Use higher prority to avoid to be blocked by other overall layout, which do not + // only exist in this module, but probably also exist in other modules, like `barPolar`. + + registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, largeLayout); + registers.registerVisual({ + seriesType: 'bar', + reset: function (seriesModel) { + // Visual coding for legend + seriesModel.getData().setVisual('legendSymbol', 'roundRect'); + } + }); // Down sample after filter + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('bar')); + /** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + registers.registerAction({ + type: 'changeAxisOrder', + event: 'changeAxisOrder', + update: 'update' + }, function (payload, ecModel) { + var componentType = payload.componentType || 'series'; + ecModel.eachComponent({ + mainType: componentType, + query: payload + }, function (componentModel) { + if (payload.sortInfo) { + componentModel.axis.setCategorySortInfo(payload.sortInfo); + } + }); + }); + } + + var PI2$8 = Math.PI * 2; + var RADIAN = Math.PI / 180; + + function getViewRect(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function pieLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var viewRect = getViewRect(seriesModel, api); + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + + if (!isArray(center)) { + center = [center, center]; + } + + var width = parsePercent$1(viewRect.width, api.getWidth()); + var height = parsePercent$1(viewRect.height, api.getHeight()); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width) + viewRect.x; + var cy = parsePercent$1(center[1], height) + viewRect.y; + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + var startAngle = -seriesModel.get('startAngle') * RADIAN; + var minAngle = seriesModel.get('minAngle') * RADIAN; + var validDataCount = 0; + data.each(valueDim, function (value) { + !isNaN(value) && validDataCount++; + }); + var sum = data.getSum(valueDim); // Sum may be 0 + + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var clockwise = seriesModel.get('clockwise'); + var roseType = seriesModel.get('roseType'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // [0...max] + + var extent = data.getDataExtent(valueDim); + extent[0] = 0; // In the case some sector angle is smaller than minAngle + + var restAngle = PI2$8; + var valueSumLargerThanMinAngle = 0; + var currentAngle = startAngle; + var dir = clockwise ? 1 : -1; + data.setLayout({ + viewRect: viewRect, + r: r + }); + data.each(valueDim, function (value, idx) { + var angle; + + if (isNaN(value)) { + data.setItemLayout(idx, { + angle: NaN, + startAngle: NaN, + endAngle: NaN, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? NaN : r + }); + return; + } // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + + + if (roseType !== 'area') { + angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + } else { + angle = PI2$8 / validDataCount; + } + + 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 ? linearMap(value, extent, [r0, r]) : r + }); + currentAngle = endAngle; + }); // Some sector is constrained by minAngle + // Rest sectors needs recalculate angle + + if (restAngle < PI2$8 && validDataCount) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle + if (restAngle <= 1e-3) { + var angle_1 = PI2$8 / validDataCount; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_1 = data.getItemLayout(idx); + layout_1.angle = angle_1; + layout_1.startAngle = startAngle + dir * idx * angle_1; + layout_1.endAngle = startAngle + dir * (idx + 1) * angle_1; + } + }); + } else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_2 = data.getItemLayout(idx); + var angle = layout_2.angle === minAngle ? minAngle : value * unitRadian; + layout_2.startAngle = currentAngle; + layout_2.endAngle = currentAngle + dir * angle; + currentAngle += dir * angle; + } + }); + } + } + }); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function dataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (!legendModels || !legendModels.length) { + return; + } + + var data = seriesModel.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++) { + // @ts-ignore FIXME: LegendModel + if (!legendModels[i].isSelected(name)) { + return false; + } + } + + return true; + }); + } + }; + } + + var RADIAN$1 = Math.PI / 180; + + function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) { + if (list.length < 2) { + return; + } + + function recalculateXOnSemiToAlignOnEllipseCurve(semi) { + var rB = semi.rB; + var rB2 = rB * rB; + + for (var i = 0; i < semi.list.length; i++) { + var item = semi.list[i]; + var dy = Math.abs(item.label.y - cy); // horizontal r is always same with original r because x is not changed. + + var rA = r + item.len; + var rA2 = rA * rA; // Use ellipse implicit function to calculate x + + var dx = Math.sqrt((1 - Math.abs(dy * dy / rB2)) * rA2); + item.label.x = cx + (dx + item.len2) * dir; + } + } // Adjust X based on the shifted y. Make tight labels aligned on an ellipse curve. + + + function recalculateX(items) { + // Extremes of + var topSemi = { + list: [], + maxY: 0 + }; + var bottomSemi = { + list: [], + maxY: 0 + }; + + for (var i = 0; i < items.length; i++) { + if (items[i].labelAlignTo !== 'none') { + continue; + } + + var item = items[i]; + var semi = item.label.y > cy ? bottomSemi : topSemi; + var dy = Math.abs(item.label.y - cy); + + if (dy > semi.maxY) { + var dx = item.label.x - cx - item.len2 * dir; // horizontal r is always same with original r because x is not changed. + + var rA = r + item.len; // Canculate rB based on the topest / bottemest label. + + var rB = Math.abs(dx) < rA ? Math.sqrt(dy * dy / (1 - dx * dx / rA / rA)) : rA; + semi.rB = rB; + semi.maxY = dy; + } + + semi.list.push(item); + } + + recalculateXOnSemiToAlignOnEllipseCurve(topSemi); + recalculateXOnSemiToAlignOnEllipseCurve(bottomSemi); + } + + var len = list.length; + + for (var i = 0; i < len; i++) { + if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') { + var dx = list[i].label.x - farthestX; + list[i].linePoints[1][0] += dx; + list[i].label.x = farthestX; + } + } + + if (shiftLayoutOnY(list, viewTop, viewTop + viewHeight)) { + recalculateX(list); + } + } + + function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) { + var leftList = []; + var rightList = []; + var leftmostX = Number.MAX_VALUE; + var rightmostX = -Number.MAX_VALUE; + + for (var i = 0; i < labelLayoutList.length; i++) { + var label = labelLayoutList[i].label; + + if (isPositionCenter(labelLayoutList[i])) { + continue; + } + + if (label.x < cx) { + leftmostX = Math.min(leftmostX, label.x); + leftList.push(labelLayoutList[i]); + } else { + rightmostX = Math.max(rightmostX, label.x); + rightList.push(labelLayoutList[i]); + } + } + + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX); + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + var label = layout.label; + + if (isPositionCenter(layout)) { + continue; + } + + var linePoints = layout.linePoints; + + if (linePoints) { + var isAlignToEdge = layout.labelAlignTo === 'edge'; + var realTextWidth = layout.rect.width; + var targetTextWidth = void 0; + + if (isAlignToEdge) { + if (label.x < cx) { + targetTextWidth = linePoints[2][0] - layout.labelDistance - viewLeft - layout.edgeDistance; + } else { + targetTextWidth = viewLeft + viewWidth - layout.edgeDistance - linePoints[2][0] - layout.labelDistance; + } + } else { + if (label.x < cx) { + targetTextWidth = label.x - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - label.x - layout.bleedMargin; + } + } + + if (targetTextWidth < layout.rect.width) { + // TODOTODO + // layout.text = textContain.truncateText(layout.text, targetTextWidth, layout.font); + layout.label.style.width = targetTextWidth; + + if (layout.labelAlignTo === 'edge') { + realTextWidth = targetTextWidth; // realTextWidth = textContain.getWidth(layout.text, layout.font); + } + } + + var dist = linePoints[1][0] - linePoints[2][0]; + + if (isAlignToEdge) { + if (label.x < cx) { + linePoints[2][0] = viewLeft + layout.edgeDistance + realTextWidth + layout.labelDistance; + } else { + linePoints[2][0] = viewLeft + viewWidth - layout.edgeDistance - realTextWidth - layout.labelDistance; + } + } else { + if (label.x < cx) { + linePoints[2][0] = label.x + layout.labelDistance; + } else { + linePoints[2][0] = label.x - layout.labelDistance; + } + + linePoints[1][0] = linePoints[2][0] + dist; + } + + linePoints[1][1] = linePoints[2][1] = label.y; + } + } + } + + function isPositionCenter(sectorShape) { + // Not change x for center label + return sectorShape.position === 'center'; + } + + function pieLabelLayout(seriesModel) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + var minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN$1; + var viewRect = data.getLayout('viewRect'); + var r = data.getLayout('r'); + var viewWidth = viewRect.width; + var viewLeft = viewRect.x; + var viewTop = viewRect.y; + var viewHeight = viewRect.height; + + function setNotShow(el) { + el.ignore = true; + } + + function isLabelShown(label) { + if (!label.ignore) { + return true; + } + + for (var key in label.states) { + if (label.states[key].ignore === false) { + return true; + } + } + + return false; + } + + data.each(function (idx) { + var sector = data.getItemGraphicEl(idx); + var sectorShape = sector.shape; + var label = sector.getTextContent(); + var labelLine = sector.getTextGuideLine(); + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); // Use position in normal or emphasis + + var labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']); + var labelDistance = labelModel.get('distanceToLabelLine'); + var labelAlignTo = labelModel.get('alignTo'); + var edgeDistance = parsePercent$1(labelModel.get('edgeDistance'), viewWidth); + var bleedMargin = labelModel.get('bleedMargin'); + var labelLineModel = itemModel.getModel('labelLine'); + var labelLineLen = labelLineModel.get('length'); + labelLineLen = parsePercent$1(labelLineLen, viewWidth); + var labelLineLen2 = labelLineModel.get('length2'); + labelLineLen2 = parsePercent$1(labelLineLen2, viewWidth); + + if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) { + each(label.states, setNotShow); + label.ignore = true; + return; + } + + if (!isLabelShown(label)) { + return; + } + + var midAngle = (sectorShape.startAngle + sectorShape.endAngle) / 2; + var nx = Math.cos(midAngle); + var ny = Math.sin(midAngle); + var textX; + var textY; + var linePoints; + var textAlign; + cx = sectorShape.cx; + cy = sectorShape.cy; + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + + if (labelPosition === 'center') { + textX = sectorShape.cx; + textY = sectorShape.cy; + textAlign = 'center'; + } else { + var x1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * nx : sectorShape.r * nx) + cx; + var y1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * ny : sectorShape.r * ny) + cy; + textX = x1 + nx * 3; + textY = y1 + ny * 3; + + if (!isLabelInside) { + // For roseType + var x2 = x1 + nx * (labelLineLen + r - sectorShape.r); + var y2 = y1 + ny * (labelLineLen + r - sectorShape.r); + var x3 = x2 + (nx < 0 ? -1 : 1) * labelLineLen2; + var y3 = y2; + + if (labelAlignTo === 'edge') { + // Adjust textX because text align of edge is opposite + textX = nx < 0 ? viewLeft + edgeDistance : viewLeft + viewWidth - edgeDistance; + } else { + textX = x3 + (nx < 0 ? -labelDistance : labelDistance); + } + + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + + textAlign = isLabelInside ? 'center' : labelAlignTo === 'edge' ? nx > 0 ? 'right' : 'left' : nx > 0 ? 'left' : 'right'; + } + + var labelRotate; + var rotate = labelModel.get('rotate'); + + if (typeof rotate === 'number') { + labelRotate = rotate * (Math.PI / 180); + } else { + labelRotate = rotate ? nx < 0 ? -midAngle + Math.PI : -midAngle : 0; + } + + hasLabelRotate = !!labelRotate; + label.x = textX; + label.y = textY; + label.rotation = labelRotate; + label.setStyle({ + verticalAlign: 'middle' + }); // Not sectorShape the inside label + + if (!isLabelInside) { + var textRect = label.getBoundingRect().clone(); + textRect.applyTransform(label.getComputedTransform()); // Text has a default 1px stroke. Exclude this. + + var margin = (label.style.margin || 0) + 2.1; + textRect.y -= margin / 2; + textRect.height += margin; + labelLayoutList.push({ + label: label, + labelLine: labelLine, + position: labelPosition, + len: labelLineLen, + len2: labelLineLen2, + minTurnAngle: labelLineModel.get('minTurnAngle'), + maxSurfaceAngle: labelLineModel.get('maxSurfaceAngle'), + surfaceNormal: new Point(nx, ny), + linePoints: linePoints, + textAlign: textAlign, + labelDistance: labelDistance, + labelAlignTo: labelAlignTo, + edgeDistance: edgeDistance, + bleedMargin: bleedMargin, + rect: textRect + }); + } else { + label.setStyle({ + align: textAlign + }); + var selectState = label.states.select; + + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + + sector.setTextConfig({ + inside: isLabelInside + }); + }); + + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop); + } + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + var label = layout.label; + var labelLine = layout.labelLine; + var notShowLabel = isNaN(label.x) || isNaN(label.y); + + if (label) { + label.setStyle({ + align: layout.textAlign + }); + + if (notShowLabel) { + each(label.states, setNotShow); + label.ignore = true; + } + + var selectState = label.states.select; + + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + + if (labelLine) { + var linePoints = layout.linePoints; + + if (notShowLabel || !linePoints) { + each(labelLine.states, setNotShow); + labelLine.ignore = true; + } else { + limitTurnAngle(linePoints, layout.minTurnAngle); + limitSurfaceAngle(linePoints, layout.surfaceNormal, layout.maxSurfaceAngle); + labelLine.setShape({ + points: linePoints + }); // Set the anchor to the midpoint of sector + + label.__hostTarget.textGuideLineConfig = { + anchor: new Point(linePoints[0][0], linePoints[0][1]) + }; + } + } + } + } + + function getSectorCornerRadius(model, shape) { + var cornerRadius = model.get('borderRadius'); + + if (cornerRadius == null) { + return null; + } + + if (!isArray(cornerRadius)) { + cornerRadius = [cornerRadius, cornerRadius]; + } + + return { + innerCornerRadius: parsePercent(cornerRadius[0], shape.r0), + cornerRadius: parsePercent(cornerRadius[1], shape.r) + }; + } + + /** + * Piece of pie including Sector, Label, LabelLine + */ + + var PiePiece = + /** @class */ + function (_super) { + __extends(PiePiece, _super); + + function PiePiece(data, idx, startAngle) { + var _this = _super.call(this) || this; + + _this.z2 = 2; + var polyline = new Polyline(); + var text = new ZRText(); + + _this.setTextGuideLine(polyline); + + _this.setTextContent(text); + + _this.updateData(data, idx, startAngle, true); + + return _this; + } + + PiePiece.prototype.updateData = function (data, idx, startAngle, firstCreate) { + var sector = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = data.getItemLayout(idx); + var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout) || {}, layout); + + if (firstCreate) { + sector.setShape(sectorShape); + var animationType = seriesModel.getShallow('animationType'); + + if (animationType === 'scale') { + sector.shape.r = layout.r0; + initProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, idx); + } // Expansion + else { + if (startAngle != null) { + sector.setShape({ + startAngle: startAngle, + endAngle: startAngle + }); + initProps(sector, { + shape: { + startAngle: layout.startAngle, + endAngle: layout.endAngle + } + }, seriesModel, idx); + } else { + sector.shape.endAngle = layout.startAngle; + updateProps(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel, idx); + } + } + } else { + // Transition animation from the old shape + updateProps(sector, { + shape: sectorShape + }, seriesModel, idx); + } + + sector.useStyle(data.getItemVisual(idx, 'style')); + setStatesStylesFromModel(sector, itemModel); + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var offset = seriesModel.get('selectedOffset'); + var dx = Math.cos(midAngle) * offset; + var dy = Math.sin(midAngle) * offset; + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + + this._updateLabel(seriesModel, data, idx); + + sector.ensureState('emphasis').shape = __assign({ + r: layout.r + (emphasisModel.get('scale') ? emphasisModel.get('scaleSize') || 0 : 0) + }, getSectorCornerRadius(emphasisModel.getModel('itemStyle'), layout)); + extend(sector.ensureState('select'), { + x: dx, + y: dy, + shape: getSectorCornerRadius(itemModel.getModel(['select', 'itemStyle']), layout) + }); + extend(sector.ensureState('blur'), { + shape: getSectorCornerRadius(itemModel.getModel(['blur', 'itemStyle']), layout) + }); + var labelLine = sector.getTextGuideLine(); + var labelText = sector.getTextContent(); + labelLine && extend(labelLine.ensureState('select'), { + x: dx, + y: dy + }); // TODO: needs dx, dy in zrender? + + extend(labelText.ensureState('select'), { + x: dx, + y: dy + }); + enableHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + }; + + PiePiece.prototype._updateLabel = function (seriesModel, data, idx) { + var _a; + + var sector = this; + var itemModel = data.getItemModel(idx); + var labelLineModel = itemModel.getModel('labelLine'); + var style = data.getItemVisual(idx, 'style'); + var visualColor = style && style.fill; + var visualOpacity = style && style.opacity; + setLabelStyle(sector, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + defaultText: seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx) + }); + var labelText = sector.getTextContent(); // Set textConfig on sector. + + sector.setTextConfig({ + // reset position, rotation + position: null, + rotation: null + }); // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + + labelText.attr({ + z2: 10 + }); + var labelPosition = seriesModel.get(['label', 'position']); + + if (labelPosition !== 'outside' && labelPosition !== 'outer') { + (_a = sector.getTextGuideLine()) === null || _a === void 0 ? void 0 : _a.hide(); + return; + } // Default use item visual color + + + setLabelLineStyle(this, getLabelLineStatesModels(itemModel), { + stroke: visualColor, + opacity: retrieve3(labelLineModel.get(['lineStyle', 'opacity']), visualOpacity, 1) + }); + }; + + return PiePiece; + }(Sector); // Pie view + + + var PieView = + /** @class */ + function (_super) { + __extends(PieView, _super); + + function PieView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.ignoreLabelLineUpdate = true; + return _this; + } + + PieView.prototype.init = function () { + var sectorGroup = new Group(); + this._sectorGroup = sectorGroup; + }; + + PieView.prototype.render = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var startAngle; // First render + + if (!oldData && data.count() > 0) { + var shape = data.getItemLayout(0); + + for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) { + shape = data.getItemLayout(s); + } + + if (shape) { + startAngle = shape.startAngle; + } + } + + data.diff(oldData).add(function (idx) { + var piePiece = new PiePiece(data, idx, startAngle); + data.setItemGraphicEl(idx, piePiece); + group.add(piePiece); + }).update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + piePiece.updateData(data, newIdx, startAngle); + piePiece.off('click'); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }).remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piePiece, seriesModel, idx); + }).execute(); + pieLabelLayout(seriesModel); // Always use initial animation. + + if (seriesModel.get('animationTypeUpdate') !== 'expansion') { + this._data = data; + } + }; + + PieView.prototype.dispose = function () {}; + + PieView.prototype.containPoint = function (point, seriesModel) { + var data = seriesModel.getData(); + var itemLayout = data.getItemLayout(0); + + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + + PieView.type = 'pie'; + return PieView; + }(ChartView); + + /** + * [Usage]: + * (1) + * createListSimply(seriesModel, ['value']); + * (2) + * createListSimply(seriesModel, { + * coordDimensions: ['value'], + * dimensionsCount: 5 + * }); + */ + + function createListSimply(seriesModel, opt, nameList) { + opt = isArray(opt) && { + coordDimensions: opt + } || extend({}, opt); + var source = seriesModel.getSource(); + var dimensionsInfo = createDimensions(source, opt); + var list = new List(dimensionsInfo, seriesModel); + list.initData(source, nameList); + return list; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * LegendVisualProvider is an bridge that pick encoded color from data and + * provide to the legend component. + */ + var LegendVisualProvider = + /** @class */ + function () { + function LegendVisualProvider( // Function to get data after filtered. It stores all the encoding info + getDataWithEncodedVisual, // Function to get raw data before filtered. + getRawData) { + this._getDataWithEncodedVisual = getDataWithEncodedVisual; + this._getRawData = getRawData; + } + + LegendVisualProvider.prototype.getAllNames = function () { + var rawData = this._getRawData(); // We find the name from the raw data. In case it's filtered by the legend component. + // Normally, the name can be found in rawData, but can't be found in filtered data will display as gray. + + + return rawData.mapArray(rawData.getName); + }; + + LegendVisualProvider.prototype.containName = function (name) { + var rawData = this._getRawData(); + + return rawData.indexOfName(name) >= 0; + }; + + LegendVisualProvider.prototype.indexOfName = function (name) { + // Only get data when necessary. + // Because LegendVisualProvider constructor may be new in the stage that data is not prepared yet. + // Invoking Series#getData immediately will throw an error. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + + return dataWithEncodedVisual.indexOfName(name); + }; + + LegendVisualProvider.prototype.getItemVisual = function (dataIndex, key) { + // Get encoded visual properties from final filtered data. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + + return dataWithEncodedVisual.getItemVisual(dataIndex, key); + }; + + return LegendVisualProvider; + }(); + + var PieSeriesModel = + /** @class */ + function (_super) { + __extends(PieSeriesModel, _super); + + function PieSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.useColorPaletteOnData = true; + return _this; + } + /** + * @overwrite + */ + + + PieSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + + this._defaultLabelLine(option); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.mergeOption = function () { + _super.prototype.mergeOption.apply(this, arguments); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.getInitialData = function () { + return createListSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); + + var params = _super.prototype.getDataParams.call(this, dataIndex); // FIXME toFixed? + + + var valueList = []; + data.each(data.mapDimension('value'), function (value) { + valueList.push(value); + }); + params.percent = getPercentWithPrecision(valueList, dataIndex, data.hostModel.get('percentPrecision')); + params.$vars.push('percent'); + return params; + }; + + PieSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false` + + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; + + PieSeriesModel.type = 'series.pie'; + PieSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + legendHoverLink: true, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // If the angle of a sector less than `minShowLabelAngle`, + // the label will not be displayed. + minShowLabelAngle: 0, + // 选中时扇区偏移量 + selectedOffset: 10, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + percentPrecision: 2, + // If still show when all data zero. + stillShowZeroSum: true, + // cursor: null, + left: 0, + top: 0, + right: 0, + bottom: 0, + width: null, + height: null, + label: { + // color: 'inherit', + // If rotate around circle + rotate: 0, + show: true, + overflow: 'truncate', + // 'outer', 'inside', 'center' + position: 'outer', + // 'none', 'labelLine', 'edge'. Works only when position is 'outer' + alignTo: 'none', + // Closest distance between label and chart edge. + // Works only position is 'outer' and alignTo is 'edge'. + edgeDistance: '25%', + // Works only position is 'outer' and alignTo is not 'edge'. + bleedMargin: 10, + // Distance between text and label line. + distanceToLabelLine: 5 // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // 默认使用全局文本样式,详见TEXTSTYLE + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + minTurnAngle: 90, + maxSurfaceAngle: 90, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + }, + itemStyle: { + borderWidth: 1 + }, + labelLayout: { + // Hide the overlapped label. + hideOverlap: true + }, + emphasis: { + scale: true, + scaleSize: 5 + }, + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // Animation type. Valid values: expansion, scale + animationType: 'expansion', + animationDuration: 1000, + // Animation type when update. Valid values: transition, expansion + animationTypeUpdate: 'transition', + animationEasingUpdate: 'cubicInOut', + animationDurationUpdate: 500, + animationEasing: 'cubicInOut' + }; + return PieSeriesModel; + }(SeriesModel); + + function install$4(registers) { + registers.registerChartView(PieView); + registers.registerSeriesModel(PieSeriesModel); + createLegacyDataSelectAction('pie', registers.registerAction); + registers.registerLayout(curry(pieLayout, 'pie')); + registers.registerProcessor(dataFilter('pie')); + } + + var ScatterSeriesModel = + /** @class */ + function (_super) { + __extends(ScatterSeriesModel, _super); + + function ScatterSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScatterSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + ScatterSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListFromArray(this.getSource(), this, { + useEncodeDefaulter: true + }); + }; + + ScatterSeriesModel.prototype.getProgressive = function () { + var progressive = this.option.progressive; + + if (progressive == null) { + // PENDING + return this.option.large ? 5e3 : this.get('progressive'); + } + + return progressive; + }; + + ScatterSeriesModel.prototype.getProgressiveThreshold = function () { + var progressiveThreshold = this.option.progressiveThreshold; + + if (progressiveThreshold == null) { + // PENDING + return this.option.large ? 1e4 : this.get('progressiveThreshold'); + } + + return progressiveThreshold; + }; + + ScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.point(data.getItemLayout(dataIndex)); + }; + + ScatterSeriesModel.type = 'series.scatter'; + ScatterSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + ScatterSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + zlevel: 0, + z: 2, + legendHoverLink: true, + symbolSize: 10, + // symbolRotate: null, // 图形旋转控制 + large: false, + // Available when large is true + largeThreshold: 2000, + // cursor: null, + itemStyle: { + opacity: 0.8 // color: 各异 + + }, + emphasis: { + scale: true + }, + // If clip the overflow graphics + // Works on cartesian / polar series + clip: true, + select: { + itemStyle: { + borderColor: '#212121' + } + } // progressive: null + + }; + return ScatterSeriesModel; + }(SeriesModel); + + var BOOST_SIZE_THRESHOLD = 4; + + var LargeSymbolPathShape = + /** @class */ + function () { + function LargeSymbolPathShape() {} + + return LargeSymbolPathShape; + }(); + + var LargeSymbolPath = + /** @class */ + function (_super) { + __extends(LargeSymbolPath, _super); + + function LargeSymbolPath(opts) { + return _super.call(this, opts) || this; + } + + LargeSymbolPath.prototype.getDefaultShape = function () { + return new LargeSymbolPathShape(); + }; + + LargeSymbolPath.prototype.buildPath = function (path, shape) { + var points = shape.points; + var size = shape.size; + var symbolProxy = this.symbolProxy; + var symbolProxyShape = symbolProxy.shape; + var ctx = path.getContext ? path.getContext() : path; + var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD; // Do draw in afterBrush. + + if (canBoost) { + this._ctx = ctx; + return; + } + + this._ctx = null; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + if (this.softClipShape && !this.softClipShape.contain(x, y)) { + continue; + } + + symbolProxyShape.x = x - size[0] / 2; + symbolProxyShape.y = y - size[1] / 2; + symbolProxyShape.width = size[0]; + symbolProxyShape.height = size[1]; + symbolProxy.buildPath(path, symbolProxyShape, true); + } + }; + + LargeSymbolPath.prototype.afterBrush = function () { + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var ctx = this._ctx; + + if (!ctx) { + return; + } // PENDING If style or other canvas status changed? + + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + if (this.softClipShape && !this.softClipShape.contain(x, y)) { + continue; + } // fillRect is faster than building a rect path and draw. + // And it support light globalCompositeOperation. + + + ctx.fillRect(x - size[0] / 2, y - size[1] / 2, size[0], size[1]); + } + }; + + LargeSymbolPath.prototype.findDataIndex = function (x, y) { + // TODO ??? + // Consider transform + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var w = Math.max(size[0], 4); + var h = Math.max(size[1], 4); // Not consider transform + // Treat each element as a rect + // top down traverse + + for (var idx = points.length / 2 - 1; idx >= 0; idx--) { + var i = idx * 2; + var x0 = points[i] - w / 2; + var y0 = points[i + 1] - h / 2; + + if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) { + return idx; + } + } + + return -1; + }; + + return LargeSymbolPath; + }(Path); + + var LargeSymbolDraw = + /** @class */ + function () { + function LargeSymbolDraw() { + this.group = new Group(); + } + + LargeSymbolDraw.prototype.isPersistent = function () { + return !this._incremental; + }; + /** + * Update symbols draw by new data + */ + + LargeSymbolDraw.prototype.updateData = function (data, opt) { + this.group.removeAll(); + var symbolEl = new LargeSymbolPath({ + rectHover: true, + cursor: 'default' + }); + symbolEl.setShape({ + points: data.getLayout('points') + }); + + this._setCommon(symbolEl, data, false, opt); + + this.group.add(symbolEl); + this._incremental = null; + }; + + LargeSymbolDraw.prototype.updateLayout = function (data) { + if (this._incremental) { + return; + } + + var points = data.getLayout('points'); + this.group.eachChild(function (child) { + if (child.startIndex != null) { + var len = (child.endIndex - child.startIndex) * 2; + var byteOffset = child.startIndex * 4 * 2; + points = new Float32Array(points.buffer, byteOffset, len); + } + + child.setShape('points', points); + }); + }; + + LargeSymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this.group.removeAll(); + + this._clearIncremental(); // Only use incremental displayables when data amount is larger than 2 million. + // PENDING Incremental data? + + + if (data.count() > 2e6) { + if (!this._incremental) { + this._incremental = new IncrementalDisplayable({ + silent: true + }); + } + + this.group.add(this._incremental); + } else { + this._incremental = null; + } + }; + + LargeSymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + var symbolEl; + + if (this._incremental) { + symbolEl = new LargeSymbolPath(); + + this._incremental.addDisplayable(symbolEl, true); + } else { + symbolEl = new LargeSymbolPath({ + rectHover: true, + cursor: 'default', + startIndex: taskParams.start, + endIndex: taskParams.end + }); + symbolEl.incremental = true; + this.group.add(symbolEl); + } + + symbolEl.setShape({ + points: data.getLayout('points') + }); + + this._setCommon(symbolEl, data, !!this._incremental, opt); + }; + + LargeSymbolDraw.prototype._setCommon = function (symbolEl, data, isIncremental, opt) { + var hostModel = data.hostModel; + opt = opt || {}; + var size = data.getVisual('symbolSize'); + symbolEl.setShape('size', size instanceof Array ? size : [size, size]); + symbolEl.softClipShape = opt.clipShape || null; // Create symbolProxy to build path for each data + + symbolEl.symbolProxy = createSymbol(data.getVisual('symbol'), 0, 0, 0, 0); // Use symbolProxy setColor method + + symbolEl.setColor = symbolEl.symbolProxy.setColor; + var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD; + symbolEl.useStyle( // Draw shadow when doing fillRect is extremely slow. + hostModel.getModel('itemStyle').getItemStyle(extrudeShadow ? ['color', 'shadowBlur', 'shadowColor'] : ['color'])); + var globalStyle = data.getVisual('style'); + var visualColor = globalStyle && globalStyle.fill; + + if (visualColor) { + symbolEl.setColor(visualColor); + } + + if (!isIncremental) { + var ecData_1 = getECData(symbolEl); // Enable tooltip + // PENDING May have performance issue when path is extremely large + + ecData_1.seriesIndex = hostModel.seriesIndex; + symbolEl.on('mousemove', function (e) { + ecData_1.dataIndex = null; + var dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY); + + if (dataIndex >= 0) { + // Provide dataIndex for tooltip + ecData_1.dataIndex = dataIndex + (symbolEl.startIndex || 0); + } + }); + } + }; + + LargeSymbolDraw.prototype.remove = function () { + this._clearIncremental(); + + this._incremental = null; + this.group.removeAll(); + }; + + LargeSymbolDraw.prototype._clearIncremental = function () { + var incremental = this._incremental; + + if (incremental) { + incremental.clearDisplaybles(); + } + }; + + return LargeSymbolDraw; + }(); + + var ScatterView = + /** @class */ + function (_super) { + __extends(ScatterView, _super); + + function ScatterView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScatterView.type; + return _this; + } + + ScatterView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.updateData(data, { + // TODO + // If this parameter should be a shape or a bounding volume + // shape will be more general. + // But bounding volume like bounding rect will be much faster in the contain calculation + clipShape: this._getClipShape(seriesModel) + }); + this._finished = true; + }; + + ScatterView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.incrementalPrepareUpdate(data); + this._finished = false; + }; + + ScatterView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData(), { + clipShape: this._getClipShape(seriesModel) + }); + + this._finished = taskParams.end === seriesModel.getData().count(); + }; + + ScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); // Must mark group dirty and make sure the incremental layer will be cleared + // PENDING + + this.group.dirty(); + + if (!this._finished || data.count() > 1e4 || !this._symbolDraw.isPersistent()) { + return { + update: true + }; + } else { + var res = pointsLayout('').reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } + + this._symbolDraw.updateLayout(data); + } + }; + + ScatterView.prototype._getClipShape = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var clipArea = coordSys && coordSys.getArea && coordSys.getArea(); + return seriesModel.get('clip', true) ? clipArea : null; + }; + + ScatterView.prototype._updateSymbolDraw = function (data, seriesModel) { + var symbolDraw = this._symbolDraw; + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if (!symbolDraw || isLargeDraw !== this._isLargeDraw) { + symbolDraw && symbolDraw.remove(); + symbolDraw = this._symbolDraw = isLargeDraw ? new LargeSymbolDraw() : new SymbolDraw(); + this._isLargeDraw = isLargeDraw; + this.group.removeAll(); + } + + this.group.add(symbolDraw.group); + return symbolDraw; + }; + + ScatterView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + this._symbolDraw = null; + }; + + ScatterView.prototype.dispose = function () {}; + + ScatterView.type = 'scatter'; + return ScatterView; + }(ChartView); + + var GridModel = + /** @class */ + function (_super) { + __extends(GridModel, _super); + + function GridModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + GridModel.type = 'grid'; + GridModel.dependencies = ['xAxis', 'yAxis']; + GridModel.layoutMode = 'box'; + GridModel.defaultOption = { + show: false, + zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 70, + // 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' + }; + return GridModel; + }(ComponentModel); + + var CartesianAxisModel = + /** @class */ + function (_super) { + __extends(CartesianAxisModel, _super); + + function CartesianAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + CartesianAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + }; + + CartesianAxisModel.type = 'cartesian2dAxis'; + return CartesianAxisModel; + }(ComponentModel); + mixin(CartesianAxisModel, AxisModelCommonMixin); + + var defaultOption = { + show: true, + zlevel: 0, + z: 0, + // Inverse the axis. + inverse: false, + // Axis name displayed. + name: '', + // 'start' | 'middle' | 'end' + nameLocation: 'end', + // By degree. By default auto rotate by nameLocation. + nameRotate: null, + nameTruncate: { + maxWidth: null, + ellipsis: '...', + placeholder: '.' + }, + // Use global text style by default. + nameTextStyle: {}, + // The gap between axisName and axisLine. + nameGap: 15, + // Default `false` to support tooltip. + silent: false, + // Default `false` to avoid legacy user event listener fail. + triggerEvent: false, + tooltip: { + show: false + }, + axisPointer: {}, + axisLine: { + show: true, + onZero: true, + onZeroAxisIndex: null, + lineStyle: { + color: '#6E7079', + width: 1, + type: 'solid' + }, + // The arrow at both ends the the axis. + symbol: ['none', 'none'], + symbolSize: [10, 15] + }, + axisTick: { + show: true, + // Whether axisTick is inside the grid or outside the grid. + inside: false, + // The length of axisTick. + length: 5, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + // Whether axisLabel is inside the grid or outside the grid. + inside: false, + rotate: 0, + // true | false | null/undefined (auto) + showMinLabel: null, + // true | false | null/undefined (auto) + showMaxLabel: null, + margin: 8, + // formatter: null, + fontSize: 12 + }, + splitLine: { + show: true, + lineStyle: { + color: ['#E0E6F1'], + width: 1, + type: 'solid' + } + }, + splitArea: { + show: false, + areaStyle: { + color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)'] + } + } + }; + var categoryAxis = merge({ + // The gap at both ends of the axis. For categoryAxis, boolean. + boundaryGap: true, + // Set false to faster category collection. + deduplication: null, + // splitArea: { + // show: false + // }, + splitLine: { + show: false + }, + axisTick: { + // If tick is align with label when boundaryGap is true + alignWithLabel: false, + interval: 'auto' + }, + axisLabel: { + interval: 'auto' + } + }, defaultOption); + var valueAxis = merge({ + boundaryGap: [0, 0], + axisLine: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + axisTick: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + // TODO + // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60] + splitNumber: 5, + minorTick: { + // Minor tick, not available for cateogry axis. + show: false, + // Split number of minor ticks. The value should be in range of (0, 100) + splitNumber: 5, + // Lenght of minor tick + length: 3, + // Line style + lineStyle: {// Default to be same with axisTick + } + }, + minorSplitLine: { + show: false, + lineStyle: { + color: '#F4F7FD', + width: 1 + } + } + }, defaultOption); + var timeAxis = merge({ + scale: true, + splitNumber: 6, + axisLabel: { + // To eliminate labels that are not nice + showMinLabel: false, + showMaxLabel: false, + rich: { + primary: { + fontWeight: 'bold' + } + } + }, + splitLine: { + show: false + } + }, valueAxis); + var logAxis = defaults({ + scale: true, + logBase: 10 + }, valueAxis); + var axisDefault = { + category: categoryAxis, + value: valueAxis, + time: timeAxis, + log: logAxis + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var AXIS_TYPES = { + value: 1, + category: 1, + time: 1, + log: 1 + }; + + /** + * Generate sub axis model class + * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ... + */ + + function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) { + each(AXIS_TYPES, function (v, axisType) { + var defaultOption = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true); + + var AxisModel = + /** @class */ + function (_super) { + __extends(AxisModel, _super); + + function AxisModel() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var _this = _super.apply(this, args) || this; + + _this.type = axisName + 'Axis.' + axisType; + return _this; + } + + AxisModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(axisType + 'Axis')); + merge(option, this.getDefaultOption()); + option.type = getAxisType(option); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + AxisModel.prototype.optionUpdated = function () { + var thisOption = this.option; + + if (thisOption.type === 'category') { + this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); + } + }; + /** + * Should not be called before all of 'getInitailData' finished. + * Because categories are collected during initializing data. + */ + + + AxisModel.prototype.getCategories = function (rawData) { + var option = this.option; // FIXME + // warning if called before all of 'getInitailData' finished. + + if (option.type === 'category') { + if (rawData) { + return option.data; + } + + return this.__ordinalMeta.categories; + } + }; + + AxisModel.prototype.getOrdinalMeta = function () { + return this.__ordinalMeta; + }; + + AxisModel.type = axisName + 'Axis.' + axisType; + AxisModel.defaultOption = defaultOption; + return AxisModel; + }(BaseAxisModelClass); + + registers.registerComponentModel(AxisModel); + }); + registers.registerSubTypeDefaulter(axisName + 'Axis', getAxisType); + } + + function getAxisType(option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); + } + + var Cartesian = + /** @class */ + function () { + function Cartesian(name) { + this.type = 'cartesian'; + this._dimList = []; + this._axes = {}; + this.name = name || ''; + } + + Cartesian.prototype.getAxis = function (dim) { + return this._axes[dim]; + }; + + Cartesian.prototype.getAxes = function () { + return map(this._dimList, function (dim) { + return this._axes[dim]; + }, this); + }; + + Cartesian.prototype.getAxesByScale = function (scaleType) { + scaleType = scaleType.toLowerCase(); + return filter(this.getAxes(), function (axis) { + return axis.scale.type === scaleType; + }); + }; + + Cartesian.prototype.addAxis = function (axis) { + var dim = axis.dim; + this._axes[dim] = axis; + + this._dimList.push(dim); + }; + + return Cartesian; + }(); + + var cartesian2DDimensions = ['x', 'y']; + + function canCalculateAffineTransform(scale) { + return scale.type === 'interval' || scale.type === 'time'; + } + + var Cartesian2D = + /** @class */ + function (_super) { + __extends(Cartesian2D, _super); + + function Cartesian2D() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'cartesian2d'; + _this.dimensions = cartesian2DDimensions; + return _this; + } + /** + * Calculate an affine transform matrix if two axes are time or value. + * It's mainly for accelartion on the large time series data. + */ + + + Cartesian2D.prototype.calcAffineTransform = function () { + this._transform = this._invTransform = null; + var xAxisScale = this.getAxis('x').scale; + var yAxisScale = this.getAxis('y').scale; + + if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) { + return; + } + + var xScaleExtent = xAxisScale.getExtent(); + var yScaleExtent = yAxisScale.getExtent(); + var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]); + var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]); + var xScaleSpan = xScaleExtent[1] - xScaleExtent[0]; + var yScaleSpan = yScaleExtent[1] - yScaleExtent[0]; + + if (!xScaleSpan || !yScaleSpan) { + return; + } // Accelerate data to point calculation on the special large time series data. + + + var scaleX = (end[0] - start[0]) / xScaleSpan; + var scaleY = (end[1] - start[1]) / yScaleSpan; + var translateX = start[0] - xScaleExtent[0] * scaleX; + var translateY = start[1] - yScaleExtent[0] * scaleY; + var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY]; + this._invTransform = invert([], m); + }; + /** + * Base axis will be used on stacking. + */ + + + Cartesian2D.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x'); + }; + + Cartesian2D.prototype.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])); + }; + + Cartesian2D.prototype.containData = function (data) { + return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]); + }; + + Cartesian2D.prototype.dataToPoint = function (data, reserved, out) { + out = out || []; + var xVal = data[0]; + var yVal = data[1]; // Fast path + + if (this._transform // It's supported that if data is like `[Inifity, 123]`, where only Y pixel calculated. + && xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) { + return applyTransform(out, data, this._transform); + } + + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal)); + out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal)); + return out; + }; + + Cartesian2D.prototype.clampData = function (data, out) { + var xScale = this.getAxis('x').scale; + var yScale = this.getAxis('y').scale; + var xAxisExtent = xScale.getExtent(); + var yAxisExtent = yScale.getExtent(); + var x = xScale.parse(data[0]); + var y = yScale.parse(data[1]); + out = out || []; + out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1])); + out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1])); + return out; + }; + + Cartesian2D.prototype.pointToData = function (point, out) { + out = out || []; + + if (this._invTransform) { + return applyTransform(out, point, this._invTransform); + } + + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0])); + out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1])); + return out; + }; + + Cartesian2D.prototype.getOtherAxis = function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + }; + /** + * Get rect area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + + + Cartesian2D.prototype.getArea = function () { + var xExtent = this.getAxis('x').getGlobalExtent(); + var yExtent = this.getAxis('y').getGlobalExtent(); + var x = Math.min(xExtent[0], xExtent[1]); + var y = Math.min(yExtent[0], yExtent[1]); + var width = Math.max(xExtent[0], xExtent[1]) - x; + var height = Math.max(yExtent[0], yExtent[1]) - y; + return new BoundingRect(x, y, width, height); + }; + + return Cartesian2D; + }(Cartesian); + + var Axis2D = + /** @class */ + function (_super) { + __extends(Axis2D, _super); + + function Axis2D(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + /** + * Index of axis, can be used as key + * Injected outside. + */ + + + _this.index = 0; + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + + Axis2D.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + /** + * Each item cooresponds to this.getExtent(), which + * means globalExtent[0] may greater than globalExtent[1], + * unless `asc` is input. + * + * @param {boolean} [asc] + * @return {Array.} + */ + + + Axis2D.prototype.getGlobalExtent = function (asc) { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + asc && ret[0] > ret[1] && ret.reverse(); + return ret; + }; + + Axis2D.prototype.pointToData = function (point, clamp) { + return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp); + }; + /** + * Set ordinalSortInfo + * @param info new OrdinalSortInfo + */ + + + Axis2D.prototype.setCategorySortInfo = function (info) { + if (this.type !== 'category') { + return false; + } + + this.model.option.categorySortInfo = info; + this.scale.setSortInfo(info); + }; + + return Axis2D; + }(Axis); + + /** + * Can only be called after coordinate system creation stage. + * (Can be called before coordinate system update stage). + */ + + function layout$1(gridModel, axisModel, opt) { + opt = opt || {}; + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0]; + var rawAxisPosition = axis.position; + var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition; + var axisDim = axis.dim; + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var idx = { + left: 0, + right: 1, + top: 0, + bottom: 1, + onZero: 2 + }; + var axisOffset = axisModel.get('offset') || 0; + var posBound = axisDim === 'x' ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset]; + + if (otherAxisOnZeroOf) { + var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0)); + posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]); + } // Axis position + + + layout.position = [axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3]]; // Axis rotation + + layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1); // 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]; + layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0; + + if (axisModel.get(['axisTick', 'inside'])) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { + layout.labelDirection = -layout.labelDirection; + } // Special label rotation + + + var labelRotate = axisModel.get(['axisLabel', 'rotate']); + layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate; // Over splitLine and splitArea + + layout.z2 = 1; + return layout; + } + function isCartesian2DSeries(seriesModel) { + return seriesModel.get('coordinateSystem') === 'cartesian2d'; + } + function findAxisModels(seriesModel) { + var axisModelMap = { + xAxisModel: null, + yAxisModel: null + }; + each(axisModelMap, function (v, key) { + var axisType = key.replace(/Model$/, ''); + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!axisModel) { + throw new Error(axisType + ' "' + retrieve3(seriesModel.get(axisType + 'Index'), seriesModel.get(axisType + 'Id'), 0) + '" not found'); + } + } + + axisModelMap[key] = axisModel; + }); + return axisModelMap; + } + + var Grid = + /** @class */ + function () { + function Grid(gridModel, ecModel, api) { + // FIXME:TS where used (different from registered type 'cartesian2d')? + this.type = 'grid'; + this._coordsMap = {}; + this._coordsList = []; + this._axesMap = {}; + this._axesList = []; + this.axisPointerEnabled = true; + this.dimensions = cartesian2DDimensions; + + this._initCartesian(gridModel, ecModel, api); + + this.model = gridModel; + } + + Grid.prototype.getRect = function () { + return this._rect; + }; + + Grid.prototype.update = function (ecModel, api) { + var axesMap = this._axesMap; + + this._updateScale(ecModel, this.model); + + each(axesMap.x, function (xAxis) { + niceScaleExtent(xAxis.scale, xAxis.model); + }); + each(axesMap.y, function (yAxis) { + niceScaleExtent(yAxis.scale, yAxis.model); + }); // Key: axisDim_axisIndex, value: boolean, whether onZero target. + + var onZeroRecords = {}; + each(axesMap.x, function (xAxis) { + fixAxisOnZero(axesMap, 'y', xAxis, onZeroRecords); + }); + each(axesMap.y, function (yAxis) { + fixAxisOnZero(axesMap, 'x', yAxis, onZeroRecords); + }); // 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 + */ + + + Grid.prototype.resize = function (gridModel, api, ignoreContainLabel) { + var boxLayoutParams = gridModel.getBoxLayoutParams(); + var isContainLabel = !ignoreContainLabel && gridModel.get('containLabel'); + var gridRect = getLayoutRect(boxLayoutParams, { + width: api.getWidth(), + height: api.getHeight() + }); + this._rect = gridRect; + var axesList = this._axesList; + adjustAxes(); // Minus label size + + if (isContainLabel) { + each(axesList, function (axis) { + if (!axis.model.get(['axisLabel', 'inside'])) { + var labelUnionRect = estimateLabelUnionRect(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(); + } + + each(this._coordsList, function (coord) { + // Calculate affine matrix to accelerate the data to point transform. + // If all the axes scales are time or value. + coord.calcAffineTransform(); + }); + + 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]); + updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } + }; + + Grid.prototype.getAxis = function (dim, axisIndex) { + var axesMapOnDim = this._axesMap[dim]; + + if (axesMapOnDim != null) { + return axesMapOnDim[axisIndex || 0]; // if (axisIndex == null) { + // Find first axis + // for (let name in axesMapOnDim) { + // if (axesMapOnDim.hasOwnProperty(name)) { + // return axesMapOnDim[name]; + // } + // } + // } + // return axesMapOnDim[axisIndex]; + } + }; + + Grid.prototype.getAxes = function () { + return this._axesList.slice(); + }; + + Grid.prototype.getCartesian = function (xAxisIndex, yAxisIndex) { + if (xAxisIndex != null && yAxisIndex != null) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + return this._coordsMap[key]; + } + + if (isObject(xAxisIndex)) { + yAxisIndex = xAxisIndex.yAxisIndex; + xAxisIndex = xAxisIndex.xAxisIndex; + } + + for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) { + if (coordList[i].getAxis('x').index === xAxisIndex || coordList[i].getAxis('y').index === yAxisIndex) { + return coordList[i]; + } + } + }; + + Grid.prototype.getCartesians = function () { + return this._coordsList.slice(); + }; + /** + * @implements + */ + + + Grid.prototype.convertToPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(finder); + + return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null; + }; + /** + * @implements + */ + + + Grid.prototype.convertFromPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(finder); + + return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null; + }; + + Grid.prototype._findConvertTarget = function (finder) { + var seriesModel = finder.seriesModel; + var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0]; + var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0]; + var gridModel = finder.gridModel; + var coordsList = this._coordsList; + var cartesian; + var axis; + + if (seriesModel) { + cartesian = seriesModel.coordinateSystem; + indexOf(coordsList, cartesian) < 0 && (cartesian = null); + } else if (xAxisModel && yAxisModel) { + cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + } else if (xAxisModel) { + axis = this.getAxis('x', xAxisModel.componentIndex); + } else if (yAxisModel) { + axis = this.getAxis('y', yAxisModel.componentIndex); + } // Lowest priority. + else if (gridModel) { + var grid = gridModel.coordinateSystem; + + if (grid === this) { + cartesian = this._coordsList[0]; + } + } + + return { + cartesian: cartesian, + axis: axis + }; + }; + /** + * @implements + */ + + + Grid.prototype.containPoint = function (point) { + var coord = this._coordsList[0]; + + if (coord) { + return coord.containPoint(point); + } + }; + /** + * Initialize cartesian coordinate systems + */ + + + Grid.prototype._initCartesian = function (gridModel, ecModel, api) { + var _this = this; + + var grid = this; + 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.master = _this; + cartesian.model = gridModel; + _this._coordsMap[key] = cartesian; + + _this._coordsList.push(cartesian); + + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }); + }); + + function createAxisCreator(dimName) { + return function (axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel)) { + return; + } + + var axisPosition = axisModel.get('position'); + + if (dimName === 'x') { + // Fix position + if (axisPosition !== 'top' && axisPosition !== 'bottom') { + // Default bottom of X + axisPosition = axisPositionUsed.bottom ? 'top' : 'bottom'; + } + } else { + // Fix position + if (axisPosition !== 'left' && axisPosition !== 'right') { + // Default left of Y + axisPosition = axisPositionUsed.left ? 'right' : 'left'; + } + } + + axisPositionUsed[axisPosition] = true; + var axis = new Axis2D(dimName, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisPosition); + 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; // Inject grid info axis + + axis.grid = grid; // Index of axis, can be used as key + + axis.index = idx; + + grid._axesList.push(axis); + + axesMap[dimName][idx] = axis; + axesCount[dimName]++; + }; + } + }; + /** + * Update cartesian properties from series. + */ + + + Grid.prototype._updateScale = function (ecModel, gridModel) { + // Reset scale + each(this._axesList, function (axis) { + axis.scale.setExtent(Infinity, -Infinity); + + if (axis.type === 'category') { + var categorySortInfo = axis.model.get('categorySortInfo'); + axis.scale.setSortInfo(categorySortInfo); + } + }); + ecModel.eachSeries(function (seriesModel) { + if (isCartesian2DSeries(seriesModel)) { + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + + if (!isAxisUsedInTheGrid(xAxisModel, gridModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel)) { + return; + } + + var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + + if (data.type === 'list') { + unionExtent(data, xAxis); + unionExtent(data, yAxis); + } + } + }, this); + + function unionExtent(data, axis) { + each(getDataDimensionsOnAxis(data, axis.dim), function (dim) { + axis.scale.unionExtentFromData(data, dim); + }); + } + }; + /** + * @param dim 'x' or 'y' or 'auto' or null/undefined + */ + + + Grid.prototype.getTooltipAxes = function (dim) { + var baseAxes = []; + var otherAxes = []; + each(this.getCartesians(), function (cartesian) { + var baseAxis = dim != null && dim !== 'auto' ? cartesian.getAxis(dim) : cartesian.getBaseAxis(); + var otherAxis = cartesian.getOtherAxis(baseAxis); + indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis); + indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis); + }); + return { + baseAxes: baseAxes, + otherAxes: otherAxes + }; + }; + + Grid.create = function (ecModel, api) { + var grids = []; + ecModel.eachComponent('grid', function (gridModel, idx) { + var grid = new Grid(gridModel, ecModel, api); + grid.name = 'grid_' + idx; // dataSampling requires axis extent, so resize + // should be performed in create stage. + + grid.resize(gridModel, api, true); + gridModel.coordinateSystem = grid; + grids.push(grid); + }); // Inject the coordinateSystems into seriesModel + + ecModel.eachSeries(function (seriesModel) { + if (!isCartesian2DSeries(seriesModel)) { + return; + } + + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + var gridModel = xAxisModel.getCoordSysModel(); + + if ("development" !== 'production') { + if (!gridModel) { + throw new Error('Grid "' + retrieve3(xAxisModel.get('gridIndex'), xAxisModel.get('gridId'), 0) + '" not found'); + } + + if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) { + throw new Error('xAxis and yAxis must use the same grid'); + } + } + + var grid = gridModel.coordinateSystem; + seriesModel.coordinateSystem = grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + }); + return grids; + }; // For deciding which dimensions to use when creating list data + + + Grid.dimensions = cartesian2DDimensions; + return Grid; + }(); + /** + * Check if the axis is used in the specified grid. + */ + + + function isAxisUsedInTheGrid(axisModel, gridModel) { + return axisModel.getCoordSysModel() === gridModel; + } + + function fixAxisOnZero(axesMap, otherAxisDim, axis, // Key: see `getOnZeroRecordKey` + onZeroRecords) { + axis.getAxesOnZeroOf = function () { + // TODO: onZero of multiple axes. + return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : []; + }; // onZero can not be enabled in these two situations: + // 1. When any other axis is a category axis. + // 2. When no axis is cross 0 point. + + + var otherAxes = axesMap[otherAxisDim]; + var otherAxisOnZeroOf; + var axisModel = axis.model; + var onZero = axisModel.get(['axisLine', 'onZero']); + var onZeroAxisIndex = axisModel.get(['axisLine', 'onZeroAxisIndex']); + + if (!onZero) { + return; + } // If target axis is specified. + + + if (onZeroAxisIndex != null) { + if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) { + otherAxisOnZeroOf = otherAxes[onZeroAxisIndex]; + } + } else { + // Find the first available other axis. + for (var idx in otherAxes) { + if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx]) // Consider that two Y axes on one value axis, + // if both onZero, the two Y axes overlap. + && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) { + otherAxisOnZeroOf = otherAxes[idx]; + break; + } + } + } + + if (otherAxisOnZeroOf) { + onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true; + } + + function getOnZeroRecordKey(axis) { + return axis.dim + '_' + axis.index; + } + } + + function canOnZeroToAxis(axis) { + return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis); + } + + function updateAxisTransform(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; + }; + } + + var PI$5 = 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. + */ + + var AxisBuilder = + /** @class */ + function () { + function AxisBuilder(axisModel, opt) { + this.group = new Group(); + this.opt = opt; + this.axisModel = axisModel; // Default value + + defaults(opt, { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true, + handleAutoShown: function () { + return true; + } + }); // FIXME Not use a seperate text group? + + var transformGroup = new Group({ + x: opt.position[0], + y: opt.position[1], + rotation: opt.rotation + }); // this.group.add(transformGroup); + // this._transformGroup = transformGroup; + + transformGroup.updateTransform(); + this._transformGroup = transformGroup; + } + + AxisBuilder.prototype.hasBuilder = function (name) { + return !!builders[name]; + }; + + AxisBuilder.prototype.add = function (name) { + builders[name](this.opt, this.axisModel, this.group, this._transformGroup); + }; + + AxisBuilder.prototype.getGroup = function () { + return this.group; + }; + + AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) { + var rotationDiff = remRadian(textRotation - axisRotation); + var textAlign; + var textVerticalAlign; + + if (isRadianAroundZero(rotationDiff)) { + // Label is parallel with axis line. + textVerticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI$5)) { + // Label is inverse parallel with axis line. + textVerticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + + if (rotationDiff > 0 && rotationDiff < PI$5) { + textAlign = direction > 0 ? 'right' : 'left'; + } else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + }; + + AxisBuilder.makeAxisEventDataBase = function (axisModel) { + var eventData = { + componentType: axisModel.mainType, + componentIndex: axisModel.componentIndex + }; + eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex; + return eventData; + }; + + AxisBuilder.isLabelSilent = function (axisModel) { + var tooltipOpt = axisModel.get('tooltip'); + return axisModel.get('silent') // Consider mouse cursor, add these restrictions. + || !(axisModel.get('triggerEvent') || tooltipOpt && tooltipOpt.show); + }; + + return AxisBuilder; + }(); + var builders = { + axisLine: function (opt, axisModel, group, transformGroup) { + var shown = axisModel.get(['axisLine', 'show']); + + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisLine'); + } + + if (!shown) { + return; + } + + var extent = axisModel.axis.getExtent(); + var matrix = transformGroup.transform; + var pt1 = [extent[0], 0]; + var pt2 = [extent[1], 0]; + + if (matrix) { + applyTransform(pt1, pt1, matrix); + applyTransform(pt2, pt2, matrix); + } + + var lineStyle = extend({ + lineCap: 'round' + }, axisModel.getModel(['axisLine', 'lineStyle']).getLineStyle()); + var line = new Line({ + // Id for animation + subPixelOptimize: true, + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: lineStyle, + strokeContainThreshold: opt.strokeContainThreshold || 5, + silent: true, + z2: 1 + }); + line.anid = 'line'; + group.add(line); + var arrows = axisModel.get(['axisLine', 'symbol']); + var arrowSize = axisModel.get(['axisLine', 'symbolSize']); + var arrowOffset = axisModel.get(['axisLine', 'symbolOffset']) || 0; + + if (typeof arrowOffset === 'number') { + arrowOffset = [arrowOffset, arrowOffset]; + } + + if (arrows != null) { + if (typeof arrows === 'string') { + // Use the same arrow for start and end point + arrows = [arrows, arrows]; + } + + if (typeof arrowSize === 'string' || typeof arrowSize === 'number') { + // Use the same size for width and height + arrowSize = [arrowSize, arrowSize]; + } + + var symbolWidth_1 = arrowSize[0]; + var symbolHeight_1 = arrowSize[1]; + each([{ + rotate: opt.rotation + Math.PI / 2, + offset: arrowOffset[0], + r: 0 + }, { + rotate: opt.rotation - Math.PI / 2, + offset: arrowOffset[1], + r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1])) + }], function (point, index) { + if (arrows[index] !== 'none' && arrows[index] != null) { + var symbol = createSymbol(arrows[index], -symbolWidth_1 / 2, -symbolHeight_1 / 2, symbolWidth_1, symbolHeight_1, lineStyle.stroke, true); // Calculate arrow position with offset + + var r = point.r + point.offset; + symbol.attr({ + rotation: point.rotate, + x: pt1[0] + r * Math.cos(opt.rotation), + y: pt1[1] - r * Math.sin(opt.rotation), + silent: true, + z2: 11 + }); + group.add(symbol); + } + }); + } + }, + axisTickLabel: function (opt, axisModel, group, transformGroup) { + var ticksEls = buildAxisMajorTicks(group, transformGroup, axisModel, opt); + var labelEls = buildAxisLabel(group, transformGroup, axisModel, opt); + fixMinMaxLabelShow(axisModel, labelEls, ticksEls); + buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); + }, + axisName: function (opt, axisModel, group, transformGroup) { + var name = retrieve(opt.axisName, 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 = 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, // Reuse labelOffset. + isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0]; + var labelLayout; + var nameRotation = axisModel.get('nameRotate'); + + if (nameRotation != null) { + nameRotation = nameRotation * PI$5 / 180; // To radian. + } + + var axisNameAvailableWidth; + + if (isNameLocationCenter(nameLocation)) { + labelLayout = AxisBuilder.innerTextLayout(opt.rotation, nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis. + nameDirection); + } else { + labelLayout = endTextLayout(opt.rotation, nameLocation, nameRotation || 0, extent); + axisNameAvailableWidth = opt.axisNameAvailableWidth; + + if (axisNameAvailableWidth != null) { + axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout.rotation)); + !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null); + } + } + + var textFont = textStyleModel.getFont(); + var truncateOpt = axisModel.get('nameTruncate', true) || {}; + var ellipsis = truncateOpt.ellipsis; + var maxWidth = retrieve(opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth); + var tooltipOpt = axisModel.get('tooltip', true); + var mainType = axisModel.mainType; + var formatterParams = { + componentType: mainType, + name: name, + $vars: ['name'] + }; + formatterParams[mainType + 'Index'] = axisModel.componentIndex; + var textEl = new ZRText({ + x: pos[0], + y: pos[1], + rotation: labelLayout.rotation, + silent: AxisBuilder.isLabelSilent(axisModel), + style: createTextStyle(textStyleModel, { + text: name, + font: textFont, + overflow: 'truncate', + width: maxWidth, + ellipsis: ellipsis, + fill: textStyleModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']), + align: textStyleModel.get('align') || labelLayout.textAlign, + verticalAlign: textStyleModel.get('verticalAlign') || labelLayout.textVerticalAlign + }), + z2: 1 + }); + textEl.tooltip = tooltipOpt && tooltipOpt.show ? extend({ + content: name, + formatter: function () { + return name; + }, + formatterParams: formatterParams + }, tooltipOpt) : null; + textEl.__fullText = name; // Id for animation + + textEl.anid = 'name'; + + if (axisModel.get('triggerEvent')) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisName'; + eventData.name = name; + getECData(textEl).eventData = eventData; + } // FIXME + + + transformGroup.add(textEl); + textEl.updateTransform(); + group.add(textEl); + textEl.decomposeTransform(); + } + }; + + function endTextLayout(rotation, textPosition, textRotate, extent) { + var rotationDiff = remRadian(textRotate - rotation); + var textAlign; + var textVerticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = textPosition === 'start' && !inverse || textPosition !== 'start' && inverse; + + if (isRadianAroundZero(rotationDiff - PI$5 / 2)) { + textVerticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI$5 * 1.5)) { + textVerticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + + if (rotationDiff < PI$5 * 1.5 && rotationDiff > PI$5 / 2) { + textAlign = onLeft ? 'left' : 'right'; + } else { + textAlign = onLeft ? 'right' : 'left'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + } + + function fixMinMaxLabelShow(axisModel, labelEls, tickEls) { + if (shouldShowAllLabels(axisModel.axis)) { + return; + } // 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 + + + var showMinLabel = axisModel.get(['axisLabel', 'showMinLabel']); + var showMaxLabel = axisModel.get(['axisLabel', 'showMaxLabel']); // FIXME + // Have not consider onBand yet, where tick els is more than label els. + + labelEls = labelEls || []; + tickEls = tickEls || []; + var firstLabel = labelEls[0]; + var nextLabel = labelEls[1]; + var lastLabel = labelEls[labelEls.length - 1]; + var prevLabel = labelEls[labelEls.length - 2]; + var firstTick = tickEls[0]; + var nextTick = tickEls[1]; + var lastTick = tickEls[tickEls.length - 1]; + var prevTick = tickEls[tickEls.length - 2]; + + if (showMinLabel === false) { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } else if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + if (showMinLabel) { + ignoreEl(nextLabel); + ignoreEl(nextTick); + } else { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } + } + + if (showMaxLabel === false) { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } else if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + if (showMaxLabel) { + ignoreEl(prevLabel); + ignoreEl(prevTick); + } else { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } + } + } + + function ignoreEl(el) { + el && (el.ignore = true); + } + + function isTwoLabelOverlapped(current, next) { + // current and next has the same rotation. + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + + if (!firstRect || !nextRect) { + return; + } // When checking intersect of two rotated labels, we use mRotationBack + // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`. + + + var mRotationBack = identity([]); + rotate(mRotationBack, mRotationBack, -current.rotation); + firstRect.applyTransform(mul$1([], mRotationBack, current.getLocalTransform())); + nextRect.applyTransform(mul$1([], mRotationBack, next.getLocalTransform())); + return firstRect.intersect(nextRect); + } + + function isNameLocationCenter(nameLocation) { + return nameLocation === 'middle' || nameLocation === 'center'; + } + + function createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, anidPrefix) { + var tickEls = []; + var pt1 = []; + var pt2 = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = ticksCoords[i].coord; + pt1[0] = tickCoord; + pt1[1] = 0; + pt2[0] = tickCoord; + pt2[1] = tickEndCoord; + + if (tickTransform) { + applyTransform(pt1, pt1, tickTransform); + applyTransform(pt2, pt2, tickTransform); + } // Tick line, Not use group transform to have better line draw + + + var tickEl = new Line({ + subPixelOptimize: true, + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: tickLineStyle, + z2: 2, + autoBatch: true, + silent: true + }); + tickEl.anid = anidPrefix + '_' + ticksCoords[i].tickValue; + tickEls.push(tickEl); + } + + return tickEls; + } + + function buildAxisMajorTicks(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var tickModel = axisModel.getModel('axisTick'); + var shown = tickModel.get('show'); + + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisTick'); + } + + if (!shown || axis.scale.isBlank()) { + return; + } + + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickEndCoord = opt.tickDirection * tickModel.get('length'); + var ticksCoords = axis.getTicksCoords(); + var ticksEls = createTicks(ticksCoords, transformGroup.transform, tickEndCoord, defaults(lineStyleModel.getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + }), 'ticks'); + + for (var i = 0; i < ticksEls.length; i++) { + group.add(ticksEls[i]); + } + + return ticksEls; + } + + function buildAxisMinorTicks(group, transformGroup, axisModel, tickDirection) { + var axis = axisModel.axis; + var minorTickModel = axisModel.getModel('minorTick'); + + if (!minorTickModel.get('show') || axis.scale.isBlank()) { + return; + } + + var minorTicksCoords = axis.getMinorTicksCoords(); + + if (!minorTicksCoords.length) { + return; + } + + var lineStyleModel = minorTickModel.getModel('lineStyle'); + var tickEndCoord = tickDirection * minorTickModel.get('length'); + var minorTickLineStyle = defaults(lineStyleModel.getLineStyle(), defaults(axisModel.getModel('axisTick').getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + })); + + for (var i = 0; i < minorTicksCoords.length; i++) { + var minorTicksEls = createTicks(minorTicksCoords[i], transformGroup.transform, tickEndCoord, minorTickLineStyle, 'minorticks_' + i); + + for (var k = 0; k < minorTicksEls.length; k++) { + group.add(minorTicksEls[k]); + } + } + } + + function buildAxisLabel(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var show = retrieve(opt.axisLabelShow, axisModel.get(['axisLabel', 'show'])); + + if (!show || axis.scale.isBlank()) { + return; + } + + var labelModel = axisModel.getModel('axisLabel'); + var labelMargin = labelModel.get('margin'); + var labels = axis.getViewLabels(); // Special label rotate. + + var labelRotation = (retrieve(opt.labelRotate, labelModel.get('rotate')) || 0) * PI$5 / 180; + var labelLayout = AxisBuilder.innerTextLayout(opt.rotation, labelRotation, opt.labelDirection); + var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true); + var labelEls = []; + var silent = AxisBuilder.isLabelSilent(axisModel); + var triggerEvent = axisModel.get('triggerEvent'); + each(labels, function (labelItem, index) { + var tickValue = axis.scale.type === 'ordinal' ? axis.scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + var formattedLabel = labelItem.formattedLabel; + var rawLabel = labelItem.rawLabel; + var itemLabelModel = labelModel; + + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + + if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) { + itemLabelModel = new Model(rawCategoryItem.textStyle, labelModel, axisModel.ecModel); + } + } + + var textColor = itemLabelModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']); + var tickCoord = axis.dataToCoord(tickValue); + var textEl = new ZRText({ + x: tickCoord, + y: opt.labelOffset + opt.labelDirection * labelMargin, + rotation: labelLayout.rotation, + silent: silent, + z2: 10, + style: createTextStyle(itemLabelModel, { + text: formattedLabel, + align: itemLabelModel.getShallow('align', true) || labelLayout.textAlign, + verticalAlign: itemLabelModel.getShallow('verticalAlign', true) || itemLabelModel.getShallow('baseline', true) || labelLayout.textVerticalAlign, + fill: typeof textColor === 'function' ? textColor( // (1) In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + // (2) Compatible with previous version, which always use formatted label as + // input. But in interval scale the formatted label is like '223,445', which + // maked user repalce ','. So we modify it to return original val but remain + // it as 'string' to avoid error in replacing. + axis.type === 'category' ? rawLabel : axis.type === 'value' ? tickValue + '' : tickValue, index) : textColor + }) + }); + textEl.anid = 'label_' + tickValue; // Pack data for mouse event + + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisLabel'; + eventData.value = rawLabel; + getECData(textEl).eventData = eventData; + } // FIXME + + + transformGroup.add(textEl); + textEl.updateTransform(); + labelEls.push(textEl); + group.add(textEl); + textEl.decomposeTransform(); + }); + return labelEls; + } + + // allAxesInfo should be updated when setOption performed. + + function collect(ecModel, api) { + var result = { + /** + * key: makeKey(axis.model) + * value: { + * axis, + * coordSys, + * axisPointerModel, + * triggerTooltip, + * involveSeries, + * snap, + * seriesModels, + * seriesDataCount + * } + */ + axesInfo: {}, + seriesInvolved: false, + + /** + * key: makeKey(coordSys.model) + * value: Object: key makeKey(axis.model), value: axisInfo + */ + coordSysAxesInfo: {}, + coordSysMap: {} + }; + collectAxesInfo(result, ecModel, api); // Check seriesInvolved for performance, in case too many series in some chart. + + result.seriesInvolved && collectSeriesInfo(result, ecModel); + return result; + } + + function collectAxesInfo(result, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var globalAxisPointerModel = ecModel.getComponent('axisPointer'); // links can only be set on global. + + var linksOption = globalAxisPointerModel.get('link', true) || []; + var linkGroups = []; // Collect axes info. + + each(api.getCoordinateSystems(), function (coordSys) { + // Some coordinate system do not support axes, like geo. + if (!coordSys.axisPointerEnabled) { + return; + } + + var coordSysKey = makeKey(coordSys.model); + var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; + result.coordSysMap[coordSysKey] = coordSys; // Set tooltip (like 'cross') is a convienent way to show axisPointer + // for user. So we enable seting tooltip on coordSys model. + + var coordSysModel = coordSys.model; + var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel); + each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null)); // If axis tooltip used, choose tooltip axis for each coordSys. + // Notice this case: coordSys is `grid` but not `cartesian2D` here. + + if (coordSys.getTooltipAxes && globalTooltipModel // If tooltip.showContent is set as false, tooltip will not + // show but axisPointer will show as normal. + && baseTooltipModel.get('show')) { + // Compatible with previous logic. But series.tooltip.trigger: 'axis' + // or series.data[n].tooltip.trigger: 'axis' are not support any more. + var triggerAxis = baseTooltipModel.get('trigger') === 'axis'; + var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross'; + var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis'])); + + if (triggerAxis || cross) { + each(tooltipAxes.baseAxes, curry(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis)); + } + + if (cross) { + each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false)); + } + } // fromTooltip: true | false | 'cross' + // triggerTooltip: true | false | null + + + function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { + var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel); + var axisPointerShow = axisPointerModel.get('show'); + + if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) { + return; + } + + if (triggerTooltip == null) { + triggerTooltip = axisPointerModel.get('triggerTooltip'); + } + + axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel; + var snap = axisPointerModel.get('snap'); + var axisKey = makeKey(axis.model); + var involveSeries = triggerTooltip || snap || axis.type === 'category'; // If result.axesInfo[key] exist, override it (tooltip has higher priority). + + var axisInfo = result.axesInfo[axisKey] = { + key: axisKey, + axis: axis, + coordSys: coordSys, + axisPointerModel: axisPointerModel, + triggerTooltip: triggerTooltip, + involveSeries: involveSeries, + snap: snap, + useHandle: isHandleTrigger(axisPointerModel), + seriesModels: [], + linkGroup: null + }; + axesInfoInCoordSys[axisKey] = axisInfo; + result.seriesInvolved = result.seriesInvolved || involveSeries; + var groupIndex = getLinkGroupIndex(linksOption, axis); + + if (groupIndex != null) { + var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = { + axesInfo: {} + }); + linkGroup.axesInfo[axisKey] = axisInfo; + linkGroup.mapper = linksOption[groupIndex].mapper; + axisInfo.linkGroup = linkGroup; + } + } + }); + } + + function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) { + var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer'); + var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z']; + var volatileOption = {}; + each(fields, function (field) { + volatileOption[field] = clone(tooltipAxisPointerModel.get(field)); + }); // category axis do not auto snap, otherwise some tick that do not + // has value can not be hovered. value/time/log axis default snap if + // triggered from tooltip and trigger tooltip. + + volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; // Compatibel with previous behavior, tooltip axis do not show label by default. + // Only these properties can be overrided from tooltip to axisPointer. + + if (tooltipAxisPointerModel.get('type') === 'cross') { + volatileOption.type = 'line'; + } + + var labelOption = volatileOption.label || (volatileOption.label = {}); // Follow the convention, do not show label when triggered by tooltip by default. + + labelOption.show == null && (labelOption.show = false); + + if (fromTooltip === 'cross') { + // When 'cross', both axes show labels. + var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']); + labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; // If triggerTooltip, this is a base axis, which should better not use cross style + // (cross style is dashed by default) + + if (!triggerTooltip) { + var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle'); + crossStyle && defaults(labelOption, crossStyle.textStyle); + } + } + + return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel)); + } + + function collectSeriesInfo(result, ecModel) { + // Prepare data for axis trigger + ecModel.eachSeries(function (seriesModel) { + // Notice this case: this coordSys is `cartesian2D` but not `grid`. + var coordSys = seriesModel.coordinateSystem; + var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true); + var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true); + + if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) { + return; + } + + each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) { + var axis = axisInfo.axis; + + if (coordSys.getAxis(axis.dim) === axis) { + axisInfo.seriesModels.push(seriesModel); + axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); + axisInfo.seriesDataCount += seriesModel.getData().count(); + } + }); + }); + } + /** + * For example: + * { + * axisPointer: { + * links: [{ + * xAxisIndex: [2, 4], + * yAxisIndex: 'all' + * }, { + * xAxisId: ['a5', 'a7'], + * xAxisName: 'xxx' + * }] + * } + * } + */ + + + function getLinkGroupIndex(linksOption, axis) { + var axisModel = axis.model; + var dim = axis.dim; + + for (var i = 0; i < linksOption.length; i++) { + var linkOption = linksOption[i] || {}; + + if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) { + return i; + } + } + } + + function checkPropInLink(linkPropValue, axisPropValue) { + return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue; + } + + function fixValue(axisModel) { + var axisInfo = getAxisInfo(axisModel); + + if (!axisInfo) { + return; + } + + var axisPointerModel = axisInfo.axisPointerModel; + var scale = axisInfo.axis.scale; + var option = axisPointerModel.option; + var status = axisPointerModel.get('status'); + var value = axisPointerModel.get('value'); // Parse init value for category and time axis. + + if (value != null) { + value = scale.parse(value); + } + + var useHandle = isHandleTrigger(axisPointerModel); // If `handle` used, `axisPointer` will always be displayed, so value + // and status should be initialized. + + if (status == null) { + option.status = useHandle ? 'show' : 'hide'; + } + + var extent = scale.getExtent().slice(); + extent[0] > extent[1] && extent.reverse(); + + if ( // Pick a value on axis when initializing. + value == null // If both `handle` and `dataZoom` are used, value may be out of axis extent, + // where we should re-pick a value to keep `handle` displaying normally. + || value > extent[1]) { + // Make handle displayed on the end of the axis when init, which looks better. + value = extent[1]; + } + + if (value < extent[0]) { + value = extent[0]; + } + + option.value = value; + + if (useHandle) { + option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show'; + } + } + function getAxisInfo(axisModel) { + var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo; + return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; + } + function getAxisPointerModel(axisModel) { + var axisInfo = getAxisInfo(axisModel); + return axisInfo && axisInfo.axisPointerModel; + } + + function isHandleTrigger(axisPointerModel) { + return !!axisPointerModel.get(['handle', 'show']); + } + /** + * @param {module:echarts/model/Model} model + * @return {string} unique key + */ + + + function makeKey(model) { + return model.type + '||' + model.id; + } + + var axisPointerClazz = {}; + /** + * Base class of AxisView. + */ + + var AxisView = + /** @class */ + function (_super) { + __extends(AxisView, _super); + + function AxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisView.type; + return _this; + } + /** + * @override + */ + + + AxisView.prototype.render = function (axisModel, ecModel, api, payload) { + // FIXME + // This process should proformed after coordinate systems updated + // (axis scale updated), and should be performed each time update. + // So put it here temporarily, although it is not appropriate to + // put a model-writing procedure in `view`. + this.axisPointerClass && fixValue(axisModel); + + _super.prototype.render.apply(this, arguments); + + this._doUpdateAxisPointerClass(axisModel, api, true); + }; + /** + * Action handler. + */ + + + AxisView.prototype.updateAxisPointer = function (axisModel, ecModel, api, payload) { + this._doUpdateAxisPointerClass(axisModel, api, false); + }; + /** + * @override + */ + + + AxisView.prototype.remove = function (ecModel, api) { + var axisPointer = this._axisPointer; + axisPointer && axisPointer.remove(api); + }; + /** + * @override + */ + + + AxisView.prototype.dispose = function (ecModel, api) { + this._disposeAxisPointer(api); + + _super.prototype.dispose.apply(this, arguments); + }; + + AxisView.prototype._doUpdateAxisPointerClass = function (axisModel, api, forceRender) { + var Clazz = AxisView.getAxisPointerClass(this.axisPointerClass); + + if (!Clazz) { + return; + } + + var axisPointerModel = getAxisPointerModel(axisModel); + axisPointerModel ? (this._axisPointer || (this._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : this._disposeAxisPointer(api); + }; + + AxisView.prototype._disposeAxisPointer = function (api) { + this._axisPointer && this._axisPointer.dispose(api); + this._axisPointer = null; + }; + + AxisView.registerAxisPointerClass = function (type, clazz) { + if ("development" !== 'production') { + if (axisPointerClazz[type]) { + throw new Error('axisPointer ' + type + ' exists'); + } + } + + axisPointerClazz[type] = clazz; + }; + + AxisView.getAxisPointerClass = function (type) { + return type && axisPointerClazz[type]; + }; + AxisView.type = 'axis'; + return AxisView; + }(ComponentView); + + var inner$5 = makeInner(); + function rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } // TODO: TYPE + + + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var gridRect = gridModel.coordinateSystem.getRect(); + var ticksCoords = axis.getTicksCoords({ + tickModel: splitAreaModel, + clamp: true + }); + + if (!ticksCoords.length) { + return; + } // For Making appropriate splitArea animation, the color and anid + // should be corresponding to previous one if possible. + + + var areaColorsLen = areaColors.length; + var lastSplitAreaColors = inner$5(axisView).splitAreaColors; + var newSplitAreaColors = createHashMap(); + var colorIndex = 0; + + if (lastSplitAreaColors) { + for (var i = 0; i < ticksCoords.length; i++) { + var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue); + + if (cIndex != null) { + colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen; + break; + } + } + } + + var prev = axis.toGlobalCoord(ticksCoords[0].coord); + var areaStyle = areaStyleModel.getAreaStyle(); + areaColors = isArray(areaColors) ? areaColors : [areaColors]; + + for (var i = 1; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + + if (axis.isHorizontal()) { + x = prev; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + prev = x + width; + } else { + x = gridRect.x; + y = prev; + width = gridRect.width; + height = tickCoord - y; + prev = y + height; + } + + var tickValue = ticksCoords[i - 1].tickValue; + tickValue != null && newSplitAreaColors.set(tickValue, colorIndex); + axisGroup.add(new Rect({ + anid: tickValue != null ? 'area_' + tickValue : null, + shape: { + x: x, + y: y, + width: width, + height: height + }, + style: defaults({ + fill: areaColors[colorIndex] + }, areaStyle), + autoBatch: true, + silent: true + })); + colorIndex = (colorIndex + 1) % areaColorsLen; + } + + inner$5(axisView).splitAreaColors = newSplitAreaColors; + } + function rectCoordAxisHandleRemove(axisView) { + inner$5(axisView).splitAreaColors = null; + } + + var axisBuilderAttrs = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs = ['splitArea', 'splitLine', 'minorSplitLine']; + + var CartesianAxisView = + /** @class */ + function (_super) { + __extends(CartesianAxisView, _super); + + function CartesianAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianAxisView.type; + _this.axisPointerClass = 'CartesianAxisPointer'; + return _this; + } + /** + * @override + */ + + + CartesianAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var gridModel = axisModel.getCoordSysModel(); + var layout = layout$1(gridModel, axisModel); + var axisBuilder = new AxisBuilder(axisModel, extend({ + handleAutoShown: function (elementType) { + var cartesians = gridModel.coordinateSystem.getCartesians(); + + for (var i = 0; i < cartesians.length; i++) { + var otherAxisType = cartesians[i].getOtherAxis(axisModel.axis).type; + + if (otherAxisType === 'value' || otherAxisType === 'log') { + // Still show axis tick or axisLine if other axis is value / log + return true; + } + } // Not show axisTick or axisLine if other axis is category / time + + + return false; + } + }, layout)); + each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + each(selfBuilderAttrs, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders[name](this, this._axisGroup, axisModel, gridModel); + } + }, this); + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + + CartesianAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + + CartesianAxisView.type = 'cartesianAxis'; + return CartesianAxisView; + }(AxisView); + + var axisElementBuilders = { + splitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + lineColors = isArray(lineColors) ? lineColors : [lineColors]; + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + 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; + var tickValue = ticksCoords[i].tickValue; + axisGroup.add(new Line({ + anid: tickValue != null ? 'line_' + ticksCoords[i].tickValue : null, + subPixelOptimize: true, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: defaults({ + stroke: lineColors[colorIndex] + }, lineStyle), + silent: true + })); + } + }, + minorSplitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + var minorSplitLineModel = axisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var minorTicksCoords = axis.getMinorTicksCoords(); + + if (!minorTicksCoords.length) { + return; + } + + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord); + + 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; + } + + axisGroup.add(new Line({ + anid: 'minor_line_' + minorTicksCoords[i][k].tickValue, + subPixelOptimize: true, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: lineStyle, + silent: true + })); + } + } + }, + splitArea: function (axisView, axisGroup, axisModel, gridModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel); + } + }; + + var CartesianXAxisView = + /** @class */ + function (_super) { + __extends(CartesianXAxisView, _super); + + function CartesianXAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianXAxisView.type; + return _this; + } + + CartesianXAxisView.type = 'xAxis'; + return CartesianXAxisView; + }(CartesianAxisView); + + var CartesianYAxisView = + /** @class */ + function (_super) { + __extends(CartesianYAxisView, _super); + + function CartesianYAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianXAxisView.type; + return _this; + } + + CartesianYAxisView.type = 'yAxis'; + return CartesianYAxisView; + }(CartesianAxisView); + + var GridView = + /** @class */ + function (_super) { + __extends(GridView, _super); + + function GridView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'grid'; + return _this; + } + + GridView.prototype.render = function (gridModel, ecModel) { + this.group.removeAll(); + + if (gridModel.get('show')) { + this.group.add(new Rect({ + shape: gridModel.coordinateSystem.getRect(), + style: defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true, + z2: -1 + })); + } + }; + + GridView.type = 'grid'; + return GridView; + }(ComponentView); + + var extraOption = { + // gridIndex: 0, + // gridId: '', + offset: 0 + }; + function install$5(registers) { + registers.registerComponentView(GridView); + registers.registerComponentModel(GridModel); + registers.registerCoordinateSystem('cartesian2d', Grid); + axisModelCreator(registers, 'x', CartesianAxisModel, extraOption); + axisModelCreator(registers, 'y', CartesianAxisModel, extraOption); + registers.registerComponentView(CartesianXAxisView); + registers.registerComponentView(CartesianYAxisView); + registers.registerPreprocessor(function (option) { + // Only create grid when need + if (option.xAxis && option.yAxis && !option.grid) { + option.grid = {}; + } + }); + } + + function install$6(registers) { + // In case developer forget to include grid component + use(install$5); + registers.registerSeriesModel(ScatterSeriesModel); + registers.registerChartView(ScatterView); + registers.registerLayout(pointsLayout('scatter')); + } + + function radarLayout(ecModel) { + ecModel.eachSeriesByType('radar', function (seriesModel) { + var data = seriesModel.getData(); + var points = []; + var coordSys = seriesModel.coordinateSystem; + + if (!coordSys) { + return; + } + + var axes = coordSys.getIndicatorAxes(); + each(axes, function (axis, axisIndex) { + data.each(data.mapDimension(axes[axisIndex].dim), function (val, dataIndex) { + points[dataIndex] = points[dataIndex] || []; + var point = coordSys.dataToPoint(val, axisIndex); + points[dataIndex][axisIndex] = isValidPoint(point) ? point : getValueMissingPoint(coordSys); + }); + }); // Close polygon + + data.each(function (idx) { + // TODO + // Is it appropriate to connect to the next data when some data is missing? + // Or, should trade it like `connectNull` in line chart? + var firstPoint = find(points[idx], function (point) { + return isValidPoint(point); + }) || getValueMissingPoint(coordSys); // Copy the first actual point to the end of the array + + points[idx].push(firstPoint.slice()); + data.setItemLayout(idx, points[idx]); + }); + }); + } + + function isValidPoint(point) { + return !isNaN(point[0]) && !isNaN(point[1]); + } + + function getValueMissingPoint(coordSys) { + // It is error-prone to input [NaN, NaN] into polygon, polygon. + // (probably cause problem when refreshing or animating) + return [coordSys.cx, coordSys.cy]; + } + + function radarBackwardCompat(option) { + var polarOptArr = option.polar; + + if (polarOptArr) { + if (!isArray(polarOptArr)) { + polarOptArr = [polarOptArr]; + } + + var polarNotRadar_1 = []; + each(polarOptArr, function (polarOpt, idx) { + if (polarOpt.indicator) { + if (polarOpt.type && !polarOpt.shape) { + polarOpt.shape = polarOpt.type; + } + + option.radar = option.radar || []; + + if (!isArray(option.radar)) { + option.radar = [option.radar]; + } + + option.radar.push(polarOpt); + } else { + polarNotRadar_1.push(polarOpt); + } + }); + option.polar = polarNotRadar_1; + } + + each(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'radar' && seriesOpt.polarIndex) { + seriesOpt.radarIndex = seriesOpt.polarIndex; + } + }); + } + + function normalizeSymbolSize(symbolSize) { + if (!isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + + return symbolSize; + } + + var RadarView = + /** @class */ + function (_super) { + __extends(RadarView, _super); + + function RadarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarView.type; + return _this; + } + + RadarView.prototype.render = function (seriesModel, ecModel, api) { + var polar = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + function createSymbol$1(data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + + if (symbolType === 'none') { + return; + } + + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2); + var symbolRotate = data.getItemVisual(idx, 'symbolRotate') || 0; + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2, + rotation: symbolRotate * Math.PI / 180 || 0 + }); + 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$1(data, idx); + + if (symbolPath) { + symbolPath.__dimIdx = i; + + if (oldPoints[i]) { + symbolPath.setPosition(oldPoints[i]); + graphic[isInit ? 'initProps' : 'updateProps'](symbolPath, { + x: newPoints[i][0], + y: newPoints[i][1] + }, seriesModel, idx); + } else { + symbolPath.setPosition(newPoints[i]); + } + + symbolGroup.add(symbolPath); + } + } + } + + function getInitialPoints(points) { + return 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 Polygon(); + var polyline = new Polyline(); + var target = { + shape: { + points: points + } + }; + polygon.shape.points = getInitialPoints(points); + polyline.shape.points = getInitialPoints(points); + initProps(polygon, target, seriesModel, idx); + initProps(polyline, target, seriesModel, idx); + var itemGroup = new Group(); + var symbolGroup = new 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); + updateProps(polyline, target, seriesModel); + 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); // Radar uses the visual encoded from itemStyle. + + var itemStyle = data.getItemVisual(idx, 'style'); + var color = itemStyle.fill; + group.add(itemGroup); + polyline.useStyle(defaults(itemModel.getModel('lineStyle').getLineStyle(), { + fill: 'none', + stroke: color + })); + setStatesStylesFromModel(polyline, itemModel, 'lineStyle'); + setStatesStylesFromModel(polygon, itemModel, 'areaStyle'); + var areaStyleModel = itemModel.getModel('areaStyle'); + var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty(); + polygon.ignore = polygonIgnore; + each(['emphasis', 'select', 'blur'], function (stateName) { + var stateModel = itemModel.getModel([stateName, 'areaStyle']); + var stateIgnore = stateModel.isEmpty() && stateModel.parentModel.isEmpty(); // Won't be ignore if normal state is not ignore. + + polygon.ensureState(stateName).ignore = stateIgnore && polygonIgnore; + }); + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: color, + opacity: 0.7, + decal: itemStyle.decal + })); + var emphasisModel = itemModel.getModel('emphasis'); + var itemHoverStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + symbolGroup.eachChild(function (symbolPath) { + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, itemStyle)); + } else { + symbolPath.useStyle(itemStyle); + symbolPath.setColor(color); + } + + var pathEmphasisState = symbolPath.ensureState('emphasis'); + pathEmphasisState.style = clone(itemHoverStyle); + var defaultText = data.get(data.dimensions[symbolPath.__dimIdx], idx); + (defaultText == null || isNaN(defaultText)) && (defaultText = ''); + setLabelStyle(symbolPath, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + labelDimIndex: symbolPath.__dimIdx, + defaultText: defaultText, + inheritColor: color, + defaultOpacity: itemStyle.opacity + }); + }); + enableHoverEmphasis(itemGroup, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + }); + this._data = data; + }; + + RadarView.prototype.remove = function () { + this.group.removeAll(); + this._data = null; + }; + + RadarView.type = 'radar'; + return RadarView; + }(ChartView); + + var RadarSeriesModel = + /** @class */ + function (_super) { + __extends(RadarSeriesModel, _super); + + function RadarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarSeriesModel.type; + _this.useColorPaletteOnData = true; + _this.hasSymbolVisual = true; + return _this; + } // Overwrite + + + RadarSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + }; + + RadarSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListSimply(this, { + generateCoord: 'indicator_', + generateCoordCount: Infinity + }); + }; + + RadarSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var coordSys = this.coordinateSystem; + var indicatorAxes = coordSys.getIndicatorAxes(); + var name = this.getData().getName(dataIndex); + var nameToDisplay = name === '' ? this.name : name; + var markerColor = retrieveVisualColorForTooltipMarker(this, dataIndex); + return createTooltipMarkup('section', { + header: nameToDisplay, + sortBlocks: true, + blocks: map(indicatorAxes, function (axis) { + var val = data.get(data.mapDimension(axis.dim), dataIndex); + return createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: markerColor, + name: axis.name, + value: val, + sortParam: val + }); + }) + }); + }; + + RadarSeriesModel.prototype.getTooltipPosition = function (dataIndex) { + if (dataIndex != null) { + var data_1 = this.getData(); + var coordSys = this.coordinateSystem; + var values = data_1.getValues(map(coordSys.dimensions, function (dim) { + return data_1.mapDimension(dim); + }), dataIndex); + + for (var i = 0, len = values.length; i < len; i++) { + if (!isNaN(values[i])) { + var indicatorAxes = coordSys.getIndicatorAxes(); + return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i); + } + } + } + }; + + RadarSeriesModel.type = 'series.radar'; + RadarSeriesModel.dependencies = ['radar']; + RadarSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'radar', + legendHoverLink: true, + radarIndex: 0, + lineStyle: { + width: 2, + type: 'solid' + }, + label: { + position: 'top' + }, + // areaStyle: { + // }, + // itemStyle: {} + symbol: 'emptyCircle', + symbolSize: 4 // symbolRotate: null + + }; + return RadarSeriesModel; + }(SeriesModel); + + var valueAxisDefault = axisDefault.value; + + function defaultsShow(opt, show) { + return defaults({ + show: show + }, opt); + } + + var RadarModel = + /** @class */ + function (_super) { + __extends(RadarModel, _super); + + function RadarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarModel.type; + return _this; + } + + RadarModel.prototype.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'); // let axisType = this.get('axisType'); + + var axisLabel = this.get('axisLabel'); + var nameTextStyle = this.get('axisName'); + var showName = this.get(['axisName', 'show']); + var nameFormatter = this.get(['axisName', 'formatter']); + var nameGap = this.get('axisNameGap'); + var triggerEvent = this.get('triggerEvent'); + var indicatorModels = map(this.get('indicator') || [], function (indicatorOpt) { + // PENDING + if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) { + indicatorOpt.min = 0; + } else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) { + indicatorOpt.max = 0; + } + + var iNameTextStyle = nameTextStyle; + + if (indicatorOpt.color != null) { + iNameTextStyle = defaults({ + color: indicatorOpt.color + }, nameTextStyle); + } // Use same configuration + + + var innerIndicatorOpt = merge(clone(indicatorOpt), { + boundaryGap: boundaryGap, + splitNumber: splitNumber, + scale: scale, + axisLine: axisLine, + axisTick: axisTick, + // axisType: axisType, + axisLabel: axisLabel, + // Compatible with 2 and use text + name: indicatorOpt.text, + nameLocation: 'end', + nameGap: nameGap, + // min: 0, + nameTextStyle: iNameTextStyle, + triggerEvent: triggerEvent + }, false); + + if (!showName) { + innerIndicatorOpt.name = ''; + } + + if (typeof nameFormatter === 'string') { + var indName = innerIndicatorOpt.name; + innerIndicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : ''); + } else if (typeof nameFormatter === 'function') { + innerIndicatorOpt.name = nameFormatter(innerIndicatorOpt.name, innerIndicatorOpt); + } + + var model = new Model(innerIndicatorOpt, null, this.ecModel); + mixin(model, AxisModelCommonMixin.prototype); // For triggerEvent. + + model.mainType = 'radar'; + model.componentIndex = this.componentIndex; + return model; + }, this); + this._indicatorModels = indicatorModels; + }; + + RadarModel.prototype.getIndicatorModels = function () { + return this._indicatorModels; + }; + + RadarModel.type = 'radar'; + RadarModel.defaultOption = { + zlevel: 0, + z: 0, + center: ['50%', '50%'], + radius: '75%', + startAngle: 90, + axisName: { + show: true // formatter: null + // textStyle: {} + + }, + boundaryGap: [0, 0], + splitNumber: 5, + axisNameGap: 15, + scale: false, + // Polygon or circle + shape: 'polygon', + axisLine: merge({ + lineStyle: { + color: '#bbb' + } + }, valueAxisDefault.axisLine), + axisLabel: defaultsShow(valueAxisDefault.axisLabel, false), + axisTick: defaultsShow(valueAxisDefault.axisTick, false), + // axisType: 'value', + splitLine: defaultsShow(valueAxisDefault.splitLine, true), + splitArea: defaultsShow(valueAxisDefault.splitArea, true), + // {text, min, max} + indicator: [] + }; + return RadarModel; + }(ComponentModel); + + var axisBuilderAttrs$1 = ['axisLine', 'axisTickLabel', 'axisName']; + + var RadarView$1 = + /** @class */ + function (_super) { + __extends(RadarView, _super); + + function RadarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarView.type; + return _this; + } + + RadarView.prototype.render = function (radarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + this._buildAxes(radarModel); + + this._buildSplitLineAndArea(radarModel); + }; + + RadarView.prototype._buildAxes = function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + var axisBuilders = 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; + }); + each(axisBuilders, function (axisBuilder) { + each(axisBuilderAttrs$1, axisBuilder.add, axisBuilder); + this.group.add(axisBuilder.getGroup()); + }, this); + }; + + RadarView.prototype._buildSplitLineAndArea = function (radarModel) { + var radar = radarModel.coordinateSystem; + 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'); + var splitLineColorsArr = isArray(splitLineColors) ? splitLineColors : [splitLineColors]; + var splitAreaColorsArr = 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, splitLineColorsArr, i); + splitLines[colorIndex].push(new Circle({ + shape: { + cx: cx, + cy: cy, + r: ticksRadius[i].coord + } + })); + } + + if (showSplitArea && i < ticksRadius.length - 1) { + var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i); + splitAreas[colorIndex].push(new Ring({ + shape: { + cx: cx, + cy: cy, + r0: ticksRadius[i].coord, + r: ticksRadius[i + 1].coord + } + })); + } + } + } // Polyyon + else { + var realSplitNumber_1; + var axesTicksPoints = map(indicatorAxes, function (indicatorAxis, idx) { + var ticksCoords = indicatorAxis.getTicksCoords(); + realSplitNumber_1 = realSplitNumber_1 == null ? ticksCoords.length - 1 : Math.min(ticksCoords.length - 1, realSplitNumber_1); + return map(ticksCoords, function (tickCoord) { + return radar.coordToPoint(tickCoord.coord, idx); + }); + }); + var prevPoints = []; + + for (var i = 0; i <= realSplitNumber_1; i++) { + var points = []; + + for (var j = 0; j < indicatorAxes.length; j++) { + points.push(axesTicksPoints[j][i]); + } // Close + + + if (points[0]) { + points.push(points[0].slice()); + } else { + if ("development" !== 'production') { + console.error('Can\'t draw value axis ' + i); + } + } + + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); + splitLines[colorIndex].push(new Polyline({ + shape: { + points: points + } + })); + } + + if (showSplitArea && prevPoints) { + var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i - 1); + splitAreas[colorIndex].push(new Polygon({ + shape: { + points: points.concat(prevPoints) + } + })); + } + + prevPoints = points.slice().reverse(); + } + } + + var lineStyle = lineStyleModel.getLineStyle(); + var areaStyle = areaStyleModel.getAreaStyle(); // Add splitArea before splitLine + + each(splitAreas, function (splitAreas, idx) { + this.group.add(mergePath$1(splitAreas, { + style: defaults({ + stroke: 'none', + fill: splitAreaColorsArr[idx % splitAreaColorsArr.length] + }, areaStyle), + silent: true + })); + }, this); + each(splitLines, function (splitLines, idx) { + this.group.add(mergePath$1(splitLines, { + style: defaults({ + fill: 'none', + stroke: splitLineColorsArr[idx % splitLineColorsArr.length] + }, lineStyle), + silent: true + })); + }, this); + }; + + RadarView.type = 'radar'; + return RadarView; + }(ComponentView); + + var IndicatorAxis = + /** @class */ + function (_super) { + __extends(IndicatorAxis, _super); + + function IndicatorAxis(dim, scale, radiusExtent) { + var _this = _super.call(this, dim, scale, radiusExtent) || this; + + _this.type = 'value'; + _this.angle = 0; + _this.name = ''; + return _this; + } + + return IndicatorAxis; + }(Axis); + + var Radar = + /** @class */ + function () { + function Radar(radarModel, ecModel, api) { + /** + * + * Radar dimensions + */ + this.dimensions = []; + this._model = radarModel; + this._indicatorAxes = map(radarModel.getIndicatorModels(), function (indicatorModel, idx) { + var dim = 'indicator_' + idx; + var indicatorAxis = new IndicatorAxis(dim, new IntervalScale() // (indicatorModel.get('axisType') === 'log') ? new LogScale() : 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); + } + + 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); + }; // TODO: API should be coordToPoint([coord, 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.coordToData(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 = parsePercent$1(center[0], viewWidth); + this.cy = parsePercent$1(center[1], viewHeight); + this.startAngle = radarModel.get('startAngle') * Math.PI / 180; // radius may be single value like `20`, `'80%'`, or array like `[10, '80%']` + + var radius = radarModel.get('radius'); + + if (typeof radius === 'string' || typeof radius === 'number') { + radius = [0, radius]; + } + + this.r0 = parsePercent$1(radius[0], viewSize); + this.r = parsePercent$1(radius[1], viewSize); + each(this._indicatorAxes, function (indicatorAxis, idx) { + indicatorAxis.setExtent(this.r0, 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; + each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeriesByType('radar', function (radarSeries, idx) { + if (radarSeries.get('coordinateSystem') !== 'radar' // @ts-ignore + || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel) { + return; + } + + var data = radarSeries.getData(); + each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(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. + + + each(indicatorAxes, function (indicatorAxis, idx) { + var rawExtent = getScaleExtent(indicatorAxis.scale, indicatorAxis.model).extent; + niceScaleExtent(indicatorAxis.scale, indicatorAxis.model); + var axisModel = indicatorAxis.model; + var scale = indicatorAxis.scale; + var fixedMin = parseAxisModelMinMax(scale, axisModel.get('min', true)); + var fixedMax = parseAxisModelMinMax(scale, axisModel.get('max', true)); + var interval = scale.getInterval(); + + if (fixedMin != null && fixedMax != null) { + // User set min, max, divide to get new interval + scale.setExtent(+fixedMin, +fixedMax); + scale.setInterval((fixedMax - fixedMin) / splitNumber); + } else if (fixedMin != null) { + var max = void 0; // 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 = void 0; // 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); + } // TODO + + + var max = Math.ceil(rawExtent[1] / interval) * interval; + var min = round(max - interval * splitNumber); + scale.setExtent(min, max); + scale.setInterval(interval); + } + }); + }; + + Radar.prototype.convertToPixel = function (ecModel, finder, value) { + console.warn('Not implemented.'); + return null; + }; + + Radar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + console.warn('Not implemented.'); + return null; + }; + + Radar.prototype.containPoint = function (point) { + console.warn('Not implemented.'); + return false; + }; + + 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 + // @ts-ignore + radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0]; + } + }); + return radarList; + }; + /** + * Radar dimensions is based on the data + */ + + + Radar.dimensions = []; + return Radar; + }(); + + function install$7(registers) { + registers.registerCoordinateSystem('radar', Radar); + registers.registerComponentModel(RadarModel); + registers.registerComponentView(RadarView$1); + } + + function install$8(registers) { + use(install$7); + registers.registerChartView(RadarView); + registers.registerSeriesModel(RadarSeriesModel); + registers.registerLayout(radarLayout); + registers.registerProcessor(dataFilter('radar')); + registers.registerPreprocessor(radarBackwardCompat); + } + + var ATTR = '\0_ec_interaction_mutex'; + function take(zr, resourceKey, userKey) { + var store = getStore(zr); + store[resourceKey] = userKey; + } + function release(zr, resourceKey, userKey) { + var store = getStore(zr); + var uKey = store[resourceKey]; + + if (uKey === userKey) { + store[resourceKey] = null; + } + } + function isTaken(zr, resourceKey) { + return !!getStore(zr)[resourceKey]; + } + + function getStore(zr) { + return zr[ATTR] || (zr[ATTR] = {}); + } + /** + * payload: { + * type: 'takeGlobalCursor', + * key: 'dataZoomSelect', or 'brush', or ..., + * If no userKey, release global cursor. + * } + */ + // TODO: SELF REGISTERED. + + + registerAction({ + type: 'takeGlobalCursor', + event: 'globalCursorTaken', + update: 'update' + }, function () {}); + + var RoamController = + /** @class */ + function (_super) { + __extends(RoamController, _super); + + function RoamController(zr) { + var _this = _super.call(this) || this; + + _this._zr = zr; // Avoid two roamController bind the same handler + + var mousedownHandler = bind(_this._mousedownHandler, _this); + var mousemoveHandler = bind(_this._mousemoveHandler, _this); + var mouseupHandler = bind(_this._mouseupHandler, _this); + var mousewheelHandler = bind(_this._mousewheelHandler, _this); + var pinchHandler = bind(_this._pinchHandler, _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. + */ + + _this.enable = function (controlType, opt) { + // Disable previous first + this.disable(); + this._opt = defaults(clone(opt) || {}, { + zoomOnMouseWheel: true, + moveOnMouseMove: true, + // By default, wheel do not trigger move. + moveOnMouseWheel: false, + preventDefaultMouseMove: true + }); + + 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); + }; + + return _this; + } + + RoamController.prototype.isDragging = function () { + return this._dragging; + }; + + RoamController.prototype.isPinching = function () { + return this._pinching; + }; + + RoamController.prototype.setPointerChecker = function (pointerChecker) { + this.pointerChecker = pointerChecker; + }; + + RoamController.prototype.dispose = function () { + this.disable(); + }; + + RoamController.prototype._mousedownHandler = function (e) { + if (isMiddleOrRightButtonOnMouseUpDown(e) || e.target && e.target.draggable) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; // Only check on mosedown, but not mousemove. + // Mouse can be out of target when mouse moving. + + if (this.pointerChecker && this.pointerChecker(e, x, y)) { + this._x = x; + this._y = y; + this._dragging = true; + } + }; + + RoamController.prototype._mousemoveHandler = function (e) { + if (!this._dragging || !isAvailableBehavior('moveOnMouseMove', e, this._opt) || e.gestureEvent === 'pinch' || isTaken(this._zr, 'globalPan')) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + var oldX = this._x; + var oldY = this._y; + var dx = x - oldX; + var dy = y - oldY; + this._x = x; + this._y = y; + this._opt.preventDefaultMouseMove && stop(e.event); + trigger(this, 'pan', 'moveOnMouseMove', e, { + dx: dx, + dy: dy, + oldX: oldX, + oldY: oldY, + newX: x, + newY: y, + isAvailableBehavior: null + }); + }; + + RoamController.prototype._mouseupHandler = function (e) { + if (!isMiddleOrRightButtonOnMouseUpDown(e)) { + this._dragging = false; + } + }; + + RoamController.prototype._mousewheelHandler = function (e) { + var shouldZoom = isAvailableBehavior('zoomOnMouseWheel', e, this._opt); + var shouldMove = isAvailableBehavior('moveOnMouseWheel', e, this._opt); + var wheelDelta = e.wheelDelta; + var absWheelDeltaDelta = Math.abs(wheelDelta); + var originX = e.offsetX; + var originY = e.offsetY; // wheelDelta maybe -0 in chrome mac. + + if (wheelDelta === 0 || !shouldZoom && !shouldMove) { + return; + } // If both `shouldZoom` and `shouldMove` is true, trigger + // their event both, and the final behavior is determined + // by event listener themselves. + + + if (shouldZoom) { + // Convenience: + // Mac and VM Windows on Mac: scroll up: zoom out. + // Windows: scroll up: zoom in. + // FIXME: Should do more test in different environment. + // wheelDelta is too complicated in difference nvironment + // (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel), + // although it has been normallized by zrender. + // wheelDelta of mouse wheel is bigger than touch pad. + var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1; + var scale = wheelDelta > 0 ? factor : 1 / factor; + checkPointerAndTrigger(this, 'zoom', 'zoomOnMouseWheel', e, { + scale: scale, + originX: originX, + originY: originY, + isAvailableBehavior: null + }); + } + + if (shouldMove) { + // FIXME: Should do more test in different environment. + var absDelta = Math.abs(wheelDelta); // wheelDelta of mouse wheel is bigger than touch pad. + + var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05); + checkPointerAndTrigger(this, 'scrollMove', 'moveOnMouseWheel', e, { + scrollDelta: scrollDelta, + originX: originX, + originY: originY, + isAvailableBehavior: null + }); + } + }; + + RoamController.prototype._pinchHandler = function (e) { + if (isTaken(this._zr, 'globalPan')) { + return; + } + + var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1; + checkPointerAndTrigger(this, 'zoom', null, e, { + scale: scale, + originX: e.pinchX, + originY: e.pinchY, + isAvailableBehavior: null + }); + }; + + return RoamController; + }(Eventful); + + function checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) { + if (controller.pointerChecker && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)) { + // When mouse is out of roamController rect, + // default befavoius should not be be disabled, otherwise + // page sliding is disabled, contrary to expectation. + stop(e.event); + trigger(controller, eventName, behaviorToCheck, e, contollerEvent); + } + } + + function trigger(controller, eventName, behaviorToCheck, e, contollerEvent) { + // Also provide behavior checker for event listener, for some case that + // multiple components share one listener. + contollerEvent.isAvailableBehavior = bind(isAvailableBehavior, null, behaviorToCheck, e); + controller.trigger(eventName, contollerEvent); + } // settings: { + // zoomOnMouseWheel + // moveOnMouseMove + // moveOnMouseWheel + // } + // The value can be: true / false / 'shift' / 'ctrl' / 'alt'. + + + function isAvailableBehavior(behaviorToCheck, e, settings) { + var setting = settings[behaviorToCheck]; + return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + 'Key']); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * For geo and graph. + */ + function updateViewOnPan(controllerHost, dx, dy) { + var target = controllerHost.target; + target.x += dx; + target.y += dy; + target.dirty(); + } + /** + * For geo and graph. + */ + + function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) { + var target = controllerHost.target; + var zoomLimit = controllerHost.zoomLimit; + var newZoom = controllerHost.zoom = controllerHost.zoom || 1; + newZoom *= zoomDelta; + + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin); + } + + var zoomScale = newZoom / controllerHost.zoom; + controllerHost.zoom = newZoom; // Keep the mouse center when scaling + + target.x -= (zoomX - target.x) * (zoomScale - 1); + target.y -= (zoomY - target.y) * (zoomScale - 1); + target.scaleX *= zoomScale; + target.scaleY *= zoomScale; + target.dirty(); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var IRRELEVANT_EXCLUDES = { + 'axisPointer': 1, + 'tooltip': 1, + 'brush': 1 + }; + /** + * Avoid that: mouse click on a elements that is over geo or graph, + * but roam is triggered. + */ + + function onIrrelevantElement(e, api, targetCoordSysModel) { + var model = api.getComponentByElement(e.topTarget); // If model is axisModel, it works only if it is injected with coordinateSystem. + + var coordSys = model && model.coordinateSystem; + return model && model !== targetCoordSysModel && !IRRELEVANT_EXCLUDES.hasOwnProperty(model.mainType) && coordSys && coordSys.model !== targetCoordSysModel; + } + + var geoCoord = [126, 25]; + var points$1 = [[[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$1.length; i++) { + for (var k = 0; k < points$1[i].length; k++) { + points$1[i][k][0] /= 10.5; + points$1[i][k][1] /= -10.5 / 0.75; + points$1[i][k][0] += geoCoord[0]; + points$1[i][k][1] += geoCoord[1]; + } + } + + function fixNanhai(mapType, regions) { + if (mapType === 'china') { + regions.push(new Region('南海诸岛', map(points$1, function (exterior) { + return { + type: 'polygon', + exterior: exterior + }; + }), geoCoord)); + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var coordsOffsetMap = { + '南海诸岛': [32, 80], + // 全国 + '广东': [0, -10], + '香港': [10, 5], + '澳门': [-10, 10], + //'北京': [-10, 0], + '天津': [5, 5] + }; + function fixTextCoords(mapType, region) { + if (mapType === 'china') { + 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); + } + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var geoCoordMap = { + 'Russia': [100, 60], + 'United States': [-99, 38], + 'United States of America': [-99, 38] + }; + function fixGeoCoords(mapType, region) { + if (mapType === 'world') { + var geoCoord = geoCoordMap[region.name]; + + if (geoCoord) { + var cp = region.center; + cp[0] = geoCoord[0]; + cp[1] = geoCoord[1]; + } + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + // Fix for 钓鱼岛 + // let Region = require('../Region'); + // let zrUtil = require('zrender/lib/core/util'); + // let geoCoord = [126, 25]; + var points$2 = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]]; + function fixDiaoyuIsland(mapType, region) { + if (mapType === 'china' && region.name === '台湾') { + region.geometries.push({ + type: 'polygon', + exterior: points$2[0] + }); + } + } + + var inner$6 = makeInner(); + var geoJSONLoader = { + load: function (mapName, mapRecord, nameProperty) { + var parsed = inner$6(mapRecord).parsed; + + if (parsed) { + return parsed; + } + + var specialAreas = mapRecord.specialAreas || {}; + var geoJSON = mapRecord.geoJSON; + var regions; // https://jsperf.com/try-catch-performance-overhead + + try { + regions = geoJSON ? parseGeoJSON(geoJSON, nameProperty) : []; + } catch (e) { + throw new Error('Invalid geoJson format\n' + e.message); + } + + fixNanhai(mapName, regions); + each(regions, function (region) { + var regionName = region.name; + fixTextCoords(mapName, region); + fixGeoCoords(mapName, region); + fixDiaoyuIsland(mapName, region); // Some area like Alaska in USA map needs to be tansformed + // to look better + + var specialArea = specialAreas[regionName]; + + if (specialArea) { + region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height); + } + }); + return inner$6(mapRecord).parsed = { + regions: regions, + boundingRect: getBoundingRect$1(regions) + }; + } + }; + + function getBoundingRect$1(regions) { + var rect; + + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(); + rect = rect || regionRect.clone(); + rect.union(regionRect); + } + + return rect; + } + + var DILIMITER_REG = /[\s,]+/; + var nodeParsers; + var SVGParser = (function () { + function SVGParser() { + this._defs = {}; + this._root = null; + this._isDefine = false; + this._isText = false; + } + SVGParser.prototype.parse = function (xml, opt) { + opt = opt || {}; + var svg = parseXML(xml); + if (!svg) { + throw new Error('Illegal svg'); + } + var root = new Group(); + this._root = root; + var viewBox = svg.getAttribute('viewBox') || ''; + var width = parseFloat((svg.getAttribute('width') || opt.width)); + var height = parseFloat((svg.getAttribute('height') || opt.height)); + isNaN(width) && (width = null); + isNaN(height) && (height = null); + parseAttributes(svg, root, null, true); + var child = svg.firstChild; + while (child) { + this._parseNode(child, root); + child = child.nextSibling; + } + var viewBoxRect; + var viewBoxTransform; + if (viewBox) { + var viewBoxArr = trim(viewBox).split(DILIMITER_REG); + if (viewBoxArr.length >= 4) { + viewBoxRect = { + x: parseFloat((viewBoxArr[0] || 0)), + y: parseFloat((viewBoxArr[1] || 0)), + width: parseFloat(viewBoxArr[2]), + height: parseFloat(viewBoxArr[3]) + }; + } + } + if (viewBoxRect && width != null && height != null) { + viewBoxTransform = makeViewBoxTransform(viewBoxRect, width, height); + if (!opt.ignoreViewBox) { + var elRoot = root; + root = new Group(); + root.add(elRoot); + elRoot.scaleX = elRoot.scaleY = viewBoxTransform.scale; + elRoot.x = viewBoxTransform.x; + elRoot.y = viewBoxTransform.y; + } + } + if (!opt.ignoreRootClip && width != null && height != null) { + root.setClipPath(new Rect({ + shape: { x: 0, y: 0, width: width, height: height } + })); + } + return { + root: root, + width: width, + height: height, + viewBoxRect: viewBoxRect, + viewBoxTransform: viewBoxTransform + }; + }; + SVGParser.prototype._parseNode = function (xmlNode, parentGroup) { + var nodeName = xmlNode.nodeName.toLowerCase(); + if (nodeName === 'defs') { + this._isDefine = true; + } + else if (nodeName === 'text') { + this._isText = true; + } + var el; + if (this._isDefine) { + var parser = defineParsers[nodeName]; + if (parser) { + var def = parser.call(this, xmlNode); + var id = xmlNode.getAttribute('id'); + if (id) { + this._defs[id] = def; + } + } + } + else { + var parser = nodeParsers[nodeName]; + if (parser) { + el = parser.call(this, xmlNode, parentGroup); + parentGroup.add(el); + } + } + if (el) { + var child = xmlNode.firstChild; + while (child) { + if (child.nodeType === 1) { + this._parseNode(child, el); + } + if (child.nodeType === 3 && this._isText) { + this._parseText(child, el); + } + child = child.nextSibling; + } + } + if (nodeName === 'defs') { + this._isDefine = false; + } + else if (nodeName === 'text') { + this._isText = false; + } + }; + SVGParser.prototype._parseText = function (xmlNode, parentGroup) { + if (xmlNode.nodeType === 1) { + var dx = xmlNode.getAttribute('dx') || 0; + var dy = xmlNode.getAttribute('dy') || 0; + this._textX += parseFloat(dx); + this._textY += parseFloat(dy); + } + var text = new TSpan({ + style: { + text: xmlNode.textContent + }, + x: this._textX || 0, + y: this._textY || 0 + }); + inheritStyle(parentGroup, text); + parseAttributes(xmlNode, text, this._defs); + var textStyle = text.style; + var fontSize = textStyle.fontSize; + if (fontSize && fontSize < 9) { + textStyle.fontSize = 9; + text.scaleX *= fontSize / 9; + text.scaleY *= fontSize / 9; + } + var font = (textStyle.fontSize || textStyle.fontFamily) && [ + textStyle.fontStyle, + textStyle.fontWeight, + (textStyle.fontSize || 12) + 'px', + textStyle.fontFamily || 'sans-serif' + ].join(' '); + textStyle.font = font; + var rect = text.getBoundingRect(); + this._textX += rect.width; + parentGroup.add(text); + return text; + }; + SVGParser.internalField = (function () { + nodeParsers = { + 'g': function (xmlNode, parentGroup) { + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defs); + return g; + }, + 'rect': function (xmlNode, parentGroup) { + var rect = new Rect(); + inheritStyle(parentGroup, rect); + parseAttributes(xmlNode, rect, this._defs); + rect.setShape({ + x: parseFloat(xmlNode.getAttribute('x') || '0'), + y: parseFloat(xmlNode.getAttribute('y') || '0'), + width: parseFloat(xmlNode.getAttribute('width') || '0'), + height: parseFloat(xmlNode.getAttribute('height') || '0') + }); + return rect; + }, + 'circle': function (xmlNode, parentGroup) { + var circle = new Circle(); + inheritStyle(parentGroup, circle); + parseAttributes(xmlNode, circle, this._defs); + circle.setShape({ + cx: parseFloat(xmlNode.getAttribute('cx') || '0'), + cy: parseFloat(xmlNode.getAttribute('cy') || '0'), + r: parseFloat(xmlNode.getAttribute('r') || '0') + }); + return circle; + }, + 'line': function (xmlNode, parentGroup) { + var line = new Line(); + inheritStyle(parentGroup, line); + parseAttributes(xmlNode, line, this._defs); + line.setShape({ + x1: parseFloat(xmlNode.getAttribute('x1') || '0'), + y1: parseFloat(xmlNode.getAttribute('y1') || '0'), + x2: parseFloat(xmlNode.getAttribute('x2') || '0'), + y2: parseFloat(xmlNode.getAttribute('y2') || '0') + }); + return line; + }, + 'ellipse': function (xmlNode, parentGroup) { + var ellipse = new Ellipse(); + inheritStyle(parentGroup, ellipse); + parseAttributes(xmlNode, ellipse, this._defs); + ellipse.setShape({ + cx: parseFloat(xmlNode.getAttribute('cx') || '0'), + cy: parseFloat(xmlNode.getAttribute('cy') || '0'), + rx: parseFloat(xmlNode.getAttribute('rx') || '0'), + ry: parseFloat(xmlNode.getAttribute('ry') || '0') + }); + return ellipse; + }, + 'polygon': function (xmlNode, parentGroup) { + var pointsStr = xmlNode.getAttribute('points'); + var pointsArr; + if (pointsStr) { + pointsArr = parsePoints(pointsStr); + } + var polygon = new Polygon({ + shape: { + points: pointsArr || [] + } + }); + inheritStyle(parentGroup, polygon); + parseAttributes(xmlNode, polygon, this._defs); + return polygon; + }, + 'polyline': function (xmlNode, parentGroup) { + var path = new Path(); + inheritStyle(parentGroup, path); + parseAttributes(xmlNode, path, this._defs); + var pointsStr = xmlNode.getAttribute('points'); + var pointsArr; + if (pointsStr) { + pointsArr = parsePoints(pointsStr); + } + var polyline = new Polyline({ + shape: { + points: pointsArr || [] + } + }); + return polyline; + }, + 'image': function (xmlNode, parentGroup) { + var img = new ZRImage(); + inheritStyle(parentGroup, img); + parseAttributes(xmlNode, img, this._defs); + img.setStyle({ + image: xmlNode.getAttribute('xlink:href'), + x: +xmlNode.getAttribute('x'), + y: +xmlNode.getAttribute('y'), + width: +xmlNode.getAttribute('width'), + height: +xmlNode.getAttribute('height') + }); + return img; + }, + 'text': function (xmlNode, parentGroup) { + var x = xmlNode.getAttribute('x') || '0'; + var y = xmlNode.getAttribute('y') || '0'; + var dx = xmlNode.getAttribute('dx') || '0'; + var dy = xmlNode.getAttribute('dy') || '0'; + this._textX = parseFloat(x) + parseFloat(dx); + this._textY = parseFloat(y) + parseFloat(dy); + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defs); + return g; + }, + 'tspan': function (xmlNode, parentGroup) { + var x = xmlNode.getAttribute('x'); + var y = xmlNode.getAttribute('y'); + if (x != null) { + this._textX = parseFloat(x); + } + if (y != null) { + this._textY = parseFloat(y); + } + var dx = xmlNode.getAttribute('dx') || 0; + var dy = xmlNode.getAttribute('dy') || 0; + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defs); + this._textX += dx; + this._textY += dy; + return g; + }, + 'path': function (xmlNode, parentGroup) { + var d = xmlNode.getAttribute('d') || ''; + var path = createFromString(d); + inheritStyle(parentGroup, path); + parseAttributes(xmlNode, path, this._defs); + return path; + } + }; + })(); + return SVGParser; + }()); + var defineParsers = { + 'lineargradient': function (xmlNode) { + var x1 = parseInt(xmlNode.getAttribute('x1') || '0', 10); + var y1 = parseInt(xmlNode.getAttribute('y1') || '0', 10); + var x2 = parseInt(xmlNode.getAttribute('x2') || '10', 10); + var y2 = parseInt(xmlNode.getAttribute('y2') || '0', 10); + var gradient = new LinearGradient(x1, y1, x2, y2); + _parseGradientColorStops(xmlNode, gradient); + return gradient; + } + }; + function _parseGradientColorStops(xmlNode, gradient) { + var stop = xmlNode.firstChild; + while (stop) { + if (stop.nodeType === 1) { + var offsetStr = stop.getAttribute('offset'); + var offset = void 0; + if (offsetStr.indexOf('%') > 0) { + offset = parseInt(offsetStr, 10) / 100; + } + else if (offsetStr) { + offset = parseFloat(offsetStr); + } + else { + offset = 0; + } + var stopColor = stop.getAttribute('stop-color') || '#000000'; + gradient.colorStops.push({ + offset: offset, + color: stopColor + }); + } + stop = stop.nextSibling; + } + } + function inheritStyle(parent, child) { + if (parent && parent.__inheritedStyle) { + if (!child.__inheritedStyle) { + child.__inheritedStyle = {}; + } + defaults(child.__inheritedStyle, parent.__inheritedStyle); + } + } + function parsePoints(pointsString) { + var list = trim(pointsString).split(DILIMITER_REG); + var points = []; + for (var i = 0; i < list.length; i += 2) { + var x = parseFloat(list[i]); + var y = parseFloat(list[i + 1]); + points.push([x, y]); + } + return points; + } + var attributesMap = { + 'fill': 'fill', + 'stroke': 'stroke', + 'stroke-width': 'lineWidth', + 'opacity': 'opacity', + 'fill-opacity': 'fillOpacity', + 'stroke-opacity': 'strokeOpacity', + 'stroke-dasharray': 'lineDash', + 'stroke-dashoffset': 'lineDashOffset', + 'stroke-linecap': 'lineCap', + 'stroke-linejoin': 'lineJoin', + 'stroke-miterlimit': 'miterLimit', + 'font-family': 'fontFamily', + 'font-size': 'fontSize', + 'font-style': 'fontStyle', + 'font-weight': 'fontWeight', + 'text-align': 'textAlign', + 'alignment-baseline': 'textBaseline' + }; + function parseAttributes(xmlNode, el, defs, onlyInlineStyle) { + var disp = el; + var zrStyle = disp.__inheritedStyle || {}; + if (xmlNode.nodeType === 1) { + parseTransformAttribute(xmlNode, el); + extend(zrStyle, parseStyleAttribute(xmlNode)); + if (!onlyInlineStyle) { + for (var svgAttrName in attributesMap) { + if (attributesMap.hasOwnProperty(svgAttrName)) { + var attrValue = xmlNode.getAttribute(svgAttrName); + if (attrValue != null) { + zrStyle[attributesMap[svgAttrName]] = attrValue; + } + } + } + } + } + disp.style = disp.style || {}; + zrStyle.fill != null && (disp.style.fill = getPaint(zrStyle.fill, defs)); + zrStyle.stroke != null && (disp.style.stroke = getPaint(zrStyle.stroke, defs)); + each([ + 'lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize' + ], function (propName) { + zrStyle[propName] != null && (disp.style[propName] = parseFloat(zrStyle[propName])); + }); + if (!zrStyle.textBaseline || zrStyle.textBaseline === 'auto') { + zrStyle.textBaseline = 'alphabetic'; + } + if (zrStyle.textBaseline === 'alphabetic') { + zrStyle.textBaseline = 'bottom'; + } + if (zrStyle.textAlign === 'start') { + zrStyle.textAlign = 'left'; + } + if (zrStyle.textAlign === 'end') { + zrStyle.textAlign = 'right'; + } + each(['lineDashOffset', 'lineCap', 'lineJoin', + 'fontWeight', 'fontFamily', 'fontStyle', 'textAlign', 'textBaseline' + ], function (propName) { + zrStyle[propName] != null && (disp.style[propName] = zrStyle[propName]); + }); + if (zrStyle.lineDash) { + disp.style.lineDash = map(trim(zrStyle.lineDash).split(DILIMITER_REG), function (str) { + return parseFloat(str); + }); + } + disp.__inheritedStyle = zrStyle; + } + var urlRegex = /url\(\s*#(.*?)\)/; + function getPaint(str, defs) { + var urlMatch = defs && str && str.match(urlRegex); + if (urlMatch) { + var url = trim(urlMatch[1]); + var def = defs[url]; + return def; + } + return str; + } + var transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.e,]*)\)/g; + function parseTransformAttribute(xmlNode, node) { + var transform = xmlNode.getAttribute('transform'); + if (transform) { + transform = transform.replace(/,/g, ' '); + var transformOps_1 = []; + var m = null; + transform.replace(transformRegex, function (str, type, value) { + transformOps_1.push(type, value); + return ''; + }); + for (var i = transformOps_1.length - 1; i > 0; i -= 2) { + var value = transformOps_1[i]; + var type = transformOps_1[i - 1]; + var valueArr = void 0; + m = m || create$1(); + switch (type) { + case 'translate': + valueArr = trim(value).split(DILIMITER_REG); + translate(m, m, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || '0')]); + break; + case 'scale': + valueArr = trim(value).split(DILIMITER_REG); + scale$1(m, m, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || valueArr[0])]); + break; + case 'rotate': + valueArr = trim(value).split(DILIMITER_REG); + rotate(m, m, parseFloat(valueArr[0])); + break; + case 'skew': + valueArr = trim(value).split(DILIMITER_REG); + console.warn('Skew transform is not supported yet'); + break; + case 'matrix': + valueArr = trim(value).split(DILIMITER_REG); + m[0] = parseFloat(valueArr[0]); + m[1] = parseFloat(valueArr[1]); + m[2] = parseFloat(valueArr[2]); + m[3] = parseFloat(valueArr[3]); + m[4] = parseFloat(valueArr[4]); + m[5] = parseFloat(valueArr[5]); + break; + } + } + node.setLocalTransform(m); + } + } + var styleRegex = /([^\s:;]+)\s*:\s*([^:;]+)/g; + function parseStyleAttribute(xmlNode) { + var style = xmlNode.getAttribute('style'); + var result = {}; + if (!style) { + return result; + } + var styleList = {}; + styleRegex.lastIndex = 0; + var styleRegResult; + while ((styleRegResult = styleRegex.exec(style)) != null) { + styleList[styleRegResult[1]] = styleRegResult[2]; + } + for (var svgAttrName in attributesMap) { + if (attributesMap.hasOwnProperty(svgAttrName) && styleList[svgAttrName] != null) { + result[attributesMap[svgAttrName]] = styleList[svgAttrName]; + } + } + return result; + } + function makeViewBoxTransform(viewBoxRect, width, height) { + var scaleX = width / viewBoxRect.width; + var scaleY = height / viewBoxRect.height; + var scale = Math.min(scaleX, scaleY); + return { + scale: scale, + x: -(viewBoxRect.x + viewBoxRect.width / 2) * scale + width / 2, + y: -(viewBoxRect.y + viewBoxRect.height / 2) * scale + height / 2 + }; + } + function parseSVG(xml, opt) { + var parser = new SVGParser(); + return parser.parse(xml, opt); + } + + var inner$7 = makeInner(); + var geoSVGLoader = { + load: function (mapName, mapRecord) { + var originRoot = inner$7(mapRecord).originRoot; + + if (originRoot) { + return { + root: originRoot, + boundingRect: inner$7(mapRecord).boundingRect + }; + } + + var graphic = buildGraphic(mapRecord); + inner$7(mapRecord).originRoot = graphic.root; + inner$7(mapRecord).boundingRect = graphic.boundingRect; + return graphic; + }, + makeGraphic: function (mapName, mapRecord, hostKey) { + // For performance consideration (in large SVG), graphic only maked + // when necessary and reuse them according to hostKey. + var field = inner$7(mapRecord); + var rootMap = field.rootMap || (field.rootMap = createHashMap()); + var root = rootMap.get(hostKey); + + if (root) { + return root; + } + + var originRoot = field.originRoot; + var boundingRect = field.boundingRect; // For performance, if originRoot is not used by a view, + // assign it to a view, but not reproduce graphic elements. + + if (!field.originRootHostKey) { + field.originRootHostKey = hostKey; + root = originRoot; + } else { + root = buildGraphic(mapRecord, boundingRect).root; + } + + return rootMap.set(hostKey, root); + }, + removeGraphic: function (mapName, mapRecord, hostKey) { + var field = inner$7(mapRecord); + var rootMap = field.rootMap; + rootMap && rootMap.removeKey(hostKey); + + if (hostKey === field.originRootHostKey) { + field.originRootHostKey = null; + } + } + }; + + function buildGraphic(mapRecord, boundingRect) { + var svgXML = mapRecord.svgXML; + var result; + var root; + + try { + result = svgXML && parseSVG(svgXML, { + ignoreViewBox: true, + ignoreRootClip: true + }) || {}; + root = result.root; + assert(root != null); + } catch (e) { + throw new Error('Invalid svg format\n' + e.message); + } + + var svgWidth = result.width; + var svgHeight = result.height; + var viewBoxRect = result.viewBoxRect; + + if (!boundingRect) { + boundingRect = svgWidth == null || svgHeight == null ? // If svg width / height not specified, calculate + // bounding rect as the width / height + root.getBoundingRect() : new BoundingRect(0, 0, 0, 0); + + if (svgWidth != null) { + boundingRect.width = svgWidth; + } + + if (svgHeight != null) { + boundingRect.height = svgHeight; + } + } + + if (viewBoxRect) { + var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect.width, boundingRect.height); + var elRoot = root; + root = new Group(); + root.add(elRoot); + elRoot.scaleX = elRoot.scaleY = viewBoxTransform.scale; + elRoot.x = viewBoxTransform.x; + elRoot.y = viewBoxTransform.y; + } + + root.setClipPath(new Rect({ + shape: boundingRect.plain() + })); + return { + root: root, + boundingRect: boundingRect + }; + } + + var loaders = { + geoJSON: geoJSONLoader, + svg: geoSVGLoader + }; + var geoSourceManager = { + load: function (mapName, nameMap, nameProperty) { + var regions = []; + var regionsMap = createHashMap(); + var nameCoordMap = createHashMap(); + var boundingRect; + var mapRecords = retrieveMap(mapName); + each(mapRecords, function (record) { + var singleSource = loaders[record.type].load(mapName, record, nameProperty); + each(singleSource.regions, function (region) { + var regionName = region.name; // Try use the alias in geoNameMap + + if (nameMap && nameMap.hasOwnProperty(regionName)) { + region = region.cloneShallow(regionName = nameMap[regionName]); + } + + regions.push(region); + regionsMap.set(regionName, region); + nameCoordMap.set(regionName, region.center); + }); + var rect = singleSource.boundingRect; + + if (rect) { + boundingRect ? boundingRect.union(rect) : boundingRect = rect.clone(); + } + }); + return { + regions: regions, + regionsMap: regionsMap, + nameCoordMap: nameCoordMap, + // FIXME Always return new ? + boundingRect: boundingRect || new BoundingRect(0, 0, 0, 0) + }; + }, + + /** + * @param hostKey For cache. + * @return Roots. + */ + makeGraphic: function (mapName, hostKey) { + var mapRecords = retrieveMap(mapName); + var results = []; + each(mapRecords, function (record) { + var method = loaders[record.type].makeGraphic; + method && results.push(method(mapName, record, hostKey)); + }); + return results; + }, + + /** + * @param hostKey For cache. + */ + removeGraphic: function (mapName, hostKey) { + var mapRecords = retrieveMap(mapName); + each(mapRecords, function (record) { + var method = loaders[record.type].makeGraphic; + method && method(mapName, record, hostKey); + }); + } + }; + + function mapNotExistsError(mapName) { + if ("development" !== 'production') { + console.error('Map ' + mapName + ' not exists. The GeoJSON of the map must be provided.'); + } + } + + function retrieveMap(mapName) { + var mapRecords = mapDataStorage.retrieveMap(mapName) || []; + + if ("development" !== 'production') { + if (!mapRecords.length) { + mapNotExistsError(mapName); + } + } + + return mapRecords; + } + + function getFixedItemStyle(model) { + var itemStyle = model.getItemStyle(); + var areaColor = model.get('areaColor'); // If user want the color not to be changed when hover, + // they should both set areaColor and color to be null. + + if (areaColor != null) { + itemStyle.fill = areaColor; + } + + return itemStyle; + } + + var MapDraw = + /** @class */ + function () { + function MapDraw(api) { + var group = new Group(); + this.uid = getUID('ec_map_draw'); // @ts-ignore FIXME:TS + + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: group + }; + this.group = group; + group.add(this._regionsGroup = new Group()); + group.add(this._backgroundGroup = new Group()); + } + + MapDraw.prototype.draw = function (mapOrGeoModel, ecModel, api, fromView, payload) { + var isGeo = mapOrGeoModel.mainType === 'geo'; // Map series has data. GEO model that controlled by map series + // will be assigned with map data. Other GEO model has no data. + + var data = mapOrGeoModel.getData && mapOrGeoModel.getData(); + isGeo && ecModel.eachComponent({ + mainType: 'series', + subType: 'map' + }, function (mapSeries) { + if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) { + data = mapSeries.getData(); + } + }); + var geo = mapOrGeoModel.coordinateSystem; + + this._updateBackground(geo); + + var regionsGroup = this._regionsGroup; + var group = this.group; + var transformInfo = geo.getTransformInfo(); // No animation when first draw or in action + + var isFirstDraw = !regionsGroup.childAt(0) || payload; + var targetScaleX; + var targetScaleY; + + if (isFirstDraw) { + group.transform = transformInfo.roamTransform; + group.decomposeTransform(); + group.dirty(); + } else { + var target = new Transformable(); + target.transform = transformInfo.roamTransform; + target.decomposeTransform(); + var props = { + scaleX: target.scaleX, + scaleY: target.scaleY, + x: target.x, + y: target.y + }; + targetScaleX = target.scaleX; + targetScaleY = target.scaleY; + updateProps(group, props, mapOrGeoModel); + } + + regionsGroup.removeAll(); + var nameMap = createHashMap(); + var isVisualEncodedByVisualMap = data && data.getVisual('visualMeta') && data.getVisual('visualMeta').length > 0; + each(geo.regions, function (region) { + // Consider in GeoJson properties.name may be duplicated, for example, + // there is multiple region named "United Kindom" or "France" (so many + // colonies). And it is not appropriate to merge them in geo, which + // will make them share the same label and bring trouble in label + // location calculation. + var regionGroup = nameMap.get(region.name) || nameMap.set(region.name, new Group()); + var compoundPath = new CompoundPath({ + segmentIgnoreThreshold: 1, + shape: { + paths: [] + } + }); + regionGroup.add(compoundPath); + var regionModel = mapOrGeoModel.getRegionModel(region.name) || mapOrGeoModel; // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var itemStyleModel = regionModel.getModel('itemStyle'); // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var emphasisModel = regionModel.getModel('emphasis'); + var emphasisItemStyleModel = emphasisModel.getModel('itemStyle'); // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var blurItemStyleModel = regionModel.getModel(['blur', 'itemStyle']); // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var selectItemStyleModel = regionModel.getModel(['select', 'itemStyle']); // NOTE: DONT use 'style' in visual when drawing map. + // This component is used for drawing underlying map for both geo component and map series. + + var itemStyle = getFixedItemStyle(itemStyleModel); + var emphasisItemStyle = getFixedItemStyle(emphasisItemStyleModel); + var blurItemStyle = getFixedItemStyle(blurItemStyleModel); + var selectItemStyle = getFixedItemStyle(selectItemStyleModel); + var dataIdx; // Use the itemStyle in data if has data + + if (data) { + dataIdx = data.indexOfName(region.name); // Only visual color of each item will be used. It can be encoded by visualMap + // But visual color of series is used in symbol drawing + // + // Visual color for each series is for the symbol draw + + var style = data.getItemVisual(dataIdx, 'style'); + var decal = data.getItemVisual(dataIdx, 'decal'); + + if (isVisualEncodedByVisualMap && style.fill) { + itemStyle.fill = style.fill; + } + + if (decal) { + itemStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + } + + var sx = transformInfo.rawScaleX; + var sy = transformInfo.rawScaleY; + var offsetX = transformInfo.rawX; + var offsetY = transformInfo.rawY; + + var transformPoint = function (point) { + return [point[0] * sx + offsetX, point[1] * sy + offsetY]; + }; + + each(region.geometries, function (geometry) { + if (geometry.type !== 'polygon') { + return; + } + + var points = []; + + for (var i = 0; i < geometry.exterior.length; ++i) { + points.push(transformPoint(geometry.exterior[i])); + } + + compoundPath.shape.paths.push(new Polygon({ + segmentIgnoreThreshold: 1, + shape: { + points: points + } + })); + + for (var i = 0; i < (geometry.interiors ? geometry.interiors.length : 0); ++i) { + var interior = geometry.interiors[i]; + var points_1 = []; + + for (var j = 0; j < interior.length; ++j) { + points_1.push(transformPoint(interior[j])); + } + + compoundPath.shape.paths.push(new Polygon({ + segmentIgnoreThreshold: 1, + shape: { + points: points_1 + } + })); + } + }); + compoundPath.setStyle(itemStyle); + compoundPath.style.strokeNoScale = true; + compoundPath.culling = true; + compoundPath.ensureState('emphasis').style = emphasisItemStyle; + compoundPath.ensureState('blur').style = blurItemStyle; + compoundPath.ensureState('select').style = selectItemStyle; + var showLabel = false; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateName = DISPLAY_STATES[i]; // @ts-ignore FIXME:TS fix the "compatible with each other"? + + if (regionModel.get(stateName === 'normal' ? ['label', 'show'] : [stateName, 'label', 'show'])) { + showLabel = true; + break; + } + } + + var isDataNaN = data && isNaN(data.get(data.mapDimension('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 (isGeo || isDataNaN && showLabel || itemLayout && itemLayout.showLabel) { + var query = !isGeo ? dataIdx : region.name; + var labelFetcher = void 0; // Consider dataIdx not found. + + if (!data || dataIdx >= 0) { + labelFetcher = mapOrGeoModel; + } + + var centerPt = transformPoint(region.center); + var textEl = new ZRText({ + x: centerPt[0], + y: centerPt[1], + // FIXME + // label rotation is not support yet in geo or regions of series-map + // that has no data. The rotation will be effected by this `scale`. + // So needed to change to RectText? + scaleX: 1 / group.scaleX, + scaleY: 1 / group.scaleY, + z2: 10, + silent: true + }); + setLabelStyle(textEl, getLabelStatesModels(regionModel), { + labelFetcher: labelFetcher, + labelDataIndex: query, + defaultText: region.name + }, { + normal: { + align: 'center', + verticalAlign: 'middle' + } + }); + compoundPath.setTextContent(textEl); + compoundPath.setTextConfig({ + local: true + }); + compoundPath.disableLabelAnimation = true; + + if (!isFirstDraw) { + // Text animation + updateProps(textEl, { + scaleX: 1 / targetScaleX, + scaleY: 1 / targetScaleY + }, mapOrGeoModel); + } + } // setItemGraphicEl, setHoverStyle after all polygons and labels + // are added to the rigionGroup + + + if (data) { + data.setItemGraphicEl(dataIdx, regionGroup); + } else { + var regionModel_1 = mapOrGeoModel.getRegionModel(region.name); // Package custom mouse event for geo component + + getECData(compoundPath).eventData = { + componentType: 'geo', + componentIndex: mapOrGeoModel.componentIndex, + geoIndex: mapOrGeoModel.componentIndex, + name: region.name, + region: regionModel_1 && regionModel_1.option || {} + }; + } + + var groupRegions = regionGroup.__regions || (regionGroup.__regions = []); + groupRegions.push(region); // @ts-ignore FIXME:TS fix the "compatible with each other"? + + regionGroup.highDownSilentOnTouch = !!mapOrGeoModel.get('selectedMode'); + enableHoverEmphasis(regionGroup, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + regionsGroup.add(regionGroup); + }); + + this._updateController(mapOrGeoModel, ecModel, api); + + this._updateMapSelectHandler(mapOrGeoModel, regionsGroup, api, fromView); + }; + + MapDraw.prototype.remove = function () { + this._regionsGroup.removeAll(); + + this._backgroundGroup.removeAll(); + + this._controller.dispose(); + + this._mapName && geoSourceManager.removeGraphic(this._mapName, this.uid); + this._mapName = null; + this._controllerHost = null; + }; + + MapDraw.prototype._updateBackground = function (geo) { + var mapName = geo.map; + + if (this._mapName !== mapName) { + each(geoSourceManager.makeGraphic(mapName, this.uid), function (root) { + this._backgroundGroup.add(root); + }, this); + } + + this._mapName = mapName; + }; + + MapDraw.prototype._updateController = function (mapOrGeoModel, ecModel, api) { + var geo = mapOrGeoModel.coordinateSystem; + var controller = this._controller; + var controllerHost = this._controllerHost; // @ts-ignore FIXME:TS + + controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit'); + controllerHost.zoom = geo.getZoom(); // roamType is will be set default true if it is null + // @ts-ignore FIXME:TS + + controller.enable(mapOrGeoModel.get('roam') || false); + var mainType = mapOrGeoModel.mainType; + + function makeActionBase() { + var action = { + type: 'geoRoam', + componentType: mainType + }; + action[mainType + 'Id'] = mapOrGeoModel.id; + return action; + } + + controller.off('pan').on('pan', function (e) { + this._mouseDownFlag = false; + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction(extend(makeActionBase(), { + dx: e.dx, + dy: e.dy + })); + }, this); + controller.off('zoom').on('zoom', function (e) { + this._mouseDownFlag = false; + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction(extend(makeActionBase(), { + zoom: e.scale, + originX: e.originX, + originY: e.originY + })); + var group = this.group; + + this._regionsGroup.traverse(function (el) { + var textContent = el.getTextContent(); + + if (textContent) { + textContent.scaleX = 1 / group.scaleX; + textContent.scaleY = 1 / group.scaleY; + textContent.markRedraw(); + } + }); + }, this); + controller.setPointerChecker(function (e, x, y) { + return geo.getViewRectAfterRoam().contain(x, y) && !onIrrelevantElement(e, api, mapOrGeoModel); + }); + }; + + MapDraw.prototype._updateMapSelectHandler = function (mapOrGeoModel, regionsGroup, api, fromView) { + var mapDraw = this; + regionsGroup.off('mousedown'); // @ts-ignore FIXME:TS resolve type conflict + + if (mapOrGeoModel.get('selectedMode')) { + regionsGroup.on('mousedown', function () { + mapDraw._mouseDownFlag = true; + }); + regionsGroup.on('click', function (e) { + if (!mapDraw._mouseDownFlag) { + return; + } + + mapDraw._mouseDownFlag = false; + }); + } + }; + + return MapDraw; + }(); + + var MapView = + /** @class */ + function (_super) { + __extends(MapView, _super); + + function MapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MapView.type; + return _this; + } + + MapView.prototype.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(); + + if (mapModel.getHostGeoModel()) { + return; + } // Not update map if it is an roam action from self + + + if (!(payload && payload.type === 'geoRoam' && payload.componentType === 'series' && payload.seriesId === mapModel.id)) { + if (mapModel.needsDrawMap) { + var mapDraw = this._mapDraw || new MapDraw(api); + group.add(mapDraw.group); + mapDraw.draw(mapModel, ecModel, api, this, payload); + 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); + }; + + MapView.prototype.remove = function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + this.group.removeAll(); + }; + + MapView.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + }; + + MapView.prototype._renderSymbols = function (mapModel, ecModel, api) { + var originalData = mapModel.originalData; + var group = this.group; + originalData.each(originalData.mapDimension('value'), function (value, originalDataIndex) { + if (isNaN(value)) { + return; + } + + var layout = originalData.getItemLayout(originalDataIndex); + + if (!layout || !layout.point) { + // Not exists in map + return; + } + + var point = layout.point; + var offset = layout.offset; + var circle = new Circle({ + style: { + // Because the special of map draw. + // Which needs statistic of multiple series and draw on one map. + // And each series also need a symbol with legend color + // + // Layout and visual are put one the different data + // TODO + fill: mapModel.getData().getVisual('style').fill + }, + shape: { + cx: point[0] + offset * 9, + cy: point[1], + r: 3 + }, + silent: true, + // Do not overlap the first series, on which labels are displayed. + z2: 8 + (!offset ? Z2_EMPHASIS_LIFT + 1 : 0) + }); // Only the series that has the first value on the same region is in charge of rendering the label. + // But consider the case: + // series: [ + // {id: 'X', type: 'map', map: 'm', {data: [{name: 'A', value: 11}, {name: 'B', {value: 22}]}, + // {id: 'Y', type: 'map', map: 'm', {data: [{name: 'A', value: 21}, {name: 'C', {value: 33}]} + // ] + // The offset `0` of item `A` is at series `X`, but of item `C` is at series `Y`. + // For backward compatibility, we follow the rule that render label `A` by the + // settings on series `X` but render label `C` by the settings on series `Y`. + + if (!offset) { + var fullData = mapModel.mainSeries.getData(); + var name_1 = originalData.getName(originalDataIndex); + var fullIndex_1 = fullData.indexOfName(name_1); + var itemModel = originalData.getItemModel(originalDataIndex); + var labelModel = itemModel.getModel('label'); + var regionGroup = fullData.getItemGraphicEl(fullIndex_1); // `getFormattedLabel` needs to use `getData` inside. Here + // `mapModel.getData()` is shallow cloned from `mainSeries.getData()`. + // FIXME + // If this is not the `mainSeries`, the item model (like label formatter) + // set on original data item will never get. But it has been working + // like that from the begining, and this scenario is rarely encountered. + // So it won't be fixed until have to. + + setLabelStyle(circle, getLabelStatesModels(itemModel), { + labelFetcher: { + getFormattedLabel: function (idx, state) { + return mapModel.getFormattedLabel(fullIndex_1, state); + } + } + }); + circle.disableLabelAnimation = true; + + if (!labelModel.get('position')) { + circle.setTextConfig({ + position: 'bottom' + }); + } + + regionGroup.onHoverStateChange = function (toState) { + circle.useState(toState); + }; + } + + group.add(circle); + }); + }; + + MapView.type = 'map'; + return MapView; + }(ChartView); + + var MapSeries = + /** @class */ + function (_super) { + __extends(MapSeries, _super); + + function MapSeries() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MapSeries.type; // Only first map series of same mapType will drawMap. + + _this.needsDrawMap = false; // Group of all map series with same mapType + + _this.seriesGroup = []; + + _this.getTooltipPosition = function (dataIndex) { + if (dataIndex != null) { + var name_1 = this.getData().getName(dataIndex); + var geo = this.coordinateSystem; + var region = geo.getRegion(name_1); + return region && geo.dataToPoint(region.center); + } + }; + + return _this; + } + + MapSeries.prototype.getInitialData = function (option) { + var data = createListSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + var dataNameMap = createHashMap(); + var toAppendNames = []; + + for (var i = 0, len = data.count(); i < len; i++) { + var name_2 = data.getName(i); + dataNameMap.set(name_2, true); + } + + var geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap, this.option.nameProperty); + each(geoSource.regions, function (region) { + var name = region.name; + + if (!dataNameMap.get(name)) { + toAppendNames.push(name); + } + }); // Complete data with missing regions. The consequent processes (like visual + // map and render) can not be performed without a "full data". For example, + // find `dataIndex` by name. + + data.appendValues([], toAppendNames); + return data; + }; + /** + * If no host geo model, return null, which means using a + * inner exclusive geo model. + */ + + + MapSeries.prototype.getHostGeoModel = function () { + var geoIndex = this.option.geoIndex; + return geoIndex != null ? this.ecModel.getComponent('geo', geoIndex) : null; + }; + + MapSeries.prototype.getMapType = function () { + return (this.getHostGeoModel() || this).option.map; + }; // _fillOption(option, mapName) { + // Shallow clone + // option = zrUtil.extend({}, option); + // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap); + // return option; + // } + + + MapSeries.prototype.getRawValue = function (dataIndex) { + // Use value stored in data instead because it is calculated from multiple series + // FIXME Provide all value of multiple series ? + var data = this.getData(); + return data.get(data.mapDimension('value'), dataIndex); + }; + /** + * Get model of region + */ + + + MapSeries.prototype.getRegionModel = function (regionName) { + var data = this.getData(); + return data.getItemModel(data.indexOfName(regionName)); + }; + /** + * Map tooltip formatter + */ + + + MapSeries.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + // FIXME orignalData and data is a bit confusing + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var name = data.getName(dataIndex); + var seriesGroup = this.seriesGroup; + var seriesNames = []; + + for (var i = 0; i < seriesGroup.length; i++) { + var otherIndex = seriesGroup[i].originalData.indexOfName(name); + var valueDim = data.mapDimension('value'); + + if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) { + seriesNames.push(seriesGroup[i].name); + } + } + + return createTooltipMarkup('section', { + header: seriesNames.join(', '), + noHeader: !seriesNames.length, + blocks: [createTooltipMarkup('nameValue', { + name: name, + value: value + })] + }); + }; + + MapSeries.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + MapSeries.prototype.setCenter = function (center) { + this.option.center = center; + }; + + MapSeries.type = 'series.map'; + MapSeries.dependencies = ['geo']; + MapSeries.layoutMode = 'box'; + MapSeries.defaultOption = { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 2, + coordinateSystem: 'geo', + // map should be explicitly specified since ec3. + map: '', + // If `geoIndex` is not specified, a exclusive geo will be + // created. Otherwise use the specified geo component, and + // `map` and `mapType` are ignored. + // geoIndex: 0, + // 'center' | 'left' | 'right' | 'x%' | {number} + left: 'center', + // 'center' | 'top' | 'bottom' | 'x%' | {number} + top: 'center', + // right + // bottom + // width: + // height + // Aspect is width / height. Inited to be geoJson bbox aspect + // This parameter is used for scale this aspect + aspectScale: 0.75, + ///// Layout with center and size + // If you wan't to put map in a fixed size box with right aspect ratio + // This two properties may more conveninet + // layoutCenter: [50%, 50%] + // layoutSize: 100 + showLegendSymbol: true, + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ], + // higher priority than center and zoom + boundingCoords: null, + // Default on center of map + center: null, + zoom: 1, + scaleLimit: null, + selectedMode: true, + label: { + show: false, + color: '#000' + }, + // scaleLimit: null, + itemStyle: { + borderWidth: 0.5, + borderColor: '#444', + areaColor: '#eee' + }, + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + areaColor: 'rgba(255,215,0,0.8)' + } + }, + select: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + nameProperty: 'name' + }; + return MapSeries; + }(SeriesModel); + + function dataStatistics(datas, statisticType) { + var dataNameMap = {}; + each(datas, function (data) { + data.each(data.mapDimension('value'), function (value, idx) { + // Add prefix to avoid conflict with Object.prototype. + var mapKey = 'ec-' + data.getName(idx); + dataNameMap[mapKey] = dataNameMap[mapKey] || []; + + if (!isNaN(value)) { + dataNameMap[mapKey].push(value); + } + }); + }); + return datas[0].map(datas[0].mapDimension('value'), function (value, idx) { + var mapKey = 'ec-' + datas[0].getName(idx); + var sum = 0; + var min = Infinity; + var max = -Infinity; + var len = dataNameMap[mapKey].length; + + for (var i = 0; i < len; i++) { + min = Math.min(min, dataNameMap[mapKey][i]); + max = Math.max(max, dataNameMap[mapKey][i]); + sum += dataNameMap[mapKey][i]; + } + + var result; + + if (statisticType === 'min') { + result = min; + } else if (statisticType === 'max') { + result = max; + } else if (statisticType === 'average') { + result = sum / len; + } else { + result = sum; + } + + return len === 0 ? NaN : result; + }); + } + + function mapDataStatistic(ecModel) { + var seriesGroups = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + var hostGeoModel = seriesModel.getHostGeoModel(); + var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType(); + (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel); + }); + each(seriesGroups, function (seriesList, key) { + var data = dataStatistics(map(seriesList, function (seriesModel) { + return seriesModel.getData(); + }), seriesList[0].get('mapValueCalculation')); + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].originalData = seriesList[i].getData(); + } // FIXME Put where? + + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].seriesGroup = seriesList; + seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel(); + seriesList[i].setData(data.cloneShallow()); + seriesList[i].mainSeries = seriesList[0]; + } + }); + } + + function mapSymbolLayout(ecModel) { + var processedMapType = {}; + ecModel.eachSeriesByType('map', function (mapSeries) { + var mapType = mapSeries.getMapType(); + + if (mapSeries.getHostGeoModel() || processedMapType[mapType]) { + return; + } + + var mapSymbolOffsets = {}; + each(mapSeries.seriesGroup, function (subMapSeries) { + var geo = subMapSeries.coordinateSystem; + var data = subMapSeries.originalData; + + if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) { + data.each(data.mapDimension('value'), function (value, idx) { + var name = data.getName(idx); + var region = geo.getRegion(name); // If input series.data is [11, 22, '-'/null/undefined, 44], + // it will be filled with NaN: [11, 22, NaN, 44] and NaN will + // not be drawn. 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; + }); + } + + var v2ApplyTransform = applyTransform; + + var View = + /** @class */ + function (_super) { + __extends(View, _super); + + function View(name) { + var _this = _super.call(this) || this; + + _this.type = 'view'; + _this.dimensions = ['x', 'y']; + _this._roamTransformable = new Transformable(); + _this._rawTransformable = new Transformable(); + _this.name = name; + return _this; + } // PENDING to getRect + + + View.prototype.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 + + + View.prototype.getBoundingRect = function () { + return this._rect; + }; + + View.prototype.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 + */ + + + View.prototype.transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var rawTransform = this._rawTransformable; + rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); + rawTransform.decomposeTransform(); + + this._updateTransform(); + }; + /** + * Set center of view + */ + + + View.prototype.setCenter = function (centerCoord) { + if (!centerCoord) { + return; + } + + this._center = centerCoord; + + this._updateCenterAndZoom(); + }; + + View.prototype.setZoom = function (zoom) { + zoom = zoom || 1; + var zoomLimit = this.zoomLimit; + + if (zoomLimit) { + if (zoomLimit.max != null) { + zoom = Math.min(zoomLimit.max, zoom); + } + + if (zoomLimit.min != null) { + zoom = Math.max(zoomLimit.min, zoom); + } + } + + this._zoom = zoom; + + this._updateCenterAndZoom(); + }; + /** + * Get default center without roam + */ + + + View.prototype.getDefaultCenter = function () { + // Rect before any transform + var rawRect = this.getBoundingRect(); + var cx = rawRect.x + rawRect.width / 2; + var cy = rawRect.y + rawRect.height / 2; + return [cx, cy]; + }; + + View.prototype.getCenter = function () { + return this._center || this.getDefaultCenter(); + }; + + View.prototype.getZoom = function () { + return this._zoom || 1; + }; + + View.prototype.getRoamTransform = function () { + return this._roamTransformable.getLocalTransform(); + }; + /** + * Remove roam + */ + + + View.prototype._updateCenterAndZoom = function () { + // Must update after view transform updated + var rawTransformMatrix = this._rawTransformable.getLocalTransform(); + + var roamTransform = this._roamTransformable; + var defaultCenter = this.getDefaultCenter(); + var center = this.getCenter(); + var zoom = this.getZoom(); + center = applyTransform([], center, rawTransformMatrix); + defaultCenter = applyTransform([], defaultCenter, rawTransformMatrix); + roamTransform.originX = center[0]; + roamTransform.originY = center[1]; + roamTransform.x = defaultCenter[0] - center[0]; + roamTransform.y = defaultCenter[1] - center[1]; + roamTransform.scaleX = roamTransform.scaleY = zoom; + + this._updateTransform(); + }; + /** + * Update transform from roam and mapLocation + */ + + + View.prototype._updateTransform = function () { + var roamTransformable = this._roamTransformable; + var rawTransformable = this._rawTransformable; + rawTransformable.parent = roamTransformable; + roamTransformable.updateTransform(); + rawTransformable.updateTransform(); + copy$1(this.transform || (this.transform = []), rawTransformable.transform || create$1()); + this._rawTransform = rawTransformable.getLocalTransform(); + this.invTransform = this.invTransform || []; + invert(this.invTransform, this.transform); + this.decomposeTransform(); + }; + + View.prototype.getTransformInfo = function () { + var roamTransform = this._roamTransformable.transform; + var rawTransformable = this._rawTransformable; + return { + roamTransform: roamTransform ? slice(roamTransform) : create$1(), + rawScaleX: rawTransformable.scaleX, + rawScaleY: rawTransformable.scaleY, + rawX: rawTransformable.x, + rawY: rawTransformable.y + }; + }; + + View.prototype.getViewRect = function () { + return this._viewRect; + }; + /** + * Get view rect after roam transform + */ + + + View.prototype.getViewRectAfterRoam = function () { + var rect = this.getBoundingRect().clone(); + rect.applyTransform(this.transform); + return rect; + }; + /** + * Convert a single (lon, lat) data item to (x, y) point. + */ + + + View.prototype.dataToPoint = function (data, noRoam, out) { + var transform = noRoam ? this._rawTransform : this.transform; + out = out || []; + return transform ? v2ApplyTransform(out, data, transform) : copy(out, data); + }; + /** + * Convert a (x, y) point to (lon, lat) data + */ + + + View.prototype.pointToData = function (point) { + var invTransform = this.invTransform; + return invTransform ? v2ApplyTransform([], point, invTransform) : [point[0], point[1]]; + }; + + View.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + View.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + /** + * @implements + */ + + + View.prototype.containPoint = function (point) { + return this.getViewRectAfterRoam().contain(point[0], point[1]); + }; + + View.dimensions = ['x', 'y']; + return View; + }(Transformable); + + function getCoordSys(finder) { + var seriesModel = finder.seriesModel; + return seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph. + } + + var Geo = + /** @class */ + function (_super) { + __extends(Geo, _super); + /** + * For backward compatibility, the orginal interface: + * `name, map, geoJson, specialAreas, nameMap` is kept. + * + * @param map Map type Specify the positioned areas by left, top, width, height. + * @param [nameMap] Specify name alias + */ + + + function Geo(name, map, nameMap, invertLongitute) { + var _this = _super.call(this, name) || this; + + _this.dimensions = ['lng', 'lat']; + _this.type = 'geo'; + _this.map = map; + var source = geoSourceManager.load(map, nameMap); + _this._nameCoordMap = source.nameCoordMap; + _this._regionsMap = source.regionsMap; + _this._invertLongitute = invertLongitute == null ? true : invertLongitute; + _this.regions = source.regions; + _this._rect = source.boundingRect; + return _this; + } + /** + * Whether contain the given [lng, lat] coord. + */ + + + Geo.prototype.containCoord = function (coord) { + var regions = this.regions; + + for (var i = 0; i < regions.length; i++) { + if (regions[i].contain(coord)) { + return true; + } + } + + return false; + }; + + Geo.prototype.transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var invertLongitute = this._invertLongitute; + rect = rect.clone(); + + if (invertLongitute) { + // Longitute is inverted + rect.y = -rect.y - rect.height; + } + + var rawTransformable = this._rawTransformable; + rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); + rawTransformable.decomposeTransform(); + + if (invertLongitute) { + rawTransformable.scaleY = -rawTransformable.scaleY; + } + + rawTransformable.updateTransform(); + + this._updateTransform(); + }; + + Geo.prototype.getRegion = function (name) { + return this._regionsMap.get(name); + }; + + Geo.prototype.getRegionByCoord = function (coord) { + var regions = this.regions; + + for (var i = 0; i < regions.length; i++) { + if (regions[i].contain(coord)) { + return regions[i]; + } + } + }; + /** + * Add geoCoord for indexing by name + */ + + + Geo.prototype.addGeoCoord = function (name, geoCoord) { + this._nameCoordMap.set(name, geoCoord); + }; + /** + * Get geoCoord by name + */ + + + Geo.prototype.getGeoCoord = function (name) { + return this._nameCoordMap.get(name); + }; + + Geo.prototype.getBoundingRect = function () { + return this._rect; + }; + + Geo.prototype.dataToPoint = function (data, noRoam, out) { + if (typeof data === 'string') { + // Map area name to geoCoord + data = this.getGeoCoord(data); + } + + if (data) { + return View.prototype.dataToPoint.call(this, data, noRoam, out); + } + }; + + Geo.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$1(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + Geo.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$1(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + + return Geo; + }(View); + mixin(Geo, View); + + function getCoordSys$1(finder) { + var geoModel = finder.geoModel; + var seriesModel = finder.seriesModel; + return geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem // For map series. + || (seriesModel.getReferringComponents('geo', SINGLE_REFERRING).models[0] || {}).coordinateSystem : null; + } + + /** + * Resize method bound to the geo + */ + + function resizeGeo(geoModel, api) { + var boundingCoords = geoModel.get('boundingCoords'); + + if (boundingCoords != null) { + var leftTop = boundingCoords[0]; + var rightBottom = boundingCoords[1]; + + if (isNaN(leftTop[0]) || isNaN(leftTop[1]) || isNaN(rightBottom[0]) || isNaN(rightBottom[1])) { + if ("development" !== 'production') { + console.error('Invalid boundingCoords'); + } + } else { + this.setBoundingRect(leftTop[0], leftTop[1], rightBottom[0] - leftTop[0], rightBottom[1] - leftTop[1]); + } + } + + var rect = this.getBoundingRect(); + var centerOption = geoModel.get('layoutCenter'); + var sizeOption = geoModel.get('layoutSize'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var aspect = rect.width / rect.height * this.aspectScale; + var useCenterAndSize = false; + var center; + var size; + + if (centerOption && sizeOption) { + center = [parsePercent$1(centerOption[0], viewWidth), parsePercent$1(centerOption[1], viewHeight)]; + size = parsePercent$1(sizeOption, Math.min(viewWidth, viewHeight)); + + if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) { + useCenterAndSize = true; + } else { + if ("development" !== 'production') { + console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.'); + } + } + } + + var viewRect; + + if (useCenterAndSize) { + viewRect = {}; + + if (aspect > 1) { + // Width is same with size + viewRect.width = size; + viewRect.height = size / aspect; + } else { + viewRect.height = size; + viewRect.width = size * aspect; + } + + viewRect.y = center[1] - viewRect.height / 2; + viewRect.x = center[0] - viewRect.width / 2; + } else { + // Use left/top/width/height + var boxLayoutOption = geoModel.getBoxLayoutParams(); // 0.75 rate + + boxLayoutOption.aspect = aspect; + viewRect = getLayoutRect(boxLayoutOption, { + width: viewWidth, + height: viewHeight + }); + } + + this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); + this.setCenter(geoModel.get('center')); + this.setZoom(geoModel.get('zoom')); + } // Back compat for ECharts2, where the coord map is set on map series: + // {type: 'map', geoCoord: {'cityA': [116.46,39.92], 'cityA': [119.12,24.61]}}, + + + function setGeoCoords(geo, model) { + each(model.get('geoCoord'), function (geoCoord, name) { + geo.addGeoCoord(name, geoCoord); + }); + } + + var GeoCreator = + /** @class */ + function () { + function GeoCreator() { + // For deciding which dimensions to use when creating list data + this.dimensions = Geo.prototype.dimensions; + } + + GeoCreator.prototype.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 aspectScale = geoModel.get('aspectScale'); + var invertLongitute = true; + var mapRecords = mapDataStorage.retrieveMap(name); + + if (mapRecords && mapRecords[0] && mapRecords[0].type === 'svg') { + aspectScale == null && (aspectScale = 1); + invertLongitute = false; + } else { + aspectScale == null && (aspectScale = 0.75); + } + + var geo = new Geo(name + idx, name, geoModel.get('nameMap'), invertLongitute); + geo.aspectScale = aspectScale; + 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) { + if (!seriesModel.getHostGeoModel()) { + var mapType = seriesModel.getMapType(); + mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; + mapModelGroupBySeries[mapType].push(seriesModel); + } + }); + each(mapModelGroupBySeries, function (mapSeries, mapType) { + var nameMapList = map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('nameMap'); + }); + var geo = new Geo(mapType, mapType, mergeAll(nameMapList)); + geo.zoomLimit = retrieve.apply(null, map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('scaleLimit'); + })); + geoList.push(geo); // Inject resize method + + geo.resize = resizeGeo; + geo.aspectScale = mapSeries[0].get('aspectScale'); + geo.resize(mapSeries[0], api); + each(mapSeries, function (singleMapSeries) { + singleMapSeries.coordinateSystem = geo; + setGeoCoords(geo, singleMapSeries); + }); + }); + return geoList; + }; + /** + * Fill given regions array + */ + + + GeoCreator.prototype.getFilledRegions = function (originRegionArr, mapName, nameMap) { + // Not use the original + var regionsArr = (originRegionArr || []).slice(); + var dataNameMap = createHashMap(); + + for (var i = 0; i < regionsArr.length; i++) { + dataNameMap.set(regionsArr[i].name, regionsArr[i]); + } + + var source = geoSourceManager.load(mapName, nameMap); + each(source.regions, function (region) { + var name = region.name; + !dataNameMap.get(name) && regionsArr.push({ + name: name + }); + }); + return regionsArr; + }; + + return GeoCreator; + }(); + + var geoCreator = new GeoCreator(); + + var GeoModel = + /** @class */ + function (_super) { + __extends(GeoModel, _super); + + function GeoModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GeoModel.type; + return _this; + } + + GeoModel.prototype.init = function (option, parentModel, ecModel) { + _super.prototype.init.call(this, option, parentModel, ecModel); // Default label emphasis `show` + + + defaultEmphasis(option, 'label', ['show']); + }; + + GeoModel.prototype.optionUpdated = function () { + var option = this.option; + var self = this; + option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap); + var selectedMap = {}; + this._optionModelMap = reduce(option.regions || [], function (optionModelMap, regionOpt) { + var regionName = regionOpt.name; + + if (regionName) { + optionModelMap.set(regionName, new Model(regionOpt, self)); + + if (regionOpt.selected) { + selectedMap[regionName] = true; + } + } + + return optionModelMap; + }, createHashMap()); + + if (!option.selectedMap) { + option.selectedMap = selectedMap; + } + }; + /** + * Get model of region. + */ + + + GeoModel.prototype.getRegionModel = function (name) { + return this._optionModelMap.get(name) || new Model(null, this, this.ecModel); + }; + /** + * Format label + * @param name Region name + */ + + + GeoModel.prototype.getFormattedLabel = function (name, status) { + var regionModel = this.getRegionModel(name); + var formatter = status === 'normal' ? regionModel.get(['label', 'formatter']) : regionModel.get(['emphasis', 'label', 'formatter']); + var params = { + name: name + }; + + if (typeof formatter === 'function') { + params.status = status; + return formatter(params); + } else if (typeof formatter === 'string') { + return formatter.replace('{a}', name != null ? name : ''); + } + }; + + GeoModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + GeoModel.prototype.setCenter = function (center) { + this.option.center = center; + }; // PENGING If selectedMode is null ? + + + GeoModel.prototype.select = function (name) { + var option = this.option; + var selectedMode = option.selectedMode; + + if (!selectedMode) { + return; + } + + if (selectedMode !== 'multiple') { + option.selectedMap = null; + } + + var selectedMap = option.selectedMap || (option.selectedMap = {}); + selectedMap[name] = true; + }; + + GeoModel.prototype.unSelect = function (name) { + var selectedMap = this.option.selectedMap; + + if (selectedMap) { + selectedMap[name] = false; + } + }; + + GeoModel.prototype.toggleSelected = function (name) { + this[this.isSelected(name) ? 'unSelect' : 'select'](name); + }; + + GeoModel.prototype.isSelected = function (name) { + var selectedMap = this.option.selectedMap; + return !!(selectedMap && selectedMap[name]); + }; + + GeoModel.prototype._initSelectedMapFromData = function () {}; + + GeoModel.type = 'geo'; + GeoModel.layoutMode = 'box'; + GeoModel.defaultOption = { + zlevel: 0, + z: 0, + show: true, + left: 'center', + top: 'center', + // If svg used, aspectScale is 1 by default. + // aspectScale: 0.75, + aspectScale: null, + ///// Layout with center and size + // If you wan't to put map in a fixed size box with right aspect ratio + // This two properties may more conveninet + // layoutCenter: [50%, 50%] + // layoutSize: 100 + silent: false, + // Map type + map: '', + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ] + boundingCoords: null, + // Default on center of map + center: null, + zoom: 1, + scaleLimit: null, + // selectedMode: false + label: { + show: false, + color: '#000' + }, + itemStyle: { + // color: 各异, + borderWidth: 0.5, + borderColor: '#444', + color: '#eee' + }, + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + select: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + regions: [] + }; + return GeoModel; + }(ComponentModel); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function updateCenterAndZoom(view, payload, zoomLimit) { + var previousZoom = view.getZoom(); + var center = view.getCenter(); + var zoom = payload.zoom; + var point = view.dataToPoint(center); + + if (payload.dx != null && payload.dy != null) { + point[0] -= payload.dx; + point[1] -= payload.dy; + view.setCenter(view.pointToData(point)); + } + + if (zoom != null) { + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + zoom = Math.max(Math.min(previousZoom * zoom, zoomMax), zoomMin) / previousZoom; + } // Zoom on given point(originX, originY) + + + view.scaleX *= zoom; + view.scaleY *= zoom; + var fixX = (payload.originX - view.x) * (zoom - 1); + var fixY = (payload.originY - view.y) * (zoom - 1); + view.x -= fixX; + view.y -= fixY; + view.updateTransform(); // Get the new center + + view.setCenter(view.pointToData(point)); + view.setZoom(zoom * previousZoom); + } + + return { + center: view.getCenter(), + zoom: view.getZoom() + }; + } + + var GeoView = + /** @class */ + function (_super) { + __extends(GeoView, _super); + + function GeoView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GeoView.type; + return _this; + } + + GeoView.prototype.init = function (ecModel, api) { + var mapDraw = new MapDraw(api); + this._mapDraw = mapDraw; + this.group.add(mapDraw.group); + this._api = api; + }; + + GeoView.prototype.render = function (geoModel, ecModel, api, payload) { + var mapDraw = this._mapDraw; + + if (geoModel.get('show')) { + mapDraw.draw(geoModel, ecModel, api, this, payload); + } else { + this._mapDraw.group.removeAll(); + } + + mapDraw.group.on('click', this._handleRegionClick, this); + mapDraw.group.silent = geoModel.get('silent'); + this._model = geoModel; + this.updateSelectStatus(geoModel, ecModel, api); + }; + + GeoView.prototype._handleRegionClick = function (e) { + var current = e.target; + var eventData; // TODO extract a util function + + while (current && (eventData = getECData(current).eventData) == null) { + current = current.__hostTarget || current.parent; + } + + if (eventData) { + this._api.dispatchAction({ + type: 'geoToggleSelect', + geoId: this._model.id, + name: eventData.name + }); + } + }; + + GeoView.prototype.updateSelectStatus = function (model, ecModel, api) { + var _this = this; + + this._mapDraw.group.traverse(function (node) { + var eventData = getECData(node).eventData; + + if (eventData) { + _this._model.isSelected(eventData.name) ? api.enterSelect(node) : api.leaveSelect(node); // No need to traverse children. + + return true; + } + }); + }; + + GeoView.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(); + }; + + GeoView.type = 'geo'; + return GeoView; + }(ComponentView); + + function install$9(registers) { + registers.registerCoordinateSystem('geo', geoCreator); + registers.registerComponentModel(GeoModel); + registers.registerComponentView(GeoView); + + function makeAction(method, actionInfo) { + actionInfo.update = 'geo:updateSelectStatus'; + registers.registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + ecModel.eachComponent({ + mainType: 'geo', + query: payload + }, function (geoModel) { + geoModel[method](payload.name); + var geo = geoModel.coordinateSystem; + each(geo.regions, function (region) { + selected[region.name] = geoModel.isSelected(region.name) || false; + }); + }); + return { + selected: selected, + name: payload.name + }; + }); + } + + makeAction('toggleSelected', { + type: 'geoToggleSelect', + event: 'geoselectchanged' + }); + makeAction('select', { + type: 'geoSelect', + event: 'geoselected' + }); + makeAction('unSelect', { + type: 'geoUnSelect', + event: 'geounselected' + }); + /** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + registers.registerAction({ + type: 'geoRoam', + event: 'geoRoam', + update: 'updateTransform' + }, function (payload, ecModel) { + var componentType = payload.componentType || 'series'; + ecModel.eachComponent({ + mainType: componentType, + query: payload + }, function (componentModel) { + var geo = componentModel.coordinateSystem; + + if (geo.type !== 'geo') { + return; + } + + var res = updateCenterAndZoom(geo, payload, componentModel.get('scaleLimit')); + componentModel.setCenter && componentModel.setCenter(res.center); + componentModel.setZoom && componentModel.setZoom(res.zoom); // All map series with same `map` use the same geo coordinate system + // So the center and zoom must be in sync. Include the series not selected by legend + + if (componentType === 'series') { + each(componentModel.seriesGroup, function (seriesModel) { + seriesModel.setCenter(res.center); + seriesModel.setZoom(res.zoom); + }); + } + }); + }); + } + + function install$a(registers) { + use(install$9); + registers.registerChartView(MapView); + registers.registerSeriesModel(MapSeries); + registers.registerLayout(mapSymbolLayout); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic); + createLegacyDataSelectAction('map', registers.registerAction); + } + + /** + * Initialize all computational message for following algorithm. + */ + + function init$2(inRoot) { + var root = inRoot; + root.hierNode = { + defaultAncestor: null, + ancestor: root, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: 0, + thread: null + }; + var nodes = [root]; + var node; + var children; + + while (node = nodes.pop()) { + // jshint ignore:line + children = node.children; + + if (node.isExpand && children.length) { + var n = children.length; + + for (var i = n - 1; i >= 0; i--) { + var child = children[i]; + child.hierNode = { + defaultAncestor: null, + ancestor: child, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: i, + thread: null + }; + nodes.push(child); + } + } + } + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Computes a preliminary x coordinate for node. Before that, this function is + * applied recursively to the children of node, as well as the function + * apportion(). After spacing out the children by calling executeShifts(), the + * node is placed to the midpoint of its outermost children. + */ + + function firstWalk(node, separation) { + var children = node.isExpand ? node.children : []; + var siblings = node.parentNode.children; + var subtreeW = node.hierNode.i ? siblings[node.hierNode.i - 1] : null; + + if (children.length) { + executeShifts(node); + var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2; + + if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + node.hierNode.modifier = node.hierNode.prelim - midPoint; + } else { + node.hierNode.prelim = midPoint; + } + } else if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + } + + node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation); + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Computes all real x-coordinates by summing up the modifiers recursively. + */ + + function secondWalk(node) { + var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier; + node.setLayout({ + x: nodeX + }, true); + node.hierNode.modifier += node.parentNode.hierNode.modifier; + } + function separation(cb) { + return arguments.length ? cb : defaultSeparation; + } + /** + * Transform the common coordinate to radial coordinate. + */ + + function radialCoordinate(rad, r) { + rad -= Math.PI / 2; + return { + x: r * Math.cos(rad), + y: r * Math.sin(rad) + }; + } + /** + * Get the layout position of the whole view. + */ + + function getViewRect$1(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + /** + * All other shifts, applied to the smaller subtrees between w- and w+, are + * performed by this function. + * + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + function executeShifts(node) { + var children = node.children; + var n = children.length; + var shift = 0; + var change = 0; + + while (--n >= 0) { + var child = children[n]; + child.hierNode.prelim += shift; + child.hierNode.modifier += shift; + change += child.hierNode.change; + shift += child.hierNode.shift + change; + } + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * The core of the algorithm. Here, a new subtree is combined with the + * previous subtrees. Threads are used to traverse the inside and outside + * contours of the left and right subtree up to the highest common level. + * Whenever two nodes of the inside contours conflict, we compute the left + * one of the greatest uncommon ancestors using the function nextAncestor() + * and call moveSubtree() to shift the subtree and prepare the shifts of + * smaller subtrees. Finally, we add a new thread (if necessary). + */ + + + function apportion(subtreeV, subtreeW, ancestor, separation) { + if (subtreeW) { + var nodeOutRight = subtreeV; + var nodeInRight = subtreeV; + var nodeOutLeft = nodeInRight.parentNode.children[0]; + var nodeInLeft = subtreeW; + var sumOutRight = nodeOutRight.hierNode.modifier; + var sumInRight = nodeInRight.hierNode.modifier; + var sumOutLeft = nodeOutLeft.hierNode.modifier; + var sumInLeft = nodeInLeft.hierNode.modifier; + + while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) { + nodeOutRight = nextRight(nodeOutRight); + nodeOutLeft = nextLeft(nodeOutLeft); + nodeOutRight.hierNode.ancestor = subtreeV; + var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim - sumInRight + separation(nodeInLeft, nodeInRight); + + if (shift > 0) { + moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift); + sumInRight += shift; + sumOutRight += shift; + } + + sumInLeft += nodeInLeft.hierNode.modifier; + sumInRight += nodeInRight.hierNode.modifier; + sumOutRight += nodeOutRight.hierNode.modifier; + sumOutLeft += nodeOutLeft.hierNode.modifier; + } + + if (nodeInLeft && !nextRight(nodeOutRight)) { + nodeOutRight.hierNode.thread = nodeInLeft; + nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight; + } + + if (nodeInRight && !nextLeft(nodeOutLeft)) { + nodeOutLeft.hierNode.thread = nodeInRight; + nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft; + ancestor = subtreeV; + } + } + + return ancestor; + } + /** + * This function is used to traverse the right contour of a subtree. + * It returns the rightmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + */ + + + function nextRight(node) { + var children = node.children; + return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread; + } + /** + * This function is used to traverse the left contour of a subtree (or a subforest). + * It returns the leftmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + */ + + + function nextLeft(node) { + var children = node.children; + return children.length && node.isExpand ? children[0] : node.hierNode.thread; + } + /** + * If nodeInLeft’s ancestor is a sibling of node, returns nodeInLeft’s ancestor. + * Otherwise, returns the specified ancestor. + */ + + + function nextAncestor(nodeInLeft, node, ancestor) { + return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode ? nodeInLeft.hierNode.ancestor : ancestor; + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Shifts the current subtree rooted at wr. + * This is done by increasing prelim(w+) and modifier(w+) by shift. + */ + + + function moveSubtree(wl, wr, shift) { + var change = shift / (wr.hierNode.i - wl.hierNode.i); + wr.hierNode.change -= change; + wr.hierNode.shift += shift; + wr.hierNode.modifier += shift; + wr.hierNode.prelim += shift; + wl.hierNode.change += change; + } + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + + function defaultSeparation(node1, node2) { + return node1.parentNode === node2.parentNode ? 1 : 2; + } + + var TreeEdgeShape = + /** @class */ + function () { + function TreeEdgeShape() { + this.parentPoint = []; + this.childPoints = []; + } + + return TreeEdgeShape; + }(); + + var TreePath = + /** @class */ + function (_super) { + __extends(TreePath, _super); + + function TreePath(opts) { + return _super.call(this, opts) || this; + } + + TreePath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + TreePath.prototype.getDefaultShape = function () { + return new TreeEdgeShape(); + }; + + TreePath.prototype.buildPath = function (ctx, shape) { + var childPoints = shape.childPoints; + var childLen = childPoints.length; + var parentPoint = shape.parentPoint; + var firstChildPos = childPoints[0]; + var lastChildPos = childPoints[childLen - 1]; + + if (childLen === 1) { + ctx.moveTo(parentPoint[0], parentPoint[1]); + ctx.lineTo(firstChildPos[0], firstChildPos[1]); + return; + } + + var orient = shape.orient; + var forkDim = orient === 'TB' || orient === 'BT' ? 0 : 1; + var otherDim = 1 - forkDim; + var forkPosition = parsePercent$1(shape.forkPosition, 1); + var tmpPoint = []; + tmpPoint[forkDim] = parentPoint[forkDim]; + tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition; + ctx.moveTo(parentPoint[0], parentPoint[1]); + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + ctx.moveTo(firstChildPos[0], firstChildPos[1]); + tmpPoint[forkDim] = firstChildPos[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + tmpPoint[forkDim] = lastChildPos[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + ctx.lineTo(lastChildPos[0], lastChildPos[1]); + + for (var i = 1; i < childLen - 1; i++) { + var point = childPoints[i]; + ctx.moveTo(point[0], point[1]); + tmpPoint[forkDim] = point[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + } + }; + + return TreePath; + }(Path); + + var TreeView = + /** @class */ + function (_super) { + __extends(TreeView, _super); + + function TreeView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreeView.type; + _this._mainGroup = new Group(); + return _this; + } + + TreeView.prototype.init = function (ecModel, api) { + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: this.group + }; + this.group.add(this._mainGroup); + }; + + TreeView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var layoutInfo = seriesModel.layoutInfo; + var group = this._mainGroup; + var layout = seriesModel.get('layout'); + + if (layout === 'radial') { + group.x = layoutInfo.x + layoutInfo.width / 2; + group.y = layoutInfo.y + layoutInfo.height / 2; + } else { + group.x = layoutInfo.x; + group.y = layoutInfo.y; + } + + this._updateViewCoordSys(seriesModel); + + this._updateController(seriesModel, ecModel, api); + + var oldData = this._data; + data.diff(oldData).add(function (newIdx) { + if (symbolNeedsDraw$1(data, newIdx)) { + // Create node and edge + updateNode(data, newIdx, null, group, seriesModel); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + + if (!symbolNeedsDraw$1(data, newIdx)) { + symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel); + return; + } // Update node and edge + + + updateNode(data, newIdx, symbolEl, group, seriesModel); + }).remove(function (oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); // When remove a collapsed node of subtree, since the collapsed + // node haven't been initialized with a symbol element, + // you can't found it's symbol element through index. + // so if we want to remove the symbol element we should insure + // that the symbol element is not null. + + if (symbolEl) { + removeNode(oldData, oldIdx, symbolEl, group, seriesModel); + } + }).execute(); + this._nodeScaleRatio = seriesModel.get('nodeScaleRatio'); + + this._updateNodeAndLinkScale(seriesModel); + + if (seriesModel.get('expandAndCollapse') === true) { + data.eachItemGraphicEl(function (el, dataIndex) { + el.off('click').on('click', function () { + api.dispatchAction({ + type: 'treeExpandAndCollapse', + seriesId: seriesModel.id, + dataIndex: dataIndex + }); + }); + }); + } + + this._data = data; + }; + + TreeView.prototype._updateViewCoordSys = function (seriesModel) { + var data = seriesModel.getData(); + var points = []; + data.each(function (idx) { + var layout = data.getItemLayout(idx); + + if (layout && !isNaN(layout.x) && !isNaN(layout.y)) { + points.push([+layout.x, +layout.y]); + } + }); + var min = []; + var max = []; + fromPoints(points, min, max); // If don't Store min max when collapse the root node after roam, + // the root node will disappear. + + var oldMin = this._min; + var oldMax = this._max; // If width or height is 0 + + if (max[0] - min[0] === 0) { + min[0] = oldMin ? oldMin[0] : min[0] - 1; + max[0] = oldMax ? oldMax[0] : max[0] + 1; + } + + if (max[1] - min[1] === 0) { + min[1] = oldMin ? oldMin[1] : min[1] - 1; + max[1] = oldMax ? oldMax[1] : max[1] + 1; + } + + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + viewCoordSys.setCenter(seriesModel.get('center')); + viewCoordSys.setZoom(seriesModel.get('zoom')); // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group + + this.group.attr({ + x: viewCoordSys.x, + y: viewCoordSys.y, + scaleX: viewCoordSys.scaleX, + scaleY: viewCoordSys.scaleY + }); + this._min = min; + this._max = max; + }; + + TreeView.prototype._updateController = function (seriesModel, ecModel, api) { + var _this = this; + + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); + }); + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + controller.off('pan').off('zoom').on('pan', function (e) { + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'treeRoam', + dx: e.dx, + dy: e.dy + }); + }).on('zoom', function (e) { + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'treeRoam', + zoom: e.scale, + originX: e.originX, + originY: e.originY + }); + + _this._updateNodeAndLinkScale(seriesModel); // Only update label layout on zoom + + + api.updateLabelLayout(); + }); + }; + + TreeView.prototype._updateNodeAndLinkScale = function (seriesModel) { + var data = seriesModel.getData(); + + var nodeScale = this._getNodeGlobalScale(seriesModel); + + data.eachItemGraphicEl(function (el, idx) { + el.setSymbolScale(nodeScale); + }); + }; + + TreeView.prototype._getNodeGlobalScale = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = this._nodeScaleRatio; + var groupZoom = coordSys.scaleX || 1; // Scale node when zoom changes + + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + return nodeScale / groupZoom; + }; + + TreeView.prototype.dispose = function () { + this._controller && this._controller.dispose(); + this._controllerHost = null; + }; + + TreeView.prototype.remove = function () { + this._mainGroup.removeAll(); + + this._data = null; + }; + + TreeView.type = 'tree'; + return TreeView; + }(ChartView); + + function symbolNeedsDraw$1(data, dataIndex) { + var layout = data.getItemLayout(dataIndex); + return layout && !isNaN(layout.x) && !isNaN(layout.y); + } + + function updateNode(data, dataIndex, symbolEl, group, seriesModel) { + var isInit = !symbolEl; + var node = data.tree.getNodeByDataIndex(dataIndex); + var itemModel = node.getModel(); + var visualColor = node.getVisual('style').fill; + var symbolInnerColor = node.isExpand === false && node.children.length !== 0 ? visualColor : '#fff'; + var virtualRoot = data.tree.root; + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceLayout = source.getLayout(); + var sourceOldLayout = sourceSymbolEl ? { + x: sourceSymbolEl.__oldX, + y: sourceSymbolEl.__oldY, + rawX: sourceSymbolEl.__radialOldRawX, + rawY: sourceSymbolEl.__radialOldRawY + } : sourceLayout; + var targetLayout = node.getLayout(); + + if (isInit) { + symbolEl = new Symbol(data, dataIndex, null, { + symbolInnerColor: symbolInnerColor, + useNameLabel: true + }); + symbolEl.x = sourceOldLayout.x; + symbolEl.y = sourceOldLayout.y; + } else { + symbolEl.updateData(data, dataIndex, null, { + symbolInnerColor: symbolInnerColor, + useNameLabel: true + }); + } + + symbolEl.__radialOldRawX = symbolEl.__radialRawX; + symbolEl.__radialOldRawY = symbolEl.__radialRawY; + symbolEl.__radialRawX = targetLayout.rawX; + symbolEl.__radialRawY = targetLayout.rawY; + group.add(symbolEl); + data.setItemGraphicEl(dataIndex, symbolEl); + symbolEl.__oldX = symbolEl.x; + symbolEl.__oldY = symbolEl.y; + updateProps(symbolEl, { + x: targetLayout.x, + y: targetLayout.y + }, seriesModel); + var symbolPath = symbolEl.getSymbolPath(); + + if (seriesModel.get('layout') === 'radial') { + var realRoot = virtualRoot.children[0]; + var rootLayout = realRoot.getLayout(); + var length_1 = realRoot.children.length; + var rad = void 0; + var isLeft = void 0; + + if (targetLayout.x === rootLayout.x && node.isExpand === true) { + var center = { + x: (realRoot.children[0].getLayout().x + realRoot.children[length_1 - 1].getLayout().x) / 2, + y: (realRoot.children[0].getLayout().y + realRoot.children[length_1 - 1].getLayout().y) / 2 + }; + rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + isLeft = center.x < rootLayout.x; + + if (isLeft) { + rad = rad - Math.PI; + } + } else { + rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) { + isLeft = targetLayout.x < rootLayout.x; + + if (isLeft) { + rad = rad - Math.PI; + } + } else { + isLeft = targetLayout.x > rootLayout.x; + + if (!isLeft) { + rad = rad - Math.PI; + } + } + } + + var textPosition = isLeft ? 'left' : 'right'; + var normalLabelModel = itemModel.getModel('label'); + var rotate = normalLabelModel.get('rotate'); + var labelRotateRadian = rotate * (Math.PI / 180); + var textContent = symbolPath.getTextContent(); + + if (textContent) { + symbolPath.setTextConfig({ + position: normalLabelModel.get('position') || textPosition, + rotation: rotate == null ? -rad : labelRotateRadian, + origin: 'center' + }); + textContent.setStyle('verticalAlign', 'middle'); + } + } // Handle status + + + var focus = itemModel.get(['emphasis', 'focus']); + var focusDataIndices = focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : null; + + if (focusDataIndices) { + // Modify the focus to data indices. + getECData(symbolEl).focus = focusDataIndices; + } + + drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group); + + if (symbolEl.__edge) { + symbolEl.onHoverStateChange = function (toState) { + if (toState !== 'blur') { + // NOTE: Ensure the parent elements will been blurred firstly. + // According to the return of getAncestorsIndices and getDescendantIndices + // TODO: A bit tricky. + var parentEl = node.parentNode && data.getItemGraphicEl(node.parentNode.dataIndex); + + if (!(parentEl && parentEl.hoverState === HOVER_STATE_BLUR)) { + setStatesFlag(symbolEl.__edge, toState); + } + } + }; + } + } + + function drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group) { + var itemModel = node.getModel(); + var edgeShape = seriesModel.get('edgeShape'); + var layout = seriesModel.get('layout'); + var orient = seriesModel.getOrient(); + var curvature = seriesModel.get(['lineStyle', 'curveness']); + var edgeForkPosition = seriesModel.get('edgeForkPosition'); + var lineStyle = itemModel.getModel('lineStyle').getLineStyle(); + var edge = symbolEl.__edge; + + if (edgeShape === 'curve') { + if (node.parentNode && node.parentNode !== virtualRoot) { + if (!edge) { + edge = symbolEl.__edge = new BezierCurve({ + shape: getEdgeShape(layout, orient, curvature, sourceOldLayout, sourceOldLayout) + }); + } + + updateProps(edge, { + shape: getEdgeShape(layout, orient, curvature, sourceLayout, targetLayout) + }, seriesModel); + } + } else if (edgeShape === 'polyline') { + if (layout === 'orthogonal') { + if (node !== virtualRoot && node.children && node.children.length !== 0 && node.isExpand === true) { + var children = node.children; + var childPoints = []; + + for (var i = 0; i < children.length; i++) { + var childLayout = children[i].getLayout(); + childPoints.push([childLayout.x, childLayout.y]); + } + + if (!edge) { + edge = symbolEl.__edge = new TreePath({ + shape: { + parentPoint: [targetLayout.x, targetLayout.y], + childPoints: [[targetLayout.x, targetLayout.y]], + orient: orient, + forkPosition: edgeForkPosition + } + }); + } + + updateProps(edge, { + shape: { + parentPoint: [targetLayout.x, targetLayout.y], + childPoints: childPoints + } + }, seriesModel); + } + } else { + if ("development" !== 'production') { + throw new Error('The polyline edgeShape can only be used in orthogonal layout'); + } + } + } + + if (edge) { + edge.useStyle(defaults({ + strokeNoScale: true, + fill: null + }, lineStyle)); + setStatesStylesFromModel(edge, itemModel, 'lineStyle'); + setDefaultStateProxy(edge); + group.add(edge); + } + } + + function removeNode(data, dataIndex, symbolEl, group, seriesModel) { + var node = data.tree.getNodeByDataIndex(dataIndex); + var virtualRoot = data.tree.root; + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; // let edgeShape = seriesScope.edgeShape; + + var sourceLayout; + + while (sourceLayout = source.getLayout(), sourceLayout == null) { + source = source.parentNode === virtualRoot ? source : source.parentNode || source; + } // Use same duration and easing with update to have more consistent animation. + + + var removeAnimationOpt = { + duration: seriesModel.get('animationDurationUpdate'), + easing: seriesModel.get('animationEasingUpdate') + }; + removeElement(symbolEl, { + x: sourceLayout.x + 1, + y: sourceLayout.y + 1 + }, seriesModel, { + cb: function () { + group.remove(symbolEl); + data.setItemGraphicEl(dataIndex, null); + }, + removeOpt: removeAnimationOpt + }); + symbolEl.fadeOut(null, { + fadeLabel: true, + animation: removeAnimationOpt + }); + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceEdge = sourceSymbolEl.__edge; // 1. when expand the sub tree, delete the children node should delete the edge of + // the source at the same time. because the polyline edge shape is only owned by the source. + // 2.when the node is the only children of the source, delete the node should delete the edge of + // the source at the same time. the same reason as above. + + var edge = symbolEl.__edge || (source.isExpand === false || source.children.length === 1 ? sourceEdge : undefined); + var edgeShape = seriesModel.get('edgeShape'); + var layoutOpt = seriesModel.get('layout'); + var orient = seriesModel.get('orient'); + var curvature = seriesModel.get(['lineStyle', 'curveness']); + + if (edge) { + if (edgeShape === 'curve') { + removeElement(edge, { + shape: getEdgeShape(layoutOpt, orient, curvature, sourceLayout, sourceLayout), + style: { + opacity: 0 + } + }, seriesModel, { + cb: function () { + group.remove(edge); + }, + removeOpt: removeAnimationOpt + }); + } else if (edgeShape === 'polyline' && seriesModel.get('layout') === 'orthogonal') { + removeElement(edge, { + shape: { + parentPoint: [sourceLayout.x, sourceLayout.y], + childPoints: [[sourceLayout.x, sourceLayout.y]] + }, + style: { + opacity: 0 + } + }, seriesModel, { + cb: function () { + group.remove(edge); + }, + removeOpt: removeAnimationOpt + }); + } + } + } + + function getEdgeShape(layoutOpt, orient, curvature, sourceLayout, targetLayout) { + var cpx1; + var cpy1; + var cpx2; + var cpy2; + var x1; + var x2; + var y1; + var y2; + + if (layoutOpt === 'radial') { + x1 = sourceLayout.rawX; + y1 = sourceLayout.rawY; + x2 = targetLayout.rawX; + y2 = targetLayout.rawY; + var radialCoor1 = radialCoordinate(x1, y1); + var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * curvature); + var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * curvature); + var radialCoor4 = radialCoordinate(x2, y2); + return { + x1: radialCoor1.x || 0, + y1: radialCoor1.y || 0, + x2: radialCoor4.x || 0, + y2: radialCoor4.y || 0, + cpx1: radialCoor2.x || 0, + cpy1: radialCoor2.y || 0, + cpx2: radialCoor3.x || 0, + cpy2: radialCoor3.y || 0 + }; + } else { + x1 = sourceLayout.x; + y1 = sourceLayout.y; + x2 = targetLayout.x; + y2 = targetLayout.y; + + if (orient === 'LR' || orient === 'RL') { + cpx1 = x1 + (x2 - x1) * curvature; + cpy1 = y1; + cpx2 = x2 + (x1 - x2) * curvature; + cpy2 = y2; + } + + if (orient === 'TB' || orient === 'BT') { + cpx1 = x1; + cpy1 = y1 + (y2 - y1) * curvature; + cpx2 = x2; + cpy2 = y2 + (y1 - y2) * curvature; + } + } + + return { + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }; + } + + var inner$8 = makeInner(); + + function linkList(opt) { + var mainData = opt.mainData; + var datas = opt.datas; + + if (!datas) { + datas = { + main: mainData + }; + opt.datasAttr = { + main: 'data' + }; + } + + opt.datas = opt.mainData = null; + linkAll(mainData, datas, opt); // Porxy data original methods. + + each(datas, function (data) { + each(mainData.TRANSFERABLE_METHODS, function (methodName) { + data.wrapMethod(methodName, curry(transferInjection, opt)); + }); + }); // Beyond transfer, additional features should be added to `cloneShallow`. + + mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt)); // Only mainData trigger change, because struct.update may trigger + // another changable methods, which may bring about dead lock. + + each(mainData.CHANGABLE_METHODS, function (methodName) { + mainData.wrapMethod(methodName, curry(changeInjection, opt)); + }); // Make sure datas contains mainData. + + assert(datas[mainData.dataType] === mainData); + } + + function transferInjection(opt, res) { + if (isMainData(this)) { + // Transfer datas to new main data. + var datas = extend({}, inner$8(this).datas); + datas[this.dataType] = res; + linkAll(res, datas, opt); + } else { + // Modify the reference in main data to point newData. + linkSingle(res, this.dataType, inner$8(this).mainData, opt); + } + + return res; + } + + function changeInjection(opt, res) { + opt.struct && opt.struct.update(); + return res; + } + + function cloneShallowInjection(opt, res) { + // cloneShallow, which brings about some fragilities, may be inappropriate + // to be exposed as an API. So for implementation simplicity we can make + // the restriction that cloneShallow of not-mainData should not be invoked + // outside, but only be invoked here. + each(inner$8(res).datas, function (data, dataType) { + data !== res && linkSingle(data.cloneShallow(), dataType, res, opt); + }); + return res; + } + /** + * Supplement method to List. + * + * @public + * @param [dataType] If not specified, return mainData. + */ + + + function getLinkedData(dataType) { + var mainData = inner$8(this).mainData; + return dataType == null || mainData == null ? mainData : inner$8(mainData).datas[dataType]; + } + /** + * Get list of all linked data + */ + + + function getLinkedDataAll() { + var mainData = inner$8(this).mainData; + return mainData == null ? [{ + data: mainData + }] : map(keys(inner$8(mainData).datas), function (type) { + return { + type: type, + data: inner$8(mainData).datas[type] + }; + }); + } + + function isMainData(data) { + return inner$8(data).mainData === data; + } + + function linkAll(mainData, datas, opt) { + inner$8(mainData).datas = {}; + each(datas, function (data, dataType) { + linkSingle(data, dataType, mainData, opt); + }); + } + + function linkSingle(data, dataType, mainData, opt) { + inner$8(mainData).datas[dataType] = data; + inner$8(data).mainData = mainData; + data.dataType = dataType; + + if (opt.struct) { + data[opt.structAttr] = opt.struct; + opt.struct[opt.datasAttr[dataType]] = data; + } // Supplement method. + + + data.getLinkedData = getLinkedData; + data.getLinkedDataAll = getLinkedDataAll; + } + + var TreeNode = + /** @class */ + function () { + function TreeNode(name, hostTree) { + this.depth = 0; + this.height = 0; + /** + * 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. + */ + + this.dataIndex = -1; + this.children = []; + this.viewChildren = []; + this.isExpand = false; + this.name = name || ''; + this.hostTree = hostTree; + } + /** + * The node is removed. + */ + + + TreeNode.prototype.isRemoved = function () { + return this.dataIndex < 0; + }; + + TreeNode.prototype.eachNode = function (options, cb, context) { + if (typeof options === 'function') { + context = cb; + cb = options; + options = null; + } + + options = options || {}; + + if (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. + */ + + + TreeNode.prototype.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; + }; + + TreeNode.prototype.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; + } + } + }; + + TreeNode.prototype.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 includeSelf Default false. + * @return order: [root, child, grandchild, ...] + */ + + + TreeNode.prototype.getAncestors = function (includeSelf) { + var ancestors = []; + var node = includeSelf ? this : this.parentNode; + + while (node) { + ancestors.push(node); + node = node.parentNode; + } + + ancestors.reverse(); + return ancestors; + }; + + TreeNode.prototype.getAncestorsIndices = function () { + var indices = []; + var currNode = this; + + while (currNode) { + indices.push(currNode.dataIndex); + currNode = currNode.parentNode; + } + + indices.reverse(); + return indices; + }; + + TreeNode.prototype.getDescendantIndices = function () { + var indices = []; + this.eachNode(function (childNode) { + indices.push(childNode.dataIndex); + }); + return indices; + }; + + TreeNode.prototype.getValue = function (dimension) { + var data = this.hostTree.data; + return data.get(data.getDimension(dimension || 'value'), this.dataIndex); + }; + + TreeNode.prototype.setLayout = function (layout, merge) { + this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge); + }; + /** + * @return {Object} layout + */ + + + TreeNode.prototype.getLayout = function () { + return this.hostTree.data.getItemLayout(this.dataIndex); + }; // @depcrecated + // getModel(path: S): Model + + + TreeNode.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var hostTree = this.hostTree; + var itemModel = hostTree.data.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; // TODO: TYPE More specific model + + + TreeNode.prototype.getLevelModel = function () { + return (this.hostTree.levelModels || [])[this.depth]; + }; + + TreeNode.prototype.setVisual = function (key, value) { + this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value); + }; + /** + * Get item visual + */ + + + TreeNode.prototype.getVisual = function (key) { + return this.hostTree.data.getItemVisual(this.dataIndex, key); + }; + + TreeNode.prototype.getRawIndex = function () { + return this.hostTree.data.getRawIndex(this.dataIndex); + }; + + TreeNode.prototype.getId = function () { + return this.hostTree.data.getId(this.dataIndex); + }; + /** + * if this is an ancestor of another node + * + * @param node another node + * @return if is ancestor + */ + + + TreeNode.prototype.isAncestorOf = function (node) { + var parent = node.parentNode; + + while (parent) { + if (parent === this) { + return true; + } + + parent = parent.parentNode; + } + + return false; + }; + /** + * if this is an descendant of another node + * + * @param node another node + * @return if is descendant + */ + + + TreeNode.prototype.isDescendantOf = function (node) { + return node !== this && node.isAncestorOf(this); + }; + + return TreeNode; + }(); + + var Tree = + /** @class */ + function () { + function Tree(hostModel) { + this.type = 'tree'; + this._nodes = []; + this.hostModel = hostModel; + } + + Tree.prototype.eachNode = function (options, cb, context) { + this.root.eachNode(options, cb, context); + }; + + Tree.prototype.getNodeByDataIndex = function (dataIndex) { + var rawIndex = this.data.getRawIndex(dataIndex); + return this._nodes[rawIndex]; + }; + + Tree.prototype.getNodeById = function (name) { + return this.root.getNodeById(name); + }; + /** + * Update item available by list, + * when list has been performed options like 'filterSelf' or 'map'. + */ + + + Tree.prototype.update = function () { + var data = this.data; + var nodes = this._nodes; + + 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; + } + }; + /** + * Clear all layouts + */ + + + Tree.prototype.clearLayouts = function () { + this.data.clearItemLayouts(); + }; + /** + * data node format: + * { + * name: ... + * value: ... + * children: [ + * { + * name: ... + * value: ... + * children: ... + * }, + * ... + * ] + * } + */ + + + Tree.createTree = function (dataRoot, hostModel, beforeLink) { + var tree = new Tree(hostModel); + var listData = []; + var dimMax = 1; + buildHierarchy(dataRoot); + + function buildHierarchy(dataNode, parentNode) { + var value = dataNode.value; + dimMax = Math.max(dimMax, isArray(value) ? value.length : 1); + listData.push(dataNode); + var node = new TreeNode(convertOptionIdName(dataNode.name, ''), tree); + parentNode ? addChild(node, parentNode) : tree.root = node; + + tree._nodes.push(node); + + var children = dataNode.children; + + if (children) { + for (var i = 0; i < children.length; i++) { + buildHierarchy(children[i], node); + } + } + } + + tree.root.updateDepthAndHeight(0); + var dimensionsInfo = createDimensions(listData, { + coordDimensions: ['value'], + dimensionsCount: dimMax + }); + var list = new List(dimensionsInfo, hostModel); + list.initData(listData); + beforeLink && beforeLink(list); + linkList({ + mainData: list, + struct: tree, + structAttr: 'tree' + }); + tree.update(); + return 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. + */ + + + function addChild(child, node) { + var children = node.children; + + if (child.parentNode === node) { + return; + } + + children.push(child); + child.parentNode = node; + } + + var TreeSeriesModel = + /** @class */ + function (_super) { + __extends(TreeSeriesModel, _super); + + function TreeSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.hasSymbolVisual = true; // Do it self. + + _this.ignoreStyleOnData = true; + return _this; + } + /** + * Init a tree data structure from data in option series + * @param option the object used to config echarts view + * @return storage initial data + */ + + + TreeSeriesModel.prototype.getInitialData = function (option) { + //create an virtual root + var root = { + name: option.name, + children: option.data + }; + var leaves = option.leaves || {}; + var leavesModel = new Model(leaves, this, this.ecModel); + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + + if (!node.children.length || !node.isExpand) { + model.parentModel = leavesModel; + } + + return model; + }); + } + + var treeDepth = 0; + tree.eachNode('preorder', function (node) { + if (node.depth > treeDepth) { + treeDepth = node.depth; + } + }); + var expandAndCollapse = option.expandAndCollapse; + var expandTreeDepth = expandAndCollapse && option.initialTreeDepth >= 0 ? option.initialTreeDepth : treeDepth; + tree.root.eachNode('preorder', function (node) { + var item = node.hostTree.data.getRawDataItem(node.dataIndex); // Add item.collapsed != null, because users can collapse node original in the series.data. + + node.isExpand = item && item.collapsed != null ? !item.collapsed : node.depth <= expandTreeDepth; + }); + return tree.data; + }; + /** + * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'. + * @returns {string} orient + */ + + + TreeSeriesModel.prototype.getOrient = function () { + var orient = this.get('orient'); + + if (orient === 'horizontal') { + orient = 'LR'; + } else if (orient === 'vertical') { + orient = 'TB'; + } + + return orient; + }; + + TreeSeriesModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + TreeSeriesModel.prototype.setCenter = function (center) { + this.option.center = center; + }; + + TreeSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var tree = this.getData().tree; + var realRoot = tree.root.children[0]; + var node = tree.getNodeByDataIndex(dataIndex); + var value = node.getValue(); + var name = node.name; + + while (node && node !== realRoot) { + name = node.parentNode.name + '.' + name; + node = node.parentNode; + } + + return createTooltipMarkup('nameValue', { + name: name, + value: value, + noValue: isNaN(value) || value == null + }); + }; + + TreeSeriesModel.type = 'series.tree'; // can support the position parameters 'left', 'top','right','bottom', 'width', + // 'height' in the setOption() with 'merge' mode normal. + + TreeSeriesModel.layoutMode = 'box'; + TreeSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'view', + // the position of the whole view + left: '12%', + top: '12%', + right: '12%', + bottom: '12%', + // the layout of the tree, two value can be selected, 'orthogonal' or 'radial' + layout: 'orthogonal', + // value can be 'polyline' + edgeShape: 'curve', + edgeForkPosition: '50%', + // true | false | 'move' | 'scale', see module:component/helper/RoamController. + roam: false, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.4, + // Default on center of graph + center: null, + zoom: 1, + orient: 'LR', + symbol: 'emptyCircle', + symbolSize: 7, + expandAndCollapse: true, + initialTreeDepth: 2, + lineStyle: { + color: '#ccc', + width: 1.5, + curveness: 0.5 + }, + itemStyle: { + color: 'lightsteelblue', + borderColor: '#c23531', + borderWidth: 1.5 + }, + label: { + show: true + }, + animationEasing: 'linear', + animationDuration: 700, + animationDurationUpdate: 500 + }; + return TreeSeriesModel; + }(SeriesModel); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * Traverse the tree from bottom to top and do something + */ + function eachAfter(root, callback, separation) { + var nodes = [root]; + var next = []; + var node; + + while (node = nodes.pop()) { + // jshint ignore:line + next.push(node); + + if (node.isExpand) { + var children = node.children; + + if (children.length) { + for (var i = 0; i < children.length; i++) { + nodes.push(children[i]); + } + } + } + } + + while (node = next.pop()) { + // jshint ignore:line + callback(node, separation); + } + } + /** + * Traverse the tree from top to bottom and do something + */ + + + function eachBefore(root, callback) { + var nodes = [root]; + var node; + + while (node = nodes.pop()) { + // jshint ignore:line + callback(node); + + if (node.isExpand) { + var children = node.children; + + if (children.length) { + for (var i = children.length - 1; i >= 0; i--) { + nodes.push(children[i]); + } + } + } + } + } + + function treeLayout(ecModel, api) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + commonLayout(seriesModel, api); + }); + } + + function commonLayout(seriesModel, api) { + var layoutInfo = getViewRect$1(seriesModel, api); + seriesModel.layoutInfo = layoutInfo; + var layout = seriesModel.get('layout'); + var width = 0; + var height = 0; + var separation$1 = null; + + if (layout === 'radial') { + width = 2 * Math.PI; + height = Math.min(layoutInfo.height, layoutInfo.width) / 2; + separation$1 = separation(function (node1, node2) { + return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth; + }); + } else { + width = layoutInfo.width; + height = layoutInfo.height; + separation$1 = separation(); + } + + var virtualRoot = seriesModel.getData().tree.root; + var realRoot = virtualRoot.children[0]; + + if (realRoot) { + init$2(virtualRoot); + eachAfter(realRoot, firstWalk, separation$1); + virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim; + eachBefore(realRoot, secondWalk); + var left_1 = realRoot; + var right_1 = realRoot; + var bottom_1 = realRoot; + eachBefore(realRoot, function (node) { + var x = node.getLayout().x; + + if (x < left_1.getLayout().x) { + left_1 = node; + } + + if (x > right_1.getLayout().x) { + right_1 = node; + } + + if (node.depth > bottom_1.depth) { + bottom_1 = node; + } + }); + var delta = left_1 === right_1 ? 1 : separation$1(left_1, right_1) / 2; + var tx_1 = delta - left_1.getLayout().x; + var kx_1 = 0; + var ky_1 = 0; + var coorX_1 = 0; + var coorY_1 = 0; + + if (layout === 'radial') { + kx_1 = width / (right_1.getLayout().x + delta + tx_1); // here we use (node.depth - 1), bucause the real root's depth is 1 + + ky_1 = height / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorX_1 = (node.getLayout().x + tx_1) * kx_1; + coorY_1 = (node.depth - 1) * ky_1; + var finalCoor = radialCoordinate(coorX_1, coorY_1); + node.setLayout({ + x: finalCoor.x, + y: finalCoor.y, + rawX: coorX_1, + rawY: coorY_1 + }, true); + }); + } else { + var orient_1 = seriesModel.getOrient(); + + if (orient_1 === 'RL' || orient_1 === 'LR') { + ky_1 = height / (right_1.getLayout().x + delta + tx_1); + kx_1 = width / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorY_1 = (node.getLayout().x + tx_1) * ky_1; + coorX_1 = orient_1 === 'LR' ? (node.depth - 1) * kx_1 : width - (node.depth - 1) * kx_1; + node.setLayout({ + x: coorX_1, + y: coorY_1 + }, true); + }); + } else if (orient_1 === 'TB' || orient_1 === 'BT') { + kx_1 = width / (right_1.getLayout().x + delta + tx_1); + ky_1 = height / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorX_1 = (node.getLayout().x + tx_1) * kx_1; + coorY_1 = orient_1 === 'TB' ? (node.depth - 1) * ky_1 : height - (node.depth - 1) * ky_1; + node.setLayout({ + x: coorX_1, + y: coorY_1 + }, true); + }); + } + } + } + } + + function treeVisual(ecModel) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + tree.eachNode(function (node) { + var model = node.getModel(); // TODO Optimize + + var style = model.getModel('itemStyle').getItemStyle(); + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); + extend(existsStyle, style); + }); + }); + } + + function installTreeAction(registers) { + registers.registerAction({ + type: 'treeExpandAndCollapse', + event: 'treeExpandAndCollapse', + update: 'update' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'tree', + query: payload + }, function (seriesModel) { + var dataIndex = payload.dataIndex; + var tree = seriesModel.getData().tree; + var node = tree.getNodeByDataIndex(dataIndex); + node.isExpand = !node.isExpand; + }); + }); + registers.registerAction({ + type: 'treeRoam', + event: 'treeRoam', + // Here we set 'none' instead of 'update', because roam action + // just need to update the transform matrix without having to recalculate + // the layout. So don't need to go through the whole update process, such + // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on. + update: 'none' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'tree', + query: payload + }, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var res = updateCenterAndZoom(coordSys, payload); + seriesModel.setCenter && seriesModel.setCenter(res.center); + seriesModel.setZoom && seriesModel.setZoom(res.zoom); + }); + }); + } + + function install$b(registers) { + registers.registerChartView(TreeView); + registers.registerSeriesModel(TreeSeriesModel); + registers.registerLayout(treeLayout); + registers.registerVisual(treeVisual); + installTreeAction(registers); + } + + function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) { + if (payload && indexOf(validPayloadTypes, payload.type) >= 0) { + var root = seriesModel.getData().tree.root; + var targetNode = payload.targetNode; + + if (typeof targetNode === 'string') { + targetNode = root.getNodeById(targetNode); + } + + if (targetNode && root.contains(targetNode)) { + return { + node: targetNode + }; + } + + var targetNodeId = payload.targetNodeId; + + if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) { + return { + node: targetNode + }; + } + } + } // Not includes the given node at the last item. + + function getPathToRoot(node) { + var path = []; + + while (node) { + node = node.parentNode; + node && path.push(node); + } + + return path.reverse(); + } + function aboveViewRoot(viewRoot, node) { + var viewPath = getPathToRoot(viewRoot); + return indexOf(viewPath, node) >= 0; + } // From root to the input node (the input node will be included). + + function wrapTreePathInfo(node, seriesModel) { + var treePathInfo = []; + + while (node) { + var nodeDataIndex = node.dataIndex; + treePathInfo.push({ + name: node.name, + dataIndex: nodeDataIndex, + value: seriesModel.getRawValue(nodeDataIndex) + }); + node = node.parentNode; + } + + treePathInfo.reverse(); + return treePathInfo; + } + + var noop$1 = function () {}; + + var actionTypes = ['treemapZoomToNode', 'treemapRender', 'treemapMove']; + function installTreemapAction(registers) { + for (var i = 0; i < actionTypes.length; i++) { + registers.registerAction({ + type: actionTypes[i], + update: 'updateView' + }, noop$1); + } + + registers.registerAction({ + type: 'treemapRootToNode', + update: 'updateView' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'treemap', + query: payload + }, handleRootToNode); + + function handleRootToNode(model, index) { + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown'; + } + + model.resetViewRoot(targetInfo.node); + } + } + }); + } + + function enableAriaDecalForTree(seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + var decalPaletteScope = {}; + tree.eachNode(function (node) { + // Use decal of level 1 node + var current = node; + + while (current && current.depth > 1) { + current = current.parentNode; + } + + var decal = getDecalFromPalette(seriesModel.ecModel, current.name || current.dataIndex + '', decalPaletteScope); + node.setVisual('decal', decal); + }); + } + + var TreemapSeriesModel = + /** @class */ + function (_super) { + __extends(TreemapSeriesModel, _super); + + function TreemapSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreemapSeriesModel.type; + _this.preventUsingHoverLayer = true; + return _this; + } + /** + * @override + */ + + + TreemapSeriesModel.prototype.getInitialData = function (option, ecModel) { + // Create a virtual root. + var root = { + name: option.name, + children: option.data + }; + completeTreeValue(root); + var levels = option.levels || []; // Used in "visual priority" in `treemapVisual.js`. + // This way is a little tricky, must satisfy the precondition: + // 1. There is no `treeNode.getModel('itemStyle.xxx')` used. + // 2. The `Model.prototype.getModel()` will not use any clone-like way. + + var designatedVisualItemStyle = this.designatedVisualItemStyle = {}; + var designatedVisualModel = new Model({ + itemStyle: designatedVisualItemStyle + }, this, ecModel); + levels = option.levels = setDefault(levels, ecModel); + var levelModels = map(levels || [], function (levelDefine) { + return new Model(levelDefine, designatedVisualModel, ecModel); + }, this); // 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. + + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + var levelModel = levelModels[node.depth]; // If no levelModel, we also need `designatedVisualModel`. + + model.parentModel = levelModel || designatedVisualModel; + return model; + }); + } + + return tree.data; + }; + + TreemapSeriesModel.prototype.optionUpdated = function () { + this.resetViewRoot(); + }; + /** + * @override + * @param {number} dataIndex + * @param {boolean} [mutipleSeries=false] + */ + + + TreemapSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var name = data.getName(dataIndex); + return createTooltipMarkup('nameValue', { + name: name, + value: value + }); + }; + /** + * Add tree path to tooltip param + * + * @override + * @param {number} dataIndex + * @return {Object} + */ + + + TreemapSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treePathInfo = wrapTreePathInfo(node, this); + return params; + }; + /** + * @public + * @param {Object} layoutInfo { + * x: containerGroup x + * y: containerGroup y + * width: containerGroup width + * height: containerGroup height + * } + */ + + + TreemapSeriesModel.prototype.setLayoutInfo = function (layoutInfo) { + /** + * @readOnly + * @type {Object} + */ + this.layoutInfo = this.layoutInfo || {}; + extend(this.layoutInfo, layoutInfo); + }; + /** + * @param {string} id + * @return {number} index + */ + + + TreemapSeriesModel.prototype.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 = createHashMap(); + /** + * @private + * @type {number} + */ + + this._idIndexMapCount = 0; + } + + var index = idIndexMap.get(id); + + if (index == null) { + idIndexMap.set(id, index = this._idIndexMapCount++); + } + + return index; + }; + + TreemapSeriesModel.prototype.getViewRoot = function () { + return this._viewRoot; + }; + + TreemapSeriesModel.prototype.resetViewRoot = function (viewRoot) { + viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; + var root = this.getRawData().tree.root; + + if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { + this._viewRoot = root; + } + }; + + TreemapSeriesModel.prototype.enableAriaDecal = function () { + enableAriaDecalForTree(this); + }; + + TreemapSeriesModel.type = 'series.treemap'; + TreemapSeriesModel.layoutMode = 'box'; + TreemapSeriesModel.defaultOption = { + // Disable progressive rendering + progressive: 0, + // size: ['80%', '80%'], // deprecated, compatible with ec2. + left: 'center', + top: 'middle', + width: '80%', + height: '80%', + sort: true, + clipWindow: 'origin', + squareRatio: 0.5 * (1 + Math.sqrt(5)), + leafDepth: null, + drillDownIcon: '▶', + // to align specialized icon. ▷▶❒❐▼✚ + zoomToNodeRatio: 0.32 * 0.32, + roam: true, + nodeClick: 'zoomToNode', + animation: true, + animationDurationUpdate: 900, + animationEasing: 'quinticInOut', + breadcrumb: { + show: true, + height: 22, + left: 'center', + top: 'bottom', + // right + // bottom + emptyItemWidth: 25, + itemStyle: { + color: 'rgba(0,0,0,0.7)', + textStyle: { + color: '#fff' + } + } + }, + label: { + show: true, + // Do not use textDistance, for ellipsis rect just the same as treemap node rect. + distance: 0, + padding: 5, + position: 'inside', + // formatter: null, + color: '#fff', + overflow: 'truncate' // align + // verticalAlign + + }, + upperLabel: { + show: false, + position: [0, '50%'], + height: 20, + // formatter: null, + // color: '#fff', + overflow: 'truncate', + // align: null, + verticalAlign: 'middle' + }, + itemStyle: { + color: null, + colorAlpha: null, + colorSaturation: null, + 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: { + upperLabel: { + show: true, + position: [0, '50%'], + ellipsis: true, + verticalAlign: 'middle' + } + }, + visualDimension: 0, + visualMin: null, + visualMax: null, + color: [], + // level[n].color (if necessary). + // + Specify color list of each level. level[0].color would be global + // color list if not specified. (see method `setDefault`). + // + But set as a empty array to forbid fetch color from global palette + // when using nodeModel.get('color'), otherwise nodes on deep level + // will always has color palette set and are not able to inherit color + // from parent node. + // + TreemapSeries.color can not be set as 'none', otherwise effect + // legend color fetching (see seriesColor.js). + colorAlpha: null, + colorSaturation: null, + colorMappingBy: 'index', + visibleMin: 10, + // be rendered. Only works when sort is 'asc' or 'desc'. + childrenVisibleMin: null, + // 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' + // } + + }; + return TreemapSeriesModel; + }(SeriesModel); + /** + * @param {Object} dataNode + */ + + + function completeTreeValue(dataNode) { + // 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; + each(dataNode.children, function (child) { + completeTreeValue(child); + var childValue = child.value; + isArray(childValue) && (childValue = childValue[0]); + sum += childValue; + }); + var thisValue = dataNode.value; + + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } // Value should not less than 0. + + + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; + } + /** + * set default to level configuration + */ + + + function setDefault(levels, ecModel) { + var globalColorList = normalizeToArray(ecModel.get('color')); + var globalDecalList = normalizeToArray(ecModel.get(['aria', 'decal', 'decals'])); + + if (!globalColorList) { + return; + } + + levels = levels || []; + var hasColorDefine; + var hasDecalDefine; + each(levels, function (levelDefine) { + var model = new Model(levelDefine); + var modelColor = model.get('color'); + var modelDecal = model.get('decal'); + + if (model.get(['itemStyle', 'color']) || modelColor && modelColor !== 'none') { + hasColorDefine = true; + } + + if (model.get(['itemStyle', 'decal']) || modelDecal && modelDecal !== 'none') { + hasDecalDefine = true; + } + }); + var level0 = levels[0] || (levels[0] = {}); + + if (!hasColorDefine) { + level0.color = globalColorList.slice(); + } + + if (!hasDecalDefine && globalDecalList) { + level0.decal = globalDecalList.slice(); + } + + return levels; + } + + var TEXT_PADDING = 8; + var ITEM_GAP = 8; + var ARRAY_LENGTH = 5; + + var Breadcrumb = + /** @class */ + function () { + function Breadcrumb(containerGroup) { + this.group = new Group(); + containerGroup.add(this.group); + } + + Breadcrumb.prototype.render = function (seriesModel, api, targetNode, onSelect) { + var model = seriesModel.getModel('breadcrumb'); + var thisGroup = this.group; + thisGroup.removeAll(); + + if (!model.get('show') || !targetNode) { + return; + } + + var normalStyleModel = model.getModel('itemStyle'); // let emphasisStyleModel = model.getModel('emphasis.itemStyle'); + + 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(targetNode, layoutParam, textStyleModel); + + this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect); + + positionElement(thisGroup, layoutParam.pos, layoutParam.box); + }; + /** + * Prepare render list and total width + * @private + */ + + + Breadcrumb.prototype._prepare = function (targetNode, layoutParam, textStyleModel) { + for (var node = targetNode; node; node = node.parentNode) { + var text = convertOptionIdName(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 + */ + + + Breadcrumb.prototype._renderContent = function (seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect) { + // Start rendering. + var lastX = 0; + var emptyItemWidth = layoutParam.emptyItemWidth; + var height = seriesModel.get(['breadcrumb', 'height']); + var availableSize = 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 itemNode = item.node; + 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 = null; + } + + var el = new Polygon({ + shape: { + points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0) + }, + style: defaults(normalStyleModel.getItemStyle(), { + lineJoin: 'bevel' + }), + textContent: new ZRText({ + style: { + text: text, + fill: textStyleModel.getTextColor(), + font: textStyleModel.getFont() + } + }), + textConfig: { + position: 'inside' + }, + z: 10, + onclick: curry(onSelect, itemNode) + }); + el.disableLabelAnimation = true; + this.group.add(el); + packEventData(el, seriesModel, itemNode); + lastX += itemWidth + ITEM_GAP; + } + }; + + Breadcrumb.prototype.remove = function () { + this.group.removeAll(); + }; + + return Breadcrumb; + }(); + + 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; + } // Package custom mouse event. + + + function packEventData(el, seriesModel, itemNode) { + getECData(el).eventData = { + componentType: 'series', + componentSubType: 'treemap', + componentIndex: seriesModel.componentIndex, + seriesIndex: seriesModel.componentIndex, + seriesName: seriesModel.name, + seriesType: 'treemap', + selfType: 'breadcrumb', + nodeData: { + dataIndex: itemNode && itemNode.dataIndex, + name: itemNode && itemNode.name + }, + treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel) + }; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * Animate multiple elements with a single done-callback. + * + * @example + * animation + * .createWrap() + * .add(el1, {x: 10, y: 10}) + * .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400) + * .done(function () { // done }) + * .start('cubicOut'); + */ + var AnimationWrap = + /** @class */ + function () { + function AnimationWrap() { + this._storage = []; + this._elExistsMap = {}; + } + /** + * 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. + * + * @return Whether adding succeeded. + */ + + + AnimationWrap.prototype.add = function (el, target, duration, delay, easing) { + if (this._elExistsMap[el.id]) { + return false; + } + + this._elExistsMap[el.id] = true; + + this._storage.push({ + el: el, + target: target, + duration: duration, + delay: delay, + easing: easing + }); + + return true; + }; + /** + * Only execute when animation done/aborted. + */ + + + AnimationWrap.prototype.finished = function (callback) { + this._finishedCallback = callback; + return this; + }; + /** + * Will stop exist animation firstly. + */ + + + AnimationWrap.prototype.start = function () { + var _this = this; + + var count = this._storage.length; + + var checkTerminate = function () { + count--; + + if (count <= 0) { + // Guard. + _this._storage.length = 0; + _this._elExistsMap = {}; + _this._finishedCallback && _this._finishedCallback(); + } + }; + + for (var i = 0, len = this._storage.length; i < len; i++) { + var item = this._storage[i]; + item.el.animateTo(item.target, { + duration: item.duration, + delay: item.delay, + easing: item.easing, + setToFinal: true, + done: checkTerminate, + aborted: checkTerminate + }); + } + + return this; + }; + + return AnimationWrap; + }(); + + function createWrap() { + return new AnimationWrap(); + } + + var Group$1 = Group; + var Rect$1 = Rect; + var DRAG_THRESHOLD = 3; + var PATH_LABEL_NOAMAL = 'label'; + var PATH_UPPERLABEL_NORMAL = 'upperLabel'; + var Z_BASE = 10; // Should bigger than every z. + + var Z_BG = 1; + var Z_CONTENT = 2; + var getStateItemStyle = makeStyleMapper([['fill', 'color'], // `borderColor` and `borderWidth` has been occupied, + // so use `stroke` to indicate the stroke of the rect. + ['stroke', 'strokeColor'], ['lineWidth', 'strokeWidth'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]); + + var getItemStyleNormal = function (model) { + // Normal style props should include emphasis style props. + var itemStyle = getStateItemStyle(model); // Clear styles set by emphasis. + + itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null; + return itemStyle; + }; + + var inner$9 = makeInner(); + + var TreemapView = + /** @class */ + function (_super) { + __extends(TreemapView, _super); + + function TreemapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreemapView.type; + _this._state = 'ready'; + _this._storage = createStorage(); + return _this; + } + /** + * @override + */ + + + TreemapView.prototype.render = function (seriesModel, ecModel, api, payload) { + var models = ecModel.findComponents({ + mainType: 'series', + subType: 'treemap', + query: payload + }); + + if (indexOf(models, seriesModel) < 0) { + return; + } + + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, 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); + }; + + TreemapView.prototype._giveContainerGroup = function (layoutInfo) { + var containerGroup = this._containerGroup; + + if (!containerGroup) { + // FIXME + // 加一层containerGroup是为了clip,但是现在clip功能并没有实现。 + containerGroup = this._containerGroup = new Group$1(); + + this._initEvents(containerGroup); + + this.group.add(containerGroup); + } + + containerGroup.x = layoutInfo.x; + containerGroup.y = layoutInfo.y; + return containerGroup; + }; + + TreemapView.prototype._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 = []; + + function doRenderNode(thisNode, oldNode, parentGroup, depth) { + return renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth); + } // Notice: when thisTree and oldTree are the same tree (see list.cloneShallow), + // 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, depth) { + // 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(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; + var group = doRenderNode(thisNode, oldNode, parentGroup, depth); + group && dualTravel(thisNode && thisNode.viewChildren || [], oldNode && oldNode.viewChildren || [], group, sameTree, depth + 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), inner$9(el).willDelete = true); + }); + }); + return willDeleteEls; + } + + function renderFinally() { + each(willDeleteEls, function (els) { + each(els, function (el) { + el.parent && el.parent.remove(el); + }); + }); + each(willInvisibleEls, function (el) { + el.invisible = true; // Setting invisible is for optimizing, so no need to set dirty, + // just mark as invisible. + + el.dirty(); + }); + } + }; + + TreemapView.prototype._doAnimation = function (containerGroup, renderResult, seriesModel, reRoot) { + if (!seriesModel.get('animation')) { + return; + } + + var durationOption = seriesModel.get('animationDurationUpdate'); + var easingOption = seriesModel.get('animationEasing'); // TODO: do not support function until necessary. + + var duration = (isFunction(durationOption) ? 0 : durationOption) || 0; + var easing = (isFunction(easingOption) ? null : easingOption) || 'cubicOut'; + var animationWrap = createWrap(); // Make delete animations. + + each(renderResult.willDeleteEls, function (store, storageName) { + each(store, function (el, rawIndex) { + if (el.invisible) { + return; + } + + var parent = el.parent; // Always has parent, and parent is nodeGroup. + + var target; + var innerStore = inner$9(parent); + + if (reRoot && reRoot.direction === 'drillDown') { + target = parent === reRoot.rootNodeGroup // This is the content element of view root. + // Only `content` will enter this branch, because + // `background` and `nodeGroup` will not be deleted. + ? { + shape: { + x: 0, + y: 0, + width: innerStore.nodeWidth, + height: innerStore.nodeHeight + }, + style: { + opacity: 0 + } + } // Others. + : { + style: { + opacity: 0 + } + }; + } else { + var targetX = 0; + var targetY = 0; + + if (!innerStore.willDelete) { + // Let node animate to right-bottom corner, cooperating with fadeout, + // which is appropriate for user understanding. + // Divided by 2 for reRoot rolling up effect. + targetX = innerStore.nodeWidth / 2; + targetY = innerStore.nodeHeight / 2; + } + + target = storageName === 'nodeGroup' ? { + x: targetX, + y: targetY, + style: { + opacity: 0 + } + } : { + shape: { + x: targetX, + y: targetY, + width: 0, + height: 0 + }, + style: { + opacity: 0 + } + }; + } // TODO: do not support delay until necessary. + + + target && animationWrap.add(el, target, duration, 0, 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 (el instanceof Group) { + if (last.oldX != null) { + target.x = el.x; + target.y = el.y; + el.x = last.oldX; + el.y = last.oldY; + } + } else { + if (last.oldShape) { + target.shape = extend({}, el.shape); + el.setShape(last.oldShape); + } + + 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, 0, easing); + }); + }, this); + this._state = 'animating'; + animationWrap.finished(bind(function () { + this._state = 'ready'; + renderResult.renderFinally(); + }, this)).start(); + }; + + TreemapView.prototype._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)); + } + + var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight()); + controller.setPointerChecker(function (e, x, y) { + return rect.contain(x, y); + }); + }; + + TreemapView.prototype._clearController = function () { + var controller = this._controller; + + if (controller) { + controller.dispose(); + controller = null; + } + }; + + TreemapView.prototype._onPan = function (e) { + if (this._state !== 'animating' && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)) { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + this.api.dispatchAction({ + type: 'treemapMove', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rootLayout.x + e.dx, + y: rootLayout.y + e.dy, + width: rootLayout.width, + height: rootLayout.height + } + }); + } + }; + + TreemapView.prototype._onZoom = function (e) { + var mouseX = e.originX; + var mouseY = e.originY; + + if (this._state !== 'animating') { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.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 = create$1(); + translate(m, m, [-mouseX, -mouseY]); + scale$1(m, m, [e.scale, e.scale]); + 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 + } + }); + } + }; + + TreemapView.prototype._initEvents = function (containerGroup) { + var _this = this; + + containerGroup.on('click', function (e) { + if (_this._state !== 'ready') { + return; + } + + 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 && windowOpen(link, linkTarget); + } + } + }, this); + }; + + TreemapView.prototype._renderBreadcrumb = function (seriesModel, api, targetInfo) { + var _this = this; + + if (!targetInfo) { + targetInfo = seriesModel.get('leafDepth', true) != null ? { + node: seriesModel.getViewRoot() + } // FIXME + // better way? + // Find breadcrumb tail on center of containerGroup. + : this.findTarget(api.getWidth() / 2, api.getHeight() / 2); + + if (!targetInfo) { + targetInfo = { + node: seriesModel.getData().tree.root + }; + } + } + + (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))).render(seriesModel, api, targetInfo.node, function (node) { + if (_this._state !== 'animating') { + aboveViewRoot(seriesModel.getViewRoot(), node) ? _this._rootToNode({ + node: node + }) : _this._zoomToNode({ + node: node + }); + } + }); + }; + /** + * @override + */ + + + TreemapView.prototype.remove = function () { + this._clearController(); + + this._containerGroup && this._containerGroup.removeAll(); + this._storage = createStorage(); + this._state = 'ready'; + this._breadcrumb && this._breadcrumb.remove(); + }; + + TreemapView.prototype.dispose = function () { + this._clearController(); + }; + + TreemapView.prototype._zoomToNode = function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapZoomToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }; + + TreemapView.prototype._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. + */ + + + TreemapView.prototype.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; + }; + + TreemapView.type = 'treemap'; + return TreemapView; + }(ChartView); + /** + * @inner + */ + + + function createStorage() { + return { + nodeGroup: [], + background: [], + content: [] + }; + } + /** + * @inner + * @return Return undefined means do not travel further. + */ + + + function renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth) { + // Whether under viewRoot. + if (!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; + } // ------------------------------------------------------------------- + // Start of closure variables available in "Procedures in renderNode". + + + var thisLayout = thisNode.getLayout(); + var data = seriesModel.getData(); + var nodeModel = thisNode.getModel(); // Only for enabling highlight/downplay. Clear firstly. + // Because some node will not be rendered. + + data.setItemGraphicEl(thisNode.dataIndex, null); + + if (!thisLayout || !thisLayout.isInView) { + return; + } + + var thisWidth = thisLayout.width; + var thisHeight = thisLayout.height; + var borderWidth = thisLayout.borderWidth; + var thisInvisible = thisLayout.invisible; + var thisRawIndex = thisNode.getRawIndex(); + var oldRawIndex = oldNode && oldNode.getRawIndex(); + var thisViewChildren = thisNode.viewChildren; + var upperHeight = thisLayout.upperHeight; + var isParent = thisViewChildren && thisViewChildren.length; + var itemStyleNormalModel = nodeModel.getModel('itemStyle'); + var itemStyleEmphasisModel = nodeModel.getModel(['emphasis', 'itemStyle']); + var itemStyleBlurModel = nodeModel.getModel(['blur', 'itemStyle']); + var itemStyleSelectModel = nodeModel.getModel(['select', 'itemStyle']); + var borderRadius = itemStyleNormalModel.get('borderRadius') || 0; // End of closure ariables available in "Procedures in renderNode". + // ----------------------------------------------------------------- + // Node group + + var group = giveGraphic('nodeGroup', Group$1); + + if (!group) { + return; + } + + parentGroup.add(group); // x,y are not set when el is above view root. + + group.x = thisLayout.x || 0; + group.y = thisLayout.y || 0; + group.markRedraw(); + inner$9(group).nodeWidth = thisWidth; + inner$9(group).nodeHeight = thisHeight; + + if (thisLayout.isAboveViewRoot) { + return group; + } // Background + + + var bg = giveGraphic('background', Rect$1, depth, Z_BG); + bg && renderBackground(group, bg, isParent && thisLayout.upperLabelHeight); + var focus = nodeModel.get(['emphasis', 'focus']); + var blurScope = nodeModel.get(['emphasis', 'blurScope']); + var focusDataIndices = focus === 'ancestor' ? thisNode.getAncestorsIndices() : focus === 'descendant' ? thisNode.getDescendantIndices() : null; // No children, render content. + + if (isParent) { + // Because of the implementation about "traverse" in graphic hover style, we + // can not set hover listener on the "group" of non-leaf node. Otherwise the + // hover event from the descendents will be listenered. + if (isHighDownDispatcher(group)) { + setAsHighDownDispatcher(group, false); + } + + if (bg) { + setAsHighDownDispatcher(bg, true); // Only for enabling highlight/downplay. + + data.setItemGraphicEl(thisNode.dataIndex, bg); + enableHoverFocus(bg, focusDataIndices || focus, blurScope); + } + } else { + var content = giveGraphic('content', Rect$1, depth, Z_CONTENT); + content && renderContent(group, content); + + if (bg && isHighDownDispatcher(bg)) { + setAsHighDownDispatcher(bg, false); + } + + setAsHighDownDispatcher(group, true); // Only for enabling highlight/downplay. + + data.setItemGraphicEl(thisNode.dataIndex, group); + enableHoverFocus(group, focusDataIndices || focus, blurScope); + } + + return group; // ---------------------------- + // | Procedures in renderNode | + // ---------------------------- + + function renderBackground(group, bg, useUpperLabel) { + var ecData = getECData(bg); // For tooltip. + + ecData.dataIndex = thisNode.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + bg.setShape({ + x: 0, + y: 0, + width: thisWidth, + height: thisHeight, + r: borderRadius + }); + + if (thisInvisible) { + // 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. + processInvisible(bg); + } else { + bg.invisible = false; + var style = thisNode.getVisual('style'); + var visualBorderColor = style.stroke; + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualBorderColor; + var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); + emphasisStyle.fill = itemStyleEmphasisModel.get('borderColor'); + var blurStyle = getStateItemStyle(itemStyleBlurModel); + blurStyle.fill = itemStyleBlurModel.get('borderColor'); + var selectStyle = getStateItemStyle(itemStyleSelectModel); + selectStyle.fill = itemStyleSelectModel.get('borderColor'); + + if (useUpperLabel) { + var upperLabelWidth = thisWidth - 2 * borderWidth; + prepareText(bg, visualBorderColor, upperLabelWidth, upperHeight, style.opacity, { + x: borderWidth, + y: 0, + width: upperLabelWidth, + height: upperHeight + }); + } // For old bg. + else { + bg.removeTextContent(); + } + + bg.setStyle(normalStyle); + bg.ensureState('emphasis').style = emphasisStyle; + bg.ensureState('blur').style = blurStyle; + bg.ensureState('select').style = selectStyle; + setDefaultStateProxy(bg); + } + + group.add(bg); + } + + function renderContent(group, content) { + var ecData = getECData(content); // For tooltip. + + ecData.dataIndex = thisNode.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0); + var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0); + content.culling = true; + content.setShape({ + x: borderWidth, + y: borderWidth, + width: contentWidth, + height: contentHeight, + r: borderRadius + }); + + if (thisInvisible) { + // 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. + processInvisible(content); + } else { + content.invisible = false; + var nodeStyle = thisNode.getVisual('style'); + var visualColor = nodeStyle.fill; + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualColor; + normalStyle.decal = nodeStyle.decal; + var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); + var blurStyle = getStateItemStyle(itemStyleBlurModel); + var selectStyle = getStateItemStyle(itemStyleSelectModel); + prepareText(content, visualColor, contentWidth, nodeStyle.opacity); + content.setStyle(normalStyle); + content.ensureState('emphasis').style = emphasisStyle; + content.ensureState('blur').style = blurStyle; + content.ensureState('select').style = selectStyle; + setDefaultStateProxy(content); + } + + group.add(content); + } + + function processInvisible(element) { + // Delay invisible setting utill animation finished, + // avoid element vanish suddenly before animation. + !element.invisible && willInvisibleEls.push(element); + } + + function prepareText(rectEl, visualColor, visualOpacity, width, height, upperLabelRect) { + var normalLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL); + var text = retrieve(seriesModel.getFormattedLabel(thisNode.dataIndex, 'normal', null, null, normalLabelModel.get('formatter')), convertOptionIdName(nodeModel.get('name'), null)); + + if (!upperLabelRect && thisLayout.isLeafRoot) { + var iconChar = seriesModel.get('drillDownIcon', true); + text = iconChar ? iconChar + ' ' + text : text; + } + + var isShow = normalLabelModel.getShallow('show'); + setLabelStyle(rectEl, getLabelStatesModels(nodeModel, upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL), { + defaultText: isShow ? text : null, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + labelFetcher: seriesModel, + labelDataIndex: thisNode.dataIndex + }); + var textEl = rectEl.getTextContent(); + var textStyle = textEl.style; + var textPadding = normalizeCssArray(textStyle.padding || 0); + + if (upperLabelRect) { + rectEl.setTextConfig({ + layoutRect: upperLabelRect + }); + textEl.disableLabelLayout = true; + } + + textEl.beforeUpdate = function () { + var width = Math.max((upperLabelRect ? upperLabelRect.width : rectEl.shape.width) - textPadding[1] - textPadding[3], 0); + var height = Math.max((upperLabelRect ? upperLabelRect.height : rectEl.shape.height) - textPadding[0] - textPadding[2], 0); + + if (textStyle.width !== width || textStyle.height !== height) { + textEl.setStyle({ + width: width, + height: height + }); + } + }; + + textStyle.truncateMinChar = 2; + textStyle.lineOverflow = 'truncate'; + addDrillDownIcon(textStyle, upperLabelRect, thisLayout); + var textEmphasisState = textEl.getState('emphasis'); + addDrillDownIcon(textEmphasisState ? textEmphasisState.style : null, upperLabelRect, thisLayout); + } + + function addDrillDownIcon(style, upperLabelRect, thisLayout) { + var text = style ? style.text : null; + + if (!upperLabelRect && thisLayout.isLeafRoot && text != null) { + var iconChar = seriesModel.get('drillDownIcon', true); + style.text = iconChar ? iconChar + ' ' + text : text; + } + } + + function giveGraphic(storageName, Ctor, depth, z) { + var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex]; + var lasts = lastsForAnimation[storageName]; + + if (element) { + // Remove from oldStorage + oldStorage[storageName][oldRawIndex] = null; + prepareAnimationWhenHasOld(lasts, element); + } // If invisible and no old element, do not create new element (for optimizing). + else if (!thisInvisible) { + element = new Ctor(); + + if (element instanceof Displayable) { + element.z = calculateZ(depth, z); + } + + prepareAnimationWhenNoOld(lasts, element); + } // Set to thisStorage + + + return thisStorage[storageName][thisRawIndex] = element; + } + + function prepareAnimationWhenHasOld(lasts, element) { + var lastCfg = lasts[thisRawIndex] = {}; + + if (element instanceof Group$1) { + lastCfg.oldX = element.x; + lastCfg.oldY = element.y; + } else { + lastCfg.oldShape = 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) { + var lastCfg = lasts[thisRawIndex] = {}; + var parentNode = thisNode.parentNode; + var isGroup = element instanceof Group; + + if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) { + var parentOldX = 0; + var parentOldY = 0; // New nodes appear from right-bottom corner in 'zoomToNode' animation. + // For convenience, get old bounding rect from background. + + var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()]; + + if (!reRoot && parentOldBg && parentOldBg.oldShape) { + parentOldX = parentOldBg.oldShape.width; + parentOldY = parentOldBg.oldShape.height; + } // When no parent old shape found, its parent is new too, + // so we can just use {x:0, y:0}. + + + if (isGroup) { + lastCfg.oldX = 0; + lastCfg.oldY = parentOldY; + } else { + lastCfg.oldShape = { + x: parentOldX, + y: parentOldY, + width: 0, + height: 0 + }; + } + } // Fade in, user can be aware that these nodes are new. + + + lastCfg.fadein = !isGroup; + } + } // We can not set all backgroud with the same z, Because the behaviour of + // drill down and roll up differ background creation sequence from tree + // hierarchy sequence, which cause that lowser background element overlap + // upper ones. So we calculate z based on depth. + // Moreover, we try to shrink down z interval to [0, 1] to avoid that + // treemap with large z overlaps other components. + + + function calculateZ(depth, zInLevel) { + var zb = depth * Z_BASE + zInLevel; + return (zb - 1) / zb; + } + + var each$4 = each; + var isObject$4 = isObject; + var CATEGORY_DEFAULT_VISUAL_INDEX = -1; + + var VisualMapping = + /** @class */ + function () { + function VisualMapping(option) { + var mappingMethod = option.mappingMethod; + var visualType = option.type; + var thisOption = this.option = clone(option); + this.type = visualType; + this.mappingMethod = mappingMethod; + this._normalizeData = normalizers[mappingMethod]; + var visualHandler = VisualMapping.visualHandlers[visualType]; + this.applyVisual = visualHandler.applyVisual; + this.getColorMapper = visualHandler.getColorMapper; + this._normalizedToVisual = visualHandler._normalizedToVisual[mappingMethod]; + + if (mappingMethod === 'piecewise') { + normalizeVisualRange(thisOption); + preprocessForPiecewise(thisOption); + } else if (mappingMethod === 'category') { + thisOption.categories ? preprocessForSpecifiedCategory(thisOption) // categories is ordinal when thisOption.categories not specified, + // which need no more preprocess except normalize visual. + : normalizeVisualRange(thisOption, true); + } else { + // mappingMethod === 'linear' or 'fixed' + assert(mappingMethod !== 'linear' || thisOption.dataExtent); + normalizeVisualRange(thisOption); + } + } + + VisualMapping.prototype.mapValueToVisual = function (value) { + var normalized = this._normalizeData(value); + + return this._normalizedToVisual(normalized, value); + }; + + VisualMapping.prototype.getNormalizer = function () { + return bind(this._normalizeData, this); + }; + /** + * List available visual types. + * + * @public + * @return {Array.} + */ + + + VisualMapping.listVisualTypes = function () { + return keys(VisualMapping.visualHandlers); + }; // /** + // * @public + // */ + // static addVisualHandler(name, handler) { + // visualHandlers[name] = handler; + // } + + /** + * @public + */ + + + VisualMapping.isValidType = function (visualType) { + return VisualMapping.visualHandlers.hasOwnProperty(visualType); + }; + /** + * Convinent method. + * Visual can be Object or Array or primary type. + */ + + + VisualMapping.eachVisual = function (visual, callback, context) { + if (isObject(visual)) { + each(visual, callback, context); + } else { + callback.call(context, visual); + } + }; + + VisualMapping.mapVisual = function (visual, callback, context) { + var isPrimary; + var newVisual = isArray(visual) ? [] : 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; + }; + /** + * Retrieve visual properties from given object. + */ + + + VisualMapping.retrieveVisuals = function (obj) { + var ret = {}; + var hasVisual; + obj && each$4(VisualMapping.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 (isArray(visualTypes)) { + visualTypes = visualTypes.slice(); + } else if (isObject$4(visualTypes)) { + var types_1 = []; + each$4(visualTypes, function (item, type) { + types_1.push(type); + }); + visualTypes = types_1; + } 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; + }; + /** + * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'. + * Other visuals are only depends on themself. + */ + + + VisualMapping.dependsOn = function (visualType1, visualType2) { + return visualType2 === 'color' ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2; + }; + /** + * @param value + * @param pieceList [{value: ..., interval: [min, max]}, ...] + * Always from small to big. + * @param findClosestWhenOutside Default to be false + * @return index + */ + + + VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) { + var possibleI; + var abs = Infinity; // value has the higher priority. + + for (var i = 0, len = pieceList.length; i < len; i++) { + var pieceValue = pieceList[i].value; + + if (pieceValue != null) { + if (pieceValue === value // FIXME + // It is supposed to compare value according to value type of dimension, + // but currently value type can exactly be string or number. + // Compromise for numeric-like string (like '12'), especially + // in the case that visualMap.categories is ['22', '33']. + || typeof pieceValue === 'string' && pieceValue === value + '') { + return i; + } + + findClosestWhenOutside && updatePossible(pieceValue, i); + } + } + + for (var i = 0, len = pieceList.length; i < len; i++) { + var piece = pieceList[i]; + var interval = piece.interval; + var close_1 = piece.close; + + if (interval) { + if (interval[0] === -Infinity) { + if (littleThan(close_1[1], value, interval[1])) { + return i; + } + } else if (interval[1] === Infinity) { + if (littleThan(close_1[0], interval[0], value)) { + return i; + } + } else if (littleThan(close_1[0], interval[0], value) && littleThan(close_1[1], value, interval[1])) { + return i; + } + + findClosestWhenOutside && updatePossible(interval[0], i); + findClosestWhenOutside && updatePossible(interval[1], i); + } + } + + if (findClosestWhenOutside) { + return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI; + } + + function updatePossible(val, index) { + var newAbs = Math.abs(val - value); + + if (newAbs < abs) { + abs = newAbs; + possibleI = index; + } + } + }; + + VisualMapping.visualHandlers = { + color: { + applyVisual: makeApplyVisual('color'), + getColorMapper: function () { + var thisOption = this.option; + return bind(thisOption.mappingMethod === 'category' ? function (value, isNormalized) { + !isNormalized && (value = this._normalizeData(value)); + return doMapCategory.call(this, 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 = fastLerp(value, thisOption.parsedVisual, out); + return returnRGBArray ? out : stringify(out, 'rgba'); + }, this); + }, + _normalizedToVisual: { + linear: function (normalized) { + return stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba'); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba'); + } + + return result; + }, + fixed: doMapFixed + } + }, + colorHue: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, value); + }), + colorSaturation: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, null, value); + }), + colorLightness: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, null, null, value); + }), + colorAlpha: makePartialColorVisualHandler(function (color$1, value) { + return modifyAlpha(color$1, value); + }), + decal: { + applyVisual: makeApplyVisual('decal'), + _normalizedToVisual: { + linear: null, + category: doMapCategory, + piecewise: null, + fixed: null + } + }, + opacity: { + applyVisual: makeApplyVisual('opacity'), + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + }, + liftZ: { + applyVisual: makeApplyVisual('liftZ'), + _normalizedToVisual: { + linear: doMapFixed, + category: doMapFixed, + piecewise: doMapFixed, + fixed: doMapFixed + } + }, + symbol: { + applyVisual: function (value, getter, setter) { + var symbolCfg = this.mapValueToVisual(value); + setter('symbol', symbolCfg); + }, + _normalizedToVisual: { + linear: doMapToArray, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = doMapToArray.call(this, normalized); + } + + return result; + }, + fixed: doMapFixed + } + }, + symbolSize: { + applyVisual: makeApplyVisual('symbolSize'), + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + } + }; + return VisualMapping; + }(); + + function preprocessForPiecewise(thisOption) { + var pieceList = thisOption.pieceList; + thisOption.hasSpecialVisual = false; + each(pieceList, function (piece, index) { + piece.originIndex = index; // piece.visual is "result visual value" but not + // a visual range, so it does not need to be normalized. + + if (piece.visual != null) { + thisOption.hasSpecialVisual = true; + } + }); + } + + function preprocessForSpecifiedCategory(thisOption) { + // Hash categories. + var categories = thisOption.categories; + var categoryMap = thisOption.categoryMap = {}; + var visual = thisOption.visual; + each$4(categories, function (cate, index) { + categoryMap[cate] = index; + }); // Process visual map input. + + if (!isArray(visual)) { + var visualArr_1 = []; + + if (isObject(visual)) { + each$4(visual, function (v, cate) { + var index = categoryMap[cate]; + visualArr_1[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v; + }); + } else { + // Is primary type, represents default visual. + visualArr_1[CATEGORY_DEFAULT_VISUAL_INDEX] = visual; + } + + visual = setVisualToOption(thisOption, visualArr_1); + } // 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 normalizeVisualRange(thisOption, isCategory) { + var visual = thisOption.visual; + var visualArr = []; + + if (isObject(visual)) { + each$4(visual, function (v) { + visualArr.push(v); + }); + } else if (visual != null) { + visualArr.push(visual); + } + + var doNotNeedPair = { + color: 1, + symbol: 1 + }; + + if (!isCategory && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) { + // Do not care visualArr.length === 0, which is illegal. + visualArr[1] = visualArr[0]; + } + + setVisualToOption(thisOption, visualArr); + } + + function makePartialColorVisualHandler(applyValue) { + return { + applyVisual: function (value, getter, setter) { + // Only used in HSL + var colorChannel = this.mapValueToVisual(value); // Must not be array value + + setter('color', applyValue(getter('color'), colorChannel)); + }, + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + }; + } + + function doMapToArray(normalized) { + var visual = this.option.visual; + return visual[Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))] || {}; // TODO {}? + } + + function makeApplyVisual(visualType) { + return function (value, getter, setter) { + setter(visualType, this.mapValueToVisual(value)); + }; + } + + function doMapCategory(normalized) { + var visual = this.option.visual; + return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized]; + } + + function doMapFixed() { + // visual will be convert to array. + return this.option.visual[0]; + } + /** + * Create mapped to numeric visual + */ + + + function createNormalizedToNumericVisual(sourceExtent) { + return { + linear: function (normalized) { + return linearMap(normalized, sourceExtent, this.option.visual, true); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = linearMap(normalized, sourceExtent, this.option.visual, true); + } + + return result; + }, + fixed: doMapFixed + }; + } + + function getSpecifiedVisual(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[this.type]; + } + } + } + + function setVisualToOption(thisOption, visualArr) { + thisOption.visual = visualArr; + + if (thisOption.type === 'color') { + thisOption.parsedVisual = map(visualArr, function (item) { + return parse(item); + }); + } + + return visualArr; + } + /** + * Normalizers by mapping methods. + */ + + + var normalizers = { + linear: function (value) { + return linearMap(value, this.option.dataExtent, [0, 1], true); + }, + piecewise: function (value) { + var pieceList = this.option.pieceList; + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true); + + if (pieceIndex != null) { + return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true); + } + }, + category: function (value) { + var index = this.option.categories ? this.option.categoryMap[value] : value; // ordinal value + + return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index; + }, + fixed: noop + }; + + function littleThan(close, a, b) { + return close ? a <= b : a < b; + } + + var ITEM_STYLE_NORMAL = 'itemStyle'; + var inner$a = makeInner(); + var treemapVisual = { + seriesType: 'treemap', + reset: function (seriesModel) { + var tree = seriesModel.getData().tree; + var root = tree.root; + + if (root.isRemoved()) { + return; + } + + travelTree(root, // Visual should calculate from tree root but not view root. + {}, seriesModel.getViewRoot().getAncestors(), seriesModel); + } + }; + + function travelTree(node, designatedVisual, viewRootAncestors, seriesModel) { + var nodeModel = node.getModel(); + var nodeLayout = node.getLayout(); + var data = node.hostTree.data; // Optimize + + if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) { + return; + } + + var nodeItemStyleModel = nodeModel.getModel(ITEM_STYLE_NORMAL); + var visuals = buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel); + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); // 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); + borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor); + } + + existsStyle.stroke = borderColor; + var viewChildren = node.viewChildren; + + if (!viewChildren || !viewChildren.length) { + thisNodeColor = calculateColor(visuals); // Apply visual to this node. + + existsStyle.fill = thisNodeColor; + } else { + var mapping_1 = buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren); // Designate visual to children. + + 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_1, seriesModel); + travelTree(child, childVisual, viewRootAncestors, seriesModel); + } + }); + } + } + + function buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel) { + var visuals = extend({}, designatedVisual); + var designatedVisualItemStyle = seriesModel.designatedVisualItemStyle; + each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) { + // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel + designatedVisualItemStyle[visualName] = designatedVisual[visualName]; + var val = nodeItemStyleModel.get(visualName); + designatedVisualItemStyle[visualName] = null; + 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 = modifyHSL(color, null, null, colorSaturation); + } + + if (colorAlpha) { + color = modifyAlpha(color, colorAlpha); + } + + return color; + } + } + + function calculateBorderColor(borderColorSaturation, thisNodeColor) { + return thisNodeColor != null // Can only be string + ? 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 visualMin = nodeModel.get('visualMin'); + var visualMax = nodeModel.get('visualMax'); + var dataExtent = nodeLayout.dataExtent.slice(); + visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin); + visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax); + var colorMappingBy = nodeModel.get('colorMappingBy'); + var opt = { + type: rangeVisual.name, + dataExtent: 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); + inner$a(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 = extend({}, visuals); + + if (mapping) { + // Only support color, colorAlpha, colorSaturation. + var mappingType = mapping.type; + var colorMappingBy = mappingType === 'color' && inner$a(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; + } + + var mathMax$7 = Math.max; + var mathMin$7 = Math.min; + var retrieveValue = retrieve; + var each$5 = each; + var PATH_BORDER_WIDTH = ['itemStyle', 'borderWidth']; + var PATH_GAP_WIDTH = ['itemStyle', 'gapWidth']; + var PATH_UPPER_LABEL_SHOW = ['upperLabel', 'show']; + var PATH_UPPER_LABEL_HEIGHT = ['upperLabel', 'height']; + /** + * @public + */ + + var treemapLayout = { + seriesType: 'treemap', + reset: function (seriesModel, ecModel, api, payload) { + // Layout result in each node: + // {x, y, width, height, area, borderWidth} + var ecWidth = api.getWidth(); + var ecHeight = api.getHeight(); + var seriesOption = seriesModel.option; + var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + var size = seriesOption.size || []; // Compatible with ec2. + + var containerWidth = parsePercent$1(retrieveValue(layoutInfo.width, size[0]), ecWidth); + var containerHeight = parsePercent$1(retrieveValue(layoutInfo.height, size[1]), ecHeight); // Fetch payload info. + + var payloadType = payload && payload.type; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var rootRect = payloadType === 'treemapRender' || payloadType === 'treemapMove' ? payload.rootRect : null; + var viewRoot = seriesModel.getViewRoot(); + var viewAbovePath = getPathToRoot(viewRoot); + + if (payloadType !== 'treemapMove') { + var rootSize = payloadType === 'treemapZoomToNode' ? estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) : rootRect ? [rootRect.width, rootRect.height] : [containerWidth, containerHeight]; + var sort_1 = seriesOption.sort; + + if (sort_1 && sort_1 !== 'asc' && sort_1 !== 'desc') { + // Default to be desc order. + sort_1 = 'desc'; + } + + var options = { + squareRatio: seriesOption.squareRatio, + sort: sort_1, + leafDepth: seriesOption.leafDepth + }; // layout should be cleared because using updateView but not update. + + viewRoot.hostTree.clearLayouts(); // TODO + // optimize: if out of view clip, do not layout. + // But take care that if do not render node out of view clip, + // how to calculate start po + + var viewRootLayout_1 = { + x: 0, + y: 0, + width: rootSize[0], + height: rootSize[1], + area: rootSize[0] * rootSize[1] + }; + viewRoot.setLayout(viewRootLayout_1); + squarify(viewRoot, options, false, 0); // Supplement layout. + + viewRootLayout_1 = viewRoot.getLayout(); + each$5(viewAbovePath, function (node, index) { + var childValue = (viewAbovePath[index + 1] || viewRoot).getValue(); + node.setLayout(extend({ + dataExtent: [childValue, childValue], + borderWidth: 0, + upperHeight: 0 + }, viewRootLayout_1)); + }); + } + + var treeRoot = seriesModel.getData().tree.root; + treeRoot.setLayout(calculateRootPosition(layoutInfo, rootRect, targetInfo), true); + seriesModel.setLayoutInfo(layoutInfo); // FIXME + // 现在没有clip功能,暂时取ec高宽。 + + prunning(treeRoot, // Transform to base element coordinate system. + new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), viewAbovePath, viewRoot, 0); + } + }; + /** + * Layout treemap with squarify algorithm. + * The original presentation of this algorithm + * was made by Mark Bruls, Kees Huizing, and Jarke J. van Wijk + * . + * The implementation of this algorithm was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * @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 nodeModel = node.getModel(); + var borderWidth = nodeModel.get(PATH_BORDER_WIDTH); + var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2; + var upperLabelHeight = getUpperLabelHeight(nodeModel); + var upperHeight = Math.max(borderWidth, upperLabelHeight); + var layoutOffset = borderWidth - halfGapWidth; + var layoutOffsetUpper = upperHeight - halfGapWidth; + node.setLayout({ + borderWidth: borderWidth, + upperHeight: upperHeight, + upperLabelHeight: upperLabelHeight + }, true); + width = mathMax$7(width - 2 * layoutOffset, 0); + height = mathMax$7(height - layoutOffset - layoutOffsetUpper, 0); + var totalArea = width * height; + var viewChildren = initChildren(node, nodeModel, totalArea, options, hideChildren, depth); + + if (!viewChildren.length) { + return; + } + + var rect = { + x: layoutOffset, + y: layoutOffsetUpper, + width: width, + height: height + }; + var rowFixedLength = mathMin$7(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$7(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 = filter(viewChildren, function (child) { + return !child.isRemoved(); + }); + sort$1(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$1(viewChildren, orderBy) { + if (orderBy) { + viewChildren.sort(function (a, b) { + var diff = orderBy === 'asc' ? a.getValue() - b.getValue() : b.getValue() - a.getValue(); + return diff === 0 ? orderBy === 'asc' ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex : diff; + }); + } + + 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 { + dataExtent = [Infinity, -Infinity]; + each$5(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 = void 0, 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$7(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$7(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$7(modWH - 2 * halfGapWidth, 0); + nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin$7(halfGapWidth, wh1 / 2); + nodeLayout[xy[idx0WhenH]] = last + mathMin$7(halfGapWidth, wh0 / 2); + last += modWH; + node.setLayout(nodeLayout, true); + } + + rect[xy[idx1WhenH]] += rowOtherLength; + rect[wh[idx1WhenH]] -= rowOtherLength; + } // Return [containerWidth, containerHeight] as default. + + + 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; // Considering border, suppose aspect ratio is 1. + + var parentModel = parent.getModel(); + var borderWidth = parentModel.get(PATH_BORDER_WIDTH); + var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel)); + area += 4 * borderWidth * borderWidth + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5); + area > MAX_SAFE_INTEGER && (area = 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 nodes visible for prunning when visual coding and rendering. + // Prunning depends on layout and root position, so we have to do it after layout. + + + function prunning(node, clipRect, viewAbovePath, viewRoot, depth) { + var nodeLayout = node.getLayout(); + var nodeInViewAbovePath = viewAbovePath[depth]; + var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node; + + if (nodeInViewAbovePath && !isAboveViewRoot || depth === viewAbovePath.length && node !== viewRoot) { + return; + } + + node.setLayout({ + // isInView means: viewRoot sub tree + viewAbovePath + isInView: true, + // invisible only means: outside view clip so that the node can not + // see but still layout for animation preparation but not render. + invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout), + isAboveViewRoot: isAboveViewRoot + }, true); // Transform to child coordinate. + + var childClipRect = new BoundingRect(clipRect.x - nodeLayout.x, clipRect.y - nodeLayout.y, clipRect.width, clipRect.height); + each$5(node.viewChildren || [], function (child) { + prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1); + }); + } + + function getUpperLabelHeight(model) { + return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0; + } + + function install$c(registers) { + registers.registerSeriesModel(TreemapSeriesModel); + registers.registerChartView(TreemapView); + registers.registerVisual(treemapVisual); + registers.registerLayout(treemapLayout); + installTreemapAction(registers); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function categoryFilter(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; + }); + }); + } + + function categoryVisual(ecModel) { + var paletteScope = {}; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var categoriesData = seriesModel.getCategoriesData(); + var data = seriesModel.getData(); + var categoryNameIdxMap = {}; + categoriesData.each(function (idx) { + var name = categoriesData.getName(idx); // Add prefix to avoid conflict with Object.prototype. + + categoryNameIdxMap['ec-' + name] = idx; + var itemModel = categoriesData.getItemModel(idx); + var style = itemModel.getModel('itemStyle').getItemStyle(); + + if (!style.fill) { + // Get color from palette. + style.fill = seriesModel.getColorFromPalette(name, paletteScope); + } + + categoriesData.setItemVisual(idx, 'style', style); + var symbolVisualList = ['symbol', 'symbolSize', 'symbolKeepAspect']; + + for (var i = 0; i < symbolVisualList.length; i++) { + var symbolVisual = itemModel.getShallow(symbolVisualList[i], true); + + if (symbolVisual != null) { + categoriesData.setItemVisual(idx, symbolVisualList[i], symbolVisual); + } + } + }); // Assign category color to visual + + if (categoriesData.count()) { + data.each(function (idx) { + var model = data.getItemModel(idx); + var categoryIdx = model.getShallow('category'); + + if (categoryIdx != null) { + if (typeof categoryIdx === 'string') { + categoryIdx = categoryNameIdxMap['ec-' + categoryIdx]; + } + + var categoryStyle = categoriesData.getItemVisual(categoryIdx, 'style'); + var style = data.ensureUniqueItemVisual(idx, 'style'); + extend(style, categoryStyle); + var visualList = ['symbol', 'symbolSize', 'symbolKeepAspect']; + + for (var i = 0; i < visualList.length; i++) { + data.setItemVisual(idx, visualList[i], categoriesData.getItemVisual(categoryIdx, visualList[i])); + } + } + }); + } + }); + } + + function normalize$2(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + + return a; + } + + function graphEdgeVisual(ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var graph = seriesModel.getGraph(); + var edgeData = seriesModel.getEdgeData(); + var symbolType = normalize$2(seriesModel.get('edgeSymbol')); + var symbolSize = normalize$2(seriesModel.get('edgeSymbolSize')); // const colorQuery = ['lineStyle', 'color'] as const; + // const opacityQuery = ['lineStyle', 'opacity'] as const; + + edgeData.setVisual('fromSymbol', symbolType && symbolType[0]); + edgeData.setVisual('toSymbol', symbolType && symbolType[1]); + edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + edgeData.setVisual('style', seriesModel.getModel('lineStyle').getLineStyle()); + edgeData.each(function (idx) { + var itemModel = edgeData.getItemModel(idx); + var edge = graph.getEdgeByIndex(idx); + var symbolType = normalize$2(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$2(itemModel.getShallow('symbolSize', true)); // Edge visual must after node visual + + var style = itemModel.getModel('lineStyle').getLineStyle(); + var existsStyle = edgeData.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + + switch (existsStyle.stroke) { + case 'source': + { + var nodeStyle = edge.node1.getVisual('style'); + existsStyle.stroke = nodeStyle && nodeStyle.fill; + break; + } + + case 'target': + { + var nodeStyle = edge.node2.getVisual('style'); + existsStyle.stroke = nodeStyle && nodeStyle.fill; + break; + } + } + + symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]); + symbolType[1] && edge.setVisual('toSymbol', symbolType[1]); + symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]); + symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]); + }); + }); + } + + var KEY_DELIMITER = '-->'; + /** + * params handler + * @param {module:echarts/model/SeriesModel} seriesModel + * @returns {*} + */ + + var getAutoCurvenessParams = function (seriesModel) { + return seriesModel.get('autoCurveness') || null; + }; + /** + * Generate a list of edge curvatures, 20 is the default + * @param {module:echarts/model/SeriesModel} seriesModel + * @param {number} appendLength + * @return 20 => [0, -0.2, 0.2, -0.4, 0.4, -0.6, 0.6, -0.8, 0.8, -1, 1, -1.2, 1.2, -1.4, 1.4, -1.6, 1.6, -1.8, 1.8, -2] + */ + + + var createCurveness = function (seriesModel, appendLength) { + var autoCurvenessParmas = getAutoCurvenessParams(seriesModel); + var length = 20; + var curvenessList = []; // handler the function set + + if (typeof autoCurvenessParmas === 'number') { + length = autoCurvenessParmas; + } else if (isArray(autoCurvenessParmas)) { + seriesModel.__curvenessList = autoCurvenessParmas; + return; + } // append length + + + if (appendLength > length) { + length = appendLength; + } // make sure the length is even + + + var len = length % 2 ? length + 2 : length + 3; + curvenessList = []; + + for (var i = 0; i < len; i++) { + curvenessList.push((i % 2 ? i + 1 : i) / 10 * (i % 2 ? -1 : 1)); + } + + seriesModel.__curvenessList = curvenessList; + }; + /** + * Create different cache key data in the positive and negative directions, in order to set the curvature later + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {module:echarts/model/SeriesModel} seriesModel + * @returns {string} key + */ + + + var getKeyOfEdges = function (n1, n2, seriesModel) { + var source = [n1.id, n1.dataIndex].join('.'); + var target = [n2.id, n2.dataIndex].join('.'); + return [seriesModel.uid, source, target].join(KEY_DELIMITER); + }; + /** + * get opposite key + * @param {string} key + * @returns {string} + */ + + + var getOppositeKey = function (key) { + var keys = key.split(KEY_DELIMITER); + return [keys[0], keys[2], keys[1]].join(KEY_DELIMITER); + }; + /** + * get edgeMap with key + * @param edge + * @param {module:echarts/model/SeriesModel} seriesModel + */ + + + var getEdgeFromMap = function (edge, seriesModel) { + var key = getKeyOfEdges(edge.node1, edge.node2, seriesModel); + return seriesModel.__edgeMap[key]; + }; + /** + * calculate all cases total length + * @param edge + * @param seriesModel + * @returns {number} + */ + + + var getTotalLengthBetweenNodes = function (edge, seriesModel) { + var len = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node1, edge.node2, seriesModel), seriesModel); + var lenV = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node2, edge.node1, seriesModel), seriesModel); + return len + lenV; + }; + /** + * + * @param key + */ + + + var getEdgeMapLengthWithKey = function (key, seriesModel) { + var edgeMap = seriesModel.__edgeMap; + return edgeMap[key] ? edgeMap[key].length : 0; + }; + /** + * Count the number of edges between the same two points, used to obtain the curvature table and the parity of the edge + * @see /graph/GraphSeries.js@getInitialData + * @param {module:echarts/model/SeriesModel} seriesModel + */ + + + function initCurvenessList(seriesModel) { + if (!getAutoCurvenessParams(seriesModel)) { + return; + } + + seriesModel.__curvenessList = []; + seriesModel.__edgeMap = {}; // calc the array of curveness List + + createCurveness(seriesModel); + } + /** + * set edgeMap with key + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {module:echarts/model/SeriesModel} seriesModel + * @param {number} index + */ + + function createEdgeMapForCurveness(n1, n2, seriesModel, index) { + if (!getAutoCurvenessParams(seriesModel)) { + return; + } + + var key = getKeyOfEdges(n1, n2, seriesModel); + var edgeMap = seriesModel.__edgeMap; + var oppositeEdges = edgeMap[getOppositeKey(key)]; // set direction + + if (edgeMap[key] && !oppositeEdges) { + edgeMap[key].isForward = true; + } else if (oppositeEdges && edgeMap[key]) { + oppositeEdges.isForward = true; + edgeMap[key].isForward = false; + } + + edgeMap[key] = edgeMap[key] || []; + edgeMap[key].push(index); + } + /** + * get curvature for edge + * @param edge + * @param {module:echarts/model/SeriesModel} seriesModel + * @param index + */ + + function getCurvenessForEdge(edge, seriesModel, index, needReverse) { + var autoCurvenessParams = getAutoCurvenessParams(seriesModel); + var isArrayParam = isArray(autoCurvenessParams); + + if (!autoCurvenessParams) { + return null; + } + + var edgeArray = getEdgeFromMap(edge, seriesModel); + + if (!edgeArray) { + return null; + } + + var edgeIndex = -1; + + for (var i = 0; i < edgeArray.length; i++) { + if (edgeArray[i] === index) { + edgeIndex = i; + break; + } + } // if totalLen is Longer createCurveness + + + var totalLen = getTotalLengthBetweenNodes(edge, seriesModel); + createCurveness(seriesModel, totalLen); + edge.lineStyle = edge.lineStyle || {}; // if is opposite edge, must set curvenss to opposite number + + var curKey = getKeyOfEdges(edge.node1, edge.node2, seriesModel); + var curvenessList = seriesModel.__curvenessList; // if pass array no need parity + + var parityCorrection = isArrayParam ? 0 : totalLen % 2 ? 0 : 1; + + if (!edgeArray.isForward) { + // the opposite edge show outside + var oppositeKey = getOppositeKey(curKey); + var len = getEdgeMapLengthWithKey(oppositeKey, seriesModel); + var resValue = curvenessList[edgeIndex + len + parityCorrection]; // isNeedReverse, simple, force type need reverse the curveness in the junction of the forword and the opposite + + if (needReverse) { + // set as array may make the parity handle with the len of opposite + if (isArrayParam) { + if (autoCurvenessParams && autoCurvenessParams[0] === 0) { + return (len + parityCorrection) % 2 ? resValue : -resValue; + } else { + return ((len % 2 ? 0 : 1) + parityCorrection) % 2 ? resValue : -resValue; + } + } else { + return (len + parityCorrection) % 2 ? resValue : -resValue; + } + } else { + return curvenessList[edgeIndex + len + parityCorrection]; + } + } else { + return curvenessList[parityCorrection + edgeIndex]; + } + } + + function simpleLayout(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')]); + }); + simpleLayoutEdge(graph, seriesModel); + } + function simpleLayoutEdge(graph, seriesModel) { + graph.eachEdge(function (edge, index) { + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, seriesModel, index, true), 0); + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var points = [p1, p2]; + + if (+curveness) { + points.push([(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness]); + } + + edge.setLayout(points); + }); + } + + function graphSimpleLayout(ecModel, api) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var layout = seriesModel.get('layout'); + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + var data_1 = seriesModel.getData(); + var dimensions_1 = []; + each(coordSys.dimensions, function (coordDim) { + dimensions_1 = dimensions_1.concat(data_1.mapDimensionsAll(coordDim)); + }); + + for (var dataIndex = 0; dataIndex < data_1.count(); dataIndex++) { + var value = []; + var hasValue = false; + + for (var i = 0; i < dimensions_1.length; i++) { + var val = data_1.get(dimensions_1[i], dataIndex); + + if (!isNaN(val)) { + hasValue = true; + } + + value.push(val); + } + + if (hasValue) { + data_1.setItemLayout(dataIndex, coordSys.dataToPoint(value)); + } else { + // Also {Array.}, not undefined to avoid if...else... statement + data_1.setItemLayout(dataIndex, [NaN, NaN]); + } + } + + simpleLayoutEdge(data_1.graph, seriesModel); + } else if (!layout || layout === 'none') { + simpleLayout(seriesModel); + } + }); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function getNodeGlobalScale(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = seriesModel.option.nodeScaleRatio; + var groupZoom = coordSys.scaleX; // Scale node when zoom changes + + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + return nodeScale / groupZoom; + } + function getSymbolSize(node) { + var symbolSize = node.getVisual('symbolSize'); + + if (symbolSize instanceof Array) { + symbolSize = (symbolSize[0] + symbolSize[1]) / 2; + } + + return +symbolSize; + } + + var PI$6 = Math.PI; + var _symbolRadiansHalf = []; + /** + * `basedOn` can be: + * 'value': + * This layout is not accurate and have same bad case. For example, + * if the min value is very smaller than the max value, the nodes + * with the min value probably overlap even though there is enough + * space to layout them. So we only use this approach in the as the + * init layout of the force layout. + * FIXME + * Probably we do not need this method any more but use + * `basedOn: 'symbolSize'` in force layout if + * delay its init operations to GraphView. + * 'symbolSize': + * This approach work only if all of the symbol size calculated. + * That is, the progressive rendering is not applied to graph. + * FIXME + * If progressive rendering is applied to graph some day, + * probably we have to use `basedOn: 'value'`. + */ + + function circularLayout(seriesModel, basedOn) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + var rect = coordSys.getBoundingRect(); + var nodeData = seriesModel.getData(); + var graph = nodeData.graph; + var cx = rect.width / 2 + rect.x; + var cy = rect.height / 2 + rect.y; + var r = Math.min(rect.width, rect.height) / 2; + var count = nodeData.count(); + nodeData.setLayout({ + cx: cx, + cy: cy + }); + + if (!count) { + return; + } + + _layoutNodesBasedOn[basedOn](seriesModel, graph, nodeData, r, cx, cy, count); + + graph.eachEdge(function (edge, index) { + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), getCurvenessForEdge(edge, seriesModel, index), 0); + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var cp1; + var x12 = (p1[0] + p2[0]) / 2; + var y12 = (p1[1] + p2[1]) / 2; + + if (+curveness) { + curveness *= 3; + cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)]; + } + + edge.setLayout([p1, p2, cp1]); + }); + } + var _layoutNodesBasedOn = { + value: function (seriesModel, graph, nodeData, r, cx, cy, count) { + var angle = 0; + var sum = nodeData.getSum('value'); + var unitAngle = Math.PI * 2 / (sum || count); + graph.eachNode(function (node) { + var value = node.getValue('value'); + var radianHalf = unitAngle * (sum ? value : 1) / 2; + angle += radianHalf; + node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); + angle += radianHalf; + }); + }, + symbolSize: function (seriesModel, graph, nodeData, r, cx, cy, count) { + var sumRadian = 0; + _symbolRadiansHalf.length = count; + var nodeScale = getNodeGlobalScale(seriesModel); + graph.eachNode(function (node) { + var symbolSize = getSymbolSize(node); // Normally this case will not happen, but we still add + // some the defensive code (2px is an arbitrary value). + + isNaN(symbolSize) && (symbolSize = 2); + symbolSize < 0 && (symbolSize = 0); + symbolSize *= nodeScale; + var symbolRadianHalf = Math.asin(symbolSize / 2 / r); // when `symbolSize / 2` is bigger than `r`. + + isNaN(symbolRadianHalf) && (symbolRadianHalf = PI$6 / 2); + _symbolRadiansHalf[node.dataIndex] = symbolRadianHalf; + sumRadian += symbolRadianHalf * 2; + }); + var halfRemainRadian = (2 * PI$6 - sumRadian) / count / 2; + var angle = 0; + graph.eachNode(function (node) { + var radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex]; + angle += radianHalf; + node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); + angle += radianHalf; + }); + } + }; + + function graphCircularLayout(ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + if (seriesModel.get('layout') === 'circular') { + circularLayout(seriesModel, 'symbolSize'); + } + }); + } + + var scaleAndAdd$1 = scaleAndAdd; // function adjacentNode(n, e) { + // return e.n1 === n ? e.n2 : e.n1; + // } + + function forceLayout(inNodes, inEdges, opts) { + var nodes = inNodes; + var edges = inEdges; + var rect = opts.rect; + var width = rect.width; + var height = rect.height; + var center = [rect.x + width / 2, rect.y + height / 2]; // let scale = opts.scale || 1; + + var gravity = opts.gravity == null ? 0.1 : opts.gravity; // for (let i = 0; i < edges.length; i++) { + // let e = edges[i]; + // let n1 = e.n1; + // let 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) { + n.p = create(width * (Math.random() - 0.5) + center[0], height * (Math.random() - 0.5) + center[1]); + } + + n.pp = clone$1(n.p); + n.edges = null; + } // Formula in 'Graph Drawing by Force-directed Placement' + // let k = scale * Math.sqrt(width * height / nodes.length); + // let k2 = k * k; + + + var initialFriction = opts.friction == null ? 0.6 : opts.friction; + var friction = initialFriction; + var beforeStepCallback; + var afterStepCallback; + return { + warmUp: function () { + friction = initialFriction * 0.8; + }, + setFixed: function (idx) { + nodes[idx].fixed = true; + }, + setUnfixed: function (idx) { + nodes[idx].fixed = false; + }, + + /** + * Before step hook + */ + beforeStep: function (cb) { + beforeStepCallback = cb; + }, + + /** + * After step hook + */ + afterStep: function (cb) { + afterStepCallback = cb; + }, + + /** + * Some formulas were originally copied from "d3.js" + * https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/layout/force.js + * with some modifications made for this project. + * See the license statement at the head of this file. + */ + step: function (cb) { + beforeStepCallback && beforeStepCallback(nodes, edges); + var v12 = []; + var nLen = nodes.length; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + + if (e.ignoreForceLayout) { + continue; + } + + var n1 = e.n1; + var n2 = e.n2; + sub(v12, n2.p, n1.p); + var d = len(v12) - e.d; + var w = n2.w / (n1.w + n2.w); + + if (isNaN(w)) { + w = 0; + } + + normalize(v12, v12); + !n1.fixed && scaleAndAdd$1(n1.p, n1.p, v12, w * d * friction); + !n2.fixed && scaleAndAdd$1(n2.p, n2.p, v12, -(1 - w) * d * friction); + } // Gravity + + + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + + if (!n.fixed) { + sub(v12, center, n.p); // let d = vec2.len(v12); + // vec2.scale(v12, v12, 1 / d); + // let gravityFactor = gravity; + + scaleAndAdd$1(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]; + sub(v12, n2.p, n1.p); + var d = len(v12); + + if (d === 0) { + // Random repulse + set(v12, Math.random() - 0.5, Math.random() - 0.5); + d = 1; + } + + var repFact = (n1.rep + n2.rep) / d / d; + !n1.fixed && scaleAndAdd$1(n1.pp, n1.pp, v12, repFact); + !n2.fixed && scaleAndAdd$1(n2.pp, n2.pp, v12, -repFact); + } + } + + var v = []; + + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + + if (!n.fixed) { + sub(v, n.p, n.pp); + scaleAndAdd$1(n.p, n.p, v, friction); + copy(n.pp, n.p); + } + } + + friction = friction * 0.992; + var finished = friction < 0.01; + afterStepCallback && afterStepCallback(nodes, edges, finished); + cb && cb(finished); + } + }; + } + + function graphForceLayout(ecModel) { + ecModel.eachSeriesByType('graph', function (graphSeries) { + var coordSys = graphSeries.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + if (graphSeries.get('layout') === 'force') { + var preservedPoints_1 = graphSeries.preservedPoints || {}; + var graph_1 = graphSeries.getGraph(); + var nodeData_1 = graph_1.data; + var edgeData = graph_1.edgeData; + var forceModel = graphSeries.getModel('force'); + var initLayout = forceModel.get('initLayout'); + + if (graphSeries.preservedPoints) { + nodeData_1.each(function (idx) { + var id = nodeData_1.getId(idx); + nodeData_1.setItemLayout(idx, preservedPoints_1[id] || [NaN, NaN]); + }); + } else if (!initLayout || initLayout === 'none') { + simpleLayout(graphSeries); + } else if (initLayout === 'circular') { + circularLayout(graphSeries, 'value'); + } + + var nodeDataExtent_1 = nodeData_1.getDataExtent('value'); + var edgeDataExtent_1 = edgeData.getDataExtent('value'); // let edgeDataExtent = edgeData.getDataExtent('value'); + + var repulsion = forceModel.get('repulsion'); + var edgeLength = forceModel.get('edgeLength'); + var repulsionArr_1 = isArray(repulsion) ? repulsion : [repulsion, repulsion]; + var edgeLengthArr_1 = isArray(edgeLength) ? edgeLength : [edgeLength, edgeLength]; // Larger value has smaller length + + edgeLengthArr_1 = [edgeLengthArr_1[1], edgeLengthArr_1[0]]; + var nodes_1 = nodeData_1.mapArray('value', function (value, idx) { + var point = nodeData_1.getItemLayout(idx); + var rep = linearMap(value, nodeDataExtent_1, repulsionArr_1); + + if (isNaN(rep)) { + rep = (repulsionArr_1[0] + repulsionArr_1[1]) / 2; + } + + return { + w: rep, + rep: rep, + fixed: nodeData_1.getItemModel(idx).get('fixed'), + p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point + }; + }); + var edges = edgeData.mapArray('value', function (value, idx) { + var edge = graph_1.getEdgeByIndex(idx); + var d = linearMap(value, edgeDataExtent_1, edgeLengthArr_1); + + if (isNaN(d)) { + d = (edgeLengthArr_1[0] + edgeLengthArr_1[1]) / 2; + } + + var edgeModel = edge.getModel(); + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, graphSeries, idx, true), 0); + return { + n1: nodes_1[edge.node1.dataIndex], + n2: nodes_1[edge.node2.dataIndex], + d: d, + curveness: curveness, + ignoreForceLayout: edgeModel.get('ignoreForceLayout') + }; + }); // let coordSys = graphSeries.coordinateSystem; + + var rect = coordSys.getBoundingRect(); + var forceInstance = forceLayout(nodes_1, edges, { + rect: rect, + gravity: forceModel.get('gravity'), + friction: forceModel.get('friction') + }); + forceInstance.beforeStep(function (nodes, edges) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (nodes[i].fixed) { + // Write back to layout instance + copy(nodes[i].p, graph_1.getNodeByIndex(i).getLayout()); + } + } + }); + forceInstance.afterStep(function (nodes, edges, stopped) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (!nodes[i].fixed) { + graph_1.getNodeByIndex(i).setLayout(nodes[i].p); + } + + preservedPoints_1[nodeData_1.getId(i)] = nodes[i].p; + } + + for (var i = 0, l = edges.length; i < l; i++) { + var e = edges[i]; + var edge = graph_1.getEdgeByIndex(i); + var p1 = e.n1.p; + var p2 = e.n2.p; + var points = edge.getLayout(); + points = points ? points.slice() : []; + points[0] = points[0] || []; + points[1] = points[1] || []; + copy(points[0], p1); + copy(points[1], p2); + + if (+e.curveness) { + points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness]; + } + + edge.setLayout(points); + } + }); + graphSeries.forceLayout = forceInstance; + graphSeries.preservedPoints = preservedPoints_1; // Step to get the layout + + forceInstance.step(); + } else { + // Remove prev injected forceLayout instance + graphSeries.forceLayout = null; + } + }); + } + + function getViewRect$2(seriesModel, api, aspect) { + var option = extend(seriesModel.getBoxLayoutParams(), { + aspect: aspect + }); + return getLayoutRect(option, { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function createViewCoordSys(ecModel, api) { + var viewList = []; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var coordSysType = seriesModel.get('coordinateSystem'); + + if (!coordSysType || coordSysType === 'view') { + var data_1 = seriesModel.getData(); + var positions = data_1.mapArray(function (idx) { + var itemModel = data_1.getItemModel(idx); + return [+itemModel.get('x'), +itemModel.get('y')]; + }); + var min = []; + var max = []; + fromPoints(positions, min, max); // If width or height is 0 + + if (max[0] - min[0] === 0) { + max[0] += 1; + min[0] -= 1; + } + + if (max[1] - min[1] === 0) { + max[1] += 1; + min[1] -= 1; + } + + var aspect = (max[0] - min[0]) / (max[1] - min[1]); // FIXME If get view rect after data processed? + + var viewRect = getViewRect$2(seriesModel, api, aspect); // Position may be NaN, use view rect instead + + if (isNaN(aspect)) { + 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; + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + viewCoordSys.setBoundingRect(min[0], min[1], bbWidth, bbHeight); + viewCoordSys.setViewRect(viewRect.x, viewRect.y, viewWidth, viewHeight); // Update roam info + + viewCoordSys.setCenter(seriesModel.get('center')); + viewCoordSys.setZoom(seriesModel.get('zoom')); + viewList.push(viewCoordSys); + } + }); + return viewList; + } + + var straightLineProto = Line.prototype; + var bezierCurveProto = BezierCurve.prototype; + + var StraightLineShape = + /** @class */ + function () { + function StraightLineShape() { + // Start point + this.x1 = 0; + this.y1 = 0; // End point + + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + + return StraightLineShape; + }(); + + var CurveShape = + /** @class */ + function (_super) { + __extends(CurveShape, _super); + + function CurveShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return CurveShape; + }(StraightLineShape); + + function isStraightLine(shape) { + return isNaN(+shape.cpx1) || isNaN(+shape.cpy1); + } + + var ECLinePath = + /** @class */ + function (_super) { + __extends(ECLinePath, _super); + + function ECLinePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-line'; + return _this; + } + + ECLinePath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + ECLinePath.prototype.getDefaultShape = function () { + return new StraightLineShape(); + }; + + ECLinePath.prototype.buildPath = function (ctx, shape) { + if (isStraightLine(shape)) { + straightLineProto.buildPath.call(this, ctx, shape); + } else { + bezierCurveProto.buildPath.call(this, ctx, shape); + } + }; + + ECLinePath.prototype.pointAt = function (t) { + if (isStraightLine(this.shape)) { + return straightLineProto.pointAt.call(this, t); + } else { + return bezierCurveProto.pointAt.call(this, t); + } + }; + + ECLinePath.prototype.tangentAt = function (t) { + var shape = this.shape; + var p = isStraightLine(shape) ? [shape.x2 - shape.x1, shape.y2 - shape.y1] : bezierCurveProto.tangentAt.call(this, t); + return normalize(p, p); + }; + + return ECLinePath; + }(Path); + + var SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol']; + + function makeSymbolTypeKey(symbolCategory) { + return '_' + symbolCategory + 'Type'; + } + /** + * @inner + */ + + + function createSymbol$1(name, lineData, idx) { + var symbolType = lineData.getItemVisual(idx, name); + + if (!symbolType || symbolType === 'none') { + return; + } + + var symbolSize = lineData.getItemVisual(idx, name + 'Size'); + var symbolRotate = lineData.getItemVisual(idx, name + 'Rotate'); + var symbolSizeArr = isArray(symbolSize) ? symbolSize : [symbolSize, symbolSize]; + var symbolPath = createSymbol(symbolType, -symbolSizeArr[0] / 2, -symbolSizeArr[1] / 2, symbolSizeArr[0], symbolSizeArr[1]); + symbolPath.__specifiedRotation = symbolRotate == null || isNaN(symbolRotate) ? void 0 : +symbolRotate * Math.PI / 180 || 0; + symbolPath.name = name; + return symbolPath; + } + + function createLine(points) { + var line = new ECLinePath({ + name: 'line', + subPixelOptimize: true + }); + setLinePoints(line.shape, points); + return line; + } + + function setLinePoints(targetShape, points) { + targetShape.x1 = points[0][0]; + targetShape.y1 = points[0][1]; + targetShape.x2 = points[1][0]; + targetShape.y2 = points[1][1]; + targetShape.percent = 1; + var cp1 = points[2]; + + if (cp1) { + targetShape.cpx1 = cp1[0]; + targetShape.cpy1 = cp1[1]; + } else { + targetShape.cpx1 = NaN; + targetShape.cpy1 = NaN; + } + } + + var Line$1 = + /** @class */ + function (_super) { + __extends(Line, _super); + + function Line(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this._createLine(lineData, idx, seriesScope); + + return _this; + } + + Line.prototype._createLine = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var linePoints = lineData.getItemLayout(idx); + var line = createLine(linePoints); + line.shape.percent = 0; + initProps(line, { + shape: { + percent: 1 + } + }, seriesModel, idx); + this.add(line); + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = createSymbol$1(symbolCategory, lineData, 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(symbol); + this[makeSymbolTypeKey(symbolCategory)] = lineData.getItemVisual(idx, symbolCategory); + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); + }; // TODO More strict on the List type in parameters? + + + Line.prototype.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childOfName('line'); + var linePoints = lineData.getItemLayout(idx); + var target = { + shape: {} + }; + setLinePoints(target.shape, linePoints); + updateProps(line, target, seriesModel, idx); + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbolType = lineData.getItemVisual(idx, symbolCategory); + var key = makeSymbolTypeKey(symbolCategory); // Symbol changed + + if (this[key] !== symbolType) { + this.remove(this.childOfName(symbolCategory)); + var symbol = createSymbol$1(symbolCategory, lineData, idx); + this.add(symbol); + } + + this[key] = symbolType; + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Line.prototype.getLinePath = function () { + return this.childAt(0); + }; + + Line.prototype._updateCommonStl = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childOfName('line'); + var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; + var blurLineStyle = seriesScope && seriesScope.blurLineStyle; + var selectLineStyle = seriesScope && seriesScope.selectLineStyle; + var labelStatesModels = seriesScope && seriesScope.labelStatesModels; // Optimization for large dataset + + if (!seriesScope || lineData.hasItemOption) { + var itemModel = lineData.getItemModel(idx); + emphasisLineStyle = itemModel.getModel(['emphasis', 'lineStyle']).getLineStyle(); + blurLineStyle = itemModel.getModel(['blur', 'lineStyle']).getLineStyle(); + selectLineStyle = itemModel.getModel(['select', 'lineStyle']).getLineStyle(); + labelStatesModels = getLabelStatesModels(itemModel); + } + + var lineStyle = lineData.getItemVisual(idx, 'style'); + var visualColor = lineStyle.stroke; + line.useStyle(lineStyle); + line.style.fill = null; + line.style.strokeNoScale = true; + line.ensureState('emphasis').style = emphasisLineStyle; + line.ensureState('blur').style = blurLineStyle; + line.ensureState('select').style = selectLineStyle; // Update symbol + + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = this.childOfName(symbolCategory); + + if (symbol) { + // Share opacity and color with line. + symbol.setColor(visualColor); + symbol.style.opacity = lineStyle.opacity; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var lineState = line.getState(stateName); + + if (lineState) { + var lineStateStyle = lineState.style || {}; + var state = symbol.ensureState(stateName); + var stateStyle = state.style || (state.style = {}); + + if (lineStateStyle.stroke != null) { + stateStyle[symbol.__isEmptyBrush ? 'stroke' : 'fill'] = lineStateStyle.stroke; + } + + if (lineStateStyle.opacity != null) { + stateStyle.opacity = lineStateStyle.opacity; + } + } + } + + symbol.markRedraw(); + } + }, this); + var rawVal = seriesModel.getRawValue(idx); + setLabelStyle(this, labelStatesModels, { + labelDataIndex: idx, + labelFetcher: { + getFormattedLabel: function (dataIndex, stateName) { + return seriesModel.getFormattedLabel(dataIndex, stateName, lineData.dataType); + } + }, + inheritColor: visualColor || '#000', + defaultOpacity: lineStyle.opacity, + defaultText: (rawVal == null ? lineData.getName(idx) : isFinite(rawVal) ? round(rawVal) : rawVal) + '' + }); + var label = this.getTextContent(); // Always set `textStyle` even if `normalStyle.text` is null, because default + // values have to be set on `normalStyle`. + + if (label) { + var labelNormalModel = labelStatesModels.normal; + label.__align = label.style.align; + label.__verticalAlign = label.style.verticalAlign; // 'start', 'middle', 'end' + + label.__position = labelNormalModel.get('position') || 'middle'; + var distance = labelNormalModel.get('distance'); + + if (!isArray(distance)) { + distance = [distance, distance]; + } + + label.__labelDistance = distance; + } + + this.setTextConfig({ + position: null, + local: true, + inside: false // Can't be inside for stroke element. + + }); + enableHoverEmphasis(this); + }; + + Line.prototype.highlight = function () { + enterEmphasis(this); + }; + + Line.prototype.downplay = function () { + leaveEmphasis(this); + }; + + Line.prototype.updateLayout = function (lineData, idx) { + this.setLinePoints(lineData.getItemLayout(idx)); + }; + + Line.prototype.setLinePoints = function (points) { + var linePath = this.childOfName('line'); + setLinePoints(linePath.shape, points); + linePath.dirty(); + }; + + Line.prototype.beforeUpdate = function () { + var lineGroup = this; + var symbolFrom = lineGroup.childOfName('fromSymbol'); + var symbolTo = lineGroup.childOfName('toSymbol'); + var label = lineGroup.getTextContent(); // Quick reject + + if (!symbolFrom && !symbolTo && (!label || label.ignore)) { + return; + } + + var invScale = 1; + var parentNode = this.parent; + + while (parentNode) { + if (parentNode.scaleX) { + invScale /= parentNode.scaleX; + } + + parentNode = parentNode.parent; + } + + var line = lineGroup.childOfName('line'); // If line not changed + // FIXME Parent scale changed + + if (!this.__dirty && !line.__dirty) { + return; + } + + var percent = line.shape.percent; + var fromPos = line.pointAt(0); + var toPos = line.pointAt(percent); + var d = sub([], toPos, fromPos); + normalize(d, d); + + function setSymbolRotation(symbol, percent) { + // Fix #12388 + // when symbol is set to be 'arrow' in markLine, + // symbolRotate value will be ignored, and compulsively use tangent angle. + // rotate by default if symbol rotation is not specified + var specifiedRotation = symbol.__specifiedRotation; + + if (specifiedRotation == null) { + var tangent = line.tangentAt(percent); + symbol.attr('rotation', (percent === 1 ? -1 : 1) * Math.PI / 2 - Math.atan2(tangent[1], tangent[0])); + } else { + symbol.attr('rotation', specifiedRotation); + } + } + + if (symbolFrom) { + symbolFrom.setPosition(fromPos); + setSymbolRotation(symbolFrom, 0); + symbolFrom.scaleX = symbolFrom.scaleY = invScale * percent; + symbolFrom.markRedraw(); + } + + if (symbolTo) { + symbolTo.setPosition(toPos); + setSymbolRotation(symbolTo, 1); + symbolTo.scaleX = symbolTo.scaleY = invScale * percent; + symbolTo.markRedraw(); + } + + if (label && !label.ignore) { + label.x = label.y = 0; + label.originX = label.originY = 0; + var textAlign = void 0; + var textVerticalAlign = void 0; + var distance = label.__labelDistance; + var distanceX = distance[0] * invScale; + var distanceY = distance[1] * invScale; + var halfPercent = percent / 2; + var tangent = line.tangentAt(halfPercent); + var n = [tangent[1], -tangent[0]]; + var cp = line.pointAt(halfPercent); + + if (n[1] > 0) { + n[0] = -n[0]; + n[1] = -n[1]; + } + + var dir = tangent[0] < 0 ? -1 : 1; + + if (label.__position !== 'start' && label.__position !== 'end') { + var rotation = -Math.atan2(tangent[1], tangent[0]); + + if (toPos[0] < fromPos[0]) { + rotation = Math.PI + rotation; + } + + label.rotation = rotation; + } + + var dy = void 0; + + switch (label.__position) { + case 'insideStartTop': + case 'insideMiddleTop': + case 'insideEndTop': + case 'middle': + dy = -distanceY; + textVerticalAlign = 'bottom'; + break; + + case 'insideStartBottom': + case 'insideMiddleBottom': + case 'insideEndBottom': + dy = distanceY; + textVerticalAlign = 'top'; + break; + + default: + dy = 0; + textVerticalAlign = 'middle'; + } + + switch (label.__position) { + case 'end': + label.x = d[0] * distanceX + toPos[0]; + label.y = d[1] * distanceY + 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'; + break; + + case 'start': + label.x = -d[0] * distanceX + fromPos[0]; + label.y = -d[1] * distanceY + 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'; + break; + + case 'insideStartTop': + case 'insideStart': + case 'insideStartBottom': + label.x = distanceX * dir + fromPos[0]; + label.y = fromPos[1] + dy; + textAlign = tangent[0] < 0 ? 'right' : 'left'; + label.originX = -distanceX * dir; + label.originY = -dy; + break; + + case 'insideMiddleTop': + case 'insideMiddle': + case 'insideMiddleBottom': + case 'middle': + label.x = cp[0]; + label.y = cp[1] + dy; + textAlign = 'center'; + label.originY = -dy; + break; + + case 'insideEndTop': + case 'insideEnd': + case 'insideEndBottom': + label.x = -distanceX * dir + toPos[0]; + label.y = toPos[1] + dy; + textAlign = tangent[0] >= 0 ? 'right' : 'left'; + label.originX = distanceX * dir; + label.originY = -dy; + break; + } + + label.scaleX = label.scaleY = invScale; + label.setStyle({ + // Use the user specified text align and baseline first + verticalAlign: label.__verticalAlign || textVerticalAlign, + align: label.__align || textAlign + }); + } + }; + + return Line; + }(Group); + + var LineDraw = + /** @class */ + function () { + function LineDraw(LineCtor) { + this.group = new Group(); + this._LineCtor = LineCtor || Line$1; + } + + LineDraw.prototype.isPersistent = function () { + return true; + }; + + LineDraw.prototype.updateData = function (lineData) { + var _this = this; + + var lineDraw = this; + var group = lineDraw.group; + var oldLineData = lineDraw._lineData; + lineDraw._lineData = lineData; // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!oldLineData) { + group.removeAll(); + } + + var seriesScope = makeSeriesScope$1(lineData); + lineData.diff(oldLineData).add(function (idx) { + _this._doAdd(lineData, idx, seriesScope); + }).update(function (newIdx, oldIdx) { + _this._doUpdate(oldLineData, lineData, oldIdx, newIdx, seriesScope); + }).remove(function (idx) { + group.remove(oldLineData.getItemGraphicEl(idx)); + }).execute(); + }; + + LineDraw.prototype.updateLayout = function () { + var lineData = this._lineData; // Do not support update layout in incremental mode. + + if (!lineData) { + return; + } + + lineData.eachItemGraphicEl(function (el, idx) { + el.updateLayout(lineData, idx); + }, this); + }; + + LineDraw.prototype.incrementalPrepareUpdate = function (lineData) { + this._seriesScope = makeSeriesScope$1(lineData); + this._lineData = null; + this.group.removeAll(); + }; + + LineDraw.prototype.incrementalUpdate = function (taskParams, lineData) { + function updateIncrementalAndHover(el) { + if (!el.isGroup && !isEffectObject(el)) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var itemLayout = lineData.getItemLayout(idx); + + if (lineNeedsDraw(itemLayout)) { + var el = new this._LineCtor(lineData, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + this.group.add(el); + lineData.setItemGraphicEl(idx, el); + } + } + }; + + LineDraw.prototype.remove = function () { + this.group.removeAll(); + }; + + LineDraw.prototype._doAdd = function (lineData, idx, seriesScope) { + var itemLayout = lineData.getItemLayout(idx); + + if (!lineNeedsDraw(itemLayout)) { + return; + } + + var el = new this._LineCtor(lineData, idx, seriesScope); + lineData.setItemGraphicEl(idx, el); + this.group.add(el); + }; + + LineDraw.prototype._doUpdate = function (oldLineData, newLineData, oldIdx, newIdx, seriesScope) { + var itemEl = oldLineData.getItemGraphicEl(oldIdx); + + if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) { + this.group.remove(itemEl); + return; + } + + if (!itemEl) { + itemEl = new this._LineCtor(newLineData, newIdx, seriesScope); + } else { + itemEl.updateData(newLineData, newIdx, seriesScope); + } + + newLineData.setItemGraphicEl(newIdx, itemEl); + this.group.add(itemEl); + }; + + return LineDraw; + }(); + + function isEffectObject(el) { + return el.animators && el.animators.length > 0; + } + + function makeSeriesScope$1(lineData) { + var hostModel = lineData.hostModel; + return { + lineStyle: hostModel.getModel('lineStyle').getLineStyle(), + emphasisLineStyle: hostModel.getModel(['emphasis', 'lineStyle']).getLineStyle(), + blurLineStyle: hostModel.getModel(['blur', 'lineStyle']).getLineStyle(), + selectLineStyle: hostModel.getModel(['select', 'lineStyle']).getLineStyle(), + labelStatesModels: getLabelStatesModels(hostModel) + }; + } + + function isPointNaN(pt) { + return isNaN(pt[0]) || isNaN(pt[1]); + } + + function lineNeedsDraw(pts) { + return !isPointNaN(pts[0]) && !isPointNaN(pts[1]); + } + + var v1 = []; + var v2 = []; + var v3 = []; + var quadraticAt$1 = quadraticAt; + var v2DistSquare = distSquare; + var mathAbs$2 = Math.abs; + + function intersectCurveCircle(curvePoints, center, radius) { + var p0 = curvePoints[0]; + var p1 = curvePoints[1]; + var p2 = curvePoints[2]; + var d = Infinity; + var t; + var radiusSquare = radius * radius; + var interval = 0.1; + + for (var _t = 0.1; _t <= 0.9; _t += 0.1) { + v1[0] = quadraticAt$1(p0[0], p1[0], p2[0], _t); + v1[1] = quadraticAt$1(p0[1], p1[1], p2[1], _t); + var diff = mathAbs$2(v2DistSquare(v1, center) - radiusSquare); + + if (diff < d) { + d = diff; + t = _t; + } + } // Assume the segment is monotone,Find root through Bisection method + // At most 32 iteration + + + for (var i = 0; i < 32; i++) { + // let prev = t - interval; + var next = t + interval; // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev); + // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev); + + v2[0] = quadraticAt$1(p0[0], p1[0], p2[0], t); + v2[1] = quadraticAt$1(p0[1], p1[1], p2[1], t); + v3[0] = quadraticAt$1(p0[0], p1[0], p2[0], next); + v3[1] = quadraticAt$1(p0[1], p1[1], p2[1], next); + var diff = v2DistSquare(v2, center) - radiusSquare; + + if (mathAbs$2(diff) < 1e-2) { + break; + } // let prevDiff = v2DistSquare(v1, center) - radiusSquare; + + + var nextDiff = v2DistSquare(v3, center) - radiusSquare; + interval /= 2; + + if (diff < 0) { + if (nextDiff >= 0) { + t = t + interval; + } else { + t = t - interval; + } + } else { + if (nextDiff >= 0) { + t = t - interval; + } else { + t = t + interval; + } + } + } + + return t; + } // Adjust edge to avoid + + + function adjustEdge(graph, scale) { + var tmp0 = []; + var quadraticSubdivide$1 = quadraticSubdivide; + var pts = [[], [], []]; + var pts2 = [[], []]; + var v = []; + scale /= 2; + graph.eachEdge(function (edge, idx) { + var linePoints = edge.getLayout(); + var fromSymbol = edge.getVisual('fromSymbol'); + var toSymbol = edge.getVisual('toSymbol'); + + if (!linePoints.__original) { + linePoints.__original = [clone$1(linePoints[0]), clone$1(linePoints[1])]; + + if (linePoints[2]) { + linePoints.__original.push(clone$1(linePoints[2])); + } + } + + var originalPoints = linePoints.__original; // Quadratic curve + + if (linePoints[2] != null) { + copy(pts[0], originalPoints[0]); + copy(pts[1], originalPoints[2]); + copy(pts[2], originalPoints[1]); + + if (fromSymbol && fromSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node1); + var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale); // Subdivide and get the second + + quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[0][0] = tmp0[3]; + pts[1][0] = tmp0[4]; + quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[0][1] = tmp0[3]; + pts[1][1] = tmp0[4]; + } + + if (toSymbol && toSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node2); + var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale); // Subdivide and get the first + + quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[1][0] = tmp0[1]; + pts[2][0] = tmp0[2]; + quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[1][1] = tmp0[1]; + pts[2][1] = tmp0[2]; + } // Copy back to layout + + + copy(linePoints[0], pts[0]); + copy(linePoints[1], pts[2]); + copy(linePoints[2], pts[1]); + } // Line + else { + copy(pts2[0], originalPoints[0]); + copy(pts2[1], originalPoints[1]); + sub(v, pts2[1], pts2[0]); + normalize(v, v); + + if (fromSymbol && fromSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node1); + scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale); + } + + if (toSymbol && toSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node2); + scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale); + } + + copy(linePoints[0], pts2[0]); + copy(linePoints[1], pts2[1]); + } + }); + } + + function isViewCoordSys(coordSys) { + return coordSys.type === 'view'; + } + + var GraphView = + /** @class */ + function (_super) { + __extends(GraphView, _super); + + function GraphView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphView.type; + return _this; + } + + GraphView.prototype.init = function (ecModel, api) { + var symbolDraw = new SymbolDraw(); + var lineDraw = new LineDraw(); + var group = this.group; + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: group + }; + group.add(symbolDraw.group); + group.add(lineDraw.group); + this._symbolDraw = symbolDraw; + this._lineDraw = lineDraw; + this._firstRender = true; + }; + + GraphView.prototype.render = function (seriesModel, ecModel, api) { + var _this = this; + + var coordSys = seriesModel.coordinateSystem; + this._model = seriesModel; + var symbolDraw = this._symbolDraw; + var lineDraw = this._lineDraw; + var group = this.group; + + if (isViewCoordSys(coordSys)) { + var groupNewProp = { + x: coordSys.x, + y: coordSys.y, + scaleX: coordSys.scaleX, + scaleY: coordSys.scaleY + }; + + if (this._firstRender) { + group.attr(groupNewProp); + } else { + updateProps(group, groupNewProp, seriesModel); + } + } // Fix edge contact point with node + + + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + var data = seriesModel.getData(); + symbolDraw.updateData(data); + var edgeData = seriesModel.getEdgeData(); // TODO: TYPE + + lineDraw.updateData(edgeData); + + this._updateNodeAndLinkScale(); + + this._updateController(seriesModel, ecModel, api); + + clearTimeout(this._layoutTimeout); + var forceLayout = seriesModel.forceLayout; + var layoutAnimation = seriesModel.get(['force', 'layoutAnimation']); + + if (forceLayout) { + this._startForceLayoutIteration(forceLayout, layoutAnimation); + } + + data.graph.eachNode(function (node) { + var idx = node.dataIndex; + var el = node.getGraphicEl(); + var itemModel = node.getModel(); // Update draggable + + el.off('drag').off('dragend'); + var draggable = itemModel.get('draggable'); + + if (draggable) { + el.on('drag', function () { + if (forceLayout) { + forceLayout.warmUp(); + !_this._layouting && _this._startForceLayoutIteration(forceLayout, layoutAnimation); + forceLayout.setFixed(idx); // Write position back to layout + + data.setItemLayout(idx, [el.x, el.y]); + } + }).on('dragend', function () { + if (forceLayout) { + forceLayout.setUnfixed(idx); + } + }); + } + + el.setDraggable(draggable && !!forceLayout); + var focus = itemModel.get(['emphasis', 'focus']); + + if (focus === 'adjacency') { + getECData(el).focus = node.getAdjacentDataIndices(); + } + }); + data.graph.eachEdge(function (edge) { + var el = edge.getGraphicEl(); + var focus = edge.getModel().get(['emphasis', 'focus']); + + if (focus === 'adjacency') { + getECData(el).focus = { + edge: [edge.dataIndex], + node: [edge.node1.dataIndex, edge.node2.dataIndex] + }; + } + }); + var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get(['circular', 'rotateLabel']); + var cx = data.getLayout('cx'); + var cy = data.getLayout('cy'); + data.eachItemGraphicEl(function (el, idx) { + var itemModel = data.getItemModel(idx); + var labelRotate = itemModel.get(['label', 'rotate']) || 0; + var symbolPath = el.getSymbolPath(); + + if (circularRotateLabel) { + var pos = data.getItemLayout(idx); + var rad = Math.atan2(pos[1] - cy, pos[0] - cx); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + var isLeft = pos[0] < cx; + + if (isLeft) { + rad = rad - Math.PI; + } + + var textPosition = isLeft ? 'left' : 'right'; + symbolPath.setTextConfig({ + rotation: -rad, + position: textPosition, + origin: 'center' + }); + var emphasisState = symbolPath.ensureState('emphasis'); + extend(emphasisState.textConfig || (emphasisState.textConfig = {}), { + position: textPosition + }); + } else { + symbolPath.setTextConfig({ + rotation: labelRotate *= Math.PI / 180 + }); + } + }); + this._firstRender = false; + }; + + GraphView.prototype.dispose = function () { + this._controller && this._controller.dispose(); + this._controllerHost = null; + }; + + GraphView.prototype._startForceLayoutIteration = function (forceLayout, layoutAnimation) { + var self = this; + + (function step() { + forceLayout.step(function (stopped) { + self.updateLayout(self._model); + (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step()); + }); + })(); + }; + + GraphView.prototype._updateController = function (seriesModel, ecModel, api) { + var _this = this; + + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); + }); + + if (!isViewCoordSys(seriesModel.coordinateSystem)) { + controller.disable(); + return; + } + + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + controller.off('pan').off('zoom').on('pan', function (e) { + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + dx: e.dx, + dy: e.dy + }); + }).on('zoom', function (e) { + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + zoom: e.scale, + originX: e.originX, + originY: e.originY + }); + + _this._updateNodeAndLinkScale(); + + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + + _this._lineDraw.updateLayout(); // Only update label layout on zoom + + + api.updateLabelLayout(); + }); + }; + + GraphView.prototype._updateNodeAndLinkScale = function () { + var seriesModel = this._model; + var data = seriesModel.getData(); + var nodeScale = getNodeGlobalScale(seriesModel); + data.eachItemGraphicEl(function (el, idx) { + el.setSymbolScale(nodeScale); + }); + }; + + GraphView.prototype.updateLayout = function (seriesModel) { + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + + this._symbolDraw.updateLayout(); + + this._lineDraw.updateLayout(); + }; + + GraphView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(); + this._lineDraw && this._lineDraw.remove(); + }; + + GraphView.type = 'graph'; + return GraphView; + }(ChartView); + + function generateNodeKey(id) { + return '_EC_' + id; + } + + var Graph = + /** @class */ + function () { + function Graph(directed) { + this.type = 'graph'; + this.nodes = []; + this.edges = []; + this._nodesMap = {}; + /** + * @type {Object.} + * @private + */ + + this._edgesMap = {}; + this._directed = directed || false; + } + /** + * If is directed graph + */ + + + Graph.prototype.isDirected = function () { + return this._directed; + }; + /** + * Add a new node + */ + + Graph.prototype.addNode = function (id, dataIndex) { + id = id == null ? '' + dataIndex : '' + id; + var nodesMap = this._nodesMap; + + if (nodesMap[generateNodeKey(id)]) { + if ("development" !== 'production') { + console.error('Graph nodes have duplicate name or id'); + } + + return; + } + + var node = new GraphNode(id, dataIndex); + node.hostGraph = this; + this.nodes.push(node); + nodesMap[generateNodeKey(id)] = node; + return node; + }; + /** + * Get node by data index + */ + + Graph.prototype.getNodeByIndex = function (dataIndex) { + var rawIdx = this.data.getRawIndex(dataIndex); + return this.nodes[rawIdx]; + }; + /** + * Get node by id + */ + + Graph.prototype.getNodeById = function (id) { + return this._nodesMap[generateNodeKey(id)]; + }; + /** + * Add a new edge + */ + + Graph.prototype.addEdge = function (n1, n2, dataIndex) { + var nodesMap = this._nodesMap; + var edgesMap = this._edgesMap; // PNEDING + + if (typeof n1 === 'number') { + n1 = this.nodes[n1]; + } + + if (typeof n2 === 'number') { + n2 = this.nodes[n2]; + } + + if (!(n1 instanceof GraphNode)) { + n1 = nodesMap[generateNodeKey(n1)]; + } + + if (!(n2 instanceof GraphNode)) { + n2 = nodesMap[generateNodeKey(n2)]; + } + + if (!n1 || !n2) { + return; + } + + var key = n1.id + '-' + n2.id; + var edge = new GraphEdge(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 + */ + + Graph.prototype.getEdgeByIndex = function (dataIndex) { + var rawIdx = this.edgeData.getRawIndex(dataIndex); + return this.edges[rawIdx]; + }; + /** + * Get edge by two linked nodes + */ + + Graph.prototype.getEdge = function (n1, n2) { + if (n1 instanceof GraphNode) { + n1 = n1.id; + } + + if (n2 instanceof GraphNode) { + 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 + */ + + Graph.prototype.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 + */ + + Graph.prototype.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 + * Return true to stop traversing + */ + + Graph.prototype.breadthFirstTraverse = function (cb, startNode, direction, context) { + if (!(startNode instanceof GraphNode)) { + startNode = this._nodesMap[generateNodeKey(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(context, otherNode, currentNode)) { + // Stop traversing + return; + } + + queue.push(otherNode); + otherNode.__visited = true; + } + } + } + }; + // depthFirstTraverse( + // cb, startNode, direction, context + // ) { + // }; + // Filter update + + Graph.prototype.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; + } + }; + /** + * @return {module:echarts/data/Graph} + */ + + Graph.prototype.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; + }; + return Graph; + }(); + + var GraphNode = + /** @class */ + function () { + function GraphNode(id, dataIndex) { + this.inEdges = []; + this.outEdges = []; + this.edges = []; + this.dataIndex = -1; + this.id = id == null ? '' : id; + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } + /** + * @return {number} + */ + + + GraphNode.prototype.degree = function () { + return this.edges.length; + }; + /** + * @return {number} + */ + + + GraphNode.prototype.inDegree = function () { + return this.inEdges.length; + }; + /** + * @return {number} + */ + + + GraphNode.prototype.outDegree = function () { + return this.outEdges.length; + }; + + GraphNode.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var graph = this.hostGraph; + var itemModel = graph.data.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; + + GraphNode.prototype.getAdjacentDataIndices = function () { + var dataIndices = { + edge: [], + node: [] + }; + + for (var i = 0; i < this.edges.length; i++) { + var adjacentEdge = this.edges[i]; + + if (adjacentEdge.dataIndex < 0) { + continue; + } + + dataIndices.edge.push(adjacentEdge.dataIndex); + dataIndices.node.push(adjacentEdge.node1.dataIndex, adjacentEdge.node2.dataIndex); + } + + return dataIndices; + }; + + return GraphNode; + }(); + + var GraphEdge = + /** @class */ + function () { + function GraphEdge(n1, n2, dataIndex) { + this.dataIndex = -1; + this.node1 = n1; + this.node2 = n2; + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } + + GraphEdge.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var graph = this.hostGraph; + var itemModel = graph.edgeData.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; + + GraphEdge.prototype.getAdjacentDataIndices = function () { + return { + edge: [this.dataIndex], + node: [this.node1.dataIndex, this.node2.dataIndex] + }; + }; + + return GraphEdge; + }(); + + function createGraphDataProxyMixin(hostName, dataName) { + return { + /** + * @param Default 'value'. can be 'a', 'b', 'c', 'd', 'e'. + */ + getValue: function (dimension) { + var data = this[hostName][dataName]; + return data.get(data.getDimension(dimension || 'value'), this.dataIndex); + }, + // TODO: TYPE stricter type. + setVisual: function (key, value) { + this.dataIndex >= 0 && this[hostName][dataName].setItemVisual(this.dataIndex, key, value); + }, + getVisual: function (key) { + return this[hostName][dataName].getItemVisual(this.dataIndex, key); + }, + setLayout: function (layout, merge) { + this.dataIndex >= 0 && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge); + }, + getLayout: function () { + return this[hostName][dataName].getItemLayout(this.dataIndex); + }, + getGraphicEl: function () { + return this[hostName][dataName].getItemGraphicEl(this.dataIndex); + }, + getRawIndex: function () { + return this[hostName][dataName].getRawIndex(this.dataIndex); + } + }; + } + mixin(GraphNode, createGraphDataProxyMixin('hostGraph', 'data')); + mixin(GraphEdge, createGraphDataProxyMixin('hostGraph', 'edgeData')); + + function createGraphFromNodeEdge(nodes, edges, seriesModel, directed, beforeLink) { + // ??? TODO + // support dataset? + var graph = new Graph(directed); + + for (var i = 0; i < nodes.length; i++) { + graph.addNode(retrieve( // Id, name, dataIndex + nodes[i].id, nodes[i].name, i), i); + } + + var linkNameList = []; + var validEdges = []; + var linkCount = 0; + + for (var i = 0; i < edges.length; i++) { + var link = edges[i]; + var source = link.source; + var target = link.target; // addEdge may fail when source or target not exists + + if (graph.addEdge(source, target, linkCount)) { + validEdges.push(link); + linkNameList.push(retrieve(convertOptionIdName(link.id, null), source + ' > ' + target)); + linkCount++; + } + } + + var coordSys = seriesModel.get('coordinateSystem'); + var nodeData; + + if (coordSys === 'cartesian2d' || coordSys === 'polar') { + nodeData = createListFromArray(nodes, seriesModel); + } else { + var coordSysCtor = CoordinateSystemManager.get(coordSys); + var coordDimensions = coordSysCtor ? coordSysCtor.dimensions || [] : []; // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs + // `value` dimension, but graph need `value` dimension. It's better to + // uniform this behavior. + + if (indexOf(coordDimensions, 'value') < 0) { + coordDimensions.concat(['value']); + } + + var dimensionNames = createDimensions(nodes, { + coordDimensions: coordDimensions + }); + nodeData = new List(dimensionNames, seriesModel); + nodeData.initData(nodes); + } + + var edgeData = new List(['value'], seriesModel); + edgeData.initData(validEdges, linkNameList); + beforeLink && beforeLink(nodeData, edgeData); + linkList({ + mainData: nodeData, + struct: graph, + structAttr: 'graph', + datas: { + node: nodeData, + edge: edgeData + }, + datasAttr: { + node: 'data', + edge: 'edgeData' + } + }); // Update dataIndex of nodes and edges because invalid edge may be removed + + graph.update(); + return graph; + } + + var GraphSeriesModel = + /** @class */ + function (_super) { + __extends(GraphSeriesModel, _super); + + function GraphSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + GraphSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); + + var self = this; + + function getCategoriesData() { + return self._categoriesData; + } // Provide data for legend select + + + this.legendVisualProvider = new LegendVisualProvider(getCategoriesData, getCategoriesData); + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }; + + GraphSeriesModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }; + + GraphSeriesModel.prototype.mergeDefaultAndTheme = function (option) { + _super.prototype.mergeDefaultAndTheme.apply(this, arguments); + + defaultEmphasis(option, 'edgeLabel', ['show']); + }; + + GraphSeriesModel.prototype.getInitialData = function (option, ecModel) { + var edges = option.edges || option.links || []; + var nodes = option.data || option.nodes || []; + var self = this; + + if (nodes && edges) { + // auto curveness + initCurvenessList(this); + var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink); + each(graph.edges, function (edge) { + createEdgeMapForCurveness(edge.node1, edge.node2, this, edge.dataIndex); + }, this); + return graph.data; + } + + function beforeLink(nodeData, edgeData) { + // Overwrite nodeData.getItemModel to + nodeData.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; + }); // TODO Inherit resolveParentPath by default in Model#getModel? + + var oldGetModel = Model.prototype.getModel; + + function newGetModel(path, parentModel) { + var model = oldGetModel.call(this, path, parentModel); + model.resolveParentPath = resolveParentPath; + return model; + } + + edgeData.wrapMethod('getItemModel', function (model) { + model.resolveParentPath = resolveParentPath; + model.getModel = newGetModel; + return model; + }); + + function resolveParentPath(pathArr) { + if (pathArr && (pathArr[0] === 'label' || pathArr[1] === 'label')) { + var newPathArr = pathArr.slice(); + + if (pathArr[0] === 'label') { + newPathArr[0] = 'edgeLabel'; + } else if (pathArr[1] === 'label') { + newPathArr[1] = 'edgeLabel'; + } + + return newPathArr; + } + + return pathArr; + } + } + }; + + GraphSeriesModel.prototype.getGraph = function () { + return this.getData().graph; + }; + + GraphSeriesModel.prototype.getEdgeData = function () { + return this.getGraph().edgeData; + }; + + GraphSeriesModel.prototype.getCategoriesData = function () { + return this._categoriesData; + }; + + GraphSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + if (dataType === 'edge') { + var nodeData = this.getData(); + var params = this.getDataParams(dataIndex, dataType); + var edge = nodeData.graph.getEdgeByIndex(dataIndex); + var sourceName = nodeData.getName(edge.node1.dataIndex); + var targetName = nodeData.getName(edge.node2.dataIndex); + var nameArr = []; + sourceName != null && nameArr.push(sourceName); + targetName != null && nameArr.push(targetName); + return createTooltipMarkup('nameValue', { + name: nameArr.join(' > '), + value: params.value, + noValue: params.value == null + }); + } // dataType === 'node' or empty + + + var nodeMarkup = defaultSeriesFormatTooltip({ + series: this, + dataIndex: dataIndex, + multipleSeries: multipleSeries + }); + return nodeMarkup; + }; + + GraphSeriesModel.prototype._updateCategoriesData = function () { + var categories = map(this.option.categories || [], function (category) { + // Data must has value + return category.value != null ? category : 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); + }); + }; + + GraphSeriesModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + GraphSeriesModel.prototype.setCenter = function (center) { + this.option.center = center; + }; + + GraphSeriesModel.prototype.isAnimationEnabled = function () { + return _super.prototype.isAnimationEnabled.call(this) // Not enable animation when do force layout + && !(this.get('layout') === 'force' && this.get(['force', 'layoutAnimation'])); + }; + + GraphSeriesModel.type = 'series.graph'; + GraphSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + GraphSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'view', + // Default option for all coordinate systems + // xAxisIndex: 0, + // yAxisIndex: 0, + // polarIndex: 0, + // geoIndex: 0, + legendHoverLink: true, + layout: null, + // Configuration of circular layout + circular: { + rotateLabel: false + }, + // Configuration of force directed layout + force: { + initLayout: null, + // Node repulsion. Can be an array to represent range. + repulsion: [0, 50], + gravity: 0.1, + // Initial friction + friction: 0.6, + // Edge length. Can be an array to represent range. + edgeLength: 30, + layoutAnimation: true + }, + left: 'center', + top: 'center', + // right: null, + // bottom: null, + // width: '80%', + // height: '80%', + symbol: 'circle', + symbolSize: 10, + edgeSymbol: ['none', 'none'], + edgeSymbolSize: 10, + edgeLabel: { + position: 'middle', + distance: 5 + }, + draggable: false, + roam: false, + // Default on center of graph + center: null, + zoom: 1, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.6, + // cursor: null, + // categories: [], + // data: [] + // Or + // nodes: [] + // + // links: [] + // Or + // edges: [] + label: { + show: false, + formatter: '{b}' + }, + itemStyle: {}, + lineStyle: { + color: '#aaa', + width: 1, + opacity: 0.5 + }, + emphasis: { + scale: true, + label: { + show: true + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return GraphSeriesModel; + }(SeriesModel); + + var actionInfo = { + type: 'graphRoam', + event: 'graphRoam', + update: 'none' + }; + function install$d(registers) { + registers.registerChartView(GraphView); + registers.registerSeriesModel(GraphSeriesModel); + registers.registerProcessor(categoryFilter); + registers.registerVisual(categoryVisual); + registers.registerVisual(graphEdgeVisual); + registers.registerLayout(graphSimpleLayout); + registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, graphCircularLayout); + registers.registerLayout(graphForceLayout); + registers.registerCoordinateSystem('graphView', { + dimensions: View.dimensions, + create: createViewCoordSys + }); // Register legacy focus actions + + registers.registerAction({ + type: 'focusNodeAdjacency', + event: 'focusNodeAdjacency', + update: 'series:focusNodeAdjacency' + }, function () {}); + registers.registerAction({ + type: 'unfocusNodeAdjacency', + event: 'unfocusNodeAdjacency', + update: 'series:unfocusNodeAdjacency' + }, function () {}); // Register roam action. + + registers.registerAction(actionInfo, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + query: payload + }, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var res = updateCenterAndZoom(coordSys, payload); + seriesModel.setCenter && seriesModel.setCenter(res.center); + seriesModel.setZoom && seriesModel.setZoom(res.zoom); + }); + }); + } + + var PointerShape = + /** @class */ + function () { + function PointerShape() { + this.angle = 0; + this.width = 10; + this.r = 10; + this.x = 0; + this.y = 0; + } + + return PointerShape; + }(); + + var PointerPath = + /** @class */ + function (_super) { + __extends(PointerPath, _super); + + function PointerPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'pointer'; + return _this; + } + + PointerPath.prototype.getDefaultShape = function () { + return new PointerShape(); + }; + + PointerPath.prototype.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 PointerPath; + }(Path); + + 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$1(center[0], api.getWidth()); + var cy = parsePercent$1(center[1], api.getHeight()); + var r = parsePercent$1(seriesModel.get('radius'), size / 2); + return { + cx: cx, + cy: cy, + r: r + }; + } + + function formatLabel(value, labelFormatter) { + var label = value == null ? '' : value + ''; + + if (labelFormatter) { + if (typeof labelFormatter === 'string') { + label = labelFormatter.replace('{value}', label); + } else if (typeof labelFormatter === 'function') { + label = labelFormatter(value); + } + } + + return label; + } + + var PI2$9 = Math.PI * 2; + + var GaugeView = + /** @class */ + function (_super) { + __extends(GaugeView, _super); + + function GaugeView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GaugeView.type; + return _this; + } + + GaugeView.prototype.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); + + this._data = seriesModel.getData(); + }; + + GaugeView.prototype.dispose = function () {}; + + GaugeView.prototype._renderMain = function (seriesModel, ecModel, api, colorList, posInfo) { + var group = this.group; + var clockwise = seriesModel.get('clockwise'); + var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI; + var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI; + var axisLineModel = seriesModel.getModel('axisLine'); + var roundCap = axisLineModel.get('roundCap'); + var MainPath = roundCap ? SausagePath : Sector; + var showAxis = axisLineModel.get('show'); + var lineStyleModel = axisLineModel.getModel('lineStyle'); + var axisLineWidth = lineStyleModel.get('width'); + var angleRangeSpan = !((endAngle - startAngle) % PI2$9) && endAngle !== startAngle ? PI2$9 : (endAngle - startAngle) % PI2$9; + var prevEndAngle = startAngle; + + for (var i = 0; showAxis && i < colorList.length; i++) { + // Clamp + var percent = Math.min(Math.max(colorList[i][0], 0), 1); + endAngle = startAngle + angleRangeSpan * percent; + var sector = new MainPath({ + 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', 'width'])); + group.add(sector); + prevEndAngle = endAngle; + } + + var getColor = function (percent) { + // Less than 0 + if (percent <= 0) { + return colorList[0][1]; + } + + var i; + + for (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, axisLineWidth); + + this._renderTitleAndDetail(seriesModel, ecModel, api, getColor, posInfo); + + this._renderAnchor(seriesModel, posInfo); + + this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth); + }; + + GaugeView.prototype._renderTicks = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { + 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$1(splitLineModel.get('length'), r); + var tickLen = parsePercent$1(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 splitLineDistance = splitLineModel.get('distance'); + var unitX; + var unitY; + + for (var i = 0; i <= splitNumber; i++) { + unitX = Math.cos(angle); + unitY = Math.sin(angle); // Split line + + if (splitLineModel.get('show')) { + var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth; + var splitLine = new Line({ + shape: { + x1: unitX * (r - distance) + cx, + y1: unitY * (r - distance) + cy, + x2: unitX * (r - splitLineLen - distance) + cx, + y2: unitY * (r - splitLineLen - distance) + cy + }, + style: splitLineStyle, + silent: true + }); + + if (splitLineStyle.stroke === 'auto') { + splitLine.setStyle({ + stroke: getColor(i / splitNumber) + }); + } + + group.add(splitLine); + } // Label + + + if (labelModel.get('show')) { + var distance = labelModel.get('distance') + splitLineDistance; + var label = formatLabel(round(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get('formatter')); + var autoColor = getColor(i / splitNumber); + group.add(new ZRText({ + style: createTextStyle(labelModel, { + text: label, + x: unitX * (r - splitLineLen - distance) + cx, + y: unitY * (r - splitLineLen - distance) + cy, + verticalAlign: unitY < -0.8 ? 'top' : unitY > 0.8 ? 'bottom' : 'middle', + align: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center' + }, { + inheritColor: autoColor + }), + silent: true + })); + } // Axis tick + + + if (tickModel.get('show') && i !== splitNumber) { + var distance = tickModel.get('distance'); + distance = distance ? distance + axisLineWidth : axisLineWidth; + + for (var j = 0; j <= subSplitNumber; j++) { + unitX = Math.cos(angle); + unitY = Math.sin(angle); + var tickLine = new Line({ + shape: { + x1: unitX * (r - distance) + cx, + y1: unitY * (r - distance) + cy, + x2: unitX * (r - tickLen - distance) + cx, + y2: unitY * (r - tickLen - distance) + 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; + } + } + }; + + GaugeView.prototype._renderPointer = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { + var group = this.group; + var oldData = this._data; + var oldProgressData = this._progressEls; + var progressList = []; + var showPointer = seriesModel.get(['pointer', 'show']); + var progressModel = seriesModel.getModel('progress'); + var showProgress = progressModel.get('show'); + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var valueExtent = [minVal, maxVal]; + var angleExtent = [startAngle, endAngle]; + + function createPointer(idx, angle) { + var itemModel = data.getItemModel(idx); + var pointerModel = itemModel.getModel('pointer'); + var pointerWidth = parsePercent$1(pointerModel.get('width'), posInfo.r); + var pointerLength = parsePercent$1(pointerModel.get('length'), posInfo.r); + var pointerStr = seriesModel.get(['pointer', 'icon']); + var pointerOffset = pointerModel.get('offsetCenter'); + var pointerOffsetX = parsePercent$1(pointerOffset[0], posInfo.r); + var pointerOffsetY = parsePercent$1(pointerOffset[1], posInfo.r); + var pointerKeepAspect = pointerModel.get('keepAspect'); + var pointer; // not exist icon type will be set 'rect' + + if (pointerStr) { + pointer = createSymbol(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect); + } else { + pointer = new PointerPath({ + shape: { + angle: -Math.PI / 2, + width: pointerWidth, + r: pointerLength, + x: pointerOffsetX, + y: pointerOffsetY + } + }); + } + + pointer.rotation = -(angle + Math.PI / 2); + pointer.x = posInfo.cx; + pointer.y = posInfo.cy; + return pointer; + } + + function createProgress(idx, endAngle) { + var roundCap = progressModel.get('roundCap'); + var ProgressPath = roundCap ? SausagePath : Sector; + var isOverlap = progressModel.get('overlap'); + var progressWidth = isOverlap ? progressModel.get('width') : axisLineWidth / data.count(); + var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth; + var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth; + var progress = new ProgressPath({ + shape: { + startAngle: startAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: r0, + r: r + } + }); + isOverlap && (progress.z2 = maxVal - data.get(valueDim, idx) % maxVal); + return progress; + } + + if (showProgress || showPointer) { + data.diff(oldData).add(function (idx) { + if (showPointer) { + var pointer = createPointer(idx, startAngle); + initProps(pointer, { + rotation: -(linearMap(data.get(valueDim, idx), valueExtent, angleExtent, true) + Math.PI / 2) + }, seriesModel); + group.add(pointer); + data.setItemGraphicEl(idx, pointer); + } + + if (showProgress) { + var progress = createProgress(idx, startAngle); + var isClip = progressModel.get('clip'); + initProps(progress, { + shape: { + endAngle: linearMap(data.get(valueDim, idx), valueExtent, angleExtent, isClip) + } + }, seriesModel); + group.add(progress); + progressList[idx] = progress; + } + }).update(function (newIdx, oldIdx) { + if (showPointer) { + var previousPointer = oldData.getItemGraphicEl(oldIdx); + var previousRotate = previousPointer ? previousPointer.rotation : startAngle; + var pointer = createPointer(newIdx, previousRotate); + pointer.rotation = previousRotate; + updateProps(pointer, { + rotation: -(linearMap(data.get(valueDim, newIdx), valueExtent, angleExtent, true) + Math.PI / 2) + }, seriesModel); + group.add(pointer); + data.setItemGraphicEl(newIdx, pointer); + } + + if (showProgress) { + var previousProgress = oldProgressData[oldIdx]; + var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle; + var progress = createProgress(newIdx, previousEndAngle); + var isClip = progressModel.get('clip'); + updateProps(progress, { + shape: { + endAngle: linearMap(data.get(valueDim, newIdx), valueExtent, angleExtent, isClip) + } + }, seriesModel); + group.add(progress); + progressList[newIdx] = progress; + } + }).execute(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + + if (showPointer) { + var pointer = data.getItemGraphicEl(idx); + pointer.useStyle(data.getItemVisual(idx, 'style')); + pointer.setStyle(itemModel.getModel(['pointer', 'itemStyle']).getItemStyle()); + + if (pointer.style.fill === 'auto') { + pointer.setStyle('fill', getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true))); + } + + pointer.z2EmphasisLift = 0; + setStatesStylesFromModel(pointer, itemModel); + enableHoverEmphasis(pointer, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + } + + if (showProgress) { + var progress = progressList[idx]; + progress.useStyle(data.getItemVisual(idx, 'style')); + progress.setStyle(itemModel.getModel(['progress', 'itemStyle']).getItemStyle()); + progress.z2EmphasisLift = 0; + setStatesStylesFromModel(progress, itemModel); + enableHoverEmphasis(progress, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + } + }); + this._progressEls = progressList; + } + }; + + GaugeView.prototype._renderAnchor = function (seriesModel, posInfo) { + var anchorModel = seriesModel.getModel('anchor'); + var showAnchor = anchorModel.get('show'); + + if (showAnchor) { + var anchorSize = anchorModel.get('size'); + var anchorType = anchorModel.get('icon'); + var offsetCenter = anchorModel.get('offsetCenter'); + var anchorKeepAspect = anchorModel.get('keepAspect'); + var anchor = createSymbol(anchorType, posInfo.cx - anchorSize / 2 + parsePercent$1(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent$1(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect); + anchor.z2 = anchorModel.get('showAbove') ? 1 : 0; + anchor.setStyle(anchorModel.getModel('itemStyle').getItemStyle()); + this.group.add(anchor); + } + }; + + GaugeView.prototype._renderTitleAndDetail = function (seriesModel, ecModel, api, getColor, posInfo) { + var _this = this; + + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var contentGroup = new Group(); + var newTitleEls = []; + var newDetailEls = []; + var hasAnimation = seriesModel.isAnimationEnabled(); + data.diff(this._data).add(function (idx) { + newTitleEls[idx] = new ZRText({ + silent: true + }); + newDetailEls[idx] = new ZRText({ + silent: true + }); + }).update(function (idx, oldIdx) { + newTitleEls[idx] = _this._titleEls[oldIdx]; + newDetailEls[idx] = _this._detailEls[oldIdx]; + }).execute(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var value = data.get(valueDim, idx); + var itemGroup = new Group(); + var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true)); + var itemTitleModel = itemModel.getModel('title'); + + if (itemTitleModel.get('show')) { + var titleOffsetCenter = itemTitleModel.get('offsetCenter'); + var titleX = posInfo.cx + parsePercent$1(titleOffsetCenter[0], posInfo.r); + var titleY = posInfo.cy + parsePercent$1(titleOffsetCenter[1], posInfo.r); + var labelEl = newTitleEls[idx]; + labelEl.attr({ + style: createTextStyle(itemTitleModel, { + x: titleX, + y: titleY, + text: data.getName(idx), + align: 'center', + verticalAlign: 'middle' + }, { + inheritColor: autoColor + }) + }); + itemGroup.add(labelEl); + } + + var itemDetailModel = itemModel.getModel('detail'); + + if (itemDetailModel.get('show')) { + var detailOffsetCenter = itemDetailModel.get('offsetCenter'); + var detailX = posInfo.cx + parsePercent$1(detailOffsetCenter[0], posInfo.r); + var detailY = posInfo.cy + parsePercent$1(detailOffsetCenter[1], posInfo.r); + var width = parsePercent$1(itemDetailModel.get('width'), posInfo.r); + var height = parsePercent$1(itemDetailModel.get('height'), posInfo.r); + var detailColor = seriesModel.get(['progress', 'show']) ? data.getItemVisual(idx, 'style').fill : autoColor; + var labelEl = newDetailEls[idx]; + var formatter_1 = itemDetailModel.get('formatter'); + labelEl.attr({ + style: createTextStyle(itemDetailModel, { + x: detailX, + y: detailY, + text: formatLabel(value, formatter_1), + width: isNaN(width) ? null : width, + height: isNaN(height) ? null : height, + align: 'center', + verticalAlign: 'middle' + }, { + inheritColor: detailColor + }) + }); + setLabelValueAnimation(labelEl, { + normal: itemDetailModel + }, value, function (value) { + return formatLabel(value, formatter_1); + }); + hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, { + getFormattedLabel: function (labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) { + return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1); + } + }); + itemGroup.add(labelEl); + } + + contentGroup.add(itemGroup); + }); + this.group.add(contentGroup); + this._titleEls = newTitleEls; + this._detailEls = newDetailEls; + }; + + GaugeView.type = 'gauge'; + return GaugeView; + }(ChartView); + + var GaugeSeriesModel = + /** @class */ + function (_super) { + __extends(GaugeSeriesModel, _super); + + function GaugeSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GaugeSeriesModel.type; + _this.visualStyleAccessPath = 'itemStyle'; + _this.useColorPaletteOnData = true; + return _this; + } + + GaugeSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListSimply(this, ['value']); + }; + + GaugeSeriesModel.type = 'series.gauge'; + GaugeSeriesModel.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, + roundCap: false, + lineStyle: { + color: [[1, '#E6EBF8']], + width: 10 + } + }, + // 坐标轴线 + progress: { + // 默认显示,属性show控制显示与否 + show: false, + overlap: true, + width: 10, + roundCap: false, + clip: true + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性length控制线长 + length: 10, + distance: 10, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: '#63677A', + width: 3, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认不显示 + show: true, + // 每份split细分多少段 + splitNumber: 5, + // 属性length控制线长 + length: 6, + distance: 10, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#63677A', + width: 1, + type: 'solid' + } + }, + axisLabel: { + show: true, + distance: 15, + // formatter: null, + color: '#464646', + fontSize: 12 + }, + pointer: { + icon: null, + offsetCenter: [0, 0], + show: true, + length: '60%', + width: 6, + keepAspect: false + }, + anchor: { + show: false, + showAbove: false, + size: 6, + icon: 'circle', + offsetCenter: [0, 0], + keepAspect: false, + itemStyle: { + color: '#fff', + borderWidth: 0, + borderColor: '#5470c6' + } + }, + title: { + show: true, + // x, y,单位px + offsetCenter: [0, '20%'], + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#464646', + fontSize: 16, + valueAnimation: false + }, + detail: { + show: true, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 0, + borderColor: '#ccc', + width: 100, + height: null, + padding: [5, 10], + // x, y,单位px + offsetCenter: [0, '40%'], + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#464646', + fontSize: 30, + fontWeight: 'bold', + lineHeight: 30, + valueAnimation: false + } + }; + return GaugeSeriesModel; + }(SeriesModel); + + function install$e(registers) { + registers.registerChartView(GaugeView); + registers.registerSeriesModel(GaugeSeriesModel); + } + + var opacityAccessPath = ['itemStyle', 'opacity']; + /** + * Piece of pie including Sector, Label, LabelLine + */ + + var FunnelPiece = + /** @class */ + function (_super) { + __extends(FunnelPiece, _super); + + function FunnelPiece(data, idx) { + var _this = _super.call(this) || this; + + var polygon = _this; + var labelLine = new Polyline(); + var text = new ZRText(); + polygon.setTextContent(text); + + _this.setTextGuideLine(labelLine); + + _this.updateData(data, idx, true); + + return _this; + } + + FunnelPiece.prototype.updateData = function (data, idx, firstCreate) { + var polygon = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var opacity = itemModel.get(opacityAccessPath); + opacity = opacity == null ? 1 : opacity; // Update common style + + polygon.useStyle(data.getItemVisual(idx, 'style')); + polygon.style.lineJoin = 'round'; + + if (firstCreate) { + polygon.setShape({ + points: layout.points + }); + polygon.style.opacity = 0; + initProps(polygon, { + style: { + opacity: opacity + } + }, seriesModel, idx); + } else { + updateProps(polygon, { + style: { + opacity: opacity + }, + shape: { + points: layout.points + } + }, seriesModel, idx); + } + + setStatesStylesFromModel(polygon, itemModel); + + this._updateLabel(data, idx); + + enableHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + }; + + FunnelPiece.prototype._updateLabel = function (data, idx) { + var polygon = this; + var labelLine = this.getTextGuideLine(); + var labelText = polygon.getTextContent(); + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var style = data.getItemVisual(idx, 'style'); + var visualColor = style.fill; + setLabelStyle( // position will not be used in setLabelStyle + labelText, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + defaultOpacity: style.opacity, + defaultText: data.getName(idx) + }, { + normal: { + align: labelLayout.textAlign, + verticalAlign: labelLayout.verticalAlign + } + }); + polygon.setTextConfig({ + local: true, + inside: !!labelLayout.inside, + insideStroke: visualColor, + // insideFill: 'auto', + outsideFill: visualColor + }); + var linePoints = labelLayout.linePoints; + labelLine.setShape({ + points: linePoints + }); + polygon.textGuideLineConfig = { + anchor: linePoints ? new Point(linePoints[0][0], linePoints[0][1]) : null + }; // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + + updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel, idx); + labelText.attr({ + rotation: labelLayout.rotation, + originX: labelLayout.x, + originY: labelLayout.y, + z2: 10 + }); + setLabelLineStyle(polygon, getLabelLineStatesModels(itemModel), { + // Default use item visual color + stroke: visualColor + }); + }; + + return FunnelPiece; + }(Polygon); + + var FunnelView = + /** @class */ + function (_super) { + __extends(FunnelView, _super); + + function FunnelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = FunnelView.type; + _this.ignoreLabelLineUpdate = true; + return _this; + } + + FunnelView.prototype.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 piece = oldData.getItemGraphicEl(oldIdx); + piece.updateData(data, newIdx); + group.add(piece); + data.setItemGraphicEl(newIdx, piece); + }).remove(function (idx) { + var piece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piece, seriesModel, idx); + }).execute(); + this._data = data; + }; + + FunnelView.prototype.remove = function () { + this.group.removeAll(); + this._data = null; + }; + + FunnelView.prototype.dispose = function () {}; + + FunnelView.type = 'funnel'; + return FunnelView; + }(ChartView); + + var FunnelSeriesModel = + /** @class */ + function (_super) { + __extends(FunnelSeriesModel, _super); + + function FunnelSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = FunnelSeriesModel.type; + _this.useColorPaletteOnData = true; + return _this; + } + + FunnelSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); // Extend labelLine emphasis + + this._defaultLabelLine(option); + }; + + FunnelSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + }; + + FunnelSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false` + + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; // Overwrite + + + FunnelSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); + + var params = _super.prototype.getDataParams.call(this, dataIndex); + + var valueDim = data.mapDimension('value'); + var sum = data.getSum(valueDim); // Percent is 0 if sum is 0 + + params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) / sum * 100).toFixed(2); + params.$vars.push('percent'); + return params; + }; + + FunnelSeriesModel.type = 'series.funnel'; + FunnelSeriesModel.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', + orient: 'vertical', + gap: 0, + funnelAlign: 'center', + label: { + show: true, + position: 'outer' // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + }, + labelLine: { + show: true, + length: 20, + lineStyle: { + // color: 各异, + width: 1 + } + }, + itemStyle: { + // color: 各异, + borderColor: '#fff', + borderWidth: 1 + }, + emphasis: { + label: { + show: true + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return FunnelSeriesModel; + }(SeriesModel); + + function getViewRect$3(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function getSortedIndices(data, sort) { + var valueDim = data.mapDimension('value'); + var valueArr = data.mapArray(valueDim, function (val) { + return val; + }); + var indices = []; + var isAscending = sort === 'ascending'; + + for (var i = 0, len = data.count(); i < len; i++) { + indices[i] = i; + } // Add custom sortable function & none sortable opetion by "options.sort" + + + if (typeof sort === 'function') { + indices.sort(sort); + } else if (sort !== 'none') { + indices.sort(function (a, b) { + return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a]; + }); + } + + return indices; + } + + function labelLayout(data) { + var seriesModel = data.hostModel; + var orient = seriesModel.get('orient'); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + var labelPosition = labelModel.get('position'); + var labelLineModel = itemModel.getModel('labelLine'); + var layout = data.getItemLayout(idx); + var points = layout.points; + var isLabelInside = labelPosition === 'inner' || labelPosition === 'inside' || labelPosition === 'center' || labelPosition === 'insideLeft' || labelPosition === 'insideRight'; + var textAlign; + var textX; + var textY; + var linePoints; + + if (isLabelInside) { + if (labelPosition === 'insideLeft') { + textX = (points[0][0] + points[3][0]) / 2 + 5; + textY = (points[0][1] + points[3][1]) / 2; + textAlign = 'left'; + } else if (labelPosition === 'insideRight') { + textX = (points[1][0] + points[2][0]) / 2 - 5; + textY = (points[1][1] + points[2][1]) / 2; + textAlign = 'right'; + } else { + 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 = void 0; + var y1 = void 0; + var x2 = void 0; + var y2 = void 0; + var labelLineLen = labelLineModel.get('length'); + + if ("development" !== 'production') { + if (orient === 'vertical' && ['top', 'bottom'].indexOf(labelPosition) > -1) { + labelPosition = 'left'; + console.warn('Position error: Funnel chart on vertical orient dose not support top and bottom.'); + } + + if (orient === 'horizontal' && ['left', 'right'].indexOf(labelPosition) > -1) { + labelPosition = 'bottom'; + console.warn('Position error: Funnel chart on horizontal orient dose not support left and right.'); + } + } + + 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 if (labelPosition === 'right') { + // 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'; + } else if (labelPosition === 'top') { + // Top side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else if (labelPosition === 'bottom') { + // Bottom side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else if (labelPosition === 'rightTop') { + // RightTop side + x1 = orient === 'horizontal' ? points[3][0] : points[1][0]; + y1 = orient === 'horizontal' ? points[3][1] : points[1][1]; + + if (orient === 'horizontal') { + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'top'; + } + } else if (labelPosition === 'rightBottom') { + // RightBottom side + x1 = points[2][0]; + y1 = points[2][1]; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'bottom'; + } + } else if (labelPosition === 'leftTop') { + // LeftTop side + x1 = points[0][0]; + y1 = orient === 'horizontal' ? points[0][1] : points[1][1]; + + if (orient === 'horizontal') { + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else { + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + } else if (labelPosition === 'leftBottom') { + // LeftBottom side + x1 = orient === 'horizontal' ? points[1][0] : points[3][0]; + y1 = orient === 'horizontal' ? points[1][1] : points[2][1]; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + } else { + // Right side or Bottom side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } + } + + if (orient === 'horizontal') { + x2 = x1; + textX = x2; + } else { + y2 = y1; + textY = y2; + } + + linePoints = [[x1, y1], [x2, y2]]; + } + + layout.label = { + linePoints: linePoints, + x: textX, + y: textY, + verticalAlign: 'middle', + textAlign: textAlign, + inside: isLabelInside + }; + }); + } + + function funnelLayout(ecModel, api) { + ecModel.eachSeriesByType('funnel', function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var sort = seriesModel.get('sort'); + var viewRect = getViewRect$3(seriesModel, api); + var orient = seriesModel.get('orient'); + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + var indices = getSortedIndices(data, sort); + var x = viewRect.x; + var y = viewRect.y; + var sizeExtent = orient === 'horizontal' ? [parsePercent$1(seriesModel.get('minSize'), viewHeight), parsePercent$1(seriesModel.get('maxSize'), viewHeight)] : [parsePercent$1(seriesModel.get('minSize'), viewWidth), parsePercent$1(seriesModel.get('maxSize'), viewWidth)]; + var dataExtent = data.getDataExtent(valueDim); + 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 viewSize = orient === 'horizontal' ? viewWidth : viewHeight; + var itemSize = (viewSize - gap * (data.count() - 1)) / data.count(); + + var getLinePoints = function (idx, offset) { + // End point index is data.count() and we assign it 0 + if (orient === 'horizontal') { + var val_1 = data.get(valueDim, idx) || 0; + var itemHeight = linearMap(val_1, [min, max], sizeExtent, true); + var y0 = void 0; + + switch (funnelAlign) { + case 'top': + y0 = y; + break; + + case 'center': + y0 = y + (viewHeight - itemHeight) / 2; + break; + + case 'bottom': + y0 = y + (viewHeight - itemHeight); + break; + } + + return [[offset, y0], [offset, y0 + itemHeight]]; + } + + var val = data.get(valueDim, idx) || 0; + var itemWidth = linearMap(val, [min, max], sizeExtent, true); + var x0; + + switch (funnelAlign) { + case 'left': + x0 = x; + break; + + case 'center': + x0 = x + (viewWidth - itemWidth) / 2; + break; + + case 'right': + x0 = x + viewWidth - itemWidth; + break; + } + + return [[x0, offset], [x0 + itemWidth, offset]]; + }; + + if (sort === 'ascending') { + // From bottom to top + itemSize = -itemSize; + gap = -gap; + + if (orient === 'horizontal') { + x += viewWidth; + } else { + y += viewHeight; + } + + indices = indices.reverse(); + } + + for (var i = 0; i < indices.length; i++) { + var idx = indices[i]; + var nextIdx = indices[i + 1]; + var itemModel = data.getItemModel(idx); + + if (orient === 'horizontal') { + var width = itemModel.get(['itemStyle', 'width']); + + if (width == null) { + width = itemSize; + } else { + width = parsePercent$1(width, viewWidth); + + if (sort === 'ascending') { + width = -width; + } + } + + var start = getLinePoints(idx, x); + var end = getLinePoints(nextIdx, x + width); + x += width + gap; + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } else { + var height = itemModel.get(['itemStyle', 'height']); + + if (height == null) { + height = itemSize; + } else { + height = parsePercent$1(height, viewHeight); + + if (sort === 'ascending') { + height = -height; + } + } + + var start = getLinePoints(idx, y); + var end = getLinePoints(nextIdx, y + height); + y += height + gap; + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } + } + + labelLayout(data); + }); + } + + function install$f(registers) { + registers.registerChartView(FunnelView); + registers.registerSeriesModel(FunnelSeriesModel); + registers.registerLayout(funnelLayout); + registers.registerProcessor(dataFilter('funnel')); + } + + var DEFAULT_SMOOTH = 0.3; + + var ParallelView = + /** @class */ + function (_super) { + __extends(ParallelView, _super); + + function ParallelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelView.type; + _this._dataGroup = new Group(); + _this._initialized = false; + return _this; + } + + ParallelView.prototype.init = function () { + this.group.add(this._dataGroup); + }; + /** + * @override + */ + + + ParallelView.prototype.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; + var seriesScope = makeSeriesScope$2(seriesModel); + data.diff(oldData).add(add).update(update).remove(remove).execute(); + + function add(newDataIndex) { + var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function update(newDataIndex, oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + var points = createLinePoints(data, newDataIndex, dimensions, coordSys); + data.setItemGraphicEl(newDataIndex, line); + updateProps(line, { + shape: { + points: points + } + }, seriesModel, newDataIndex); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function remove(oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + dataGroup.remove(line); + } // First create + + + if (!this._initialized) { + this._initialized = true; + var clipPath = createGridClipShape(coordSys, seriesModel, function () { + // Callback will be invoked immediately if there is no animation + setTimeout(function () { + dataGroup.removeClipPath(); + }); + }); + dataGroup.setClipPath(clipPath); + } + + this._data = data; + }; + + ParallelView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this._initialized = true; + this._data = null; + + this._dataGroup.removeAll(); + }; + + ParallelView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + + for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) { + var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys); + line.incremental = true; + updateElCommon(line, data, dataIndex, seriesScope); + } + }; + + ParallelView.prototype.remove = function () { + this._dataGroup && this._dataGroup.removeAll(); + this._data = null; + }; + + ParallelView.type = 'parallel'; + return ParallelView; + }(ChartView); + + function createGridClipShape(coordSys, seriesModel, cb) { + var parallelModel = coordSys.model; + var rect = coordSys.getRect(); + var rectEl = new 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); + initProps(rectEl, { + shape: { + width: rect.width, + height: rect.height + } + }, seriesModel, cb); + return rectEl; + } + + function createLinePoints(data, dataIndex, dimensions, coordSys) { + var points = []; + + for (var i = 0; i < dimensions.length; i++) { + var dimName = dimensions[i]; + var value = data.get(data.mapDimension(dimName), dataIndex); + + if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) { + points.push(coordSys.dataToPoint(value, dimName)); + } + } + + return points; + } + + function addEl(data, dataGroup, dataIndex, dimensions, coordSys) { + var points = createLinePoints(data, dataIndex, dimensions, coordSys); + var line = new Polyline({ + shape: { + points: points + }, + // silent: true, + z2: 10 + }); + dataGroup.add(line); + data.setItemGraphicEl(dataIndex, line); + return line; + } + + function makeSeriesScope$2(seriesModel) { + var smooth = seriesModel.get('smooth', true); + smooth === true && (smooth = DEFAULT_SMOOTH); + smooth = numericToNumber(smooth); + eqNaN(smooth) && (smooth = 0); + return { + smooth: smooth + }; + } + + function updateElCommon(el, data, dataIndex, seriesScope) { + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.fill = null; + el.setShape('smooth', seriesScope.smooth); + var itemModel = data.getItemModel(dataIndex); + var emphasisModel = itemModel.getModel('emphasis'); + setStatesStylesFromModel(el, itemModel, 'lineStyle'); + enableHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + } // function simpleDiff(oldData, newData, dimensions) { + // let oldLen; + // if (!oldData + // || !oldData.__plProgressive + // || (oldLen = oldData.count()) !== newData.count() + // ) { + // return true; + // } + // let dimLen = dimensions.length; + // for (let i = 0; i < oldLen; i++) { + // for (let j = 0; j < dimLen; j++) { + // if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) { + // return true; + // } + // } + // } + // return false; + // } + // FIXME put in common util? + + + function isEmptyValue(val, axisType) { + return axisType === 'category' ? val == null : val == null || isNaN(val); // axisType === 'value' + } + + var ParallelSeriesModel = + /** @class */ + function (_super) { + __extends(ParallelSeriesModel, _super); + + function ParallelSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelSeriesModel.type; + _this.visualStyleAccessPath = 'lineStyle'; + _this.visualDrawType = 'stroke'; + return _this; + } + + ParallelSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListFromArray(this.getSource(), this, { + useEncodeDefaulter: bind(makeDefaultEncode, null, this) + }); + }; + /** + * User can get data raw indices on 'axisAreaSelected' event received. + * + * @return Raw indices + */ + + + ParallelSeriesModel.prototype.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; + }; + + ParallelSeriesModel.type = 'series.parallel'; + ParallelSeriesModel.dependencies = ['parallel']; + ParallelSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'parallel', + parallelIndex: 0, + label: { + show: false + }, + inactiveOpacity: 0.05, + activeOpacity: 1, + lineStyle: { + width: 1, + opacity: 0.45, + type: 'solid' + }, + emphasis: { + label: { + show: false + } + }, + progressive: 500, + smooth: false, + animationEasing: 'linear' + }; + return ParallelSeriesModel; + }(SeriesModel); + + function makeDefaultEncode(seriesModel) { + // The mapping of parallelAxis dimension to data dimension can + // be specified in parallelAxis.option.dim. For example, if + // parallelAxis.option.dim is 'dim3', it mapping to the third + // dimension of data. But `data.encode` has higher priority. + // Moreover, parallelModel.dimension should not be regarded as data + // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6']; + var parallelModel = seriesModel.ecModel.getComponent('parallel', seriesModel.get('parallelIndex')); + + if (!parallelModel) { + return; + } + + var encodeDefine = {}; + each(parallelModel.dimensions, function (axisDim) { + var dataDimIndex = convertDimNameToNumber(axisDim); + encodeDefine[axisDim] = dataDimIndex; + }); + return encodeDefine; + } + + function convertDimNameToNumber(dimName) { + return +dimName.replace('dim', ''); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var opacityAccessPath$1 = ['lineStyle', 'opacity']; + var parallelVisual = { + seriesType: 'parallel', + reset: function (seriesModel, ecModel) { + var coordSys = seriesModel.coordinateSystem; + var opacityMap = { + normal: seriesModel.get(['lineStyle', 'opacity']), + active: seriesModel.get('activeOpacity'), + inactive: seriesModel.get('inactiveOpacity') + }; + return { + progress: function (params, data) { + coordSys.eachActiveState(data, function (activeState, dataIndex) { + var opacity = opacityMap[activeState]; + + if (activeState === 'normal' && data.hasItemOption) { + var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath$1, true); + itemOpacity != null && (opacity = itemOpacity); + } + + var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style'); + existsStyle.opacity = opacity; + }, params.start, params.end); + } + }; + } + }; + + function parallelPreprocessor(option) { + createParallelIfNeeded(option); + mergeAxisOptionFromParallel(option); + } + /** + * Create a parallel coordinate if not exists. + * @inner + */ + + function createParallelIfNeeded(option) { + if (option.parallel) { + return; + } + + var hasParallelSeries = false; + 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 = normalizeToArray(option.parallelAxis); + each(axes, function (axisOption) { + if (!isObject(axisOption)) { + return; + } + + var parallelIndex = axisOption.parallelIndex || 0; + var parallelOption = normalizeToArray(option.parallel)[parallelIndex]; + + if (parallelOption && parallelOption.parallelAxisDefault) { + merge(axisOption, parallelOption.parallelAxisDefault, false); + } + }); + } + + var CLICK_THRESHOLD = 5; // > 4 + + var ParallelView$1 = + /** @class */ + function (_super) { + __extends(ParallelView, _super); + + function ParallelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelView.type; + return _this; + } + + ParallelView.prototype.render = function (parallelModel, ecModel, api) { + this._model = parallelModel; + this._api = api; + + if (!this._handlers) { + this._handlers = {}; + each(handlers, function (handler, eventName) { + api.getZr().on(eventName, this._handlers[eventName] = bind(handler, this)); + }, this); + } + + createOrUpdate(this, '_throttledDispatchExpand', parallelModel.get('axisExpandRate'), 'fixRate'); + }; + + ParallelView.prototype.dispose = function (ecModel, api) { + each(this._handlers, function (handler, eventName) { + api.getZr().off(eventName, handler); + }); + this._handlers = null; + }; + /** + * @internal + * @param {Object} [opt] If null, cancle the last action triggering for debounce. + */ + + + ParallelView.prototype._throttledDispatchExpand = function (opt) { + this._dispatchExpand(opt); + }; + /** + * @internal + */ + + + ParallelView.prototype._dispatchExpand = function (opt) { + opt && this._api.dispatchAction(extend({ + type: 'parallelAxisExpand' + }, opt)); + }; + + ParallelView.type = 'parallel'; + return ParallelView; + }(ComponentView); + + var handlers = { + mousedown: function (e) { + if (checkTrigger(this, 'click')) { + this._mouseDownPoint = [e.offsetX, e.offsetY]; + } + }, + mouseup: function (e) { + var mouseDownPoint = this._mouseDownPoint; + + if (checkTrigger(this, 'click') && mouseDownPoint) { + var point = [e.offsetX, e.offsetY]; + var dist = Math.pow(mouseDownPoint[0] - point[0], 2) + Math.pow(mouseDownPoint[1] - point[1], 2); + + if (dist > CLICK_THRESHOLD) { + return; + } + + var result = this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); + + result.behavior !== 'none' && this._dispatchExpand({ + axisExpandWindow: result.axisExpandWindow + }); + } + + this._mouseDownPoint = null; + }, + mousemove: function (e) { + // Should do nothing when brushing. + if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) { + return; + } + + var model = this._model; + var result = model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); + var behavior = result.behavior; + behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce')); + + this._throttledDispatchExpand(behavior === 'none' ? null // Cancle the last trigger, in case that mouse slide out of the area quickly. + : { + axisExpandWindow: result.axisExpandWindow, + // Jumping uses animation, and sliding suppresses animation. + animation: behavior === 'jump' ? null : { + duration: 0 // Disable animation. + + } + }); + } + }; + + function checkTrigger(view, triggerOn) { + var model = view._model; + return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn; + } + + var ParallelModel = + /** @class */ + function (_super) { + __extends(ParallelModel, _super); + + function ParallelModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelModel.type; + return _this; + } + + ParallelModel.prototype.init = function () { + _super.prototype.init.apply(this, arguments); + + this.mergeOption({}); + }; + + ParallelModel.prototype.mergeOption = function (newOption) { + var thisOption = this.option; + newOption && merge(thisOption, newOption, true); + + this._initDimensions(); + }; + /** + * Whether series or axis is in this coordinate system. + */ + + + ParallelModel.prototype.contains = function (model, ecModel) { + var parallelIndex = model.get('parallelIndex'); + return parallelIndex != null && ecModel.getComponent('parallel', parallelIndex) === this; + }; + + ParallelModel.prototype.setAxisExpand = function (opt) { + each(['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'], function (name) { + if (opt.hasOwnProperty(name)) { + // @ts-ignore FIXME: why "never" inferred in this.option[name]? + this.option[name] = opt[name]; + } + }, this); + }; + + ParallelModel.prototype._initDimensions = function () { + var dimensions = this.dimensions = []; + var parallelAxisIndex = this.parallelAxisIndex = []; + var axisModels = filter(this.ecModel.queryComponents({ + mainType: 'parallelAxis' + }), function (axisModel) { + // Can not use this.contains here, because + // initialization has not been completed yet. + return (axisModel.get('parallelIndex') || 0) === this.componentIndex; + }, this); + each(axisModels, function (axisModel) { + dimensions.push('dim' + axisModel.get('dim')); + parallelAxisIndex.push(axisModel.componentIndex); + }); + }; + + ParallelModel.type = 'parallel'; + ParallelModel.dependencies = ['parallelAxis']; + ParallelModel.layoutMode = 'box'; + ParallelModel.defaultOption = { + zlevel: 0, + z: 0, + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + layout: 'horizontal', + // FIXME + // naming? + axisExpandable: false, + axisExpandCenter: null, + axisExpandCount: 0, + axisExpandWidth: 50, + axisExpandRate: 17, + axisExpandDebounce: 50, + // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full. + // Do not doc to user until necessary. + axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4], + axisExpandTriggerOn: 'click', + parallelAxisDefault: null + }; + return ParallelModel; + }(ComponentModel); + + var ParallelAxis = + /** @class */ + function (_super) { + __extends(ParallelAxis, _super); + + function ParallelAxis(dim, scale, coordExtent, axisType, axisIndex) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + _this.axisIndex = axisIndex; + return _this; + } + + ParallelAxis.prototype.isHorizontal = function () { + return this.coordinateSystem.getModel().get('layout') !== 'horizontal'; + }; + + return ParallelAxis; + }(Axis); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * Calculate slider move result. + * Usage: + * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as + * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`. + * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`. + * + * @param delta Move length. + * @param handleEnds handleEnds[0] can be bigger then handleEnds[1]. + * handleEnds will be modified in this method. + * @param extent handleEnds is restricted by extent. + * extent[0] should less or equals than extent[1]. + * @param handleIndex Can be 'all', means that both move the two handleEnds. + * @param minSpan The range of dataZoom can not be smaller than that. + * If not set, handle0 and cross handle1. If set as a non-negative + * number (including `0`), handles will push each other when reaching + * the minSpan. + * @param maxSpan The range of dataZoom can not be larger than that. + * @return The input handleEnds. + */ + function sliderMove(delta, handleEnds, extent, handleIndex, minSpan, maxSpan) { + delta = delta || 0; + var extentSpan = extent[1] - extent[0]; // Notice maxSpan and minSpan can be null/undefined. + + if (minSpan != null) { + minSpan = restrict(minSpan, [0, extentSpan]); + } + + if (maxSpan != null) { + maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0); + } + + if (handleIndex === 'all') { + var handleSpan = Math.abs(handleEnds[1] - handleEnds[0]); + handleSpan = restrict(handleSpan, [0, extentSpan]); + minSpan = maxSpan = restrict(handleSpan, [minSpan, maxSpan]); + handleIndex = 0; + } + + handleEnds[0] = restrict(handleEnds[0], extent); + handleEnds[1] = restrict(handleEnds[1], extent); + var originalDistSign = getSpanSign(handleEnds, handleIndex); + handleEnds[handleIndex] += delta; // Restrict in extent. + + var extentMinSpan = minSpan || 0; + var realExtent = extent.slice(); + originalDistSign.sign < 0 ? realExtent[0] += extentMinSpan : realExtent[1] -= extentMinSpan; + handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent); // Expand span. + + var currDistSign; + currDistSign = getSpanSign(handleEnds, handleIndex); + + if (minSpan != null && (currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan)) { + // If minSpan exists, 'cross' is forbidden. + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan; + } // Shrink span. + + + currDistSign = getSpanSign(handleEnds, handleIndex); + + if (maxSpan != null && currDistSign.span > maxSpan) { + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan; + } + + return handleEnds; + } + + function getSpanSign(handleEnds, handleIndex) { + var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex]; // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0] + // is at left of handleEnds[1] for non-cross case. + + return { + span: Math.abs(dist), + sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1 + }; + } + + function restrict(value, extend) { + return Math.min(extend[1] != null ? extend[1] : Infinity, Math.max(extend[0] != null ? extend[0] : -Infinity, value)); + } + + var each$6 = each; + var mathMin$8 = Math.min; + var mathMax$8 = Math.max; + var mathFloor$2 = Math.floor; + var mathCeil$1 = Math.ceil; + var round$2 = round; + var PI$7 = Math.PI; + + var Parallel = + /** @class */ + function () { + function Parallel(parallelModel, ecModel, api) { + this.type = 'parallel'; + /** + * key: dimension + */ + + this._axesMap = createHashMap(); + /** + * key: dimension + * value: {position: [], rotation, } + */ + + this._axesLayout = {}; + this.dimensions = parallelModel.dimensions; + this._model = parallelModel; + + this._init(parallelModel, ecModel, api); + } + + Parallel.prototype._init = function (parallelModel, ecModel, api) { + var dimensions = parallelModel.dimensions; + var parallelAxisIndex = parallelModel.parallelAxisIndex; + each$6(dimensions, function (dim, idx) { + var axisIndex = parallelAxisIndex[idx]; + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + + var axis = this._axesMap.set(dim, new ParallelAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisIndex)); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); // Injection + + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = axisModel.coordinateSystem = this; + }, this); + }; + /** + * Update axis scale after data processed + */ + + + Parallel.prototype.update = function (ecModel, api) { + this._updateAxesFromSeries(this._model, ecModel); + }; + + Parallel.prototype.containPoint = function (point) { + var layoutInfo = this._makeLayoutInfo(); + + var axisBase = layoutInfo.axisBase; + var layoutBase = layoutInfo.layoutBase; + var pixelDimIndex = layoutInfo.pixelDimIndex; + var pAxis = point[1 - pixelDimIndex]; + var pLayout = point[pixelDimIndex]; + return pAxis >= axisBase && pAxis <= axisBase + layoutInfo.axisLength && pLayout >= layoutBase && pLayout <= layoutBase + layoutInfo.layoutLength; + }; + + Parallel.prototype.getModel = function () { + return this._model; + }; + /** + * Update properties from series + */ + + + Parallel.prototype._updateAxesFromSeries = function (parallelModel, ecModel) { + ecModel.eachSeries(function (seriesModel) { + if (!parallelModel.contains(seriesModel, ecModel)) { + return; + } + + var data = seriesModel.getData(); + each$6(this.dimensions, function (dim) { + var axis = this._axesMap.get(dim); + + axis.scale.unionExtentFromData(data, data.mapDimension(dim)); + niceScaleExtent(axis.scale, axis.model); + }, this); + }, this); + }; + /** + * Resize the parallel coordinate system. + */ + + + Parallel.prototype.resize = function (parallelModel, api) { + this._rect = getLayoutRect(parallelModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + + this._layoutAxes(); + }; + + Parallel.prototype.getRect = function () { + return this._rect; + }; + + Parallel.prototype._makeLayoutInfo = function () { + var parallelModel = this._model; + var rect = this._rect; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + var layout = parallelModel.get('layout'); + var pixelDimIndex = layout === 'horizontal' ? 0 : 1; + var layoutLength = rect[wh[pixelDimIndex]]; + var layoutExtent = [0, layoutLength]; + var axisCount = this.dimensions.length; + var axisExpandWidth = restrict$1(parallelModel.get('axisExpandWidth'), layoutExtent); + var axisExpandCount = restrict$1(parallelModel.get('axisExpandCount') || 0, [0, axisCount]); + var axisExpandable = parallelModel.get('axisExpandable') && axisCount > 3 && axisCount > axisExpandCount && axisExpandCount > 1 && axisExpandWidth > 0 && layoutLength > 0; // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength], + // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow), + // where collapsed axes should be overlapped. + + var axisExpandWindow = parallelModel.get('axisExpandWindow'); + var winSize; + + if (!axisExpandWindow) { + winSize = restrict$1(axisExpandWidth * (axisExpandCount - 1), layoutExtent); + var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor$2(axisCount / 2); + axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2]; + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } else { + winSize = restrict$1(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent); + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } + + var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount); // Avoid axisCollapseWidth is too small. + + axisCollapseWidth < 3 && (axisCollapseWidth = 0); // Find the first and last indices > ewin[0] and < ewin[1]. + + var winInnerIndices = [mathFloor$2(round$2(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, mathCeil$1(round$2(axisExpandWindow[1] / axisExpandWidth, 1)) - 1]; // Pos in ec coordinates. + + var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0]; + return { + layout: layout, + pixelDimIndex: pixelDimIndex, + layoutBase: rect[xy[pixelDimIndex]], + layoutLength: layoutLength, + axisBase: rect[xy[1 - pixelDimIndex]], + axisLength: rect[wh[1 - pixelDimIndex]], + axisExpandable: axisExpandable, + axisExpandWidth: axisExpandWidth, + axisCollapseWidth: axisCollapseWidth, + axisExpandWindow: axisExpandWindow, + axisCount: axisCount, + winInnerIndices: winInnerIndices, + axisExpandWindow0Pos: axisExpandWindow0Pos + }; + }; + + Parallel.prototype._layoutAxes = function () { + var rect = this._rect; + var axes = this._axesMap; + var dimensions = this.dimensions; + + var layoutInfo = this._makeLayoutInfo(); + + var layout = layoutInfo.layout; + axes.each(function (axis) { + var axisExtent = [0, layoutInfo.axisLength]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(axisExtent[idx], axisExtent[1 - idx]); + }); + each$6(dimensions, function (dim, idx) { + var posInfo = (layoutInfo.axisExpandable ? layoutAxisWithExpand : layoutAxisWithoutExpand)(idx, layoutInfo); + var positionTable = { + horizontal: { + x: posInfo.position, + y: layoutInfo.axisLength + }, + vertical: { + x: 0, + y: posInfo.position + } + }; + var rotationTable = { + horizontal: PI$7 / 2, + vertical: 0 + }; + var position = [positionTable[layout].x + rect.x, positionTable[layout].y + rect.y]; + var rotation = rotationTable[layout]; + var transform = create$1(); + rotate(transform, transform, rotation); + translate(transform, transform, position); // TODO + // tick layout info + // TODO + // update dimensions info based on axis order. + + this._axesLayout[dim] = { + position: position, + rotation: rotation, + transform: transform, + axisNameAvailableWidth: posInfo.axisNameAvailableWidth, + axisLabelShow: posInfo.axisLabelShow, + nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth, + tickDirection: 1, + labelDirection: 1 + }; + }, this); + }; + /** + * Get axis by dim. + */ + + + Parallel.prototype.getAxis = function (dim) { + return this._axesMap.get(dim); + }; + /** + * Convert a dim value of a single item of series data to Point. + */ + + + Parallel.prototype.dataToPoint = function (value, dim) { + return this.axisCoordToPoint(this._axesMap.get(dim).dataToCoord(value), dim); + }; + /** + * Travel data for one time, get activeState of each data item. + * @param start the start dataIndex that travel from. + * @param end the next dataIndex of the last dataIndex will be travel. + */ + + + Parallel.prototype.eachActiveState = function (data, callback, start, end) { + start == null && (start = 0); + end == null && (end = data.count()); + var axesMap = this._axesMap; + var dimensions = this.dimensions; + var dataDimensions = []; + var axisModels = []; + each(dimensions, function (axisDim) { + dataDimensions.push(data.mapDimension(axisDim)); + axisModels.push(axesMap.get(axisDim).model); + }); + var hasActiveSet = this.hasAxisBrushed(); + + for (var dataIndex = start; dataIndex < end; dataIndex++) { + var activeState = void 0; + + if (!hasActiveSet) { + activeState = 'normal'; + } else { + activeState = 'active'; + var values = data.getValues(dataDimensions, dataIndex); + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + var state = axisModels[j].getActiveState(values[j]); + + if (state === 'inactive') { + activeState = 'inactive'; + break; + } + } + } + + callback(activeState, dataIndex); + } + }; + /** + * Whether has any activeSet. + */ + + + Parallel.prototype.hasAxisBrushed = function () { + var dimensions = this.dimensions; + var axesMap = this._axesMap; + var hasActiveSet = false; + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') { + hasActiveSet = true; + } + } + + return hasActiveSet; + }; + /** + * Convert coords of each axis to Point. + * Return point. For example: [10, 20] + */ + + + Parallel.prototype.axisCoordToPoint = function (coord, dim) { + var axisLayout = this._axesLayout[dim]; + return applyTransform$1([coord, 0], axisLayout.transform); + }; + /** + * Get axis layout. + */ + + + Parallel.prototype.getAxisLayout = function (dim) { + return clone(this._axesLayout[dim]); + }; + /** + * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}. + */ + + + Parallel.prototype.getSlidedAxisExpandWindow = function (point) { + var layoutInfo = this._makeLayoutInfo(); + + var pixelDimIndex = layoutInfo.pixelDimIndex; + var axisExpandWindow = layoutInfo.axisExpandWindow.slice(); + var winSize = axisExpandWindow[1] - axisExpandWindow[0]; + var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)]; // Out of the area of coordinate system. + + if (!this.containPoint(point)) { + return { + behavior: 'none', + axisExpandWindow: axisExpandWindow + }; + } // Conver the point from global to expand coordinates. + + + var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos; // For dragging operation convenience, the window should not be + // slided when mouse is the center area of the window. + + var delta; + var behavior = 'slide'; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + + var triggerArea = this._model.get('axisExpandSlideTriggerArea'); // But consider touch device, jump is necessary. + + + var useJump = triggerArea[0] != null; + + if (axisCollapseWidth) { + if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) { + behavior = 'jump'; + delta = pointCoord - winSize * triggerArea[2]; + } else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) { + behavior = 'jump'; + delta = pointCoord - winSize * (1 - triggerArea[2]); + } else { + (delta = pointCoord - winSize * triggerArea[1]) >= 0 && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 && (delta = 0); + } + + delta *= layoutInfo.axisExpandWidth / axisCollapseWidth; + delta ? sliderMove(delta, axisExpandWindow, extent, 'all') // Avoid nonsense triger on mousemove. + : behavior = 'none'; + } // When screen is too narrow, make it visible and slidable, although it is hard to interact. + else { + var winSize2 = axisExpandWindow[1] - axisExpandWindow[0]; + var pos = extent[1] * pointCoord / winSize2; + axisExpandWindow = [mathMax$8(0, pos - winSize2 / 2)]; + axisExpandWindow[1] = mathMin$8(extent[1], axisExpandWindow[0] + winSize2); + axisExpandWindow[0] = axisExpandWindow[1] - winSize2; + } + + return { + axisExpandWindow: axisExpandWindow, + behavior: behavior + }; + }; + + return Parallel; + }(); + + function restrict$1(len, extent) { + return mathMin$8(mathMax$8(len, extent[0]), extent[1]); + } + + function layoutAxisWithoutExpand(axisIndex, layoutInfo) { + var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1); + return { + position: step * axisIndex, + axisNameAvailableWidth: step, + axisLabelShow: true + }; + } + + function layoutAxisWithExpand(axisIndex, layoutInfo) { + var layoutLength = layoutInfo.layoutLength; + var axisExpandWidth = layoutInfo.axisExpandWidth; + var axisCount = layoutInfo.axisCount; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + var winInnerIndices = layoutInfo.winInnerIndices; + var position; + var axisNameAvailableWidth = axisCollapseWidth; + var axisLabelShow = false; + var nameTruncateMaxWidth; + + if (axisIndex < winInnerIndices[0]) { + position = axisIndex * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } else if (axisIndex <= winInnerIndices[1]) { + position = layoutInfo.axisExpandWindow0Pos + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0]; + axisNameAvailableWidth = axisExpandWidth; + axisLabelShow = true; + } else { + position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } + + return { + position: position, + axisNameAvailableWidth: axisNameAvailableWidth, + axisLabelShow: axisLabelShow, + nameTruncateMaxWidth: nameTruncateMaxWidth + }; + } + + function createParallelCoordSys(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 parallelModel = seriesModel.getReferringComponents('parallel', SINGLE_REFERRING).models[0]; + seriesModel.coordinateSystem = parallelModel.coordinateSystem; + } + }); + return coordSysList; + } + + var parallelCoordSysCreator = { + create: createParallelCoordSys + }; + + var ParallelAxisModel = + /** @class */ + function (_super) { + __extends(ParallelAxisModel, _super); + + function ParallelAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelAxisModel.type; + /** + * @readOnly + */ + + _this.activeIntervals = []; + return _this; + } + + ParallelAxisModel.prototype.getAreaSelectStyle = function () { + return makeStyleMapper([['fill', 'color'], ['lineWidth', 'borderWidth'], ['stroke', 'borderColor'], ['width', 'width'], ['opacity', 'opacity'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ])(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 intervals `interval.length === 0` means set all active. + */ + + + ParallelAxisModel.prototype.setActiveIntervals = function (intervals) { + var activeIntervals = this.activeIntervals = clone(intervals); // Normalize + + if (activeIntervals) { + for (var i = activeIntervals.length - 1; i >= 0; i--) { + asc(activeIntervals[i]); + } + } + }; + /** + * @param value When only attempting detect whether 'no activeIntervals set', + * `value` is not needed to be input. + */ + + + ParallelAxisModel.prototype.getActiveState = function (value) { + var activeIntervals = this.activeIntervals; + + if (!activeIntervals.length) { + return 'normal'; + } + + if (value == null || isNaN(+value)) { + return 'inactive'; + } // Simple optimization + + + if (activeIntervals.length === 1) { + var interval = activeIntervals[0]; + + if (interval[0] <= value && value <= interval[1]) { + return 'active'; + } + } else { + for (var i = 0, len = activeIntervals.length; i < len; i++) { + if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) { + return 'active'; + } + } + } + + return 'inactive'; + }; + + return ParallelAxisModel; + }(ComponentModel); + + mixin(ParallelAxisModel, AxisModelCommonMixin); + + var BRUSH_PANEL_GLOBAL = true; + var mathMin$9 = Math.min; + var mathMax$9 = Math.max; + var mathPow$2 = Math.pow; + var COVER_Z = 10000; + var UNSELECT_THRESHOLD = 6; + var MIN_RESIZE_LINE_WIDTH = 6; + var MUTEX_RESOURCE_KEY = 'globalPan'; + var DIRECTION_MAP = { + w: [0, 0], + e: [0, 1], + n: [1, 0], + s: [1, 1] + }; + var CURSOR_MAP = { + w: 'ew', + e: 'ew', + n: 'ns', + s: 'ns', + ne: 'nesw', + sw: 'nesw', + nw: 'nwse', + se: 'nwse' + }; + var DEFAULT_BRUSH_OPT = { + brushStyle: { + lineWidth: 2, + stroke: 'rgba(210,219,238,0.3)', + fill: '#D2DBEE' + }, + transformable: true, + brushMode: 'single', + removeOnClick: false + }; + var baseUID = 0; + /** + * params: + * areas: Array., coord relates to container group, + * If no container specified, to global. + * opt { + * isEnd: boolean, + * removeOnClick: boolean + * } + */ + + var BrushController = + /** @class */ + function (_super) { + __extends(BrushController, _super); + + function BrushController(zr) { + var _this = _super.call(this) || this; + /** + * @internal + */ + + + _this._track = []; + /** + * @internal + */ + + _this._covers = []; + _this._handlers = {}; + + if ("development" !== 'production') { + assert(zr); + } + + _this._zr = zr; + _this.group = new Group(); + _this._uid = 'brushController_' + baseUID++; + each(pointerHandlers, function (handler, eventName) { + this._handlers[eventName] = bind(handler, this); + }, _this); + return _this; + } + /** + * If set to `false`, select disabled. + */ + + + BrushController.prototype.enableBrush = function (brushOption) { + if ("development" !== 'production') { + assert(this._mounted); + } + + this._brushType && this._doDisableBrush(); + brushOption.brushType && this._doEnableBrush(brushOption); + return this; + }; + + BrushController.prototype._doEnableBrush = function (brushOption) { + var zr = this._zr; // Consider roam, which takes globalPan too. + + if (!this._enableGlobalPan) { + take(zr, MUTEX_RESOURCE_KEY, this._uid); + } + + each(this._handlers, function (handler, eventName) { + zr.on(eventName, handler); + }); + this._brushType = brushOption.brushType; + this._brushOption = merge(clone(DEFAULT_BRUSH_OPT), brushOption, true); + }; + + BrushController.prototype._doDisableBrush = function () { + var zr = this._zr; + release(zr, MUTEX_RESOURCE_KEY, this._uid); + each(this._handlers, function (handler, eventName) { + zr.off(eventName, handler); + }); + this._brushType = this._brushOption = null; + }; + /** + * @param panelOpts If not pass, it is global brush. + */ + + + BrushController.prototype.setPanels = function (panelOpts) { + if (panelOpts && panelOpts.length) { + var panels_1 = this._panels = {}; + each(panelOpts, function (panelOpts) { + panels_1[panelOpts.panelId] = clone(panelOpts); + }); + } else { + this._panels = null; + } + + return this; + }; + + BrushController.prototype.mount = function (opt) { + opt = opt || {}; + + if ("development" !== 'production') { + this._mounted = true; // should be at first. + } + + this._enableGlobalPan = opt.enableGlobalPan; + var thisGroup = this.group; + + this._zr.add(thisGroup); + + thisGroup.attr({ + x: opt.x || 0, + y: opt.y || 0, + rotation: opt.rotation || 0, + scaleX: opt.scaleX || 1, + scaleY: opt.scaleY || 1 + }); + this._transform = thisGroup.getLocalTransform(); + return this; + }; // eachCover(cb, context): void { + // each(this._covers, cb, context); + // } + + /** + * Update covers. + * @param coverConfigList + * If coverConfigList is null/undefined, all covers removed. + */ + + + BrushController.prototype.updateCovers = function (coverConfigList) { + if ("development" !== 'production') { + assert(this._mounted); + } + + coverConfigList = map(coverConfigList, function (coverConfig) { + return merge(clone(DEFAULT_BRUSH_OPT), coverConfig, true); + }); + var tmpIdPrefix = '\0-brush-index-'; + var oldCovers = this._covers; + var newCovers = this._covers = []; + var controller = this; + var creatingCover = this._creatingCover; + new DataDiffer(oldCovers, coverConfigList, oldGetKey, getKey).add(addOrUpdate).update(addOrUpdate).remove(remove).execute(); + return this; + + function getKey(brushOption, index) { + return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + '-' + brushOption.brushType; + } + + function oldGetKey(cover, index) { + return getKey(cover.__brushOption, index); + } + + function addOrUpdate(newIndex, oldIndex) { + var newBrushInternal = coverConfigList[newIndex]; // Consider setOption in event listener of brushSelect, + // where updating cover when creating should be forbiden. + + if (oldIndex != null && oldCovers[oldIndex] === creatingCover) { + newCovers[newIndex] = oldCovers[oldIndex]; + } else { + var cover = newCovers[newIndex] = oldIndex != null ? (oldCovers[oldIndex].__brushOption = newBrushInternal, oldCovers[oldIndex]) : endCreating(controller, createCover(controller, newBrushInternal)); + updateCoverAfterCreation(controller, cover); + } + } + + function remove(oldIndex) { + if (oldCovers[oldIndex] !== creatingCover) { + controller.group.remove(oldCovers[oldIndex]); + } + } + }; + + BrushController.prototype.unmount = function () { + if ("development" !== 'production') { + if (!this._mounted) { + return; + } + } + + this.enableBrush(false); // container may 'removeAll' outside. + + clearCovers(this); + + this._zr.remove(this.group); + + if ("development" !== 'production') { + this._mounted = false; // should be at last. + } + + return this; + }; + + BrushController.prototype.dispose = function () { + this.unmount(); + this.off(); + }; + + return BrushController; + }(Eventful); + + function createCover(controller, brushOption) { + var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption); + cover.__brushOption = brushOption; + updateZ(cover, brushOption); + controller.group.add(cover); + return cover; + } + + function endCreating(controller, creatingCover) { + var coverRenderer = getCoverRenderer(creatingCover); + + if (coverRenderer.endCreating) { + coverRenderer.endCreating(controller, creatingCover); + updateZ(creatingCover, creatingCover.__brushOption); + } + + return creatingCover; + } + + function updateCoverShape(controller, cover) { + var brushOption = cover.__brushOption; + getCoverRenderer(cover).updateCoverShape(controller, cover, brushOption.range, brushOption); + } + + function updateZ(cover, brushOption) { + var z = brushOption.z; + z == null && (z = COVER_Z); + cover.traverse(function (el) { + el.z = z; + el.z2 = z; // Consider in given container. + }); + } + + function updateCoverAfterCreation(controller, cover) { + getCoverRenderer(cover).updateCommon(controller, cover); + updateCoverShape(controller, cover); + } + + function getCoverRenderer(cover) { + return coverRenderers[cover.__brushOption.brushType]; + } // return target panel or `true` (means global panel) + + + function getPanelByPoint(controller, e, localCursorPoint) { + var panels = controller._panels; + + if (!panels) { + return BRUSH_PANEL_GLOBAL; // Global panel + } + + var panel; + var transform = controller._transform; + each(panels, function (pn) { + pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn); + }); + return panel; + } // Return a panel or true + + + function getPanelByCover(controller, cover) { + var panels = controller._panels; + + if (!panels) { + return BRUSH_PANEL_GLOBAL; // Global panel + } + + var panelId = cover.__brushOption.panelId; // User may give cover without coord sys info, + // which is then treated as global panel. + + return panelId != null ? panels[panelId] : BRUSH_PANEL_GLOBAL; + } + + function clearCovers(controller) { + var covers = controller._covers; + var originalLength = covers.length; + each(covers, function (cover) { + controller.group.remove(cover); + }, controller); + covers.length = 0; + return !!originalLength; + } + + function trigger$1(controller, opt) { + var areas = map(controller._covers, function (cover) { + var brushOption = cover.__brushOption; + var range = clone(brushOption.range); + return { + brushType: brushOption.brushType, + panelId: brushOption.panelId, + range: range + }; + }); + controller.trigger('brush', { + areas: areas, + isEnd: !!opt.isEnd, + removeOnClick: !!opt.removeOnClick + }); + } + + function shouldShowCover(controller) { + var track = controller._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$2(dx * dx + dy * dy, 0.5); + return dist > UNSELECT_THRESHOLD; + } + + function getTrackEnds(track) { + var tail = track.length - 1; + tail < 0 && (tail = 0); + return [track[0], track[tail]]; + } + + function createBaseRectCover(rectRangeConverter, controller, brushOption, edgeNameSequences) { + var cover = new Group(); + cover.add(new Rect({ + name: 'main', + style: makeStyle(brushOption), + silent: true, + draggable: true, + cursor: 'move', + drift: curry(driftRect, rectRangeConverter, controller, cover, ['n', 's', 'w', 'e']), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + each(edgeNameSequences, function (nameSequence) { + cover.add(new Rect({ + name: nameSequence.join(''), + style: { + opacity: 0 + }, + draggable: true, + silent: true, + invisible: true, + drift: curry(driftRect, rectRangeConverter, controller, cover, nameSequence), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + }); + return cover; + } + + function updateBaseRect(controller, cover, localRange, brushOption) { + var lineWidth = brushOption.brushStyle.lineWidth || 0; + var handleSize = mathMax$9(lineWidth, MIN_RESIZE_LINE_WIDTH); + var x = localRange[0][0]; + var y = localRange[1][0]; + var xa = x - lineWidth / 2; + var ya = y - lineWidth / 2; + var x2 = localRange[0][1]; + var y2 = localRange[1][1]; + var x2a = x2 - handleSize + lineWidth / 2; + var y2a = y2 - handleSize + lineWidth / 2; + var width = x2 - x; + var height = y2 - y; + var widtha = width + lineWidth; + var heighta = height + lineWidth; + updateRectShape(controller, cover, 'main', x, y, width, height); + + if (brushOption.transformable) { + updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta); + updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta); + updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize); + updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize); + updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize); + updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize); + } + } + + function updateCommon(controller, cover) { + var brushOption = cover.__brushOption; + var transformable = brushOption.transformable; + var mainEl = cover.childAt(0); + mainEl.useStyle(makeStyle(brushOption)); + mainEl.attr({ + silent: !transformable, + cursor: transformable ? 'move' : 'default' + }); + each([['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']], function (nameSequence) { + var el = cover.childOfName(nameSequence.join('')); + var globalDir = nameSequence.length === 1 ? getGlobalDirection1(controller, nameSequence[0]) : getGlobalDirection2(controller, nameSequence); + el && el.attr({ + silent: !transformable, + invisible: !transformable, + cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null + }); + }); + } + + function updateRectShape(controller, cover, name, x, y, w, h) { + var el = cover.childOfName(name); + el && el.setShape(pointsToRect(clipByPanel(controller, cover, [[x, y], [x + w, y + h]]))); + } + + function makeStyle(brushOption) { + return defaults({ + strokeNoScale: true + }, brushOption.brushStyle); + } + + function formatRectRange(x, y, x2, y2) { + var min = [mathMin$9(x, x2), mathMin$9(y, y2)]; + var max = [mathMax$9(x, x2), mathMax$9(y, y2)]; + return [[min[0], max[0]], [min[1], max[1]] // y range + ]; + } + + function getTransform$1(controller) { + return getTransform(controller.group); + } + + function getGlobalDirection1(controller, localDirName) { + var map = { + w: 'left', + e: 'right', + n: 'top', + s: 'bottom' + }; + var inverseMap = { + left: 'w', + right: 'e', + top: 'n', + bottom: 's' + }; + var dir = transformDirection(map[localDirName], getTransform$1(controller)); + return inverseMap[dir]; + } + + function getGlobalDirection2(controller, localDirNameSeq) { + var globalDir = [getGlobalDirection1(controller, localDirNameSeq[0]), getGlobalDirection1(controller, localDirNameSeq[1])]; + (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse(); + return globalDir.join(''); + } + + function driftRect(rectRangeConverter, controller, cover, dirNameSequence, dx, dy) { + var brushOption = cover.__brushOption; + var rectRange = rectRangeConverter.toRectRange(brushOption.range); + var localDelta = toLocalDelta(controller, dx, dy); + each(dirNameSequence, function (dirName) { + var ind = DIRECTION_MAP[dirName]; + rectRange[ind[0]][ind[1]] += localDelta[ind[0]]; + }); + brushOption.range = rectRangeConverter.fromRectRange(formatRectRange(rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1])); + updateCoverAfterCreation(controller, cover); + trigger$1(controller, { + isEnd: false + }); + } + + function driftPolygon(controller, cover, dx, dy) { + var range = cover.__brushOption.range; + var localDelta = toLocalDelta(controller, dx, dy); + each(range, function (point) { + point[0] += localDelta[0]; + point[1] += localDelta[1]; + }); + updateCoverAfterCreation(controller, cover); + trigger$1(controller, { + isEnd: false + }); + } + + function toLocalDelta(controller, dx, dy) { + var thisGroup = controller.group; + var localD = thisGroup.transformCoordToLocal(dx, dy); + var localZero = thisGroup.transformCoordToLocal(0, 0); + return [localD[0] - localZero[0], localD[1] - localZero[1]]; + } + + function clipByPanel(controller, cover, data) { + var panel = getPanelByCover(controller, cover); + return panel && panel !== BRUSH_PANEL_GLOBAL ? panel.clipPath(data, controller._transform) : clone(data); + } + + function pointsToRect(points) { + var xmin = mathMin$9(points[0][0], points[1][0]); + var ymin = mathMin$9(points[0][1], points[1][1]); + var xmax = mathMax$9(points[0][0], points[1][0]); + var ymax = mathMax$9(points[0][1], points[1][1]); + return { + x: xmin, + y: ymin, + width: xmax - xmin, + height: ymax - ymin + }; + } + + function resetCursor(controller, e, localCursorPoint) { + if ( // Check active + !controller._brushType // resetCursor should be always called when mouse is in zr area, + // but not called when mouse is out of zr area to avoid bad influence + // if `mousemove`, `mouseup` are triggered from `document` event. + || isOutsideZrArea(controller, e.offsetX, e.offsetY)) { + return; + } + + var zr = controller._zr; + var covers = controller._covers; + var currPanel = getPanelByPoint(controller, e, localCursorPoint); // Check whether in covers. + + if (!controller._dragging) { + for (var i = 0; i < covers.length; i++) { + var brushOption = covers[i].__brushOption; + + if (currPanel && (currPanel === BRUSH_PANEL_GLOBAL || brushOption.panelId === currPanel.panelId) && coverRenderers[brushOption.brushType].contain(covers[i], localCursorPoint[0], localCursorPoint[1])) { + // Use cursor style set on cover. + return; + } + } + } + + currPanel && zr.setCursorStyle('crosshair'); + } + + function preventDefault(e) { + var rawE = e.event; + rawE.preventDefault && rawE.preventDefault(); + } + + function mainShapeContain(cover, x, y) { + return cover.childOfName('main').contain(x, y); + } + + function updateCoverByMouse(controller, e, localCursorPoint, isEnd) { + var creatingCover = controller._creatingCover; + var panel = controller._creatingPanel; + var thisBrushOption = controller._brushOption; + var eventParams; + + controller._track.push(localCursorPoint.slice()); + + if (shouldShowCover(controller) || creatingCover) { + if (panel && !creatingCover) { + thisBrushOption.brushMode === 'single' && clearCovers(controller); + var brushOption = clone(thisBrushOption); + brushOption.brushType = determineBrushType(brushOption.brushType, panel); + brushOption.panelId = panel === BRUSH_PANEL_GLOBAL ? null : panel.panelId; + creatingCover = controller._creatingCover = createCover(controller, brushOption); + + controller._covers.push(creatingCover); + } + + if (creatingCover) { + var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)]; + var coverBrushOption = creatingCover.__brushOption; + coverBrushOption.range = coverRenderer.getCreatingRange(clipByPanel(controller, creatingCover, controller._track)); + + if (isEnd) { + endCreating(controller, creatingCover); + coverRenderer.updateCommon(controller, creatingCover); + } + + updateCoverShape(controller, creatingCover); + eventParams = { + isEnd: isEnd + }; + } + } else if (isEnd && thisBrushOption.brushMode === 'single' && thisBrushOption.removeOnClick) { + // Help user to remove covers easily, only by a tiny drag, in 'single' mode. + // But a single click do not clear covers, because user may have casual + // clicks (for example, click on other component and do not expect covers + // disappear). + // Only some cover removed, trigger action, but not every click trigger action. + if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) { + eventParams = { + isEnd: isEnd, + removeOnClick: true + }; + } + } + + return eventParams; + } + + function determineBrushType(brushType, panel) { + if (brushType === 'auto') { + if ("development" !== 'production') { + assert(panel && panel.defaultBrushType, 'MUST have defaultBrushType when brushType is "atuo"'); + } + + return panel.defaultBrushType; + } + + return brushType; + } + + var pointerHandlers = { + mousedown: function (e) { + if (this._dragging) { + // In case some browser do not support globalOut, + // and release mouse out side the browser. + handleDragEnd(this, e); + } else if (!e.target || !e.target.draggable) { + preventDefault(e); + var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY); + this._creatingCover = null; + var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint); + + if (panel) { + this._dragging = true; + this._track = [localCursorPoint.slice()]; + } + } + }, + mousemove: function (e) { + var x = e.offsetX; + var y = e.offsetY; + var localCursorPoint = this.group.transformCoordToLocal(x, y); + resetCursor(this, e, localCursorPoint); + + if (this._dragging) { + preventDefault(e); + var eventParams = updateCoverByMouse(this, e, localCursorPoint, false); + eventParams && trigger$1(this, eventParams); + } + }, + mouseup: function (e) { + handleDragEnd(this, e); + } + }; + + function handleDragEnd(controller, e) { + if (controller._dragging) { + preventDefault(e); + var x = e.offsetX; + var y = e.offsetY; + var localCursorPoint = controller.group.transformCoordToLocal(x, y); + var eventParams = updateCoverByMouse(controller, e, localCursorPoint, true); + controller._dragging = false; + controller._track = []; + controller._creatingCover = null; // trigger event shoule be at final, after procedure will be nested. + + eventParams && trigger$1(controller, eventParams); + } + } + + function isOutsideZrArea(controller, x, y) { + var zr = controller._zr; + return x < 0 || x > zr.getWidth() || y < 0 || y > zr.getHeight(); + } + /** + * key: brushType + */ + + + var coverRenderers = { + lineX: getLineRenderer(0), + lineY: getLineRenderer(1), + rect: { + createCover: function (controller, brushOption) { + function returnInput(range) { + return range; + } + + return createBaseRectCover({ + toRectRange: returnInput, + fromRectRange: returnInput + }, controller, brushOption, [['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']]); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + updateBaseRect(controller, cover, localRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }, + polygon: { + createCover: function (controller, brushOption) { + var cover = new Group(); // Do not use graphic.Polygon because graphic.Polyline do not close the + // border of the shape when drawing, which is a better experience for user. + + cover.add(new Polyline({ + name: 'main', + style: makeStyle(brushOption), + silent: true + })); + return cover; + }, + getCreatingRange: function (localTrack) { + return localTrack; + }, + endCreating: function (controller, cover) { + cover.remove(cover.childAt(0)); // Use graphic.Polygon close the shape. + + cover.add(new Polygon({ + name: 'main', + draggable: true, + drift: curry(driftPolygon, controller, cover), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + cover.childAt(0).setShape({ + points: clipByPanel(controller, cover, localRange) + }); + }, + updateCommon: updateCommon, + contain: mainShapeContain + } + }; + + function getLineRenderer(xyIndex) { + return { + createCover: function (controller, brushOption) { + return createBaseRectCover({ + toRectRange: function (range) { + var rectRange = [range, [0, 100]]; + xyIndex && rectRange.reverse(); + return rectRange; + }, + fromRectRange: function (rectRange) { + return rectRange[xyIndex]; + } + }, controller, brushOption, [[['w'], ['e']], [['n'], ['s']]][xyIndex]); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + var min = mathMin$9(ends[0][xyIndex], ends[1][xyIndex]); + var max = mathMax$9(ends[0][xyIndex], ends[1][xyIndex]); + return [min, max]; + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + var otherExtent; // If brushWidth not specified, fit the panel. + + var panel = getPanelByCover(controller, cover); + + if (panel !== BRUSH_PANEL_GLOBAL && panel.getLinearBrushOtherExtent) { + otherExtent = panel.getLinearBrushOtherExtent(xyIndex); + } else { + var zr = controller._zr; + otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]]; + } + + var rectRange = [localRange, otherExtent]; + xyIndex && rectRange.reverse(); + updateBaseRect(controller, cover, rectRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }; + } + + function makeRectPanelClipPath(rect) { + rect = normalizeRect(rect); + return function (localPoints) { + return clipPointsByRect(localPoints, rect); + }; + } + function makeLinearBrushOtherExtent(rect, specifiedXYIndex) { + rect = normalizeRect(rect); + return function (xyIndex) { + var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex; + var brushWidth = idx ? rect.width : rect.height; + var base = idx ? rect.x : rect.y; + return [base, base + (brushWidth || 0)]; + }; + } + function makeRectIsTargetByCursor(rect, api, targetModel) { + var boundingRect = normalizeRect(rect); + return function (e, localCursorPoint) { + return boundingRect.contain(localCursorPoint[0], localCursorPoint[1]) && !onIrrelevantElement(e, api, targetModel); + }; + } // Consider width/height is negative. + + function normalizeRect(rect) { + return BoundingRect.create(rect); + } + + var elementList = ['axisLine', 'axisTickLabel', 'axisName']; + + var ParallelAxisView = + /** @class */ + function (_super) { + __extends(ParallelAxisView, _super); + + function ParallelAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelAxisView.type; + return _this; + } + + ParallelAxisView.prototype.init = function (ecModel, api) { + _super.prototype.init.apply(this, arguments); + + (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)); + }; + + ParallelAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + if (fromAxisAreaSelect(axisModel, ecModel, payload)) { + return; + } + + this.axisModel = axisModel; + this.api = api; + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var coordSysModel = getCoordSysModel(axisModel, ecModel); + var coordSys = coordSysModel.coordinateSystem; + var areaSelectStyle = axisModel.getAreaSelectStyle(); + var areaWidth = areaSelectStyle.width; + var dim = axisModel.axis.dim; + var axisLayout = coordSys.getAxisLayout(dim); + var builderOpt = extend({ + strokeContainThreshold: areaWidth + }, axisLayout); + var axisBuilder = new AxisBuilder(axisModel, builderOpt); + each(elementList, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api); + + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + }; // /** + // * @override + // */ + // updateVisual(axisModel, ecModel, api, payload) { + // this._brushController && this._brushController + // .updateCovers(getCoverInfoList(axisModel)); + // } + + + ParallelAxisView.prototype._refreshBrushController = function (builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api) { + // After filtering, axis may change, select area needs to be update. + var extent = axisModel.axis.getExtent(); + var extentLen = extent[1] - extent[0]; + var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value. + // width/height might be negative, which will be + // normalized in BoundingRect. + + var rect = BoundingRect.create({ + x: extent[0], + y: -areaWidth / 2, + width: extentLen, + height: areaWidth + }); + rect.x -= extra; + rect.width += 2 * extra; + + this._brushController.mount({ + enableGlobalPan: true, + rotation: builderOpt.rotation, + x: builderOpt.position[0], + y: builderOpt.position[1] + }).setPanels([{ + panelId: 'pl', + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect, 0) + }]).enableBrush({ + brushType: 'lineX', + brushStyle: areaSelectStyle, + removeOnClick: true + }).updateCovers(getCoverInfoList(axisModel)); + }; + + ParallelAxisView.prototype._onBrush = function (eventParam) { + var coverInfoList = eventParam.areas; // Do not cache these object, because the mey be changed. + + var axisModel = this.axisModel; + var axis = axisModel.axis; + var intervals = map(coverInfoList, function (coverInfo) { + return [axis.coordToData(coverInfo.range[0], true), axis.coordToData(coverInfo.range[1], true)]; + }); // If realtime is true, action is not dispatched on drag end, because + // the drag end emits the same params with the last drag move event, + // and may have some delay when using touch pad. + + if (!axisModel.option.realtime === eventParam.isEnd || eventParam.removeOnClick) { + // jshint ignore:line + this.api.dispatchAction({ + type: 'axisAreaSelect', + parallelAxisId: axisModel.id, + intervals: intervals + }); + } + }; + + ParallelAxisView.prototype.dispose = function () { + this._brushController.dispose(); + }; + + ParallelAxisView.type = 'parallelAxis'; + return ParallelAxisView; + }(ComponentView); + + function fromAxisAreaSelect(axisModel, ecModel, payload) { + return payload && payload.type === 'axisAreaSelect' && ecModel.findComponents({ + mainType: 'parallelAxis', + query: payload + })[0] === axisModel; + } + + function getCoverInfoList(axisModel) { + var axis = axisModel.axis; + return map(axisModel.activeIntervals, function (interval) { + return { + brushType: 'lineX', + panelId: 'pl', + range: [axis.dataToCoord(interval[0], true), axis.dataToCoord(interval[1], true)] + }; + }); + } + + function getCoordSysModel(axisModel, ecModel) { + return ecModel.getComponent('parallel', axisModel.get('parallelIndex')); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var actionInfo$1 = { + type: 'axisAreaSelect', + event: 'axisAreaSelected' // update: 'updateVisual' + + }; + function installParallelActions(registers) { + registers.registerAction(actionInfo$1, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'parallelAxis', + query: payload + }, function (parallelAxisModel) { + parallelAxisModel.axis.model.setActiveIntervals(payload.intervals); + }); + }); + /** + * @payload + */ + + registers.registerAction('parallelAxisExpand', function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'parallel', + query: payload + }, function (parallelModel) { + parallelModel.setAxisExpand(payload); + }); + }); + } + + var defaultAxisOption = { + type: 'value', + areaSelectStyle: { + width: 20, + borderWidth: 1, + borderColor: 'rgba(160,197,232)', + color: 'rgba(160,197,232)', + opacity: 0.3 + }, + realtime: true, + z: 10 + }; + function install$g(registers) { + registers.registerComponentView(ParallelView$1); + registers.registerComponentModel(ParallelModel); + registers.registerCoordinateSystem('parallel', parallelCoordSysCreator); + registers.registerPreprocessor(parallelPreprocessor); + registers.registerComponentModel(ParallelAxisModel); + registers.registerComponentView(ParallelAxisView); + axisModelCreator(registers, 'parallel', ParallelAxisModel, defaultAxisOption); + installParallelActions(registers); + } + + function install$h(registers) { + use(install$g); + registers.registerChartView(ParallelView); + registers.registerSeriesModel(ParallelSeriesModel); + registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, parallelVisual); + } + + var SankeyPathShape = + /** @class */ + function () { + function SankeyPathShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.cpx2 = 0; + this.cpy2 = 0; + this.extent = 0; + } + + return SankeyPathShape; + }(); + + var SankeyPath = + /** @class */ + function (_super) { + __extends(SankeyPath, _super); + + function SankeyPath(opts) { + return _super.call(this, opts) || this; + } + + SankeyPath.prototype.getDefaultShape = function () { + return new SankeyPathShape(); + }; + + SankeyPath.prototype.buildPath = function (ctx, shape) { + var extent = shape.extent; + ctx.moveTo(shape.x1, shape.y1); + ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2); + + if (shape.orient === 'vertical') { + ctx.lineTo(shape.x2 + extent, shape.y2); + ctx.bezierCurveTo(shape.cpx2 + extent, shape.cpy2, shape.cpx1 + extent, shape.cpy1, shape.x1 + extent, shape.y1); + } else { + ctx.lineTo(shape.x2, shape.y2 + extent); + ctx.bezierCurveTo(shape.cpx2, shape.cpy2 + extent, shape.cpx1, shape.cpy1 + extent, shape.x1, shape.y1 + extent); + } + + ctx.closePath(); + }; + + SankeyPath.prototype.highlight = function () { + enterEmphasis(this); + }; + + SankeyPath.prototype.downplay = function () { + leaveEmphasis(this); + }; + + return SankeyPath; + }(Path); + + var SankeyView = + /** @class */ + function (_super) { + __extends(SankeyView, _super); + + function SankeyView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SankeyView.type; + _this._focusAdjacencyDisabled = false; + return _this; + } + + SankeyView.prototype.render = function (seriesModel, ecModel, api) { + var sankeyView = this; + var graph = seriesModel.getGraph(); + var group = this.group; + var layoutInfo = seriesModel.layoutInfo; // view width + + var width = layoutInfo.width; // view height + + var height = layoutInfo.height; + var nodeData = seriesModel.getData(); + var edgeData = seriesModel.getData('edge'); + var orient = seriesModel.get('orient'); + this._model = seriesModel; + group.removeAll(); + group.x = layoutInfo.x; + group.y = layoutInfo.y; // generate a bezire Curve for each edge + + graph.eachEdge(function (edge) { + var curve = new SankeyPath(); + var ecData = getECData(curve); + ecData.dataIndex = edge.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + ecData.dataType = 'edge'; + var edgeModel = edge.getModel(); + var lineStyleModel = edgeModel.getModel('lineStyle'); + var curvature = lineStyleModel.get('curveness'); + var n1Layout = edge.node1.getLayout(); + var node1Model = edge.node1.getModel(); + var dragX1 = node1Model.get('localX'); + var dragY1 = node1Model.get('localY'); + var n2Layout = edge.node2.getLayout(); + var node2Model = edge.node2.getModel(); + var dragX2 = node2Model.get('localX'); + var dragY2 = node2Model.get('localY'); + var edgeLayout = edge.getLayout(); + var x1; + var y1; + var x2; + var y2; + var cpx1; + var cpy1; + var cpx2; + var cpy2; + curve.shape.extent = Math.max(1, edgeLayout.dy); + curve.shape.orient = orient; + + if (orient === 'vertical') { + x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + edgeLayout.sy; + y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + n1Layout.dy; + x2 = (dragX2 != null ? dragX2 * width : n2Layout.x) + edgeLayout.ty; + y2 = dragY2 != null ? dragY2 * height : n2Layout.y; + cpx1 = x1; + cpy1 = y1 * (1 - curvature) + y2 * curvature; + cpx2 = x2; + cpy2 = y1 * curvature + y2 * (1 - curvature); + } else { + x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx; + y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy; + x2 = dragX2 != null ? dragX2 * width : n2Layout.x; + y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty; + cpx1 = x1 * (1 - curvature) + x2 * curvature; + cpy1 = y1; + cpx2 = x1 * curvature + x2 * (1 - curvature); + cpy2 = y2; + } + + curve.setShape({ + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }); + curve.useStyle(lineStyleModel.getItemStyle()); // Special color, use source node color or target node color + + switch (curve.style.fill) { + case 'source': + curve.style.fill = edge.node1.getVisual('color'); + curve.style.decal = edge.node1.getVisual('style').decal; + break; + + case 'target': + curve.style.fill = edge.node2.getVisual('color'); + curve.style.decal = edge.node2.getVisual('style').decal; + break; + + case 'gradient': + var sourceColor = edge.node1.getVisual('color'); + var targetColor = edge.node2.getVisual('color'); + + if (typeof sourceColor === 'string' && typeof targetColor === 'string') { + curve.style.fill = new LinearGradient(0, 0, 1, 0, [{ + color: sourceColor, + offset: 0 + }, { + color: targetColor, + offset: 1 + }]); + } + + } + + var emphasisModel = edgeModel.getModel('emphasis'); + setStatesStylesFromModel(curve, edgeModel, 'lineStyle', function (model) { + return model.getItemStyle(); + }); + group.add(curve); + edgeData.setItemGraphicEl(edge.dataIndex, curve); + var focus = emphasisModel.get('focus'); + enableHoverEmphasis(curve, focus === 'adjacency' ? edge.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope')); + getECData(curve).dataType = 'edge'; + }); // Generate a rect for each node + + graph.eachNode(function (node) { + var layout = node.getLayout(); + var itemModel = node.getModel(); + var dragX = itemModel.get('localX'); + var dragY = itemModel.get('localY'); + var emphasisModel = itemModel.getModel('emphasis'); + var rect = new Rect({ + shape: { + x: dragX != null ? dragX * width : layout.x, + y: dragY != null ? dragY * height : layout.y, + width: layout.dx, + height: layout.dy + }, + style: itemModel.getModel('itemStyle').getItemStyle() + }); + setLabelStyle(rect, getLabelStatesModels(itemModel), { + labelFetcher: seriesModel, + labelDataIndex: node.dataIndex, + defaultText: node.id + }); + rect.disableLabelAnimation = true; + rect.setStyle('fill', node.getVisual('color')); + rect.setStyle('decal', node.getVisual('style').decal); + setStatesStylesFromModel(rect, itemModel); + group.add(rect); + nodeData.setItemGraphicEl(node.dataIndex, rect); + getECData(rect).dataType = 'node'; + var focus = emphasisModel.get('focus'); + enableHoverEmphasis(rect, focus === 'adjacency' ? node.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope')); + }); + nodeData.eachItemGraphicEl(function (el, dataIndex) { + var itemModel = nodeData.getItemModel(dataIndex); + + if (itemModel.get('draggable')) { + el.drift = function (dx, dy) { + sankeyView._focusAdjacencyDisabled = true; + this.shape.x += dx; + this.shape.y += dy; + this.dirty(); + api.dispatchAction({ + type: 'dragNode', + seriesId: seriesModel.id, + dataIndex: nodeData.getRawIndex(dataIndex), + localX: this.shape.x / width, + localY: this.shape.y / height + }); + }; + + el.ondragend = function () { + sankeyView._focusAdjacencyDisabled = false; + }; + + el.draggable = true; + el.cursor = 'move'; + } + }); + + if (!this._data && seriesModel.isAnimationEnabled()) { + group.setClipPath(createGridClipShape$1(group.getBoundingRect(), seriesModel, function () { + group.removeClipPath(); + })); + } + + this._data = seriesModel.getData(); + }; + + SankeyView.prototype.dispose = function () {}; + + SankeyView.type = 'sankey'; + return SankeyView; + }(ChartView); // Add animation to the view + + + function createGridClipShape$1(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + width: rect.width + 20 + } + }, seriesModel, cb); + return rectEl; + } + + var SankeySeriesModel = + /** @class */ + function (_super) { + __extends(SankeySeriesModel, _super); + + function SankeySeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SankeySeriesModel.type; + return _this; + } + /** + * Init a graph data structure from data in option series + * + * @param {Object} option the object used to config echarts view + * @return {module:echarts/data/List} storage initial data + */ + + + SankeySeriesModel.prototype.getInitialData = function (option, ecModel) { + var links = option.edges || option.links; + var nodes = option.data || option.nodes; + var levels = option.levels; + this.levelModels = []; + var levelModels = this.levelModels; + + for (var i = 0; i < levels.length; i++) { + if (levels[i].depth != null && levels[i].depth >= 0) { + levelModels[levels[i].depth] = new Model(levels[i], this, ecModel); + } else { + if ("development" !== 'production') { + throw new Error('levels[i].depth is mandatory and should be natural number'); + } + } + } + + if (nodes && links) { + var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink); + return graph.data; + } + + function beforeLink(nodeData, edgeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var seriesModel = model.parentModel; + var layout = seriesModel.getData().getItemLayout(idx); + + if (layout) { + var nodeDepth = layout.depth; + var levelModel = seriesModel.levelModels[nodeDepth]; + + if (levelModel) { + model.parentModel = levelModel; + } + } + + return model; + }); + edgeData.wrapMethod('getItemModel', function (model, idx) { + var seriesModel = model.parentModel; + var edge = seriesModel.getGraph().getEdgeByIndex(idx); + var layout = edge.node1.getLayout(); + + if (layout) { + var depth = layout.depth; + var levelModel = seriesModel.levelModels[depth]; + + if (levelModel) { + model.parentModel = levelModel; + } + } + + return model; + }); + } + }; + + SankeySeriesModel.prototype.setNodePosition = function (dataIndex, localPosition) { + var dataItem = this.option.data[dataIndex]; + dataItem.localX = localPosition[0]; + dataItem.localY = localPosition[1]; + }; + /** + * Return the graphic data structure + * + * @return graphic data structure + */ + + + SankeySeriesModel.prototype.getGraph = function () { + return this.getData().graph; + }; + /** + * Get edge data of graphic data structure + * + * @return data structure of list + */ + + + SankeySeriesModel.prototype.getEdgeData = function () { + return this.getGraph().edgeData; + }; + + SankeySeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + function noValue(val) { + return isNaN(val) || val == null; + } // dataType === 'node' or empty do not show tooltip by default + + + if (dataType === 'edge') { + var params = this.getDataParams(dataIndex, dataType); + var rawDataOpt = params.data; + var edgeValue = params.value; + var edgeName = rawDataOpt.source + ' -- ' + rawDataOpt.target; + return createTooltipMarkup('nameValue', { + name: edgeName, + value: edgeValue, + noValue: noValue(edgeValue) + }); + } // dataType === 'node' + else { + var node = this.getGraph().getNodeByIndex(dataIndex); + var value = node.getLayout().value; + var name_1 = this.getDataParams(dataIndex, dataType).data.name; + return createTooltipMarkup('nameValue', { + name: name_1 != null ? name_1 + '' : null, + value: value, + noValue: noValue(value) + }); + } + }; + + SankeySeriesModel.prototype.optionUpdated = function () { + var option = this.option; + }; // Override Series.getDataParams() + + + SankeySeriesModel.prototype.getDataParams = function (dataIndex, dataType) { + var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); + + if (params.value == null && dataType === 'node') { + var node = this.getGraph().getNodeByIndex(dataIndex); + var nodeValue = node.getLayout().value; + params.value = nodeValue; + } + + return params; + }; + + SankeySeriesModel.type = 'series.sankey'; + SankeySeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'view', + left: '5%', + top: '5%', + right: '20%', + bottom: '5%', + orient: 'horizontal', + nodeWidth: 20, + nodeGap: 8, + draggable: true, + layoutIterations: 32, + label: { + show: true, + position: 'right', + fontSize: 12 + }, + levels: [], + nodeAlign: 'justify', + lineStyle: { + color: '#314656', + opacity: 0.2, + curveness: 0.5 + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + opacity: 0.5 + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + animationEasing: 'linear', + animationDuration: 1000 + }; + return SankeySeriesModel; + }(SeriesModel); + + function sankeyLayout(ecModel, api) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var nodeWidth = seriesModel.get('nodeWidth'); + var nodeGap = seriesModel.get('nodeGap'); + var layoutInfo = getViewRect$4(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 = filter(nodes, function (node) { + return node.getLayout().value === 0; + }); + var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations'); + var orient = seriesModel.get('orient'); + var nodeAlign = seriesModel.get('nodeAlign'); + layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign); + }); + } + /** + * Get the layout position of the whole view + */ + + function getViewRect$4(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) { + computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign); + computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient); + computeEdgeDepths(nodes, orient); + } + /** + * Compute the value of each node by summing the associated edge's value + */ + + + function computeNodeValues(nodes) { + each(nodes, function (node) { + var value1 = sum(node.outEdges, getEdgeValue); + var value2 = sum(node.inEdges, getEdgeValue); + var nodeRawValue = node.getValue() || 0; + var value = Math.max(value1, value2, nodeRawValue); + node.setLayout({ + value: value + }, true); + }); + } + /** + * Compute the x-position for each node. + * + * Here we use Kahn algorithm to detect cycle when we traverse + * the node to computer the initial x position. + */ + + + function computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) { + // Used to mark whether the edge is deleted. if it is deleted, + // the value is 0, otherwise it is 1. + var remainEdges = []; // Storage each node's indegree. + + var indegreeArr = []; //Used to storage the node with indegree is equal to 0. + + var zeroIndegrees = []; + var nextTargetNode = []; + var x = 0; // let kx = 0; + + for (var i = 0; i < edges.length; i++) { + remainEdges[i] = 1; + } + + for (var i = 0; i < nodes.length; i++) { + indegreeArr[i] = nodes[i].inEdges.length; + + if (indegreeArr[i] === 0) { + zeroIndegrees.push(nodes[i]); + } + } + + var maxNodeDepth = -1; // Traversing nodes using topological sorting to calculate the + // horizontal(if orient === 'horizontal') or vertical(if orient === 'vertical') + // position of the nodes. + + while (zeroIndegrees.length) { + for (var idx = 0; idx < zeroIndegrees.length; idx++) { + var node = zeroIndegrees[idx]; + var item = node.hostGraph.data.getRawDataItem(node.dataIndex); + var isItemDepth = item.depth != null && item.depth >= 0; + + if (isItemDepth && item.depth > maxNodeDepth) { + maxNodeDepth = item.depth; + } + + node.setLayout({ + depth: isItemDepth ? item.depth : x + }, true); + orient === 'vertical' ? node.setLayout({ + dy: nodeWidth + }, true) : node.setLayout({ + dx: nodeWidth + }, true); + + for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) { + var edge = node.outEdges[edgeIdx]; + var indexEdge = edges.indexOf(edge); + remainEdges[indexEdge] = 0; + var targetNode = edge.node2; + var nodeIndex = nodes.indexOf(targetNode); + + if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) { + nextTargetNode.push(targetNode); + } + } + } + + ++x; + zeroIndegrees = nextTargetNode; + nextTargetNode = []; + } + + for (var i = 0; i < remainEdges.length; i++) { + if (remainEdges[i] === 1) { + throw new Error('Sankey is a DAG, the original data has cycle!'); + } + } + + var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1; + + if (nodeAlign && nodeAlign !== 'left') { + adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth); + } + + var kx = orient === 'vertical' ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth; + scaleNodeBreadths(nodes, kx, orient); + } + + function isNodeDepth(node) { + var item = node.hostGraph.data.getRawDataItem(node.dataIndex); + return item.depth != null && item.depth >= 0; + } + + function adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) { + if (nodeAlign === 'right') { + var nextSourceNode = []; + var remainNodes = nodes; + var nodeHeight = 0; + + while (remainNodes.length) { + for (var i = 0; i < remainNodes.length; i++) { + var node = remainNodes[i]; + node.setLayout({ + skNodeHeight: nodeHeight + }, true); + + for (var j = 0; j < node.inEdges.length; j++) { + var edge = node.inEdges[j]; + + if (nextSourceNode.indexOf(edge.node1) < 0) { + nextSourceNode.push(edge.node1); + } + } + } + + remainNodes = nextSourceNode; + nextSourceNode = []; + ++nodeHeight; + } + + each(nodes, function (node) { + if (!isNodeDepth(node)) { + node.setLayout({ + depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight) + }, true); + } + }); + } else if (nodeAlign === 'justify') { + moveSinksRight(nodes, maxDepth); + } + } + /** + * All the node without outEgdes are assigned maximum x-position and + * be aligned in the last column. + * + * @param nodes. node of sankey view. + * @param maxDepth. use to assign to node without outEdges as x-position. + */ + + + function moveSinksRight(nodes, maxDepth) { + each(nodes, function (node) { + if (!isNodeDepth(node) && !node.outEdges.length) { + node.setLayout({ + depth: maxDepth + }, true); + } + }); + } + /** + * Scale node x-position to the width + * + * @param nodes node of sankey view + * @param kx multiple used to scale nodes + */ + + + function scaleNodeBreadths(nodes, kx, orient) { + each(nodes, function (node) { + var nodeDepth = node.getLayout().depth * kx; + orient === 'vertical' ? node.setLayout({ + y: nodeDepth + }, true) : node.setLayout({ + x: nodeDepth + }, true); + }); + } + /** + * Using Gauss-Seidel iterations method to compute the node depth(y-position) + * + * @param nodes node of sankey view + * @param edges edge of sankey view + * @param height the whole height of the area to draw the view + * @param nodeGap the vertical distance between two nodes + * in the same column. + * @param iterations the number of iterations for the algorithm + */ + + + function computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) { + var nodesByBreadth = prepareNodesByBreadth(nodes, orient); + initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + + for (var alpha = 1; iterations > 0; iterations--) { + // 0.99 is a experience parameter, ensure that each iterations of + // changes as small as possible. + alpha *= 0.99; + relaxRightToLeft(nodesByBreadth, alpha, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + relaxLeftToRight(nodesByBreadth, alpha, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + } + } + + function prepareNodesByBreadth(nodes, orient) { + var nodesByBreadth = []; + var keyAttr = orient === 'vertical' ? 'y' : 'x'; + var groupResult = groupData(nodes, function (node) { + return node.getLayout()[keyAttr]; + }); + groupResult.keys.sort(function (a, b) { + return a - b; + }); + each(groupResult.keys, function (key) { + nodesByBreadth.push(groupResult.buckets.get(key)); + }); + return nodesByBreadth; + } + /** + * Compute the original y-position for each node + */ + + + function initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) { + var minKy = Infinity; + each(nodesByBreadth, function (nodes) { + var n = nodes.length; + var sum = 0; + each(nodes, function (node) { + sum += node.getLayout().value; + }); + var ky = orient === 'vertical' ? (width - (n - 1) * nodeGap) / sum : (height - (n - 1) * nodeGap) / sum; + + if (ky < minKy) { + minKy = ky; + } + }); + each(nodesByBreadth, function (nodes) { + each(nodes, function (node, i) { + var nodeDy = node.getLayout().value * minKy; + + if (orient === 'vertical') { + node.setLayout({ + x: i + }, true); + node.setLayout({ + dx: nodeDy + }, true); + } else { + node.setLayout({ + y: i + }, true); + node.setLayout({ + dy: nodeDy + }, true); + } + }); + }); + each(edges, function (edge) { + var edgeDy = +edge.getValue() * minKy; + edge.setLayout({ + dy: edgeDy + }, true); + }); + } + /** + * Resolve the collision of initialized depth (y-position) + */ + + + function resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) { + var keyAttr = orient === 'vertical' ? 'x' : 'y'; + each(nodesByBreadth, function (nodes) { + nodes.sort(function (a, b) { + return a.getLayout()[keyAttr] - b.getLayout()[keyAttr]; + }); + var nodeX; + var node; + var dy; + var y0 = 0; + var n = nodes.length; + var nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy'; + + for (var i = 0; i < n; i++) { + node = nodes[i]; + dy = y0 - node.getLayout()[keyAttr]; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] + dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + } + + y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap; + } + + var viewWidth = orient === 'vertical' ? width : height; // If the bottommost node goes outside the bounds, push it back up + + dy = y0 - nodeGap - viewWidth; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] - dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + y0 = nodeX; + + for (var i = n - 2; i >= 0; --i) { + node = nodes[i]; + dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] - dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + } + + y0 = node.getLayout()[keyAttr]; + } + } + }); + } + /** + * Change the y-position of the nodes, except most the right side nodes + * @param nodesByBreadth + * @param alpha parameter used to adjust the nodes y-position + */ + + + function relaxRightToLeft(nodesByBreadth, alpha, orient) { + each(nodesByBreadth.slice().reverse(), function (nodes) { + each(nodes, function (node) { + if (node.outEdges.length) { + var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue); + + if (isNaN(y)) { + var len = node.outEdges.length; + y = len ? sum(node.outEdges, centerTarget, orient) / len : 0; + } + + if (orient === 'vertical') { + var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha; + node.setLayout({ + x: nodeX + }, true); + } else { + var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha; + node.setLayout({ + y: nodeY + }, true); + } + } + }); + }); + } + + function weightedTarget(edge, orient) { + return center$1(edge.node2, orient) * edge.getValue(); + } + + function centerTarget(edge, orient) { + return center$1(edge.node2, orient); + } + + function weightedSource(edge, orient) { + return center$1(edge.node1, orient) * edge.getValue(); + } + + function centerSource(edge, orient) { + return center$1(edge.node1, orient); + } + + function center$1(node, orient) { + return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2; + } + + function getEdgeValue(edge) { + return edge.getValue(); + } + + function sum(array, cb, orient) { + var sum = 0; + var len = array.length; + var i = -1; + + while (++i < len) { + var value = +cb(array[i], orient); + + if (!isNaN(value)) { + sum += value; + } + } + + return sum; + } + /** + * Change the y-position of the nodes, except most the left side nodes + */ + + + function relaxLeftToRight(nodesByBreadth, alpha, orient) { + each(nodesByBreadth, function (nodes) { + each(nodes, function (node) { + if (node.inEdges.length) { + var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue); + + if (isNaN(y)) { + var len = node.inEdges.length; + y = len ? sum(node.inEdges, centerSource, orient) / len : 0; + } + + if (orient === 'vertical') { + var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha; + node.setLayout({ + x: nodeX + }, true); + } else { + var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha; + node.setLayout({ + y: nodeY + }, true); + } + } + }); + }); + } + /** + * Compute the depth(y-position) of each edge + */ + + + function computeEdgeDepths(nodes, orient) { + var keyAttr = orient === 'vertical' ? 'x' : 'y'; + each(nodes, function (node) { + node.outEdges.sort(function (a, b) { + return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr]; + }); + node.inEdges.sort(function (a, b) { + return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr]; + }); + }); + each(nodes, function (node) { + var sy = 0; + var ty = 0; + each(node.outEdges, function (edge) { + edge.setLayout({ + sy: sy + }, true); + sy += edge.getLayout().dy; + }); + each(node.inEdges, function (edge) { + edge.setLayout({ + ty: ty + }, true); + ty += edge.getLayout().dy; + }); + }); + } + + function sankeyVisual(ecModel) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + + if (nodes.length) { + var minValue_1 = Infinity; + var maxValue_1 = -Infinity; + each(nodes, function (node) { + var nodeValue = node.getLayout().value; + + if (nodeValue < minValue_1) { + minValue_1 = nodeValue; + } + + if (nodeValue > maxValue_1) { + maxValue_1 = nodeValue; + } + }); + each(nodes, function (node) { + var mapping = new VisualMapping({ + type: 'color', + mappingMethod: 'linear', + dataExtent: [minValue_1, maxValue_1], + visual: seriesModel.get('color') + }); + var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value); + var customColor = node.getModel().get(['itemStyle', 'color']); + + if (customColor != null) { + node.setVisual('color', customColor); + node.setVisual('style', { + fill: customColor + }); + } else { + node.setVisual('color', mapValueToColor); + node.setVisual('style', { + fill: mapValueToColor + }); + } + }); + } + }); + } + + function install$i(registers) { + registers.registerChartView(SankeyView); + registers.registerSeriesModel(SankeySeriesModel); + registers.registerLayout(sankeyLayout); + registers.registerVisual(sankeyVisual); + registers.registerAction({ + type: 'dragNode', + event: 'dragnode', + // here can only use 'update' now, other value is not support in echarts. + update: 'update' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'sankey', + query: payload + }, function (seriesModel) { + seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]); + }); + }); + } + + var WhiskerBoxCommonMixin = + /** @class */ + function () { + function WhiskerBoxCommonMixin() {} + /** + * @override + */ + + + WhiskerBoxCommonMixin.prototype.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 ordinalMeta; + 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 + // Consider time axis. + + if (xAxisType === 'category') { + option.layout = 'horizontal'; + ordinalMeta = xAxisModel.getOrdinalMeta(); + addOrdinal = true; + } else if (yAxisType === 'category') { + option.layout = 'vertical'; + ordinalMeta = yAxisModel.getOrdinalMeta(); + addOrdinal = true; + } else { + option.layout = option.layout || 'horizontal'; + } + + var coordDims = ['x', 'y']; + var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1; + var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex]; + var otherAxisDim = coordDims[1 - baseAxisDimIndex]; + var axisModels = [xAxisModel, yAxisModel]; + var baseAxisType = axisModels[baseAxisDimIndex].get('type'); + var otherAxisType = axisModels[1 - baseAxisDimIndex].get('type'); + var data = option.data; // ??? FIXME make a stage to perform data transfrom. + // MUST create a new data, consider setOption({}) again. + + if (data && addOrdinal) { + var newOptionData_1 = []; + each(data, function (item, index) { + var newItem; + + if (isArray(item)) { + newItem = item.slice(); + item.unshift(index); + } else if (isArray(item.value)) { + newItem = item.value.slice(); + item.value.unshift(index); + } else { + newItem = item; + } + + newOptionData_1.push(newItem); + }); + option.data = newOptionData_1; + } + + var defaultValueDimensions = this.defaultValueDimensions; + var coordDimensions = [{ + name: baseAxisDim, + type: getDimensionTypeByAxis(baseAxisType), + ordinalMeta: ordinalMeta, + otherDims: { + tooltip: false, + itemName: 0 + }, + dimsDef: ['base'] + }, { + name: otherAxisDim, + type: getDimensionTypeByAxis(otherAxisType), + dimsDef: defaultValueDimensions.slice() + }]; + return createListSimply(this, { + coordDimensions: coordDimensions, + dimensionsCount: defaultValueDimensions.length + 1, + encodeDefaulter: curry(makeSeriesEncodeForAxisCoordSys, coordDimensions, this) + }); + }; + /** + * If horizontal, base axis is x, otherwise y. + * @override + */ + + + WhiskerBoxCommonMixin.prototype.getBaseAxis = function () { + var dim = this._baseAxisDim; + return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis; + }; + + return WhiskerBoxCommonMixin; + }(); + + var BoxplotSeriesModel = + /** @class */ + function (_super) { + __extends(BoxplotSeriesModel, _super); + + function BoxplotSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BoxplotSeriesModel.type; // 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 + */ + + _this.defaultValueDimensions = [{ + name: 'min', + defaultTooltip: true + }, { + name: 'Q1', + defaultTooltip: true + }, { + name: 'median', + defaultTooltip: true + }, { + name: 'Q3', + defaultTooltip: true + }, { + name: 'max', + defaultTooltip: true + }]; + _this.visualDrawType = 'stroke'; + return _this; + } + + BoxplotSeriesModel.type = 'series.boxplot'; + BoxplotSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid']; + BoxplotSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + layout: null, + boxWidth: [7, 50], + itemStyle: { + color: '#fff', + borderWidth: 1 + }, + emphasis: { + scale: true, + itemStyle: { + borderWidth: 2, + shadowBlur: 5, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0,0,0,0.2)' + } + }, + animationDuration: 800 + }; + return BoxplotSeriesModel; + }(SeriesModel); + + mixin(BoxplotSeriesModel, WhiskerBoxCommonMixin, true); + + var BoxplotView = + /** @class */ + function (_super) { + __extends(BoxplotView, _super); + + function BoxplotView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BoxplotView.type; + return _this; + } + + BoxplotView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var group = this.group; + var oldData = this._data; // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!this._data) { + group.removeAll(); + } + + var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0; + data.diff(oldData).add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + var symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, 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; + } + + var itemLayout = data.getItemLayout(newIdx); + + if (!symbolEl) { + symbolEl = createNormalBox(itemLayout, data, newIdx, constDim); + } else { + updateNormalBoxData(itemLayout, symbolEl, data, newIdx); + } + + group.add(symbolEl); + data.setItemGraphicEl(newIdx, symbolEl); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }).execute(); + this._data = data; + }; + + BoxplotView.prototype.remove = function (ecModel) { + var group = this.group; + var data = this._data; + this._data = null; + data && data.eachItemGraphicEl(function (el) { + el && group.remove(el); + }); + }; + + BoxplotView.type = 'boxplot'; + return BoxplotView; + }(ChartView); + + var BoxPathShape = + /** @class */ + function () { + function BoxPathShape() {} + + return BoxPathShape; + }(); + + var BoxPath = + /** @class */ + function (_super) { + __extends(BoxPath, _super); + + function BoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'boxplotBoxPath'; + return _this; + } + + BoxPath.prototype.getDefaultShape = function () { + return new BoxPathShape(); + }; + + BoxPath.prototype.buildPath = function (ctx, shape) { + var ends = shape.points; + var i = 0; + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + + for (; i < 4; i++) { + ctx.lineTo(ends[i][0], ends[i][1]); + } + + ctx.closePath(); + + for (; i < ends.length; i++) { + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + ctx.lineTo(ends[i][0], ends[i][1]); + } + }; + + return BoxPath; + }(Path); + + function createNormalBox(itemLayout, data, dataIndex, constDim, isInit) { + var ends = itemLayout.ends; + var el = new BoxPath({ + shape: { + points: isInit ? transInit(ends, constDim, itemLayout) : ends + } + }); + updateNormalBoxData(itemLayout, el, data, dataIndex, isInit); + return el; + } + + function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) { + var seriesModel = data.hostModel; + var updateMethod = graphic[isInit ? 'initProps' : 'updateProps']; + updateMethod(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, dataIndex); + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.strokeNoScale = true; + el.z2 = 100; + var itemModel = data.getItemModel(dataIndex); + setStatesStylesFromModel(el, itemModel); + enableHoverEmphasis(el, itemModel.get(['emphasis', 'focus']), itemModel.get(['emphasis', 'blurScope'])); + } + + function transInit(points, dim, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[dim] = itemLayout.initBaseline; + return point; + }); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function boxplotVisual(ecModel, api) { + ecModel.eachRawSeriesByType('boxplot', function (seriesModel) { + seriesModel.getData().setVisual('legendSymbol', 'roundRect'); + }); + } + + var each$7 = each; + function boxplotLayout(ecModel) { + var groupResult = groupSeriesByAxis(ecModel); + each$7(groupResult, function (groupItem) { + var seriesModels = groupItem.seriesModels; + + if (!seriesModels.length) { + return; + } + + calculateBase(groupItem); + each$7(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 = 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_1 = 0; + each$7(seriesModels, function (seriesModel) { + maxDataCount_1 = Math.max(maxDataCount_1, seriesModel.getData().count()); + }); + extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / maxDataCount_1; + } + + each$7(seriesModels, function (seriesModel) { + var boxWidthBound = seriesModel.get('boxWidth'); + + if (!isArray(boxWidthBound)) { + boxWidthBound = [boxWidthBound, boxWidthBound]; + } + + boundList.push([parsePercent$1(boxWidthBound[0], bandWidth) || 0, parsePercent$1(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$7(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 halfWidth = boxWidth / 2; + var cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1; + var vDimIdx = 1 - cDimIdx; + var coordDims = ['x', 'y']; + var cDim = data.mapDimension(coordDims[cDimIdx]); + var vDims = data.mapDimensionsAll(coordDims[vDimIdx]); + + if (cDim == null || vDims.length < 5) { + return; + } + + for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) { + var axisDimVal = data.get(cDim, dataIndex); + var median = getPoint(axisDimVal, vDims[2], dataIndex); + var end1 = getPoint(axisDimVal, vDims[0], dataIndex); + var end2 = getPoint(axisDimVal, vDims[1], dataIndex); + var end4 = getPoint(axisDimVal, vDims[3], dataIndex); + var end5 = getPoint(axisDimVal, vDims[4], dataIndex); + var ends = []; + addBodyEnd(ends, end2, false); + addBodyEnd(ends, end4, true); + ends.push(end1, end2, end5, end4); + layEndLine(ends, end1); + layEndLine(ends, end5); + layEndLine(ends, median); + data.setItemLayout(dataIndex, { + initBaseline: median[vDimIdx], + ends: ends + }); + } + + function getPoint(axisDimVal, dim, dataIndex) { + var val = data.get(dim, dataIndex); + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + var point; + + if (isNaN(axisDimVal) || isNaN(val)) { + point = [NaN, NaN]; + } else { + point = coordSys.dataToPoint(p); + point[cDimIdx] += offset; + } + + return point; + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] += halfWidth; + point2[cDimIdx] -= halfWidth; + start ? ends.push(point1, point2) : ends.push(point2, point1); + } + + function layEndLine(ends, endCenter) { + var from = endCenter.slice(); + var to = endCenter.slice(); + from[cDimIdx] -= halfWidth; + to[cDimIdx] += halfWidth; + ends.push(from, to); + } + } + + /** + * See: + * + * + * + * Helper method for preparing data. + * + * @param rawData like + * [ + * [12,232,443], (raw data set for the first box) + * [3843,5545,1232], (raw data set for the second box) + * ... + * ] + * @param opt.boundIQR=1.5 Data less than min bound is outlier. + * default 1.5, means Q1 - 1.5 * (Q3 - Q1). + * If 'none'/0 passed, min bound will not be used. + */ + + function prepareBoxplotData(rawData, opt) { + opt = opt || {}; + var boxData = []; + var outliers = []; + var boundIQR = opt.boundIQR; + var useExtreme = boundIQR === 'none' || boundIQR === 0; + + for (var i = 0; i < rawData.length; i++) { + var ascList = asc(rawData[i].slice()); + var Q1 = quantile(ascList, 0.25); + var Q2 = quantile(ascList, 0.5); + var Q3 = quantile(ascList, 0.75); + var min = ascList[0]; + var max = ascList[ascList.length - 1]; + var bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1); + var low = useExtreme ? min : Math.max(min, Q1 - bound); + var high = useExtreme ? max : Math.min(max, Q3 + bound); + var itemNameFormatter = opt.itemNameFormatter; + var itemName = isFunction(itemNameFormatter) ? itemNameFormatter({ + value: i + }) : isString(itemNameFormatter) ? itemNameFormatter.replace('{value}', i + '') : i + ''; + boxData.push([itemName, low, Q1, Q2, Q3, high]); + + for (var j = 0; j < ascList.length; j++) { + var dataItem = ascList[j]; + + if (dataItem < low || dataItem > high) { + var outlier = [itemName, dataItem]; + outliers.push(outlier); + } + } + } + + return { + boxData: boxData, + outliers: outliers + }; + } + + var boxplotTransform = { + type: 'echarts:boxplot', + transform: function transform(params) { + var upstream = params.upstream; + + if (upstream.sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('source data is not applicable for this boxplot transform. Expect number[][].'); + } + + throwError(errMsg); + } + + var result = prepareBoxplotData(upstream.getRawData(), params.config); + return [{ + dimensions: ['ItemName', 'Low', 'Q1', 'Q2', 'Q3', 'High'], + data: result.boxData + }, { + data: result.outliers + }]; + } + }; + + function install$j(registers) { + registers.registerSeriesModel(BoxplotSeriesModel); + registers.registerChartView(BoxplotView); + registers.registerVisual(boxplotVisual); + registers.registerLayout(boxplotLayout); + registers.registerTransform(boxplotTransform); + } + + var SKIP_PROPS = ['color', 'borderColor']; + + var CandlestickView = + /** @class */ + function (_super) { + __extends(CandlestickView, _super); + + function CandlestickView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CandlestickView.type; + return _this; + } + + CandlestickView.prototype.render = function (seriesModel, ecModel, api) { + // If there is clipPath created in large mode. Remove it. + this.group.removeClipPath(); + + this._updateDrawMode(seriesModel); + + this._isLargeDraw ? this._renderLarge(seriesModel) : this._renderNormal(seriesModel); + }; + + CandlestickView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this._clear(); + + this._updateDrawMode(seriesModel); + }; + + CandlestickView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { + this._isLargeDraw ? this._incrementalRenderLarge(params, seriesModel) : this._incrementalRenderNormal(params, seriesModel); + }; + + CandlestickView.prototype._updateDrawMode = function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + + if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + + this._clear(); + } + }; + + CandlestickView.prototype._renderNormal = function (seriesModel) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var isSimpleBox = data.getLayout('isSimpleBox'); + var needsClip = seriesModel.get('clip', true); + var coord = seriesModel.coordinateSystem; + var clipArea = coord.getArea && coord.getArea(); // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!this._data) { + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + + if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { + return; + } + + var el = createNormalBox$1(itemLayout, newIdx, true); + initProps(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, newIdx); + setBoxCommon(el, data, newIdx, isSimpleBox); + group.add(el); + data.setItemGraphicEl(newIdx, el); + } + }).update(function (newIdx, oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); // Empty data + + if (!data.hasValue(newIdx)) { + group.remove(el); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + + if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { + group.remove(el); + return; + } + + if (!el) { + el = createNormalBox$1(itemLayout); + } else { + updateProps(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, newIdx); + } + + setBoxCommon(el, data, newIdx, isSimpleBox); + group.add(el); + data.setItemGraphicEl(newIdx, el); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }).execute(); + this._data = data; + }; + + CandlestickView.prototype._renderLarge = function (seriesModel) { + this._clear(); + + createLarge$1(seriesModel, this.group); + var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null; + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + }; + + CandlestickView.prototype._incrementalRenderNormal = function (params, seriesModel) { + var data = seriesModel.getData(); + var isSimpleBox = data.getLayout('isSimpleBox'); + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var itemLayout = data.getItemLayout(dataIndex); + var el = createNormalBox$1(itemLayout); + setBoxCommon(el, data, dataIndex, isSimpleBox); + el.incremental = true; + this.group.add(el); + } + }; + + CandlestickView.prototype._incrementalRenderLarge = function (params, seriesModel) { + createLarge$1(seriesModel, this.group, true); + }; + + CandlestickView.prototype.remove = function (ecModel) { + this._clear(); + }; + + CandlestickView.prototype._clear = function () { + this.group.removeAll(); + this._data = null; + }; + + CandlestickView.type = 'candlestick'; + return CandlestickView; + }(ChartView); + + var NormalBoxPathShape = + /** @class */ + function () { + function NormalBoxPathShape() {} + + return NormalBoxPathShape; + }(); + + var NormalBoxPath = + /** @class */ + function (_super) { + __extends(NormalBoxPath, _super); + + function NormalBoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'normalCandlestickBox'; + return _this; + } + + NormalBoxPath.prototype.getDefaultShape = function () { + return new NormalBoxPathShape(); + }; + + NormalBoxPath.prototype.buildPath = function (ctx, shape) { + var ends = shape.points; + + if (this.__simpleBox) { + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[6][0], ends[6][1]); + } else { + ctx.moveTo(ends[0][0], ends[0][1]); + ctx.lineTo(ends[1][0], ends[1][1]); + ctx.lineTo(ends[2][0], ends[2][1]); + ctx.lineTo(ends[3][0], ends[3][1]); + ctx.closePath(); + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[5][0], ends[5][1]); + ctx.moveTo(ends[6][0], ends[6][1]); + ctx.lineTo(ends[7][0], ends[7][1]); + } + }; + + return NormalBoxPath; + }(Path); + + function createNormalBox$1(itemLayout, dataIndex, isInit) { + var ends = itemLayout.ends; + return new NormalBoxPath({ + shape: { + points: isInit ? transInit$1(ends, itemLayout) : ends + }, + z2: 100 + }); + } + + function isNormalBoxClipped(clipArea, itemLayout) { + var clipped = true; + + for (var i = 0; i < itemLayout.ends.length; i++) { + // If any point are in the region. + if (clipArea.contain(itemLayout.ends[i][0], itemLayout.ends[i][1])) { + clipped = false; + break; + } + } + + return clipped; + } + + function setBoxCommon(el, data, dataIndex, isSimpleBox) { + var itemModel = data.getItemModel(dataIndex); + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.strokeNoScale = true; + el.__simpleBox = isSimpleBox; + setStatesStylesFromModel(el, itemModel); + } + + function transInit$1(points, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[1] = itemLayout.initBaseline; + return point; + }); + } + + var LargeBoxPathShape = + /** @class */ + function () { + function LargeBoxPathShape() {} + + return LargeBoxPathShape; + }(); + + var LargeBoxPath = + /** @class */ + function (_super) { + __extends(LargeBoxPath, _super); + + function LargeBoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'largeCandlestickBox'; + return _this; + } + + LargeBoxPath.prototype.getDefaultShape = function () { + return new LargeBoxPathShape(); + }; + + LargeBoxPath.prototype.buildPath = function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + + for (var i = 0; i < points.length;) { + if (this.__sign === points[i++]) { + var x = points[i++]; + ctx.moveTo(x, points[i++]); + ctx.lineTo(x, points[i++]); + } else { + i += 3; + } + } + }; + + return LargeBoxPath; + }(Path); + + function createLarge$1(seriesModel, group, incremental) { + var data = seriesModel.getData(); + var largePoints = data.getLayout('largePoints'); + var elP = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: 1 + }); + group.add(elP); + var elN = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: -1 + }); + group.add(elN); + setLargeStyle$1(1, elP, seriesModel); + setLargeStyle$1(-1, elN, seriesModel); + + if (incremental) { + elP.incremental = true; + elN.incremental = true; + } + } + + function setLargeStyle$1(sign, el, seriesModel, data) { + // TODO put in visual? + var borderColor = seriesModel.get(['itemStyle', sign > 0 ? 'borderColor' : 'borderColor0']) || seriesModel.get(['itemStyle', sign > 0 ? 'color' : 'color0']); // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + + var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(SKIP_PROPS); + el.useStyle(itemStyle); + el.style.fill = null; + el.style.stroke = borderColor; + } + + var CandlestickSeriesModel = + /** @class */ + function (_super) { + __extends(CandlestickSeriesModel, _super); + + function CandlestickSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CandlestickSeriesModel.type; + _this.defaultValueDimensions = [{ + name: 'open', + defaultTooltip: true + }, { + name: 'close', + defaultTooltip: true + }, { + name: 'lowest', + defaultTooltip: true + }, { + name: 'highest', + defaultTooltip: true + }]; + return _this; + } + /** + * Get dimension for shadow in dataZoom + * @return dimension name + */ + + + CandlestickSeriesModel.prototype.getShadowDim = function () { + return 'open'; + }; + + CandlestickSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + var itemLayout = data.getItemLayout(dataIndex); + return itemLayout && selectors.rect(itemLayout.brushRect); + }; + + CandlestickSeriesModel.type = 'series.candlestick'; + CandlestickSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid']; + CandlestickSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // xAxisIndex: 0, + // yAxisIndex: 0, + layout: null, + clip: true, + itemStyle: { + color: '#eb5454', + color0: '#47b262', + borderColor: '#eb5454', + borderColor0: '#47b262', + // borderColor: '#d24040', + // borderColor0: '#398f4f', + borderWidth: 1 + }, + emphasis: { + scale: true, + itemStyle: { + borderWidth: 2 + } + }, + barMaxWidth: null, + barMinWidth: null, + barWidth: null, + large: true, + largeThreshold: 600, + progressive: 3e3, + progressiveThreshold: 1e4, + progressiveChunkMode: 'mod', + animationEasing: 'linear', + animationDuration: 300 + }; + return CandlestickSeriesModel; + }(SeriesModel); + + mixin(CandlestickSeriesModel, WhiskerBoxCommonMixin, true); + + function candlestickPreprocessor(option) { + if (!option || !isArray(option.series)) { + return; + } // Translate 'k' to 'candlestick'. + + + each(option.series, function (seriesItem) { + if (isObject(seriesItem) && seriesItem.type === 'k') { + seriesItem.type = 'candlestick'; + } + }); + } + + var positiveBorderColorQuery = ['itemStyle', 'borderColor']; + var negativeBorderColorQuery = ['itemStyle', 'borderColor0']; + var positiveColorQuery = ['itemStyle', 'color']; + var negativeColorQuery = ['itemStyle', 'color0']; + var candlestickVisual = { + seriesType: 'candlestick', + plan: createRenderPlanner(), + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + function getColor(sign, model) { + return model.get(sign > 0 ? positiveColorQuery : negativeColorQuery); + } + + function getBorderColor(sign, model) { + return model.get(sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery); + } + + var data = seriesModel.getData(); + data.setVisual('legendSymbol', 'roundRect'); // Only visible series has each data be visual encoded + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var isLargeRender = seriesModel.pipelineContext.large; + return !isLargeRender && { + progress: function (params, data) { + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var itemModel = data.getItemModel(dataIndex); + var sign = data.getItemLayout(dataIndex).sign; + var style = itemModel.getItemStyle(); + style.fill = getColor(sign, itemModel); + style.stroke = getBorderColor(sign, itemModel) || style.fill; + var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style'); + extend(existsStyle, style); + } + } + }; + } + }; + + var LargeArr$1 = typeof Float32Array !== 'undefined' ? Float32Array : Array; + var candlestickLayout = { + seriesType: 'candlestick', + plan: createRenderPlanner(), + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var candleWidth = calculateCandleWidth(seriesModel, data); + var cDimIdx = 0; + var vDimIdx = 1; + var coordDims = ['x', 'y']; + var cDim = data.mapDimension(coordDims[cDimIdx]); + var vDims = data.mapDimensionsAll(coordDims[vDimIdx]); + var openDim = vDims[0]; + var closeDim = vDims[1]; + var lowestDim = vDims[2]; + var highestDim = vDims[3]; + data.setLayout({ + candleWidth: candleWidth, + // The value is experimented visually. + isSimpleBox: candleWidth <= 1.3 + }); + + if (cDim == null || vDims.length < 4) { + return; + } + + return { + progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress + }; + + function normalProgress(params, data) { + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var axisDimVal = data.get(cDim, dataIndex); + var openVal = data.get(openDim, dataIndex); + var closeVal = data.get(closeDim, dataIndex); + var lowestVal = data.get(lowestDim, dataIndex); + var highestVal = data.get(highestDim, dataIndex); + var ocLow = Math.min(openVal, closeVal); + var ocHigh = Math.max(openVal, closeVal); + var ocLowPoint = getPoint(ocLow, axisDimVal); + var ocHighPoint = getPoint(ocHigh, axisDimVal); + var lowestPoint = getPoint(lowestVal, axisDimVal); + var highestPoint = getPoint(highestVal, axisDimVal); + var ends = []; + addBodyEnd(ends, ocHighPoint, 0); + addBodyEnd(ends, ocLowPoint, 1); + ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint)); + data.setItemLayout(dataIndex, { + sign: getSign(data, dataIndex, openVal, closeVal, closeDim), + initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], + ends: ends, + brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal) + }); + } + + function getPoint(val, axisDimVal) { + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + return isNaN(axisDimVal) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p); + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] = subPixelOptimize$1(point1[cDimIdx] + candleWidth / 2, 1, false); + point2[cDimIdx] = subPixelOptimize$1(point2[cDimIdx] - candleWidth / 2, 1, true); + start ? ends.push(point1, point2) : ends.push(point2, point1); + } + + function makeBrushRect(lowestVal, highestVal, axisDimVal) { + var pmin = getPoint(lowestVal, axisDimVal); + var pmax = getPoint(highestVal, axisDimVal); + pmin[cDimIdx] -= candleWidth / 2; + pmax[cDimIdx] -= candleWidth / 2; + return { + x: pmin[0], + y: pmin[1], + width: candleWidth , + height: pmax[1] - pmin[1] + }; + } + + function subPixelOptimizePoint(point) { + point[cDimIdx] = subPixelOptimize$1(point[cDimIdx], 1); + return point; + } + } + + function largeProgress(params, data) { + // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...] + var points = new LargeArr$1(params.count * 4); + var offset = 0; + var point; + var tmpIn = []; + var tmpOut = []; + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var axisDimVal = data.get(cDim, dataIndex); + var openVal = data.get(openDim, dataIndex); + var closeVal = data.get(closeDim, dataIndex); + var lowestVal = data.get(lowestDim, dataIndex); + var highestVal = data.get(highestDim, dataIndex); + + if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) { + points[offset++] = NaN; + offset += 3; + continue; + } + + points[offset++] = getSign(data, dataIndex, openVal, closeVal, closeDim); + tmpIn[cDimIdx] = axisDimVal; + tmpIn[vDimIdx] = lowestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[0] : NaN; + points[offset++] = point ? point[1] : NaN; + tmpIn[vDimIdx] = highestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[1] : NaN; + } + + data.setLayout('largePoints', points); + } + } + }; + + function getSign(data, dataIndex, openVal, closeVal, closeDim) { + var sign; + + if (openVal > closeVal) { + sign = -1; + } else if (openVal < closeVal) { + sign = 1; + } else { + sign = dataIndex > 0 // If close === open, compare with close of last record + ? data.get(closeDim, dataIndex - 1) <= closeVal ? 1 : -1 : // No record of previous, set to be positive + 1; + } + + return sign; + } + + 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()); + var barMaxWidth = parsePercent$1(retrieve2(seriesModel.get('barMaxWidth'), bandWidth), bandWidth); + var barMinWidth = parsePercent$1(retrieve2(seriesModel.get('barMinWidth'), 1), bandWidth); + var barWidth = seriesModel.get('barWidth'); + return barWidth != null ? parsePercent$1(barWidth, bandWidth) // Put max outer to ensure bar visible in spite of overlap. + : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth); + } + + function install$k(registers) { + registers.registerChartView(CandlestickView); + registers.registerSeriesModel(CandlestickSeriesModel); + registers.registerPreprocessor(candlestickPreprocessor); + registers.registerVisual(candlestickVisual); + registers.registerLayout(candlestickLayout); + } + + var EFFECT_RIPPLE_NUMBER = 3; + + function normalizeSymbolSize$1(symbolSize) { + if (!isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + + return symbolSize; + } + + function updateRipplePath(rippleGroup, effectCfg) { + var color = effectCfg.rippleEffectColor || effectCfg.color; + rippleGroup.eachChild(function (ripplePath) { + ripplePath.attr({ + z: effectCfg.z, + zlevel: effectCfg.zlevel, + style: { + stroke: effectCfg.brushType === 'stroke' ? color : null, + fill: effectCfg.brushType === 'fill' ? color : null + } + }); + }); + } + + var EffectSymbol = + /** @class */ + function (_super) { + __extends(EffectSymbol, _super); + + function EffectSymbol(data, idx) { + var _this = _super.call(this) || this; + + var symbol = new Symbol(data, idx); + var rippleGroup = new Group(); + + _this.add(symbol); + + _this.add(rippleGroup); + + _this.updateData(data, idx); + + return _this; + } + + EffectSymbol.prototype.stopEffectAnimation = function () { + this.childAt(1).removeAll(); + }; + + EffectSymbol.prototype.startEffectAnimation = function (effectCfg) { + var symbolType = effectCfg.symbolType; + var color = effectCfg.color; + var rippleGroup = this.childAt(1); + + for (var i = 0; i < EFFECT_RIPPLE_NUMBER; i++) { + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4136. + var ripplePath = createSymbol(symbolType, -1, -1, 2, 2, color); + ripplePath.attr({ + style: { + strokeNoScale: true + }, + z2: 99, + silent: true, + scaleX: 0.5, + scaleY: 0.5 + }); + var delay = -i / EFFECT_RIPPLE_NUMBER * effectCfg.period + effectCfg.effectOffset; // TODO Configurable effectCfg.period + + ripplePath.animate('', true).when(effectCfg.period, { + scale: [effectCfg.rippleScale / 2, effectCfg.rippleScale / 2] + }).delay(delay).start(); + ripplePath.animateStyle(true).when(effectCfg.period, { + opacity: 0 + }).delay(delay).start(); + rippleGroup.add(ripplePath); + } + + updateRipplePath(rippleGroup, effectCfg); + }; + /** + * Update effect symbol + */ + + + EffectSymbol.prototype.updateEffectAnimation = function (effectCfg) { + var oldEffectCfg = this._effectCfg; + var rippleGroup = this.childAt(1); // Must reinitialize effect if following configuration changed + + var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale']; + + for (var i = 0; i < DIFFICULT_PROPS.length; i++) { + var propName = DIFFICULT_PROPS[i]; + + if (oldEffectCfg[propName] !== effectCfg[propName]) { + this.stopEffectAnimation(); + this.startEffectAnimation(effectCfg); + return; + } + } + + updateRipplePath(rippleGroup, effectCfg); + }; + /** + * Highlight symbol + */ + + + EffectSymbol.prototype.highlight = function () { + enterEmphasis(this); + }; + /** + * Downplay symbol + */ + + + EffectSymbol.prototype.downplay = function () { + leaveEmphasis(this); + }; + /** + * Update symbol properties + */ + + + EffectSymbol.prototype.updateData = function (data, idx) { + var _this = this; + + 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$1(data.getItemVisual(idx, 'symbolSize')); + var symbolStyle = data.getItemVisual(idx, 'style'); + var color = symbolStyle && symbolStyle.fill; + rippleGroup.setScale(symbolSize); + rippleGroup.traverse(function (ripplePath) { + ripplePath.setStyle('fill', color); + }); + var symbolOffset = itemModel.getShallow('symbolOffset'); + + if (symbolOffset) { + rippleGroup.x = parsePercent$1(symbolOffset[0], symbolSize[0]); + rippleGroup.y = parsePercent$1(symbolOffset[1], symbolSize[1]); + } + + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + rippleGroup.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var effectCfg = {}; + effectCfg.showEffectOn = seriesModel.get('showEffectOn'); + effectCfg.rippleScale = itemModel.get(['rippleEffect', 'scale']); + effectCfg.brushType = itemModel.get(['rippleEffect', 'brushType']); + effectCfg.period = itemModel.get(['rippleEffect', 'period']) * 1000; + effectCfg.effectOffset = idx / data.count(); + effectCfg.z = seriesModel.getShallow('z') || 0; + effectCfg.zlevel = seriesModel.getShallow('zlevel') || 0; + effectCfg.symbolType = symbolType; + effectCfg.color = color; + effectCfg.rippleEffectColor = itemModel.get(['rippleEffect', 'color']); + this.off('mouseover').off('mouseout').off('emphasis').off('normal'); + + if (effectCfg.showEffectOn === 'render') { + this._effectCfg ? this.updateEffectAnimation(effectCfg) : this.startEffectAnimation(effectCfg); + this._effectCfg = effectCfg; + } else { + // Not keep old effect config + this._effectCfg = null; + this.stopEffectAnimation(); + + this.onHoverStateChange = function (toState) { + if (toState === 'emphasis') { + if (effectCfg.showEffectOn !== 'render') { + _this.startEffectAnimation(effectCfg); + } + } else if (toState === 'normal') { + if (effectCfg.showEffectOn !== 'render') { + _this.stopEffectAnimation(); + } + } + }; + } + + this._effectCfg = effectCfg; + enableHoverEmphasis(this); + }; + + EffectSymbol.prototype.fadeOut = function (cb) { + this.off('mouseover').off('mouseout'); + cb && cb(); + }; + return EffectSymbol; + }(Group); + + inherits(EffectSymbol, Group); + + var EffectScatterView = + /** @class */ + function (_super) { + __extends(EffectScatterView, _super); + + function EffectScatterView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = EffectScatterView.type; + return _this; + } + + EffectScatterView.prototype.init = function () { + this._symbolDraw = new SymbolDraw(EffectSymbol); + }; + + EffectScatterView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var effectSymbolDraw = this._symbolDraw; + effectSymbolDraw.updateData(data); + this.group.add(effectSymbolDraw.group); + }; + + EffectScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + this.group.dirty(); + var res = pointsLayout('').reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } + + this._symbolDraw.updateLayout(); + }; + + EffectScatterView.prototype._updateGroupTransform = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.getRoamTransform) { + this.group.transform = clone$2(coordSys.getRoamTransform()); + this.group.decomposeTransform(); + } + }; + + EffectScatterView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + }; + + EffectScatterView.type = 'effectScatter'; + return EffectScatterView; + }(ChartView); + + var EffectScatterSeriesModel = + /** @class */ + function (_super) { + __extends(EffectScatterSeriesModel, _super); + + function EffectScatterSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = EffectScatterSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + EffectScatterSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListFromArray(this.getSource(), this, { + useEncodeDefaulter: true + }); + }; + + EffectScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.point(data.getItemLayout(dataIndex)); + }; + + EffectScatterSeriesModel.type = 'series.effectScatter'; + EffectScatterSeriesModel.dependencies = ['grid', 'polar']; + EffectScatterSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + zlevel: 0, + z: 2, + legendHoverLink: true, + effectType: 'ripple', + progressive: 0, + // 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, // 图形旋转控制 + // itemStyle: { + // opacity: 1 + // } + + }; + return EffectScatterSeriesModel; + }(SeriesModel); + + function install$l(registers) { + registers.registerChartView(EffectScatterView); + registers.registerSeriesModel(EffectScatterSeriesModel); + registers.registerLayout(pointsLayout('effectScatter')); + } + + var EffectLine = + /** @class */ + function (_super) { + __extends(EffectLine, _super); + + function EffectLine(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this.add(_this.createLine(lineData, idx, seriesScope)); + + _this._updateEffectSymbol(lineData, idx); + + return _this; + } + + EffectLine.prototype.createLine = function (lineData, idx, seriesScope) { + return new Line$1(lineData, idx, seriesScope); + }; + + EffectLine.prototype._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 (!isArray(size)) { + size = [size, size]; + } + + var lineStyle = lineData.getItemVisual(idx, 'style'); + var color = effectModel.get('color') || lineStyle && lineStyle.stroke; + var symbol = this.childAt(1); + + if (this._symbolType !== symbolType) { + // Remove previous + this.remove(symbol); + symbol = createSymbol(symbolType, -0.5, -0.5, 1, 1, color); + symbol.z2 = 100; + symbol.culling = true; + this.add(symbol); + } // Symbol may be removed if loop is false + + + if (!symbol) { + return; + } // Shadow color is same with color in default + + + symbol.setStyle('shadowColor', color); + symbol.setStyle(effectModel.getItemStyle(['color'])); + symbol.scaleX = size[0]; + symbol.scaleY = size[1]; + symbol.setColor(color); + this._symbolType = symbolType; + this._symbolScale = size; + + this._updateEffectAnimation(lineData, effectModel, idx); + }; + + EffectLine.prototype._updateEffectAnimation = function (lineData, effectModel, idx) { + var symbol = this.childAt(1); + + if (!symbol) { + return; + } + + var self = this; + var points = lineData.getItemLayout(idx); + var period = effectModel.get('period') * 1000; + var loop = effectModel.get('loop'); + var constantSpeed = effectModel.get('constantSpeed'); + var delayExpr = retrieve(effectModel.get('delay'), function (idx) { + return idx / lineData.count() * period / 3; + }); // Ignore when updating + + symbol.ignore = true; + + this._updateAnimationPoints(symbol, points); + + if (constantSpeed > 0) { + period = this._getLineLength(symbol) / constantSpeed * 1000; + } + + if (period !== this._period || loop !== this._loop) { + symbol.stopAnimation(); + + if (period > 0) { + var delayNum = void 0; + + if (typeof delayExpr === 'function') { + delayNum = delayExpr(idx); + } else { + delayNum = delayExpr; + } + + if (symbol.__t > 0) { + delayNum = -period * symbol.__t; + } + + symbol.__t = 0; + var animator = symbol.animate('', loop).when(period, { + __t: 1 + }).delay(delayNum).during(function () { + self._updateSymbolPosition(symbol); + }); + + if (!loop) { + animator.done(function () { + self.remove(symbol); + }); + } + + animator.start(); + } + } + + this._period = period; + this._loop = loop; + }; + + EffectLine.prototype._getLineLength = function (symbol) { + // Not so accurate + return dist(symbol.__p1, symbol.__cp1) + dist(symbol.__cp1, symbol.__p2); + }; + + EffectLine.prototype._updateAnimationPoints = function (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]; + }; + + EffectLine.prototype.updateData = function (lineData, idx, seriesScope) { + this.childAt(0).updateData(lineData, idx, seriesScope); + + this._updateEffectSymbol(lineData, idx); + }; + + EffectLine.prototype._updateSymbolPosition = function (symbol) { + var p1 = symbol.__p1; + var p2 = symbol.__p2; + var cp1 = symbol.__cp1; + var t = symbol.__t; + var pos = [symbol.x, symbol.y]; + var lastPos = pos.slice(); + var quadraticAt$1 = quadraticAt; + var quadraticDerivativeAt$1 = quadraticDerivativeAt; + pos[0] = quadraticAt$1(p1[0], cp1[0], p2[0], t); + pos[1] = quadraticAt$1(p1[1], cp1[1], p2[1], t); // Tangent + + var tx = quadraticDerivativeAt$1(p1[0], cp1[0], p2[0], t); + var ty = quadraticDerivativeAt$1(p1[1], cp1[1], p2[1], t); + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; // enable continuity trail for 'line', 'rect', 'roundRect' symbolType + + if (this._symbolType === 'line' || this._symbolType === 'rect' || this._symbolType === 'roundRect') { + if (symbol.__lastT !== undefined && symbol.__lastT < symbol.__t) { + symbol.scaleY = dist(lastPos, pos) * 1.05; // make sure the last segment render within endPoint + + if (t === 1) { + pos[0] = lastPos[0] + (pos[0] - lastPos[0]) / 2; + pos[1] = lastPos[1] + (pos[1] - lastPos[1]) / 2; + } + } else if (symbol.__lastT === 1) { + // After first loop, symbol.__t does NOT start with 0, so connect p1 to pos directly. + symbol.scaleY = 2 * dist(p1, pos); + } else { + symbol.scaleY = this._symbolScale[1]; + } + } + + symbol.__lastT = symbol.__t; + symbol.ignore = false; + symbol.x = pos[0]; + symbol.y = pos[1]; + }; + + EffectLine.prototype.updateLayout = function (lineData, idx) { + this.childAt(0).updateLayout(lineData, idx); + var effectModel = lineData.getItemModel(idx).getModel('effect'); + + this._updateEffectAnimation(lineData, effectModel, idx); + }; + + return EffectLine; + }(Group); + + var Polyline$1 = + /** @class */ + function (_super) { + __extends(Polyline$1, _super); + + function Polyline$1(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this._createPolyline(lineData, idx, seriesScope); + + return _this; + } + + Polyline$1.prototype._createPolyline = function (lineData, idx, seriesScope) { + // let seriesModel = lineData.hostModel; + var points = lineData.getItemLayout(idx); + var line = new Polyline({ + shape: { + points: points + } + }); + this.add(line); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Polyline$1.prototype.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childAt(0); + var target = { + shape: { + points: lineData.getItemLayout(idx) + } + }; + updateProps(line, target, seriesModel, idx); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Polyline$1.prototype._updateCommonStl = function (lineData, idx, seriesScope) { + var line = this.childAt(0); + var itemModel = lineData.getItemModel(idx); + var hoverLineStyle = seriesScope && seriesScope.emphasisLineStyle; + + if (!seriesScope || lineData.hasItemOption) { + hoverLineStyle = itemModel.getModel(['emphasis', 'lineStyle']).getLineStyle(); + } + + line.useStyle(lineData.getItemVisual(idx, 'style')); + line.style.fill = null; + line.style.strokeNoScale = true; + var lineEmphasisState = line.ensureState('emphasis'); + lineEmphasisState.style = hoverLineStyle; + enableHoverEmphasis(this); + }; + + Polyline$1.prototype.updateLayout = function (lineData, idx) { + var polyline = this.childAt(0); + polyline.setShape('points', lineData.getItemLayout(idx)); + }; + return Polyline$1; + }(Group); + + var EffectPolyline = + /** @class */ + function (_super) { + __extends(EffectPolyline, _super); + + function EffectPolyline() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this._lastFrame = 0; + _this._lastFramePercent = 0; + return _this; + } // Override + + + EffectPolyline.prototype.createLine = function (lineData, idx, seriesScope) { + return new Polyline$1(lineData, idx, seriesScope); + }; + + EffectPolyline.prototype._updateAnimationPoints = function (symbol, points) { + this._points = points; + var accLenArr = [0]; + var len = 0; + + for (var i = 1; i < points.length; i++) { + var p1 = points[i - 1]; + var p2 = points[i]; + len += dist(p1, p2); + accLenArr.push(len); + } + + if (len === 0) { + this._length = 0; + return; + } + + for (var i = 0; i < accLenArr.length; i++) { + accLenArr[i] /= len; + } + + this._offsets = accLenArr; + this._length = len; + }; + + EffectPolyline.prototype._getLineLength = function () { + return this._length; + }; + + EffectPolyline.prototype._updateSymbolPosition = function (symbol) { + var t = symbol.__t; + var points = this._points; + var offsets = this._offsets; + var len = points.length; + + if (!offsets) { + // Has length 0 + return; + } + + var lastFrame = this._lastFrame; + var frame; + + if (t < this._lastFramePercent) { + // Start from the next frame + // PENDING start from lastFrame ? + var start = Math.min(lastFrame + 1, len - 1); + + for (frame = start; frame >= 0; frame--) { + if (offsets[frame] <= t) { + break; + } + } // PENDING really need to do this ? + + + frame = Math.min(frame, len - 2); + } else { + for (frame = lastFrame; frame < len; frame++) { + if (offsets[frame] > t) { + break; + } + } + + frame = Math.min(frame - 1, len - 2); + } + + var p = (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]); + var p0 = points[frame]; + var p1 = points[frame + 1]; + symbol.x = p0[0] * (1 - p) + p * p1[0]; + symbol.y = p0[1] * (1 - p) + p * p1[1]; + var tx = p1[0] - p0[0]; + var ty = p1[1] - p0[1]; + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; + this._lastFrame = frame; + this._lastFramePercent = t; + symbol.ignore = false; + }; + return EffectPolyline; + }(EffectLine); + + var LargeLinesPathShape = + /** @class */ + function () { + function LargeLinesPathShape() { + this.polyline = false; + this.curveness = 0; + this.segs = []; + } + + return LargeLinesPathShape; + }(); + + var LargeLinesPath = + /** @class */ + function (_super) { + __extends(LargeLinesPath, _super); + + function LargeLinesPath(opts) { + return _super.call(this, opts) || this; + } + + LargeLinesPath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + LargeLinesPath.prototype.getDefaultShape = function () { + return new LargeLinesPathShape(); + }; + + LargeLinesPath.prototype.buildPath = function (ctx, shape) { + var segs = shape.segs; + var curveness = shape.curveness; + + if (shape.polyline) { + for (var i = 0; i < segs.length;) { + var count = segs[i++]; + + if (count > 0) { + ctx.moveTo(segs[i++], segs[i++]); + + for (var k = 1; k < count; k++) { + ctx.lineTo(segs[i++], segs[i++]); + } + } + } + } else { + for (var i = 0; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + ctx.moveTo(x0, y0); + + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + ctx.quadraticCurveTo(x2, y2, x1, y1); + } else { + ctx.lineTo(x1, y1); + } + } + } + }; + + LargeLinesPath.prototype.findDataIndex = function (x, y) { + var shape = this.shape; + var segs = shape.segs; + var curveness = shape.curveness; + var lineWidth = this.style.lineWidth; + + if (shape.polyline) { + var dataIndex = 0; + + for (var i = 0; i < segs.length;) { + var count = segs[i++]; + + if (count > 0) { + var x0 = segs[i++]; + var y0 = segs[i++]; + + for (var k = 1; k < count; k++) { + var x1 = segs[i++]; + var y1 = segs[i++]; + + if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } + } + + dataIndex++; + } + } else { + var dataIndex = 0; + + for (var i = 0; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + + if (containStroke$2(x0, y0, x2, y2, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } else { + if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } + + dataIndex++; + } + } + + return -1; + }; + + return LargeLinesPath; + }(Path); + + var LargeLineDraw = + /** @class */ + function () { + function LargeLineDraw() { + this.group = new Group(); + } + + LargeLineDraw.prototype.isPersistent = function () { + return !this._incremental; + }; + /** + * Update symbols draw by new data + */ + + LargeLineDraw.prototype.updateData = function (data) { + this.group.removeAll(); + var lineEl = new LargeLinesPath({ + rectHover: true, + cursor: 'default' + }); + lineEl.setShape({ + segs: data.getLayout('linesPoints') + }); + + this._setCommon(lineEl, data); // Add back + + + this.group.add(lineEl); + this._incremental = null; + }; + /** + * @override + */ + + LargeLineDraw.prototype.incrementalPrepareUpdate = function (data) { + this.group.removeAll(); + + this._clearIncremental(); + + if (data.count() > 5e5) { + if (!this._incremental) { + this._incremental = new IncrementalDisplayable({ + silent: true + }); + } + + this.group.add(this._incremental); + } else { + this._incremental = null; + } + }; + /** + * @override + */ + + LargeLineDraw.prototype.incrementalUpdate = function (taskParams, data) { + var lineEl = new LargeLinesPath(); + lineEl.setShape({ + segs: data.getLayout('linesPoints') + }); + + this._setCommon(lineEl, data, !!this._incremental); + + if (!this._incremental) { + lineEl.rectHover = true; + lineEl.cursor = 'default'; + lineEl.__startIndex = taskParams.start; + this.group.add(lineEl); + } else { + this._incremental.addDisplayable(lineEl, true); + } + }; + /** + * @override + */ + + LargeLineDraw.prototype.remove = function () { + this._clearIncremental(); + + this._incremental = null; + this.group.removeAll(); + }; + + LargeLineDraw.prototype._setCommon = function (lineEl, data, isIncremental) { + var hostModel = data.hostModel; + lineEl.setShape({ + polyline: hostModel.get('polyline'), + curveness: hostModel.get(['lineStyle', 'curveness']) + }); + lineEl.useStyle(hostModel.getModel('lineStyle').getLineStyle()); + lineEl.style.strokeNoScale = true; + var style = data.getVisual('style'); + + if (style && style.stroke) { + lineEl.setStyle('stroke', style.stroke); + } + + lineEl.setStyle('fill', null); + + if (!isIncremental) { + var ecData_1 = getECData(lineEl); // Enable tooltip + // PENDING May have performance issue when path is extremely large + + ecData_1.seriesIndex = hostModel.seriesIndex; + lineEl.on('mousemove', function (e) { + ecData_1.dataIndex = null; + var dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY); + + if (dataIndex > 0) { + // Provide dataIndex for tooltip + ecData_1.dataIndex = dataIndex + lineEl.__startIndex; + } + }); + } + }; + + LargeLineDraw.prototype._clearIncremental = function () { + var incremental = this._incremental; + + if (incremental) { + incremental.clearDisplaybles(); + } + }; + return LargeLineDraw; + }(); + + var linesLayout = { + seriesType: 'lines', + plan: createRenderPlanner(), + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var isPolyline = seriesModel.get('polyline'); + var isLarge = seriesModel.pipelineContext.large; + return { + progress: function (params, lineData) { + var lineCoords = []; + + if (isLarge) { + var points = void 0; + var segCount = params.end - params.start; + + if (isPolyline) { + var totalCoordsCount = 0; + + for (var i = params.start; i < params.end; i++) { + totalCoordsCount += seriesModel.getLineCoordsCount(i); + } + + points = new Float32Array(segCount + totalCoordsCount * 2); + } else { + points = new Float32Array(segCount * 4); + } + + var offset = 0; + var pt = []; + + for (var i = params.start; i < params.end; i++) { + var len = seriesModel.getLineCoords(i, lineCoords); + + if (isPolyline) { + points[offset++] = len; + } + + for (var k = 0; k < len; k++) { + pt = coordSys.dataToPoint(lineCoords[k], false, pt); + points[offset++] = pt[0]; + points[offset++] = pt[1]; + } + } + + lineData.setLayout('linesPoints', points); + } else { + for (var i = params.start; i < params.end; i++) { + var itemModel = lineData.getItemModel(i); + var len = seriesModel.getLineCoords(i, lineCoords); + var pts = []; + + if (isPolyline) { + for (var j = 0; j < len; j++) { + pts.push(coordSys.dataToPoint(lineCoords[j])); + } + } else { + pts[0] = coordSys.dataToPoint(lineCoords[0]); + pts[1] = coordSys.dataToPoint(lineCoords[1]); + var curveness = itemModel.get(['lineStyle', 'curveness']); + + if (+curveness) { + pts[2] = [(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness]; + } + } + + lineData.setItemLayout(i, pts); + } + } + } + }; + } + }; + + var LinesView = + /** @class */ + function (_super) { + __extends(LinesView, _super); + + function LinesView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LinesView.type; + return _this; + } + + LinesView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + var zlevel = seriesModel.get('zlevel'); + var trailLength = seriesModel.get(['effect', 'trailLength']); + var zr = api.getZr(); // Avoid the drag cause ghost shadow + // FIXME Better way ? + // SVG doesn't support + + var isSvg = zr.painter.getType() === 'svg'; + + if (!isSvg) { + zr.painter.getLayer(zlevel).clear(true); + } // Config layer with motion blur + + + if (this._lastZlevel != null && !isSvg) { + zr.configLayer(this._lastZlevel, { + motionBlur: false + }); + } + + if (this._showEffect(seriesModel) && trailLength) { + if ("development" !== 'production') { + var notInIndividual_1 = false; + ecModel.eachSeries(function (otherSeriesModel) { + if (otherSeriesModel !== seriesModel && otherSeriesModel.get('zlevel') === zlevel) { + notInIndividual_1 = true; + } + }); + notInIndividual_1 && console.warn('Lines with trail effect should have an individual zlevel'); + } + + if (!isSvg) { + zr.configLayer(zlevel, { + motionBlur: true, + lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0) + }); + } + } + + lineDraw.updateData(data); + var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + + this._lastZlevel = zlevel; + this._finished = true; + }; + + LinesView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + lineDraw.incrementalPrepareUpdate(data); + + this._clearLayer(api); + + this._finished = false; + }; + + LinesView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData()); + + this._finished = taskParams.end === seriesModel.getData().count(); + }; + + LinesView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var pipelineContext = seriesModel.pipelineContext; + + if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) { + // TODO Don't have to do update in large mode. Only do it when there are millions of data. + return { + update: true + }; + } else { + // TODO Use same logic with ScatterView. + // Manually update layout + var res = linesLayout.reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } // Not in large mode + + + this._lineDraw.updateLayout(); + + this._clearLayer(api); + } + }; + + LinesView.prototype._updateLineDraw = function (data, seriesModel) { + var lineDraw = this._lineDraw; + + var hasEffect = this._showEffect(seriesModel); + + var isPolyline = !!seriesModel.get('polyline'); + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if ("development" !== 'production') { + if (hasEffect && isLargeDraw) { + console.warn('Large lines not support effect'); + } + } + + if (!lineDraw || hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLargeDraw !== this._isLargeDraw) { + if (lineDraw) { + lineDraw.remove(); + } + + lineDraw = this._lineDraw = isLargeDraw ? new LargeLineDraw() : new LineDraw(isPolyline ? hasEffect ? EffectPolyline : Polyline$1 : hasEffect ? EffectLine : Line$1); + this._hasEffet = hasEffect; + this._isPolyline = isPolyline; + this._isLargeDraw = isLargeDraw; + this.group.removeAll(); + } + + this.group.add(lineDraw.group); + return lineDraw; + }; + + LinesView.prototype._showEffect = function (seriesModel) { + return !!seriesModel.get(['effect', 'show']); + }; + + LinesView.prototype._clearLayer = function (api) { + // Not use motion when dragging or zooming + var zr = api.getZr(); + var isSvg = zr.painter.getType() === 'svg'; + + if (!isSvg && this._lastZlevel != null) { + zr.painter.getLayer(this._lastZlevel).clear(true); + } + }; + + LinesView.prototype.remove = function (ecModel, api) { + this._lineDraw && this._lineDraw.remove(); + this._lineDraw = null; // Clear motion when lineDraw is removed + + this._clearLayer(api); + }; + + LinesView.type = 'lines'; + return LinesView; + }(ChartView); + + var Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array; + var Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array; + + function compatEc2(seriesOpt) { + var data = seriesOpt.data; + + if (data && data[0] && data[0][0] && data[0][0].coord) { + if ("development" !== 'production') { + console.warn('Lines data configuration has been changed to' + ' { coords:[[1,2],[2,3]] }'); + } + + seriesOpt.data = map(data, function (itemOpt) { + var coords = [itemOpt[0].coord, itemOpt[1].coord]; + var target = { + coords: coords + }; + + if (itemOpt[0].name) { + target.fromName = itemOpt[0].name; + } + + if (itemOpt[1].name) { + target.toName = itemOpt[1].name; + } + + return mergeAll([target, itemOpt[0], itemOpt[1]]); + }); + } + } + + var LinesSeriesModel = + /** @class */ + function (_super) { + __extends(LinesSeriesModel, _super); + + function LinesSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LinesSeriesModel.type; + _this.visualStyleAccessPath = 'lineStyle'; + _this.visualDrawType = 'stroke'; + return _this; + } + + LinesSeriesModel.prototype.init = function (option) { + // The input data may be null/undefined. + option.data = option.data || []; // Not using preprocessor because mergeOption may not have series.type + + compatEc2(option); + + var result = this._processFlatCoordsArray(option.data); + + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + + _super.prototype.init.apply(this, arguments); + }; + + LinesSeriesModel.prototype.mergeOption = function (option) { + compatEc2(option); + + if (option.data) { + // Only update when have option data to merge. + var result = this._processFlatCoordsArray(option.data); + + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + } + + _super.prototype.mergeOption.apply(this, arguments); + }; + + LinesSeriesModel.prototype.appendData = function (params) { + var result = this._processFlatCoordsArray(params.data); + + if (result.flatCoords) { + if (!this._flatCoords) { + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + } else { + this._flatCoords = concatArray(this._flatCoords, result.flatCoords); + this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset); + } + + params.data = new Float32Array(result.count); + } + + this.getRawData().appendData(params.data); + }; + + LinesSeriesModel.prototype._getCoordsFromItemModel = function (idx) { + var itemModel = this.getData().getItemModel(idx); + var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow('coords'); + + if ("development" !== 'production') { + if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) { + throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.'); + } + } + + return coords; + }; + + LinesSeriesModel.prototype.getLineCoordsCount = function (idx) { + if (this._flatCoordsOffset) { + return this._flatCoordsOffset[idx * 2 + 1]; + } else { + return this._getCoordsFromItemModel(idx).length; + } + }; + + LinesSeriesModel.prototype.getLineCoords = function (idx, out) { + if (this._flatCoordsOffset) { + var offset = this._flatCoordsOffset[idx * 2]; + var len = this._flatCoordsOffset[idx * 2 + 1]; + + for (var i = 0; i < len; i++) { + out[i] = out[i] || []; + out[i][0] = this._flatCoords[offset + i * 2]; + out[i][1] = this._flatCoords[offset + i * 2 + 1]; + } + + return len; + } else { + var coords = this._getCoordsFromItemModel(idx); + + for (var i = 0; i < coords.length; i++) { + out[i] = out[i] || []; + out[i][0] = coords[i][0]; + out[i][1] = coords[i][1]; + } + + return coords.length; + } + }; + + LinesSeriesModel.prototype._processFlatCoordsArray = function (data) { + var startOffset = 0; + + if (this._flatCoords) { + startOffset = this._flatCoords.length; + } // Stored as a typed array. In format + // Points Count(2) | x | y | x | y | Points Count(3) | x | y | x | y | x | y | + + + if (typeof data[0] === 'number') { + var len = data.length; // Store offset and len of each segment + + var coordsOffsetAndLenStorage = new Uint32Arr(len); + var coordsStorage = new Float64Arr(len); + var coordsCursor = 0; + var offsetCursor = 0; + var dataCount = 0; + + for (var i = 0; i < len;) { + dataCount++; + var count = data[i++]; // Offset + + coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset; // Len + + coordsOffsetAndLenStorage[offsetCursor++] = count; + + for (var k = 0; k < count; k++) { + var x = data[i++]; + var y = data[i++]; + coordsStorage[coordsCursor++] = x; + coordsStorage[coordsCursor++] = y; + + if (i > len) { + if ("development" !== 'production') { + throw new Error('Invalid data format.'); + } + } + } + } + + return { + flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor), + flatCoords: coordsStorage, + count: dataCount + }; + } + + return { + flatCoordsOffset: null, + flatCoords: null, + count: data.length + }; + }; + + LinesSeriesModel.prototype.getInitialData = function (option, ecModel) { + if ("development" !== 'production') { + var CoordSys = CoordinateSystemManager.get(option.coordinateSystem); + + if (!CoordSys) { + throw new Error('Unkown coordinate system ' + option.coordinateSystem); + } + } + + var lineData = new List(['value'], this); + lineData.hasItemOption = false; + lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) { + // dataItem is simply coords + if (dataItem instanceof Array) { + return NaN; + } else { + lineData.hasItemOption = true; + var value = dataItem.value; + + if (value != null) { + return value instanceof Array ? value[dimIndex] : value; + } + } + }); + return lineData; + }; + + LinesSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + var name = itemModel.get('name'); + + if (name) { + return name; + } + + var fromName = itemModel.get('fromName'); + var toName = itemModel.get('toName'); + var nameArr = []; + fromName != null && nameArr.push(fromName); + toName != null && nameArr.push(toName); + return createTooltipMarkup('nameValue', { + name: nameArr.join(' > ') + }); + }; + + LinesSeriesModel.prototype.preventIncremental = function () { + return !!this.get(['effect', 'show']); + }; + + LinesSeriesModel.prototype.getProgressive = function () { + var progressive = this.option.progressive; + + if (progressive == null) { + return this.option.large ? 1e4 : this.get('progressive'); + } + + return progressive; + }; + + LinesSeriesModel.prototype.getProgressiveThreshold = function () { + var progressiveThreshold = this.option.progressiveThreshold; + + if (progressiveThreshold == null) { + return this.option.large ? 2e4 : this.get('progressiveThreshold'); + } + + return progressiveThreshold; + }; + + LinesSeriesModel.type = 'series.lines'; + LinesSeriesModel.dependencies = ['grid', 'polar', 'geo', 'calendar']; + LinesSeriesModel.defaultOption = { + coordinateSystem: 'geo', + zlevel: 0, + z: 2, + legendHoverLink: true, + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + symbol: ['none', 'none'], + symbolSize: [10, 10], + // Geo coordinate system + geoIndex: 0, + effect: { + show: false, + period: 4, + constantSpeed: 0, + symbol: 'circle', + symbolSize: 3, + loop: true, + trailLength: 0.2 + }, + large: false, + // Available when large is true + largeThreshold: 2000, + polyline: false, + clip: true, + label: { + show: false, + position: 'end' // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + }, + lineStyle: { + opacity: 0.5 + } + }; + return LinesSeriesModel; + }(SeriesModel); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function normalize$3(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + + return a; + } + + var linesVisual = { + seriesType: 'lines', + reset: function (seriesModel) { + var symbolType = normalize$3(seriesModel.get('symbol')); + var symbolSize = normalize$3(seriesModel.get('symbolSize')); + var data = seriesModel.getData(); + data.setVisual('fromSymbol', symbolType && symbolType[0]); + data.setVisual('toSymbol', symbolType && symbolType[1]); + data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + data.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + var symbolType = normalize$3(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$3(itemModel.getShallow('symbolSize', true)); + symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]); + symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]); + symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]); + symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]); + } + + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } + }; + + function install$m(registers) { + registers.registerChartView(LinesView); + registers.registerSeriesModel(LinesSeriesModel); + registers.registerLayout(linesLayout); + registers.registerVisual(linesVisual); + } + + var GRADIENT_LEVELS = 256; + + var HeatmapLayer = + /** @class */ + function () { + function HeatmapLayer() { + this.blurSize = 30; + this.pointSize = 20; + this.maxOpacity = 1; + this.minOpacity = 0; + this._gradientPixels = { + inRange: null, + outOfRange: null + }; + var canvas = createCanvas(); + this.canvas = canvas; + } + /** + * Renders Heatmap and returns the rendered canvas + * @param data array of data, each has x, y, value + * @param width canvas width + * @param height canvas height + */ + + + HeatmapLayer.prototype.update = function (data, width, height, normalize, colorFunc, isInRange) { + var brush = this._getBrush(); + + var gradientInRange = this._getGradient(colorFunc, 'inRange'); + + var gradientOutOfRange = this._getGradient(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); + } + + if (!canvas.width || !canvas.height) { + // Avoid "Uncaught DOMException: Failed to execute 'getImageData' on + // 'CanvasRenderingContext2D': The source height is 0." + return canvas; + } // 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 + */ + + + HeatmapLayer.prototype._getBrush = function () { + var brushCanvas = this._brushCanvas || (this._brushCanvas = 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 + */ + + + HeatmapLayer.prototype._getGradient = function (colorFunc, state) { + var gradientPixels = this._gradientPixels; + var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4)); + var color = [0, 0, 0, 0]; + 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; + }; + + return HeatmapLayer; + }(); + + function getIsInPiecewiseRange(dataExtent, pieceList, selected) { + var dataSpan = dataExtent[1] - dataExtent[0]; + pieceList = 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) { + var i; // Try to find in the location of the last found + + for (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 (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'; + } + + var HeatmapView = + /** @class */ + function (_super) { + __extends(HeatmapView, _super); + + function HeatmapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = HeatmapView.type; + return _this; + } + + HeatmapView.prototype.render = function (seriesModel, ecModel, api) { + var visualMapOfThisSeries; + ecModel.eachComponent('visualMap', function (visualMap) { + visualMap.eachTargetSeries(function (targetSeries) { + if (targetSeries === seriesModel) { + visualMapOfThisSeries = visualMap; + } + }); + }); + + if ("development" !== 'production') { + if (!visualMapOfThisSeries) { + throw new Error('Heatmap must use with visualMap'); + } + } + + this.group.removeAll(); + this._incrementalDisplayable = null; + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') { + this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count()); + } else if (isGeoCoordSys(coordSys)) { + this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api); + } + }; + + HeatmapView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this.group.removeAll(); + }; + + HeatmapView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys) { + // geo does not support incremental rendering? + if (isGeoCoordSys(coordSys)) { + this.render(seriesModel, ecModel, api); + } else { + this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true); + } + } + }; + + HeatmapView.prototype._renderOnCartesianAndCalendar = function (seriesModel, api, start, end, incremental) { + var coordSys = seriesModel.coordinateSystem; + var width; + var height; + var xAxisExtent; + var yAxisExtent; + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + + if ("development" !== 'production') { + 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'); + } + } + + width = xAxis.getBandWidth(); + height = yAxis.getBandWidth(); + xAxisExtent = xAxis.scale.getExtent(); + yAxisExtent = yAxis.scale.getExtent(); + } + + var group = this.group; + var data = seriesModel.getData(); + var emphasisStyle = seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle(); + var blurStyle = seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(); + var selectStyle = seriesModel.getModel(['select', 'itemStyle']).getItemStyle(); + var labelStatesModels = getLabelStatesModels(seriesModel); + var focus = seriesModel.get(['emphasis', 'focus']); + var blurScope = seriesModel.get(['emphasis', 'blurScope']); + var dataDims = isCoordinateSystemType(coordSys, 'cartesian2d') ? [data.mapDimension('x'), data.mapDimension('y'), data.mapDimension('value')] : [data.mapDimension('time'), data.mapDimension('value')]; + + for (var idx = start; idx < end; idx++) { + var rect = void 0; + var style = data.getItemVisual(idx, 'style'); + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + var dataDimX = data.get(dataDims[0], idx); + var dataDimY = data.get(dataDims[1], idx); // Ignore empty data and out of extent data + + if (isNaN(data.get(dataDims[2], idx)) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] || dataDimY > yAxisExtent[1]) { + continue; + } + + var point = coordSys.dataToPoint([dataDimX, dataDimY]); + rect = new Rect({ + shape: { + x: Math.floor(Math.round(point[0]) - width / 2), + y: Math.floor(Math.round(point[1]) - height / 2), + width: Math.ceil(width), + height: Math.ceil(height) + }, + style: style + }); + } else { + // Ignore empty data + if (isNaN(data.get(dataDims[1], idx))) { + continue; + } + + rect = new Rect({ + z2: 1, + shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape, + style: style + }); + } + + var itemModel = data.getItemModel(idx); // Optimization for large datset + + if (data.hasItemOption) { + var emphasisModel = itemModel.getModel('emphasis'); + emphasisStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + labelStatesModels = getLabelStatesModels(itemModel); + } + + var rawValue = seriesModel.getRawValue(idx); + var defaultText = '-'; + + if (rawValue && rawValue[2] != null) { + defaultText = rawValue[2] + ''; + } + + setLabelStyle(rect, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultOpacity: style.opacity, + defaultText: defaultText + }); + rect.ensureState('emphasis').style = emphasisStyle; + rect.ensureState('blur').style = blurStyle; + rect.ensureState('select').style = selectStyle; + enableHoverEmphasis(rect, focus, blurScope); + rect.incremental = incremental; // PENDING + + if (incremental) { + // Rect must use hover layer if it's incremental. + rect.states.emphasis.hoverLayer = true; + } + + group.add(rect); + data.setItemGraphicEl(idx, rect); + } + }; + + HeatmapView.prototype._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 dims = [data.mapDimension('lng'), data.mapDimension('lat'), data.mapDimension('value')]; + var points = data.mapArray(dims, 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 ZRImage({ + style: { + width: width, + height: height, + x: x, + y: y, + image: hmLayer.canvas + }, + silent: true + }); + this.group.add(img); + }; + + HeatmapView.type = 'heatmap'; + return HeatmapView; + }(ChartView); + + var HeatmapSeriesModel = + /** @class */ + function (_super) { + __extends(HeatmapSeriesModel, _super); + + function HeatmapSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = HeatmapSeriesModel.type; + return _this; + } + + HeatmapSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListFromArray(this.getSource(), this, { + generateCoord: 'value' + }); + }; + + HeatmapSeriesModel.prototype.preventIncremental = function () { + var coordSysCreator = CoordinateSystemManager.get(this.get('coordinateSystem')); + + if (coordSysCreator && coordSysCreator.dimensions) { + return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat'; + } + }; + + HeatmapSeriesModel.type = 'series.heatmap'; + HeatmapSeriesModel.dependencies = ['grid', 'geo', 'calendar']; + HeatmapSeriesModel.defaultOption = { + 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, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return HeatmapSeriesModel; + }(SeriesModel); + + function install$n(registers) { + registers.registerChartView(HeatmapView); + registers.registerSeriesModel(HeatmapSeriesModel); + } + + var BAR_BORDER_WIDTH_QUERY$1 = ['itemStyle', 'borderWidth']; // index: +isHorizontal + + var LAYOUT_ATTRS = [{ + xy: 'x', + wh: 'width', + index: 0, + posDesc: ['left', 'right'] + }, { + xy: 'y', + wh: 'height', + index: 1, + posDesc: ['top', 'bottom'] + }]; + var pathForLineWidth = new Circle(); + + var PictorialBarView = + /** @class */ + function (_super) { + __extends(PictorialBarView, _super); + + function PictorialBarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PictorialBarView.type; + return _this; + } + + PictorialBarView.prototype.render = 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 coordSysRect = cartesian.master.getRect(); + var opt = { + ecSize: { + width: api.getWidth(), + height: api.getHeight() + }, + seriesModel: seriesModel, + coordSys: cartesian, + coordSysExtent: [[coordSysRect.x, coordSysRect.x + coordSysRect.width], [coordSysRect.y, coordSysRect.y + coordSysRect.height]], + isHorizontal: isHorizontal, + valueDim: LAYOUT_ATTRS[+isHorizontal], + categoryDim: LAYOUT_ATTRS[1 - +isHorizontal] + }; + data.diff(oldData).add(function (dataIndex) { + if (!data.hasValue(dataIndex)) { + return; + } + + var itemModel = getItemModel(data, dataIndex); + var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt); + var bar = createBar(data, opt, symbolMeta); + data.setItemGraphicEl(dataIndex, bar); + group.add(bar); + updateCommon$1(bar, opt, symbolMeta); + }).update(function (newIndex, oldIndex) { + var bar = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex)) { + group.remove(bar); + return; + } + + var itemModel = getItemModel(data, newIndex); + var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt); + var pictorialShapeStr = getShapeStr(data, symbolMeta); + + if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) { + group.remove(bar); + data.setItemGraphicEl(newIndex, null); + bar = null; + } + + if (bar) { + updateBar(bar, opt, symbolMeta); + } else { + bar = createBar(data, opt, symbolMeta, true); + } + + data.setItemGraphicEl(newIndex, bar); + bar.__pictorialSymbolMeta = symbolMeta; // Add back + + group.add(bar); + updateCommon$1(bar, opt, symbolMeta); + }).remove(function (dataIndex) { + var bar = oldData.getItemGraphicEl(dataIndex); + bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar); + }).execute(); + this._data = data; + return this.group; + }; + + PictorialBarView.prototype.remove = function (ecModel, api) { + var group = this.group; + var data = this._data; + + if (ecModel.get('animation')) { + if (data) { + data.eachItemGraphicEl(function (bar) { + removeBar(data, getECData(bar).dataIndex, ecModel, bar); + }); + } + } else { + group.removeAll(); + } + }; + + PictorialBarView.type = 'pictorialBar'; + return PictorialBarView; + }(ChartView); // Set or calculate default value about symbol, and calculate layout info. + + + function getSymbolMeta(data, dataIndex, itemModel, opt) { + var layout = data.getItemLayout(dataIndex); + var symbolRepeat = itemModel.get('symbolRepeat'); + var symbolClip = itemModel.get('symbolClip'); + var symbolPosition = itemModel.get('symbolPosition') || 'start'; + var symbolRotate = itemModel.get('symbolRotate'); + var rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var symbolPatternSize = itemModel.get('symbolPatternSize') || 2; + var isAnimationEnabled = itemModel.isAnimationEnabled(); + var symbolMeta = { + dataIndex: dataIndex, + layout: layout, + itemModel: itemModel, + symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle', + style: data.getItemVisual(dataIndex, 'style'), + symbolClip: symbolClip, + symbolRepeat: symbolRepeat, + symbolRepeatDirection: itemModel.get('symbolRepeatDirection'), + symbolPatternSize: symbolPatternSize, + rotation: rotation, + animationModel: isAnimationEnabled ? itemModel : null, + hoverScale: isAnimationEnabled && itemModel.get(['emphasis', 'scale']), + z2: itemModel.getShallow('z', true) || 0 + }; + prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta); + prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength, symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta); + prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta); + var symbolSize = symbolMeta.symbolSize; + var symbolOffset = itemModel.get('symbolOffset'); + + if (isArray(symbolOffset)) { + symbolOffset = [parsePercent$1(symbolOffset[0], symbolSize[0]), parsePercent$1(symbolOffset[1], symbolSize[1])]; + } + + prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, opt, symbolMeta); + return symbolMeta; + } // bar length can be negative. + + + function prepareBarLength(itemModel, symbolRepeat, layout, opt, outputSymbolMeta) { + var valueDim = opt.valueDim; + var symbolBoundingData = itemModel.get('symbolBoundingData'); + var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis()); + var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)); + var pxSignIdx = 1 - +(layout[valueDim.wh] <= 0); + var boundingLength; + + if (isArray(symbolBoundingData)) { + var symbolBoundingExtent = [convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx, convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx]; + symbolBoundingExtent[1] < symbolBoundingExtent[0] && symbolBoundingExtent.reverse(); + boundingLength = symbolBoundingExtent[pxSignIdx]; + } else if (symbolBoundingData != null) { + boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx; + } else if (symbolRepeat) { + boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx; + } else { + boundingLength = layout[valueDim.wh]; + } + + outputSymbolMeta.boundingLength = boundingLength; + + if (symbolRepeat) { + outputSymbolMeta.repeatCutLength = layout[valueDim.wh]; + } + + outputSymbolMeta.pxSign = boundingLength > 0 ? 1 : boundingLength < 0 ? -1 : 0; + } + + function convertToCoordOnAxis(axis, value) { + return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value))); + } // Support ['100%', '100%'] + + + function prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength, pxSign, symbolPatternSize, opt, outputSymbolMeta) { + var valueDim = opt.valueDim; + var categoryDim = opt.categoryDim; + var categorySize = Math.abs(layout[categoryDim.wh]); + var symbolSize = data.getItemVisual(dataIndex, 'symbolSize'); + var parsedSymbolSize; + + if (isArray(symbolSize)) { + parsedSymbolSize = symbolSize.slice(); + } else { + if (symbolSize == null) { + // will parse to number below + parsedSymbolSize = ['100%', '100%']; + } else { + parsedSymbolSize = [symbolSize, symbolSize]; + } + } // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is + // to complicated to calculate real percent value if considering scaled lineWidth. + // So the actual size will bigger than layout size if lineWidth is bigger than zero, + // which can be tolerated in pictorial chart. + + + parsedSymbolSize[categoryDim.index] = parsePercent$1(parsedSymbolSize[categoryDim.index], categorySize); + parsedSymbolSize[valueDim.index] = parsePercent$1(parsedSymbolSize[valueDim.index], symbolRepeat ? categorySize : Math.abs(boundingLength)); + outputSymbolMeta.symbolSize = parsedSymbolSize; // If x or y is less than zero, show reversed shape. + + var symbolScale = outputSymbolMeta.symbolScale = [parsedSymbolSize[0] / symbolPatternSize, parsedSymbolSize[1] / symbolPatternSize]; // Follow convention, 'right' and 'top' is the normal scale. + + symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign; + } + + function prepareLineWidth(itemModel, symbolScale, rotation, opt, outputSymbolMeta) { + // In symbols are drawn with scale, so do not need to care about the case that width + // or height are too small. But symbol use strokeNoScale, where acture lineWidth should + // be calculated. + var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY$1) || 0; + + if (valueLineWidth) { + pathForLineWidth.attr({ + scaleX: symbolScale[0], + scaleY: symbolScale[1], + rotation: rotation + }); + pathForLineWidth.updateTransform(); + valueLineWidth /= pathForLineWidth.getLineScale(); + valueLineWidth *= symbolScale[opt.valueDim.index]; + } + + outputSymbolMeta.valueLineWidth = valueLineWidth; + } + + function prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, outputSymbolMeta) { + var categoryDim = opt.categoryDim; + var valueDim = opt.valueDim; + var pxSign = outputSymbolMeta.pxSign; + var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0); + var pathLen = unitLength; // Note: rotation will not effect the layout of symbols, because user may + // want symbols to rotate on its center, which should not be translated + // when rotating. + + if (symbolRepeat) { + var absBoundingLength = Math.abs(boundingLength); + var symbolMargin = retrieve(itemModel.get('symbolMargin'), '15%') + ''; + var hasEndGap = false; + + if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) { + hasEndGap = true; + symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1); + } + + var symbolMarginNumeric = parsePercent$1(symbolMargin, symbolSize[valueDim.index]); + var uLenWithMargin = Math.max(unitLength + symbolMarginNumeric * 2, 0); // When symbol margin is less than 0, margin at both ends will be subtracted + // to ensure that all of the symbols will not be overflow the given area. + + var endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; // Both final repeatTimes and final symbolMarginNumeric area calculated based on + // boundingLength. + + var repeatSpecified = isNumeric(symbolRepeat); + var repeatTimes = repeatSpecified ? symbolRepeat : toIntTimes((absBoundingLength + endFix) / uLenWithMargin); // Adjust calculate margin, to ensure each symbol is displayed + // entirely in the given layout area. + + var mDiff = absBoundingLength - repeatTimes * unitLength; + symbolMarginNumeric = mDiff / 2 / (hasEndGap ? repeatTimes : repeatTimes - 1); + uLenWithMargin = unitLength + symbolMarginNumeric * 2; + endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; // Update repeatTimes when not all symbol will be shown. + + if (!repeatSpecified && symbolRepeat !== 'fixed') { + repeatTimes = repeatCutLength ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) : 0; + } + + pathLen = repeatTimes * uLenWithMargin - endFix; + outputSymbolMeta.repeatTimes = repeatTimes; + outputSymbolMeta.symbolMargin = symbolMarginNumeric; + } + + var sizeFix = pxSign * (pathLen / 2); + var pathPosition = outputSymbolMeta.pathPosition = []; + pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2; + pathPosition[valueDim.index] = symbolPosition === 'start' ? sizeFix : symbolPosition === 'end' ? boundingLength - sizeFix : boundingLength / 2; // 'center' + + if (symbolOffset) { + pathPosition[0] += symbolOffset[0]; + pathPosition[1] += symbolOffset[1]; + } + + var bundlePosition = outputSymbolMeta.bundlePosition = []; + bundlePosition[categoryDim.index] = layout[categoryDim.xy]; + bundlePosition[valueDim.index] = layout[valueDim.xy]; + var barRectShape = outputSymbolMeta.barRectShape = extend({}, layout); + barRectShape[valueDim.wh] = pxSign * Math.max(Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix)); + barRectShape[categoryDim.wh] = layout[categoryDim.wh]; + var clipShape = outputSymbolMeta.clipShape = {}; // Consider that symbol may be overflow layout rect. + + clipShape[categoryDim.xy] = -layout[categoryDim.xy]; + clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh]; + clipShape[valueDim.xy] = 0; + clipShape[valueDim.wh] = layout[valueDim.wh]; + } + + function createPath(symbolMeta) { + var symbolPatternSize = symbolMeta.symbolPatternSize; + var path = createSymbol( // Consider texture img, make a big size. + symbolMeta.symbolType, -symbolPatternSize / 2, -symbolPatternSize / 2, symbolPatternSize, symbolPatternSize); + path.attr({ + culling: true + }); + path.type !== 'image' && path.setStyle({ + strokeNoScale: true + }); + return path; + } + + function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var symbolSize = symbolMeta.symbolSize; + var valueLineWidth = symbolMeta.valueLineWidth; + var pathPosition = symbolMeta.pathPosition; + var valueDim = opt.valueDim; + var repeatTimes = symbolMeta.repeatTimes || 0; + var index = 0; + var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2; + eachPath(bar, function (path) { + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + + if (index < repeatTimes) { + updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate); + } else { + updateAttr(path, null, { + scaleX: 0, + scaleY: 0 + }, symbolMeta, isUpdate, function () { + bundle.remove(path); + }); + } // updateHoverAnimation(path, symbolMeta); + + + index++; + }); + + for (; index < repeatTimes; index++) { + var path = createPath(symbolMeta); + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + bundle.add(path); + var target = makeTarget(index); + updateAttr(path, { + x: target.x, + y: target.y, + scaleX: 0, + scaleY: 0 + }, { + scaleX: target.scaleX, + scaleY: target.scaleY, + rotation: target.rotation + }, symbolMeta, isUpdate); + } + + function makeTarget(index) { + var position = pathPosition.slice(); // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index + // Otherwise: i = index; + + var pxSign = symbolMeta.pxSign; + var i = index; + + if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) { + i = repeatTimes - 1 - index; + } + + position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index]; + return { + x: position[0], + y: position[1], + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1], + rotation: symbolMeta.rotation + }; + } + } + + function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var mainPath = bar.__pictorialMainPath; + + if (!mainPath) { + mainPath = bar.__pictorialMainPath = createPath(symbolMeta); + bundle.add(mainPath); + updateAttr(mainPath, { + x: symbolMeta.pathPosition[0], + y: symbolMeta.pathPosition[1], + scaleX: 0, + scaleY: 0, + rotation: symbolMeta.rotation + }, { + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1] + }, symbolMeta, isUpdate); + } else { + updateAttr(mainPath, null, { + x: symbolMeta.pathPosition[0], + y: symbolMeta.pathPosition[1], + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1], + rotation: symbolMeta.rotation + }, symbolMeta, isUpdate); + } + } // bar rect is used for label. + + + function createOrUpdateBarRect(bar, symbolMeta, isUpdate) { + var rectShape = extend({}, symbolMeta.barRectShape); + var barRect = bar.__pictorialBarRect; + + if (!barRect) { + barRect = bar.__pictorialBarRect = new Rect({ + z2: 2, + shape: rectShape, + silent: true, + style: { + stroke: 'transparent', + fill: 'transparent', + lineWidth: 0 + } + }); + bar.add(barRect); + } else { + updateAttr(barRect, null, { + shape: rectShape + }, symbolMeta, isUpdate); + } + } + + function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) { + // If not clip, symbol will be remove and rebuilt. + if (symbolMeta.symbolClip) { + var clipPath = bar.__pictorialClipPath; + var clipShape = extend({}, symbolMeta.clipShape); + var valueDim = opt.valueDim; + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + + if (clipPath) { + updateProps(clipPath, { + shape: clipShape + }, animationModel, dataIndex); + } else { + clipShape[valueDim.wh] = 0; + clipPath = new Rect({ + shape: clipShape + }); + + bar.__pictorialBundle.setClipPath(clipPath); + + bar.__pictorialClipPath = clipPath; + var target = {}; + target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh]; + graphic[isUpdate ? 'updateProps' : 'initProps'](clipPath, { + shape: target + }, animationModel, dataIndex); + } + } + } + + function getItemModel(data, dataIndex) { + var itemModel = data.getItemModel(dataIndex); + itemModel.getAnimationDelayParams = getAnimationDelayParams; + itemModel.isAnimationEnabled = isAnimationEnabled; + return itemModel; + } + + function getAnimationDelayParams(path) { + // The order is the same as the z-order, see `symbolRepeatDiretion`. + return { + index: path.__pictorialAnimationIndex, + count: path.__pictorialRepeatTimes + }; + } + + function isAnimationEnabled() { + // `animation` prop can be set on itemModel in pictorial bar chart. + return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation'); + } + + function createBar(data, opt, symbolMeta, isUpdate) { + // bar is the main element for each data. + var bar = new Group(); // bundle is used for location and clip. + + var bundle = new Group(); + bar.add(bundle); + bar.__pictorialBundle = bundle; + bundle.x = symbolMeta.bundlePosition[0]; + bundle.y = symbolMeta.bundlePosition[1]; + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta); + } else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta); + } + + createOrUpdateBarRect(bar, symbolMeta, isUpdate); + createOrUpdateClip(bar, opt, symbolMeta, isUpdate); + bar.__pictorialShapeStr = getShapeStr(data, symbolMeta); + bar.__pictorialSymbolMeta = symbolMeta; + return bar; + } + + function updateBar(bar, opt, symbolMeta) { + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + var bundle = bar.__pictorialBundle; + updateProps(bundle, { + x: symbolMeta.bundlePosition[0], + y: symbolMeta.bundlePosition[1] + }, animationModel, dataIndex); + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true); + } else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta, true); + } + + createOrUpdateBarRect(bar, symbolMeta, true); + createOrUpdateClip(bar, opt, symbolMeta, true); + } + + function removeBar(data, dataIndex, animationModel, bar) { + // Not show text when animating + var labelRect = bar.__pictorialBarRect; + labelRect && labelRect.removeTextContent(); + var pathes = []; + eachPath(bar, function (path) { + pathes.push(path); + }); + bar.__pictorialMainPath && pathes.push(bar.__pictorialMainPath); // I do not find proper remove animation for clip yet. + + bar.__pictorialClipPath && (animationModel = null); + each(pathes, function (path) { + removeElement(path, { + scaleX: 0, + scaleY: 0 + }, animationModel, dataIndex, function () { + bar.parent && bar.parent.remove(bar); + }); + }); + data.setItemGraphicEl(dataIndex, null); + } + + function getShapeStr(data, symbolMeta) { + return [data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none', !!symbolMeta.symbolRepeat, !!symbolMeta.symbolClip].join(':'); + } + + function eachPath(bar, cb, context) { + // Do not use Group#eachChild, because it do not support remove. + each(bar.__pictorialBundle.children(), function (el) { + el !== bar.__pictorialBarRect && cb.call(context, el); + }); + } + + function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) { + immediateAttrs && el.attr(immediateAttrs); // when symbolCip used, only clip path has init animation, otherwise it would be weird effect. + + if (symbolMeta.symbolClip && !isUpdate) { + animationAttrs && el.attr(animationAttrs); + } else { + animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps'](el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb); + } + } + + function updateCommon$1(bar, opt, symbolMeta) { + var dataIndex = symbolMeta.dataIndex; + var itemModel = symbolMeta.itemModel; // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + + var emphasisModel = itemModel.getModel('emphasis'); + var emphasisStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + var blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + var selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + var cursorStyle = itemModel.getShallow('cursor'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var hoverScale = emphasisModel.get('scale'); + eachPath(bar, function (path) { + if (path instanceof ZRImage) { + var pathStyle = path.style; + path.useStyle(extend({ + // TODO other properties like dx, dy ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolMeta.style)); + } else { + path.useStyle(symbolMeta.style); + } + + var emphasisState = path.ensureState('emphasis'); + emphasisState.style = emphasisStyle; + + if (hoverScale) { + // NOTE: Must after scale is set after updateAttr + emphasisState.scaleX = path.scaleX * 1.1; + emphasisState.scaleY = path.scaleY * 1.1; + } + + path.ensureState('blur').style = blurStyle; + path.ensureState('select').style = selectStyle; + cursorStyle && (path.cursor = cursorStyle); + path.z2 = symbolMeta.z2; + }); + var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)]; + var barRect = bar.__pictorialBarRect; + setLabelStyle(barRect, getLabelStatesModels(itemModel), { + labelFetcher: opt.seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(opt.seriesModel.getData(), dataIndex), + inheritColor: symbolMeta.style.fill, + defaultOpacity: symbolMeta.style.opacity, + defaultOutsidePosition: barPositionOutside + }); + enableHoverEmphasis(bar, focus, blurScope); + } + + function toIntTimes(times) { + var roundedTimes = Math.round(times); // Escapse accurate error + + return Math.abs(times - roundedTimes) < 1e-4 ? roundedTimes : Math.ceil(times); + } + + var PictorialBarSeriesModel = + /** @class */ + function (_super) { + __extends(PictorialBarSeriesModel, _super); + + function PictorialBarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PictorialBarSeriesModel.type; + _this.hasSymbolVisual = true; + _this.defaultSymbol = 'roundRect'; + return _this; + } + + PictorialBarSeriesModel.prototype.getInitialData = function (option) { + // Disable stack. + option.stack = null; + return _super.prototype.getInitialData.apply(this, arguments); + }; + + PictorialBarSeriesModel.type = 'series.pictorialBar'; + PictorialBarSeriesModel.dependencies = ['grid']; + PictorialBarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { + symbol: 'circle', + symbolSize: null, + symbolRotate: null, + symbolPosition: null, + symbolOffset: null, + symbolMargin: null, + symbolRepeat: false, + symbolRepeatDirection: 'end', + symbolClip: false, + symbolBoundingData: null, + symbolPatternSize: 400, + barGap: '-100%', + // z can be set in data item, which is z2 actually. + // Disable progressive + progressive: 0, + emphasis: { + // By default pictorialBar do not hover scale. Hover scale is not suitable + // for the case that both has foreground and background. + scale: false + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }); + return PictorialBarSeriesModel; + }(BaseBarSeriesModel); + + function install$o(registers) { + registers.registerChartView(PictorialBarView); + registers.registerSeriesModel(PictorialBarSeriesModel); + registers.registerLayout(curry(layout, 'pictorialBar')); + } + + var ThemeRiverView = + /** @class */ + function (_super) { + __extends(ThemeRiverView, _super); + + function ThemeRiverView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ThemeRiverView.type; + _this._layers = []; + return _this; + } + + ThemeRiverView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var self = this; + var group = this.group; + var layersSeries = seriesModel.getLayerSeries(); + var layoutInfo = data.getLayout('layoutInfo'); + var rect = layoutInfo.rect; + var boundaryGap = layoutInfo.boundaryGap; + group.x = 0; + group.y = rect.y + boundaryGap[0]; + + function keyGetter(item) { + return item.name; + } + + var dataDiffer = new DataDiffer(this._layersSeries || [], layersSeries, keyGetter, keyGetter); + var newLayersGroups = []; + dataDiffer.add(bind(process, this, 'add')).update(bind(process, this, 'update')).remove(bind(process, this, 'remove')).execute(); + + function process(status, idx, oldIdx) { + var oldLayersGroups = self._layers; + + if (status === 'remove') { + group.remove(oldLayersGroups[idx]); + return; + } + + var points0 = []; + var points1 = []; + var style; + var indices = layersSeries[idx].indices; + var j = 0; + + for (; j < indices.length; j++) { + var layout = data.getItemLayout(indices[j]); + var x = layout.x; + var y0 = layout.y0; + var y = layout.y; + points0.push(x, y0); + points1.push(x, y0 + y); + style = data.getItemVisual(indices[j], 'style'); + } + + var polygon; + var textLayout = data.getItemLayout(indices[0]); + var labelModel = seriesModel.getModel('label'); + var margin = labelModel.get('margin'); + var emphasisModel = seriesModel.getModel('emphasis'); + + if (status === 'add') { + var layerGroup = newLayersGroups[idx] = new Group(); + polygon = new ECPolygon({ + shape: { + points: points0, + stackedOnPoints: points1, + smooth: 0.4, + stackedOnSmooth: 0.4, + smoothConstraint: false + }, + z2: 0 + }); + layerGroup.add(polygon); + group.add(layerGroup); + + if (seriesModel.isAnimationEnabled()) { + polygon.setClipPath(createGridClipShape$2(polygon.getBoundingRect(), seriesModel, function () { + polygon.removeClipPath(); + })); + } + } else { + var layerGroup = oldLayersGroups[oldIdx]; + polygon = layerGroup.childAt(0); + group.add(layerGroup); + newLayersGroups[idx] = layerGroup; + updateProps(polygon, { + shape: { + points: points0, + stackedOnPoints: points1 + } + }, seriesModel); + } + + setLabelStyle(polygon, getLabelStatesModels(seriesModel), { + labelDataIndex: indices[j - 1], + defaultText: data.getName(indices[j - 1]), + inheritColor: style.fill + }, { + normal: { + verticalAlign: 'middle' // align: 'right' + + } + }); + polygon.setTextConfig({ + position: null, + local: true + }); + var labelEl = polygon.getTextContent(); // TODO More label position options. + + if (labelEl) { + labelEl.x = textLayout.x - margin; + labelEl.y = textLayout.y0 + textLayout.y / 2; + } + + polygon.useStyle(style); + data.setItemGraphicEl(idx, polygon); + setStatesStylesFromModel(polygon, seriesModel); + enableHoverEmphasis(polygon, emphasisModel.get('focus'), emphasisModel.get('blurScope')); + } + + this._layersSeries = layersSeries; + this._layers = newLayersGroups; + }; + + ThemeRiverView.type = 'themeRiver'; + return ThemeRiverView; + }(ChartView); + + function createGridClipShape$2(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + x: rect.x - 50, + width: rect.width + 100, + height: rect.height + 20 + } + }, seriesModel, cb); + return rectEl; + } + + var DATA_NAME_INDEX = 2; + + var ThemeRiverSeriesModel = + /** @class */ + function (_super) { + __extends(ThemeRiverSeriesModel, _super); + + function ThemeRiverSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ThemeRiverSeriesModel.type; + _this.useColorPaletteOnData = true; + return _this; + } + /** + * @override + */ + + + ThemeRiverSeriesModel.prototype.init = function (option) { + // eslint-disable-next-line + _super.prototype.init.apply(this, arguments); // Put this function here is for the sake of consistency of code style. + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + }; + /** + * If there is no value of a certain point in the time for some event,set it value to 0. + * + * @param {Array} data initial data in the option + * @return {Array} + */ + + + ThemeRiverSeriesModel.prototype.fixData = function (data) { + var rawDataLength = data.length; + /** + * Make sure every layer data get the same keys. + * The value index tells which layer has visited. + * { + * 2014/01/01: -1 + * } + */ + + var timeValueKeys = {}; // grouped data by name + + var groupResult = groupData(data, function (item) { + if (!timeValueKeys.hasOwnProperty(item[0] + '')) { + timeValueKeys[item[0] + ''] = -1; + } + + return item[2]; + }); + var layerData = []; + groupResult.buckets.each(function (items, key) { + layerData.push({ + name: key, + dataList: items + }); + }); + var layerNum = layerData.length; + + for (var k = 0; k < layerNum; ++k) { + var name_1 = layerData[k].name; + + for (var j = 0; j < layerData[k].dataList.length; ++j) { + var timeValue = layerData[k].dataList[j][0] + ''; + timeValueKeys[timeValue] = k; + } + + for (var timeValue in timeValueKeys) { + if (timeValueKeys.hasOwnProperty(timeValue) && timeValueKeys[timeValue] !== k) { + timeValueKeys[timeValue] = k; + data[rawDataLength] = [timeValue, 0, name_1]; + rawDataLength++; + } + } + } + + return data; + }; + /** + * @override + * @param option the initial option that user gived + * @param ecModel the model object for themeRiver option + */ + + + ThemeRiverSeriesModel.prototype.getInitialData = function (option, ecModel) { + var singleAxisModel = this.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + var axisType = singleAxisModel.get('type'); // filter the data item with the value of label is undefined + + var filterData = filter(option.data, function (dataItem) { + return dataItem[2] !== undefined; + }); // ??? TODO design a stage to transfer data for themeRiver and lines? + + var data = this.fixData(filterData || []); + var nameList = []; + var nameMap = this.nameMap = createHashMap(); + var count = 0; + + for (var i = 0; i < data.length; ++i) { + nameList.push(data[i][DATA_NAME_INDEX]); + + if (!nameMap.get(data[i][DATA_NAME_INDEX])) { + nameMap.set(data[i][DATA_NAME_INDEX], count); + count++; + } + } + + var dimensionsInfo = createDimensions(data, { + coordDimensions: ['single'], + dimensionsDefine: [{ + name: 'time', + type: getDimensionTypeByAxis(axisType) + }, { + name: 'value', + type: 'float' + }, { + name: 'name', + type: 'ordinal' + }], + encodeDefine: { + single: 0, + value: 1, + itemName: 2 + } + }); + var list = new List(dimensionsInfo, this); + list.initData(data); + return list; + }; + /** + * The raw data is divided into multiple layers and each layer + * has same name. + */ + + + ThemeRiverSeriesModel.prototype.getLayerSeries = function () { + var data = this.getData(); + var lenCount = data.count(); + var indexArr = []; + + for (var i = 0; i < lenCount; ++i) { + indexArr[i] = i; + } + + var timeDim = data.mapDimension('single'); // data group by name + + var groupResult = groupData(indexArr, function (index) { + return data.get('name', index); + }); + var layerSeries = []; + groupResult.buckets.each(function (items, key) { + items.sort(function (index1, index2) { + return data.get(timeDim, index1) - data.get(timeDim, index2); + }); + layerSeries.push({ + name: key, + indices: items + }); + }); + return layerSeries; + }; + /** + * Get data indices for show tooltip content + */ + + + ThemeRiverSeriesModel.prototype.getAxisTooltipData = function (dim, value, baseAxis) { + if (!isArray(dim)) { + dim = dim ? [dim] : []; + } + + var data = this.getData(); + var layerSeries = this.getLayerSeries(); + var indices = []; + var layerNum = layerSeries.length; + var nestestValue; + + for (var i = 0; i < layerNum; ++i) { + var minDist = Number.MAX_VALUE; + var nearestIdx = -1; + var pointNum = layerSeries[i].indices.length; + + for (var j = 0; j < pointNum; ++j) { + var theValue = data.get(dim[0], layerSeries[i].indices[j]); + var dist = Math.abs(theValue - value); + + if (dist <= minDist) { + nestestValue = theValue; + minDist = dist; + nearestIdx = layerSeries[i].indices[j]; + } + } + + indices.push(nearestIdx); + } + + return { + dataIndices: indices, + nestestValue: nestestValue + }; + }; + + ThemeRiverSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var name = data.getName(dataIndex); + var value = data.get(data.mapDimension('value'), dataIndex); + return createTooltipMarkup('nameValue', { + name: name, + value: value + }); + }; + + ThemeRiverSeriesModel.type = 'series.themeRiver'; + ThemeRiverSeriesModel.dependencies = ['singleAxis']; + ThemeRiverSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + coordinateSystem: 'singleAxis', + // gap in axis's orthogonal orientation + boundaryGap: ['10%', '10%'], + // legendHoverLink: true, + singleAxisIndex: 0, + animationEasing: 'linear', + label: { + margin: 4, + show: true, + position: 'left', + fontSize: 11 + }, + emphasis: { + label: { + show: true + } + } + }; + return ThemeRiverSeriesModel; + }(SeriesModel); + + function themeRiverLayout(ecModel, api) { + ecModel.eachSeriesByType('themeRiver', function (seriesModel) { + var data = seriesModel.getData(); + var single = seriesModel.coordinateSystem; + var layoutInfo = {}; // use the axis boundingRect for view + + var rect = single.getRect(); + layoutInfo.rect = rect; + var boundaryGap = seriesModel.get('boundaryGap'); + var axis = single.getAxis(); + layoutInfo.boundaryGap = boundaryGap; + + if (axis.orient === 'horizontal') { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.height); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.height); + var height = rect.height - boundaryGap[0] - boundaryGap[1]; + doThemeRiverLayout(data, seriesModel, height); + } else { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.width); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.width); + var width = rect.width - boundaryGap[0] - boundaryGap[1]; + doThemeRiverLayout(data, seriesModel, width); + } + + data.setLayout('layoutInfo', layoutInfo); + }); + } + /** + * The layout information about themeriver + * + * @param data data in the series + * @param seriesModel the model object of themeRiver series + * @param height value used to compute every series height + */ + + function doThemeRiverLayout(data, seriesModel, height) { + if (!data.count()) { + return; + } + + var coordSys = seriesModel.coordinateSystem; // the data in each layer are organized into a series. + + var layerSeries = seriesModel.getLayerSeries(); // the points in each layer. + + var timeDim = data.mapDimension('single'); + var valueDim = data.mapDimension('value'); + var layerPoints = map(layerSeries, function (singleLayer) { + return map(singleLayer.indices, function (idx) { + var pt = coordSys.dataToPoint(data.get(timeDim, idx)); + pt[1] = data.get(valueDim, idx); + return pt; + }); + }); + var base = computeBaseline(layerPoints); + var baseLine = base.y0; + var ky = height / base.max; // set layout information for each item. + + var n = layerSeries.length; + var m = layerSeries[0].indices.length; + var baseY0; + + for (var j = 0; j < m; ++j) { + baseY0 = baseLine[j] * ky; + data.setItemLayout(layerSeries[0].indices[j], { + layerIndex: 0, + x: layerPoints[0][j][0], + y0: baseY0, + y: layerPoints[0][j][1] * ky + }); + + for (var i = 1; i < n; ++i) { + baseY0 += layerPoints[i - 1][j][1] * ky; + data.setItemLayout(layerSeries[i].indices[j], { + layerIndex: i, + x: layerPoints[i][j][0], + y0: baseY0, + y: layerPoints[i][j][1] * ky + }); + } + } + } + /** + * Compute the baseLine of the rawdata + * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics + * + * @param data the points in each layer + */ + + + function computeBaseline(data) { + var layerNum = data.length; + var pointNum = data[0].length; + var sums = []; + var y0 = []; + var max = 0; + + for (var i = 0; i < pointNum; ++i) { + var temp = 0; + + for (var j = 0; j < layerNum; ++j) { + temp += data[j][i][1]; + } + + if (temp > max) { + max = temp; + } + + sums.push(temp); + } + + for (var k = 0; k < pointNum; ++k) { + y0[k] = (max - sums[k]) / 2; + } + + max = 0; + + for (var l = 0; l < pointNum; ++l) { + var sum = sums[l] + y0[l]; + + if (sum > max) { + max = sum; + } + } + + return { + y0: y0, + max: max + }; + } + + function install$p(registers) { + registers.registerChartView(ThemeRiverView); + registers.registerSeriesModel(ThemeRiverSeriesModel); + registers.registerLayout(themeRiverLayout); + registers.registerProcessor(dataFilter('themeRiver')); + } + + var DEFAULT_SECTOR_Z = 2; + var DEFAULT_TEXT_Z = 4; + /** + * Sunburstce of Sunburst including Sector, Label, LabelLine + */ + + var SunburstPiece = + /** @class */ + function (_super) { + __extends(SunburstPiece, _super); + + function SunburstPiece(node, seriesModel, ecModel, api) { + var _this = _super.call(this) || this; + + _this.z2 = DEFAULT_SECTOR_Z; + _this.textConfig = { + inside: true + }; + getECData(_this).seriesIndex = seriesModel.seriesIndex; + var text = new ZRText({ + z2: DEFAULT_TEXT_Z, + silent: node.getModel().get(['label', 'silent']) + }); + + _this.setTextContent(text); + + _this.updateData(true, node, seriesModel, ecModel, api); + + return _this; + } + + SunburstPiece.prototype.updateData = function (firstCreate, node, // state: 'emphasis' | 'normal' | 'highlight' | 'downplay', + seriesModel, ecModel, api) { + this.node = node; + node.piece = this; + seriesModel = seriesModel || this._seriesModel; + ecModel = ecModel || this._ecModel; + var sector = this; + getECData(sector).dataIndex = node.dataIndex; + var itemModel = node.getModel(); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = node.getLayout(); + var sectorShape = extend({}, layout); + sectorShape.label = null; + var normalStyle = node.getVisual('style'); + normalStyle.lineJoin = 'bevel'; + var decal = node.getVisual('decal'); + + if (decal) { + normalStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + + var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape); + extend(sectorShape, cornerRadius); + each(SPECIAL_STATES, function (stateName) { + var state = sector.ensureState(stateName); + var itemStyleModel = itemModel.getModel([stateName, 'itemStyle']); + state.style = itemStyleModel.getItemStyle(); // border radius + + var cornerRadius = getSectorCornerRadius(itemStyleModel, sectorShape); + + if (cornerRadius) { + state.shape = cornerRadius; + } + }); + + if (firstCreate) { + sector.setShape(sectorShape); + sector.shape.r = layout.r0; + updateProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, node.dataIndex); + } else { + // Disable animation for gradient since no interpolation method + // is supported for gradient + updateProps(sector, { + shape: sectorShape + }, seriesModel); + } + + sector.useStyle(normalStyle); + + this._updateLabel(seriesModel); + + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + this._seriesModel = seriesModel || this._seriesModel; + this._ecModel = ecModel || this._ecModel; + var focus = emphasisModel.get('focus'); + var focusDataIndices = focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : null; + enableHoverEmphasis(this, focusDataIndices || focus, emphasisModel.get('blurScope')); + }; + + SunburstPiece.prototype._updateLabel = function (seriesModel) { + var _this = this; + + var itemModel = this.node.getModel(); + var normalLabelModel = itemModel.getModel('label'); + var layout = this.node.getLayout(); + var angle = layout.endAngle - layout.startAngle; + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + var sector = this; + var label = sector.getTextContent(); + var dataIndex = this.node.dataIndex; + var labelMinAngle = normalLabelModel.get('minAngle') / 180 * Math.PI; + var isNormalShown = normalLabelModel.get('show') && !(labelMinAngle != null && Math.abs(angle) < labelMinAngle); + label.ignore = !isNormalShown; // TODO use setLabelStyle + + each(DISPLAY_STATES, function (stateName) { + var labelStateModel = stateName === 'normal' ? itemModel.getModel('label') : itemModel.getModel([stateName, 'label']); + var isNormal = stateName === 'normal'; + var state = isNormal ? label : label.ensureState(stateName); + var text = seriesModel.getFormattedLabel(dataIndex, stateName); + + if (isNormal) { + text = text || _this.node.name; + } + + state.style = createTextStyle(labelStateModel, {}, null, stateName !== 'normal', true); + + if (text) { + state.style.text = text; + } // Not displaying text when angle is too small + + + var isShown = labelStateModel.get('show'); + + if (isShown != null && !isNormal) { + state.ignore = !isShown; + } + + var labelPosition = getLabelAttr(labelStateModel, 'position'); + var sectorState = isNormal ? sector : sector.states[stateName]; + var labelColor = sectorState.style.fill; + sectorState.textConfig = { + outsideFill: labelStateModel.get('color') === 'inherit' ? labelColor : null, + inside: labelPosition !== 'outside' + }; + var r; + var labelPadding = getLabelAttr(labelStateModel, 'distance') || 0; + var textAlign = getLabelAttr(labelStateModel, 'align'); + + if (labelPosition === 'outside') { + r = layout.r + labelPadding; + textAlign = midAngle > Math.PI / 2 ? 'right' : 'left'; + } else { + if (!textAlign || textAlign === 'center') { + r = (layout.r + layout.r0) / 2; + textAlign = 'center'; + } else if (textAlign === 'left') { + r = layout.r0 + labelPadding; + + if (midAngle > Math.PI / 2) { + textAlign = 'right'; + } + } else if (textAlign === 'right') { + r = layout.r - labelPadding; + + if (midAngle > Math.PI / 2) { + textAlign = 'left'; + } + } + } + + state.style.align = textAlign; + state.style.verticalAlign = getLabelAttr(labelStateModel, 'verticalAlign') || 'middle'; + state.x = r * dx + layout.cx; + state.y = r * dy + layout.cy; + var rotateType = getLabelAttr(labelStateModel, 'rotate'); + var rotate = 0; + + if (rotateType === 'radial') { + rotate = -midAngle; + + if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } else if (rotateType === 'tangential') { + rotate = Math.PI / 2 - midAngle; + + if (rotate > Math.PI / 2) { + rotate -= Math.PI; + } else if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } else if (typeof rotateType === 'number') { + rotate = rotateType * Math.PI / 180; + } + + state.rotation = rotate; + }); + + function getLabelAttr(model, name) { + var stateAttr = model.get(name); + + if (stateAttr == null) { + return normalLabelModel.get(name); + } + + return stateAttr; + } + + label.dirtyStyle(); + }; + + return SunburstPiece; + }(Sector); + + var ROOT_TO_NODE_ACTION = 'sunburstRootToNode'; + var HIGHLIGHT_ACTION = 'sunburstHighlight'; + var UNHIGHLIGHT_ACTION = 'sunburstUnhighlight'; + function installSunburstAction(registers) { + registers.registerAction({ + type: ROOT_TO_NODE_ACTION, + update: 'updateView' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'sunburst', + query: payload + }, handleRootToNode); + + function handleRootToNode(model, index) { + var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION], model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown'; + } + + model.resetViewRoot(targetInfo.node); + } + } + }); + registers.registerAction({ + type: HIGHLIGHT_ACTION, + update: 'none' + }, function (payload, ecModel, api) { + // Clone + payload = extend({}, payload); + ecModel.eachComponent({ + mainType: 'series', + subType: 'sunburst', + query: payload + }, handleHighlight); + + function handleHighlight(model) { + var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model); + + if (targetInfo) { + payload.dataIndex = targetInfo.node.dataIndex; + } + } + + if ("development" !== 'production') { + deprecateReplaceLog('highlight', 'sunburstHighlight'); + } // Fast forward action + + + api.dispatchAction(extend(payload, { + type: 'highlight' + })); + }); + registers.registerAction({ + type: UNHIGHLIGHT_ACTION, + update: 'updateView' + }, function (payload, ecModel, api) { + payload = extend({}, payload); + + if ("development" !== 'production') { + deprecateReplaceLog('downplay', 'sunburstUnhighlight'); + } + + api.dispatchAction(extend(payload, { + type: 'downplay' + })); + }); + } + + var SunburstView = + /** @class */ + function (_super) { + __extends(SunburstView, _super); + + function SunburstView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SunburstView.type; + return _this; + } + + SunburstView.prototype.render = function (seriesModel, ecModel, api, // @ts-ignore + payload) { + var self = this; + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + var data = seriesModel.getData(); + var virtualRoot = data.tree.root; + var newRoot = seriesModel.getViewRoot(); + var group = this.group; + var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData'); + var newChildren = []; + newRoot.eachNode(function (node) { + newChildren.push(node); + }); + var oldChildren = this._oldChildren || []; + dualTravel(newChildren, oldChildren); + renderRollUp(virtualRoot, newRoot); + + this._initEvents(); + + this._oldChildren = newChildren; + + function dualTravel(newChildren, oldChildren) { + if (newChildren.length === 0 && oldChildren.length === 0) { + return; + } + + new DataDiffer(oldChildren, newChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute(); + + function getKey(node) { + return node.getId(); + } + + function processNode(newIdx, oldIdx) { + var newNode = newIdx == null ? null : newChildren[newIdx]; + var oldNode = oldIdx == null ? null : oldChildren[oldIdx]; + doRenderNode(newNode, oldNode); + } + } + + function doRenderNode(newNode, oldNode) { + if (!renderLabelForZeroData && newNode && !newNode.getValue()) { + // Not render data with value 0 + newNode = null; + } + + if (newNode !== virtualRoot && oldNode !== virtualRoot) { + if (oldNode && oldNode.piece) { + if (newNode) { + // Update + oldNode.piece.updateData(false, newNode, seriesModel, ecModel, api); // For tooltip + + data.setItemGraphicEl(newNode.dataIndex, oldNode.piece); + } else { + // Remove + removeNode(oldNode); + } + } else if (newNode) { + // Add + var piece = new SunburstPiece(newNode, seriesModel, ecModel, api); + group.add(piece); // For tooltip + + data.setItemGraphicEl(newNode.dataIndex, piece); + } + } + } + + function removeNode(node) { + if (!node) { + return; + } + + if (node.piece) { + group.remove(node.piece); + node.piece = null; + } + } + + function renderRollUp(virtualRoot, viewRoot) { + if (viewRoot.depth > 0) { + // Render + if (self.virtualPiece) { + // Update + self.virtualPiece.updateData(false, virtualRoot, seriesModel, ecModel, api); + } else { + // Add + self.virtualPiece = new SunburstPiece(virtualRoot, seriesModel, ecModel, api); + group.add(self.virtualPiece); + } // TODO event scope + + + viewRoot.piece.off('click'); + self.virtualPiece.on('click', function (e) { + self._rootToNode(viewRoot.parentNode); + }); + } else if (self.virtualPiece) { + // Remove + group.remove(self.virtualPiece); + self.virtualPiece = null; + } + } + }; + /** + * @private + */ + + + SunburstView.prototype._initEvents = function () { + var _this = this; + + this.group.off('click'); + this.group.on('click', function (e) { + var targetFound = false; + + var viewRoot = _this.seriesModel.getViewRoot(); + + viewRoot.eachNode(function (node) { + if (!targetFound && node.piece && node.piece === e.target) { + var nodeClick = node.getModel().get('nodeClick'); + + if (nodeClick === 'rootToNode') { + _this._rootToNode(node); + } else if (nodeClick === 'link') { + var itemModel = node.getModel(); + var link = itemModel.get('link'); + + if (link) { + var linkTarget = itemModel.get('target', true) || '_blank'; + windowOpen(link, linkTarget); + } + } + + targetFound = true; + } + }); + }); + }; + /** + * @private + */ + + + SunburstView.prototype._rootToNode = function (node) { + if (node !== this.seriesModel.getViewRoot()) { + this.api.dispatchAction({ + type: ROOT_TO_NODE_ACTION, + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: node + }); + } + }; + /** + * @implement + */ + + + SunburstView.prototype.containPoint = function (point, seriesModel) { + var treeRoot = seriesModel.getData(); + var itemLayout = treeRoot.getItemLayout(0); + + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + + SunburstView.type = 'sunburst'; + return SunburstView; + }(ChartView); + + var SunburstSeriesModel = + /** @class */ + function (_super) { + __extends(SunburstSeriesModel, _super); + + function SunburstSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SunburstSeriesModel.type; + _this.ignoreStyleOnData = true; + return _this; + } + + SunburstSeriesModel.prototype.getInitialData = function (option, ecModel) { + // Create a virtual root. + var root = { + name: option.name, + children: option.data + }; + completeTreeValue$1(root); + var levelModels = map(option.levels || [], function (levelDefine) { + return new Model(levelDefine, this, ecModel); + }, this); // 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. + + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + var levelModel = levelModels[node.depth]; + levelModel && (model.parentModel = levelModel); + return model; + }); + } + + return tree.data; + }; + + SunburstSeriesModel.prototype.optionUpdated = function () { + this.resetViewRoot(); + }; + /* + * @override + */ + + + SunburstSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treePathInfo = wrapTreePathInfo(node, this); + return params; + }; + + SunburstSeriesModel.prototype.getViewRoot = function () { + return this._viewRoot; + }; + + SunburstSeriesModel.prototype.resetViewRoot = function (viewRoot) { + viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; + var root = this.getRawData().tree.root; + + if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { + this._viewRoot = root; + } + }; + + SunburstSeriesModel.prototype.enableAriaDecal = function () { + enableAriaDecalForTree(this); + }; + + SunburstSeriesModel.type = 'series.sunburst'; + SunburstSeriesModel.defaultOption = { + zlevel: 0, + z: 2, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // If still show when all data zero. + stillShowZeroSum: true, + // 'rootToNode', 'link', or false + nodeClick: 'rootToNode', + renderLabelForZeroData: false, + label: { + // could be: 'radial', 'tangential', or 'none' + rotate: 'radial', + show: true, + opacity: 1, + // 'left' is for inner side of inside, and 'right' is for outter + // side for inside + align: 'center', + position: 'inside', + distance: 5, + silent: true + }, + itemStyle: { + borderWidth: 1, + borderColor: 'white', + borderType: 'solid', + shadowBlur: 0, + shadowColor: 'rgba(0, 0, 0, 0.2)', + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + emphasis: { + focus: 'descendant' + }, + blur: { + itemStyle: { + opacity: 0.2 + }, + label: { + opacity: 0.1 + } + }, + // Animation type canbe expansion, scale + animationType: 'expansion', + animationDuration: 1000, + animationDurationUpdate: 500, + data: [], + levels: [], + + /** + * Sort order. + * + * Valid values: 'desc', 'asc', null, or callback function. + * 'desc' and 'asc' for descend and ascendant order; + * null for not sorting; + * example of callback function: + * function(nodeA, nodeB) { + * return nodeA.getValue() - nodeB.getValue(); + * } + */ + sort: 'desc' + }; + return SunburstSeriesModel; + }(SeriesModel); + + function completeTreeValue$1(dataNode) { + // 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; + each(dataNode.children, function (child) { + completeTreeValue$1(child); + var childValue = child.value; // TODO First value of array must be a number + + isArray(childValue) && (childValue = childValue[0]); + sum += childValue; + }); + var thisValue = dataNode.value; + + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } // Value should not less than 0. + + + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; + } + + var RADIAN$2 = Math.PI / 180; + function sunburstLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + + if (!isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width); + var cy = parsePercent$1(center[1], height); + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + var startAngle = -seriesModel.get('startAngle') * RADIAN$2; + var minAngle = seriesModel.get('minAngle') * RADIAN$2; + var virtualRoot = seriesModel.getData().tree.root; + var treeRoot = seriesModel.getViewRoot(); + var rootDepth = treeRoot.depth; + var sort = seriesModel.get('sort'); + + if (sort != null) { + initChildren$1(treeRoot, sort); + } + + var validDataCount = 0; + each(treeRoot.children, function (child) { + !isNaN(child.getValue()) && validDataCount++; + }); + var sum = treeRoot.getValue(); // Sum may be 0 + + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var renderRollupNode = treeRoot.depth > 0; + var levels = treeRoot.height - (renderRollupNode ? -1 : 1); + var rPerLevel = (r - r0) / (levels || 1); + var clockwise = seriesModel.get('clockwise'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // In the case some sector angle is smaller than minAngle + // let restAngle = PI2; + // let valueSumLargerThanMinAngle = 0; + + var dir = clockwise ? 1 : -1; + /** + * Render a tree + * @return increased angle + */ + + var renderNode = function (node, startAngle) { + if (!node) { + return; + } + + var endAngle = startAngle; // Render self + + if (node !== virtualRoot) { + // Tree node is virtual, so it doesn't need to be drawn + var value = node.getValue(); + var angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + + if (angle < minAngle) { + angle = minAngle; // restAngle -= minAngle; + } // else { + // valueSumLargerThanMinAngle += value; + // } + + + endAngle = startAngle + dir * angle; + var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1); + var rStart = r0 + rPerLevel * depth; + var rEnd = r0 + rPerLevel * (depth + 1); + var itemModel = node.getModel(); // @ts-ignore. TODO this is not provided to developer yet. Rename it. + + if (itemModel.get('r0') != null) { + // @ts-ignore + rStart = parsePercent$1(itemModel.get('r0'), size / 2); + } // @ts-ignore + + + if (itemModel.get('r') != null) { + // @ts-ignore + rEnd = parsePercent$1(itemModel.get('r'), size / 2); + } + + node.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } // Render children + + + if (node.children && node.children.length) { + // currentAngle = startAngle; + var siblingAngle_1 = 0; + each(node.children, function (node) { + siblingAngle_1 += renderNode(node, startAngle + siblingAngle_1); + }); + } + + return endAngle - startAngle; + }; // Virtual root node for roll up + + + if (renderRollupNode) { + var rStart = r0; + var rEnd = r0 + rPerLevel; + var angle = Math.PI * 2; + virtualRoot.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: startAngle + angle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } + + renderNode(treeRoot, startAngle); + }); + } + /** + * Init node children by order and update visual + */ + + function initChildren$1(node, sortOrder) { + var children = node.children || []; + node.children = sort$2(children, sortOrder); // Init children recursively + + if (children.length) { + each(node.children, function (child) { + initChildren$1(child, sortOrder); + }); + } + } + /** + * Sort children nodes + * + * @param {TreeNode[]} children children of node to be sorted + * @param {string | function | null} sort sort method + * See SunburstSeries.js for details. + */ + + + function sort$2(children, sortOrder) { + if (typeof sortOrder === 'function') { + var sortTargets = map(children, function (child, idx) { + var value = child.getValue(); + return { + params: { + depth: child.depth, + height: child.height, + dataIndex: child.dataIndex, + getValue: function () { + return value; + } + }, + index: idx + }; + }); + sortTargets.sort(function (a, b) { + return sortOrder(a.params, b.params); + }); + return map(sortTargets, function (target) { + return children[target.index]; + }); + } else { + var isAsc_1 = sortOrder === 'asc'; + return children.sort(function (a, b) { + var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1); + return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff; + }); + } + } + + function sunburstVisual(ecModel) { + var paletteScope = {}; // Default color strategy + + function pickColor(node, seriesModel, treeHeight) { + // Choose color from palette based on the first level. + var current = node; + + while (current && current.depth > 1) { + current = current.parentNode; + } + + var color = seriesModel.getColorFromPalette(current.name || current.dataIndex + '', paletteScope); + + if (node.depth > 1 && typeof color === 'string') { + // Lighter on the deeper level. + color = lift(color, (node.depth - 1) / (treeHeight - 1) * 0.5); + } + + return color; + } + + ecModel.eachSeriesByType('sunburst', function (seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + tree.eachNode(function (node) { + var model = node.getModel(); + var style = model.getModel('itemStyle').getItemStyle(); + + if (!style.fill) { + style.fill = pickColor(node, seriesModel, tree.root.height); + } + + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); + extend(existsStyle, style); + }); + }); + } + + function install$q(registers) { + registers.registerChartView(SunburstView); + registers.registerSeriesModel(SunburstSeriesModel); + registers.registerLayout(curry(sunburstLayout, 'sunburst')); + registers.registerProcessor(curry(dataFilter, 'sunburst')); + registers.registerVisual(sunburstVisual); + installSunburstAction(registers); + } + + function dataToCoordSize(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['x', 'y'], function (dim, dimIdx) { + var axis = this.getAxis(dim); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + }, this); + } + + function cartesianPrepareCustom(coordSys) { + var rect = coordSys.master.getRect(); + return { + coordSys: { + // The name exposed to user is always 'cartesian2d' but not 'grid'. + type: 'cartesian2d', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (data) { + // do not provide "out" param + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize, coordSys) + } + }; + } + + function dataToCoordSize$1(dataSize, dataItem) { + dataItem = dataItem || [0, 0]; + return map([0, 1], function (dimIdx) { + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var p1 = []; + var p2 = []; + p1[dimIdx] = val - halfSize; + p2[dimIdx] = val + halfSize; + p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx]; + return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]); + }, this); + } + + function geoPrepareCustom(coordSys) { + var rect = coordSys.getBoundingRect(); + return { + coordSys: { + type: 'geo', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + zoom: coordSys.getZoom() + }, + api: { + coord: function (data) { + // do not provide "out" and noRoam param, + // Compatible with this usage: + // echarts.util.map(item.points, api.coord) + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize$1, coordSys) + } + }; + } + + function dataToCoordSize$2(dataSize, dataItem) { + // dataItem is necessary in log axis. + var axis = this.getAxis(); + var val = dataItem instanceof Array ? dataItem[0] : dataItem; + var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2; + return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + } + + function singlePrepareCustom(coordSys) { + var rect = coordSys.getRect(); + return { + coordSys: { + type: 'singleAxis', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (val) { + // do not provide "out" param + return coordSys.dataToPoint(val); + }, + size: bind(dataToCoordSize$2, coordSys) + } + }; + } + + function dataToCoordSize$3(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['Radius', 'Angle'], function (dim, dimIdx) { + var getterName = 'get' + dim + 'Axis'; // TODO: TYPE Check Angle Axis + + var axis = this[getterName](); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var result = axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + + if (dim === 'Angle') { + result = result * Math.PI / 180; + } + + return result; + }, this); + } + + function polarPrepareCustom(coordSys) { + var radiusAxis = coordSys.getRadiusAxis(); + var angleAxis = coordSys.getAngleAxis(); + var radius = radiusAxis.getExtent(); + radius[0] > radius[1] && radius.reverse(); + return { + coordSys: { + type: 'polar', + cx: coordSys.cx, + cy: coordSys.cy, + r: radius[1], + r0: radius[0] + }, + api: { + coord: function (data) { + var radius = radiusAxis.dataToRadius(data[0]); + var angle = angleAxis.dataToAngle(data[1]); + var coord = coordSys.coordToPoint([radius, angle]); + coord.push(radius, angle * Math.PI / 180); + return coord; + }, + size: bind(dataToCoordSize$3, coordSys) + } + }; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function calendarPrepareCustom(coordSys) { + var rect = coordSys.getRect(); + var rangeInfo = coordSys.getRangeInfo(); + return { + coordSys: { + type: 'calendar', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + cellWidth: coordSys.getCellWidth(), + cellHeight: coordSys.getCellHeight(), + rangeInfo: { + start: rangeInfo.start, + end: rangeInfo.end, + weeks: rangeInfo.weeks, + dayCount: rangeInfo.allDay + } + }, + api: { + coord: function (data, clamp) { + return coordSys.dataToPoint(data, clamp); + } + } + }; + } + + var deprecatedLogs = {}; + /** + * Whether need to call `convertEC4CompatibleStyle`. + */ + + function isEC4CompatibleStyle(style, elType, hasOwnTextContentOption, hasOwnTextConfig) { + // Since echarts5, `RectText` is separated from its host element and style.text + // does not exist any more. The compat work brings some extra burden on performance. + // So we provide: + // `legacy: true` force make compat. + // `legacy: false`, force do not compat. + // `legacy` not set: auto detect wheter legacy. + // But in this case we do not compat (difficult to detect and rare case): + // Becuse custom series and graphic component support "merge", users may firstly + // only set `textStrokeWidth` style or secondly only set `text`. + return style && (style.legacy || style.legacy !== false && !hasOwnTextContentOption && !hasOwnTextConfig && elType !== 'tspan' // Difficult to detect whether legacy for a "text" el. + && (elType === 'text' || hasOwn(style, 'text'))); + } + /** + * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format. + * @param hostStyle The properties might be modified. + * @return If be text el, `textContentStyle` and `textConfig` will not be retured. + * Otherwise a `textContentStyle` and `textConfig` will be created, whose props area + * retried from the `hostStyle`. + */ + + function convertFromEC4CompatibleStyle(hostStyle, elType, isNormal) { + var srcStyle = hostStyle; + var textConfig; + var textContent; + var textContentStyle; + + if (elType === 'text') { + textContentStyle = srcStyle; + } else { + textContentStyle = {}; + hasOwn(srcStyle, 'text') && (textContentStyle.text = srcStyle.text); + hasOwn(srcStyle, 'rich') && (textContentStyle.rich = srcStyle.rich); + hasOwn(srcStyle, 'textFill') && (textContentStyle.fill = srcStyle.textFill); + hasOwn(srcStyle, 'textStroke') && (textContentStyle.stroke = srcStyle.textStroke); + textContent = { + type: 'text', + style: textContentStyle, + // ec4 do not support rectText trigger. + // And when text postion is different in normal and emphasis + // => hover text trigger emphasis; + // => text position changed, leave mouse pointer immediately; + // That might cause state incorrect. + silent: true + }; + textConfig = {}; + var hasOwnPos = hasOwn(srcStyle, 'textPosition'); + + if (isNormal) { + textConfig.position = hasOwnPos ? srcStyle.textPosition : 'inside'; + } else { + hasOwnPos && (textConfig.position = srcStyle.textPosition); + } + + hasOwn(srcStyle, 'textPosition') && (textConfig.position = srcStyle.textPosition); + hasOwn(srcStyle, 'textOffset') && (textConfig.offset = srcStyle.textOffset); + hasOwn(srcStyle, 'textRotation') && (textConfig.rotation = srcStyle.textRotation); + hasOwn(srcStyle, 'textDistance') && (textConfig.distance = srcStyle.textDistance); + } + + convertEC4CompatibleRichItem(textContentStyle, hostStyle); + each(textContentStyle.rich, function (richItem) { + convertEC4CompatibleRichItem(richItem, richItem); + }); + return { + textConfig: textConfig, + textContent: textContent + }; + } + /** + * The result will be set to `out`. + */ + + function convertEC4CompatibleRichItem(out, richItem) { + if (!richItem) { + return; + } // (1) For simplicity, make textXXX properties (deprecated since ec5) has + // higher priority. For example, consider in ec4 `borderColor: 5, textBorderColor: 10` + // on a rect means `borderColor: 4` on the rect and `borderColor: 10` on an attached + // richText in ec5. + // (2) `out === richItem` if and only if `out` is text el or rich item. + // So we can overwite existing props in `out` since textXXX has higher priority. + + + richItem.font = richItem.textFont || richItem.font; + hasOwn(richItem, 'textStrokeWidth') && (out.lineWidth = richItem.textStrokeWidth); + hasOwn(richItem, 'textAlign') && (out.align = richItem.textAlign); + hasOwn(richItem, 'textVerticalAlign') && (out.verticalAlign = richItem.textVerticalAlign); + hasOwn(richItem, 'textLineHeight') && (out.lineHeight = richItem.textLineHeight); + hasOwn(richItem, 'textWidth') && (out.width = richItem.textWidth); + hasOwn(richItem, 'textHeight') && (out.height = richItem.textHeight); + hasOwn(richItem, 'textBackgroundColor') && (out.backgroundColor = richItem.textBackgroundColor); + hasOwn(richItem, 'textPadding') && (out.padding = richItem.textPadding); + hasOwn(richItem, 'textBorderColor') && (out.borderColor = richItem.textBorderColor); + hasOwn(richItem, 'textBorderWidth') && (out.borderWidth = richItem.textBorderWidth); + hasOwn(richItem, 'textBorderRadius') && (out.borderRadius = richItem.textBorderRadius); + hasOwn(richItem, 'textBoxShadowColor') && (out.shadowColor = richItem.textBoxShadowColor); + hasOwn(richItem, 'textBoxShadowBlur') && (out.shadowBlur = richItem.textBoxShadowBlur); + hasOwn(richItem, 'textBoxShadowOffsetX') && (out.shadowOffsetX = richItem.textBoxShadowOffsetX); + hasOwn(richItem, 'textBoxShadowOffsetY') && (out.shadowOffsetY = richItem.textBoxShadowOffsetY); + } + /** + * Convert to pure echarts4 format style. + * `itemStyle` will be modified, added with ec4 style properties from + * `textStyle` and `textConfig`. + * + * [Caveat]: For simplicity, `insideRollback` in ec4 does not compat, where + * `styleEmphasis: {textFill: 'red'}` will remove the normal auto added stroke. + */ + + + function convertToEC4StyleForCustomSerise(itemStl, txStl, txCfg) { + var out = itemStl; // See `custom.ts`, a trick to set extra `textPosition` firstly. + + out.textPosition = out.textPosition || txCfg.position || 'inside'; + txCfg.offset != null && (out.textOffset = txCfg.offset); + txCfg.rotation != null && (out.textRotation = txCfg.rotation); + txCfg.distance != null && (out.textDistance = txCfg.distance); + var isInside = out.textPosition.indexOf('inside') >= 0; + var hostFill = itemStl.fill || '#000'; + convertToEC4RichItem(out, txStl); + var textFillNotSet = out.textFill == null; + + if (isInside) { + if (textFillNotSet) { + out.textFill = txCfg.insideFill || '#fff'; + !out.textStroke && txCfg.insideStroke && (out.textStroke = txCfg.insideStroke); + !out.textStroke && (out.textStroke = hostFill); + out.textStrokeWidth == null && (out.textStrokeWidth = 2); + } + } else { + if (textFillNotSet) { + out.textFill = txCfg.outsideFill || hostFill; + } + + !out.textStroke && txCfg.outsideStroke && (out.textStroke = txCfg.outsideStroke); + } + + out.text = txStl.text; + out.rich = txStl.rich; + each(txStl.rich, function (richItem) { + convertToEC4RichItem(richItem, richItem); + }); + return out; + } + + function convertToEC4RichItem(out, richItem) { + if (!richItem) { + return; + } + + hasOwn(richItem, 'fill') && (out.textFill = richItem.fill); + hasOwn(richItem, 'stroke') && (out.textStroke = richItem.fill); + hasOwn(richItem, 'lineWidth') && (out.textStrokeWidth = richItem.lineWidth); + hasOwn(richItem, 'font') && (out.font = richItem.font); + hasOwn(richItem, 'fontStyle') && (out.fontStyle = richItem.fontStyle); + hasOwn(richItem, 'fontWeight') && (out.fontWeight = richItem.fontWeight); + hasOwn(richItem, 'fontSize') && (out.fontSize = richItem.fontSize); + hasOwn(richItem, 'fontFamily') && (out.fontFamily = richItem.fontFamily); + hasOwn(richItem, 'align') && (out.textAlign = richItem.align); + hasOwn(richItem, 'verticalAlign') && (out.textVerticalAlign = richItem.verticalAlign); + hasOwn(richItem, 'lineHeight') && (out.textLineHeight = richItem.lineHeight); + hasOwn(richItem, 'width') && (out.textWidth = richItem.width); + hasOwn(richItem, 'height') && (out.textHeight = richItem.height); + hasOwn(richItem, 'backgroundColor') && (out.textBackgroundColor = richItem.backgroundColor); + hasOwn(richItem, 'padding') && (out.textPadding = richItem.padding); + hasOwn(richItem, 'borderColor') && (out.textBorderColor = richItem.borderColor); + hasOwn(richItem, 'borderWidth') && (out.textBorderWidth = richItem.borderWidth); + hasOwn(richItem, 'borderRadius') && (out.textBorderRadius = richItem.borderRadius); + hasOwn(richItem, 'shadowColor') && (out.textBoxShadowColor = richItem.shadowColor); + hasOwn(richItem, 'shadowBlur') && (out.textBoxShadowBlur = richItem.shadowBlur); + hasOwn(richItem, 'shadowOffsetX') && (out.textBoxShadowOffsetX = richItem.shadowOffsetX); + hasOwn(richItem, 'shadowOffsetY') && (out.textBoxShadowOffsetY = richItem.shadowOffsetY); + hasOwn(richItem, 'textShadowColor') && (out.textShadowColor = richItem.textShadowColor); + hasOwn(richItem, 'textShadowBlur') && (out.textShadowBlur = richItem.textShadowBlur); + hasOwn(richItem, 'textShadowOffsetX') && (out.textShadowOffsetX = richItem.textShadowOffsetX); + hasOwn(richItem, 'textShadowOffsetY') && (out.textShadowOffsetY = richItem.textShadowOffsetY); + } + + function warnDeprecated(deprecated, insteadApproach) { + if ("development" !== 'production') { + var key = deprecated + '^_^' + insteadApproach; + + if (!deprecatedLogs[key]) { + console.warn("[ECharts] DEPRECATED: \"" + deprecated + "\" has been deprecated. " + insteadApproach); + deprecatedLogs[key] = true; + } + } + } + + var CMD$4 = PathProxy.CMD; + var PI2$a = Math.PI * 2; + var PROP_XY = ['x', 'y']; + var PROP_WH = ['width', 'height']; + var tmpArr$1 = []; + function aroundEqual(a, b) { + return Math.abs(a - b) < 1e-5; + } + function pathToBezierCurves(path) { + var data = path.data; + var len = path.len(); + var bezierArray = []; + var currentSubpath; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + function createNewSubpath(x, y) { + if (currentSubpath && currentSubpath.length > 2) { + bezierArray.push(currentSubpath); + } + currentSubpath = [x, y]; + } + function addLine(x0, y0, x1, y1) { + if (!(aroundEqual(x0, x1) && aroundEqual(y0, y1))) { + currentSubpath.push(x0, y0, x1, y1, x1, y1); + } + } + function addArc(startAngle, endAngle, cx, cy, rx, ry) { + var delta = Math.abs(endAngle - startAngle); + var len = Math.tan(delta / 4) * 4 / 3; + var dir = endAngle < startAngle ? -1 : 1; + var c1 = Math.cos(startAngle); + var s1 = Math.sin(startAngle); + var c2 = Math.cos(endAngle); + var s2 = Math.sin(endAngle); + var x1 = c1 * rx + cx; + var y1 = s1 * ry + cy; + var x4 = c2 * rx + cx; + var y4 = s2 * ry + cy; + var hx = rx * len * dir; + var hy = ry * len * dir; + currentSubpath.push(x1 - hx * s1, y1 + hy * c1, x4 + hx * s2, y4 - hy * c2, x4, y4); + } + var x1; + var y1; + var x2; + var y2; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + if (cmd === CMD$4.L || cmd === CMD$4.C || cmd === CMD$4.Q) { + currentSubpath = [x0, y0]; + } + } + switch (cmd) { + case CMD$4.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + createNewSubpath(x0, y0); + break; + case CMD$4.L: + x1 = data[i++]; + y1 = data[i++]; + addLine(xi, yi, x1, y1); + xi = x1; + yi = y1; + break; + case CMD$4.C: + currentSubpath.push(data[i++], data[i++], data[i++], data[i++], xi = data[i++], yi = data[i++]); + break; + case CMD$4.Q: + x1 = data[i++]; + y1 = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + currentSubpath.push(xi + 2 / 3 * (x1 - xi), yi + 2 / 3 * (y1 - yi), x2 + 2 / 3 * (x1 - x2), y2 + 2 / 3 * (y1 - y2), x2, y2); + xi = x2; + yi = y2; + break; + case CMD$4.A: + 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; + i += 1; + var anticlockwise = !data[i++]; + x1 = Math.cos(startAngle) * rx + cx; + y1 = Math.sin(startAngle) * ry + cy; + if (isFirst) { + x0 = x1; + y0 = y1; + createNewSubpath(x0, y0); + } + else { + addLine(xi, yi, x1, y1); + } + xi = Math.cos(endAngle) * rx + cx; + yi = Math.sin(endAngle) * ry + cy; + var step = (anticlockwise ? -1 : 1) * Math.PI / 2; + for (var angle = startAngle; anticlockwise ? angle > endAngle : angle < endAngle; angle += step) { + var nextAngle = anticlockwise ? Math.max(angle + step, endAngle) + : Math.min(angle + step, endAngle); + addArc(angle, nextAngle, cx, cy, rx, ry); + } + break; + case CMD$4.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + x1 = x0 + data[i++]; + y1 = y0 + data[i++]; + createNewSubpath(x1, y0); + addLine(x1, y0, x1, y1); + addLine(x1, y1, x0, y1); + addLine(x0, y1, x0, y0); + addLine(x0, y0, x1, y0); + break; + case CMD$4.Z: + currentSubpath && addLine(xi, yi, x0, y0); + xi = x0; + yi = y0; + break; + } + } + if (currentSubpath && currentSubpath.length > 2) { + bezierArray.push(currentSubpath); + } + return bezierArray; + } + function alignSubpath(subpath1, subpath2) { + var len1 = subpath1.length; + var len2 = subpath2.length; + if (len1 === len2) { + return [subpath1, subpath2]; + } + var shorterPath = len1 < len2 ? subpath1 : subpath2; + var shorterLen = Math.min(len1, len2); + var diff = Math.abs(len2 - len1) / 6; + var shorterBezierCount = (shorterLen - 2) / 6; + var eachCurveSubDivCount = Math.ceil(diff / shorterBezierCount) + 1; + var newSubpath = [shorterPath[0], shorterPath[1]]; + var remained = diff; + var tmpSegX = []; + var tmpSegY = []; + for (var i = 2; i < shorterLen;) { + var x0 = shorterPath[i - 2]; + var y0 = shorterPath[i - 1]; + var x1 = shorterPath[i++]; + var y1 = shorterPath[i++]; + var x2 = shorterPath[i++]; + var y2 = shorterPath[i++]; + var x3 = shorterPath[i++]; + var y3 = shorterPath[i++]; + if (remained <= 0) { + newSubpath.push(x1, y1, x2, y2, x3, y3); + continue; + } + var actualSubDivCount = Math.min(remained, eachCurveSubDivCount - 1) + 1; + for (var k = 1; k <= actualSubDivCount; k++) { + var p = k / actualSubDivCount; + cubicSubdivide(x0, x1, x2, x3, p, tmpSegX); + cubicSubdivide(y0, y1, y2, y3, p, tmpSegY); + x0 = tmpSegX[3]; + y0 = tmpSegY[3]; + newSubpath.push(tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], x0, y0); + x1 = tmpSegX[5]; + y1 = tmpSegY[5]; + x2 = tmpSegX[6]; + y2 = tmpSegY[6]; + } + remained -= actualSubDivCount - 1; + } + return shorterPath === subpath1 ? [newSubpath, subpath2] : [subpath1, newSubpath]; + } + function createSubpath(lastSubpathSubpath, otherSubpath) { + var len = lastSubpathSubpath.length; + var lastX = lastSubpathSubpath[len - 2]; + var lastY = lastSubpathSubpath[len - 1]; + var newSubpath = []; + for (var i = 0; i < otherSubpath.length;) { + newSubpath[i++] = lastX; + newSubpath[i++] = lastY; + } + return newSubpath; + } + function alignBezierCurves(array1, array2) { + var _a; + var lastSubpath1; + var lastSubpath2; + var newArray1 = []; + var newArray2 = []; + for (var i = 0; i < Math.max(array1.length, array2.length); i++) { + var subpath1 = array1[i]; + var subpath2 = array2[i]; + var newSubpath1 = void 0; + var newSubpath2 = void 0; + if (!subpath1) { + newSubpath1 = createSubpath(lastSubpath1 || subpath2, subpath2); + newSubpath2 = subpath2; + } + else if (!subpath2) { + newSubpath2 = createSubpath(lastSubpath2 || subpath1, subpath1); + newSubpath1 = subpath1; + } + else { + _a = alignSubpath(subpath1, subpath2), newSubpath1 = _a[0], newSubpath2 = _a[1]; + lastSubpath1 = newSubpath1; + lastSubpath2 = newSubpath2; + } + newArray1.push(newSubpath1); + newArray2.push(newSubpath2); + } + return [newArray1, newArray2]; + } + function centroid(array) { + var signedArea = 0; + var cx = 0; + var cy = 0; + var len = array.length; + for (var i = 0, j = len - 2; i < len; j = i, i += 2) { + var x0 = array[j]; + var y0 = array[j + 1]; + var x1 = array[i]; + var y1 = array[i + 1]; + var a = x0 * y1 - x1 * y0; + signedArea += a; + cx += (x0 + x1) * a; + cy += (y0 + y1) * a; + } + if (signedArea === 0) { + return [array[0] || 0, array[1] || 0]; + } + return [cx / signedArea / 3, cy / signedArea / 3, signedArea]; + } + function findBestRingOffset(fromSubBeziers, toSubBeziers, fromCp, toCp) { + var bezierCount = (fromSubBeziers.length - 2) / 6; + var bestScore = Infinity; + var bestOffset = 0; + var len = fromSubBeziers.length; + var len2 = len - 2; + for (var offset = 0; offset < bezierCount; offset++) { + var cursorOffset = offset * 6; + var score = 0; + for (var k = 0; k < len; k += 2) { + var idx = k === 0 ? cursorOffset : ((cursorOffset + k - 2) % len2 + 2); + var x0 = fromSubBeziers[idx] - fromCp[0]; + var y0 = fromSubBeziers[idx + 1] - fromCp[1]; + var x1 = toSubBeziers[k] - toCp[0]; + var y1 = toSubBeziers[k + 1] - toCp[1]; + var dx = x1 - x0; + var dy = y1 - y0; + score += dx * dx + dy * dy; + } + if (score < bestScore) { + bestScore = score; + bestOffset = offset; + } + } + return bestOffset; + } + function reverse(array) { + var newArr = []; + var len = array.length; + for (var i = 0; i < len; i += 2) { + newArr[i] = array[len - i - 2]; + newArr[i + 1] = array[len - i - 1]; + } + return newArr; + } + function findBestMorphingRotation(fromArr, toArr, searchAngleIteration, searchAngleRange) { + var result = []; + var fromNeedsReverse; + for (var i = 0; i < fromArr.length; i++) { + var fromSubpathBezier = fromArr[i]; + var toSubpathBezier = toArr[i]; + var fromCp = centroid(fromSubpathBezier); + var toCp = centroid(toSubpathBezier); + if (fromNeedsReverse == null) { + fromNeedsReverse = fromCp[2] < 0 !== toCp[2] < 0; + } + var newFromSubpathBezier = []; + var newToSubpathBezier = []; + var bestAngle = 0; + var bestScore = Infinity; + var tmpArr_1 = []; + var len = fromSubpathBezier.length; + if (fromNeedsReverse) { + fromSubpathBezier = reverse(fromSubpathBezier); + } + var offset = findBestRingOffset(fromSubpathBezier, toSubpathBezier, fromCp, toCp) * 6; + var len2 = len - 2; + for (var k = 0; k < len2; k += 2) { + var idx = (offset + k) % len2 + 2; + newFromSubpathBezier[k + 2] = fromSubpathBezier[idx] - fromCp[0]; + newFromSubpathBezier[k + 3] = fromSubpathBezier[idx + 1] - fromCp[1]; + } + newFromSubpathBezier[0] = fromSubpathBezier[offset] - fromCp[0]; + newFromSubpathBezier[1] = fromSubpathBezier[offset + 1] - fromCp[1]; + if (searchAngleIteration > 0) { + var step = searchAngleRange / searchAngleIteration; + for (var angle = -searchAngleRange / 2; angle <= searchAngleRange / 2; angle += step) { + var sa = Math.sin(angle); + var ca = Math.cos(angle); + var score = 0; + for (var k = 0; k < fromSubpathBezier.length; k += 2) { + var x0 = newFromSubpathBezier[k]; + var y0 = newFromSubpathBezier[k + 1]; + var x1 = toSubpathBezier[k] - toCp[0]; + var y1 = toSubpathBezier[k + 1] - toCp[1]; + var newX1 = x1 * ca - y1 * sa; + var newY1 = x1 * sa + y1 * ca; + tmpArr_1[k] = newX1; + tmpArr_1[k + 1] = newY1; + var dx = newX1 - x0; + var dy = newY1 - y0; + score += dx * dx + dy * dy; + } + if (score < bestScore) { + bestScore = score; + bestAngle = angle; + for (var m = 0; m < tmpArr_1.length; m++) { + newToSubpathBezier[m] = tmpArr_1[m]; + } + } + } + } + else { + for (var i_1 = 0; i_1 < len; i_1 += 2) { + newToSubpathBezier[i_1] = toSubpathBezier[i_1] - toCp[0]; + newToSubpathBezier[i_1 + 1] = toSubpathBezier[i_1 + 1] - toCp[1]; + } + } + result.push({ + from: newFromSubpathBezier, + to: newToSubpathBezier, + fromCp: fromCp, + toCp: toCp, + rotation: -bestAngle + }); + } + return result; + } + function morphPath(fromPath, toPath, animationOpts) { + var fromPathProxy; + var toPathProxy; + if (!fromPath || !toPath) { + return toPath; + } + !fromPath.path && fromPath.createPathProxy(); + fromPathProxy = fromPath.path; + fromPathProxy.beginPath(); + fromPath.buildPath(fromPathProxy, fromPath.shape); + !toPath.path && toPath.createPathProxy(); + toPathProxy = toPath.path; + toPathProxy === fromPathProxy && (toPathProxy = new PathProxy(false)); + toPathProxy.beginPath(); + if (isIndividualMorphingPath(toPath)) { + toPath.__oldBuildPath(toPathProxy, toPath.shape); + } + else { + toPath.buildPath(toPathProxy, toPath.shape); + } + var _a = alignBezierCurves(pathToBezierCurves(fromPathProxy), pathToBezierCurves(toPathProxy)), fromBezierCurves = _a[0], toBezierCurves = _a[1]; + var morphingData = findBestMorphingRotation(fromBezierCurves, toBezierCurves, 10, Math.PI); + becomeIndividualMorphingPath(toPath, morphingData, 0); + var oldDone = animationOpts && animationOpts.done; + var oldAborted = animationOpts && animationOpts.aborted; + var oldDuring = animationOpts && animationOpts.during; + toPath.animateTo({ + __morphT: 1 + }, defaults({ + during: function (p) { + toPath.dirtyShape(); + oldDuring && oldDuring(p); + }, + done: function () { + restoreIndividualMorphingPath(toPath); + toPath.createPathProxy(); + toPath.dirtyShape(); + oldDone && oldDone(); + }, + aborted: function () { + oldAborted && oldAborted(); + } + }, animationOpts)); + return toPath; + } + function morphingPathBuildPath(path) { + var morphingData = this.__morphingData; + var t = this.__morphT; + var onet = 1 - t; + var newCp = []; + for (var i = 0; i < morphingData.length; i++) { + var item = morphingData[i]; + var from = item.from; + var to = item.to; + var angle = item.rotation * t; + var fromCp = item.fromCp; + var toCp = item.toCp; + var sa = Math.sin(angle); + var ca = Math.cos(angle); + lerp(newCp, fromCp, toCp, t); + for (var m = 0; m < from.length; m += 2) { + var x0 = from[m]; + var y0 = from[m + 1]; + var x1 = to[m]; + var y1 = to[m + 1]; + var x = x0 * onet + x1 * t; + var y = y0 * onet + y1 * t; + tmpArr$1[m] = (x * ca - y * sa) + newCp[0]; + tmpArr$1[m + 1] = (x * sa + y * ca) + newCp[1]; + } + for (var m = 0; m < from.length;) { + if (m === 0) { + path.moveTo(tmpArr$1[m++], tmpArr$1[m++]); + } + path.bezierCurveTo(tmpArr$1[m++], tmpArr$1[m++], tmpArr$1[m++], tmpArr$1[m++], tmpArr$1[m++], tmpArr$1[m++]); + } + } + } + function becomeIndividualMorphingPath(path, morphingData, morphT) { + if (isIndividualMorphingPath(path)) { + updateIndividualMorphingPath(path, morphingData, morphT); + return; + } + var morphingPath = path; + morphingPath.__oldBuildPath = morphingPath.buildPath; + morphingPath.buildPath = morphingPathBuildPath; + updateIndividualMorphingPath(morphingPath, morphingData, morphT); + } + function updateIndividualMorphingPath(morphingPath, morphingData, morphT) { + morphingPath.__morphingData = morphingData; + morphingPath.__morphT = morphT; + } + function restoreIndividualMorphingPath(path) { + if (isIndividualMorphingPath(path)) { + path.buildPath = path.__oldBuildPath; + path.__oldBuildPath = path.__morphingData = null; + } + } + function isIndividualMorphingPath(path) { + return path.__oldBuildPath != null; + } + function isCombiningPath(path) { + return !!path.__combiningSubList; + } + function isInAnyMorphing(path) { + return isIndividualMorphingPath(path) || isCombiningPath(path); + } + function combine(fromPathList, toPath, animationOpts, copyPropsIfDivided) { + var fromIndividuals = []; + var separateCount = 0; + for (var i = 0; i < fromPathList.length; i++) { + var fromPath = fromPathList[i]; + if (isCombiningPath(fromPath)) { + var fromCombiningSubList = fromPath.__combiningSubList; + for (var j = 0; j < fromCombiningSubList.length; j++) { + fromIndividuals.push(fromCombiningSubList[j]); + } + separateCount += fromCombiningSubList.length; + } + else { + fromIndividuals.push(fromPath); + separateCount++; + } + } + if (!separateCount) { + return; + } + var dividingMethod = animationOpts ? animationOpts.dividingMethod : null; + var toPathSplittedList = divideShape(toPath, separateCount, dividingMethod); + assert(toPathSplittedList.length === separateCount); + var oldDone = animationOpts && animationOpts.done; + var oldAborted = animationOpts && animationOpts.aborted; + var oldDuring = animationOpts && animationOpts.during; + var doneCount = 0; + var abortedCalled = false; + var morphAnimationOpts = defaults({ + during: function (p) { + oldDuring && oldDuring(p); + }, + done: function () { + doneCount++; + if (doneCount === toPathSplittedList.length) { + restoreCombiningPath(toPath); + oldDone && oldDone(); + } + }, + aborted: function () { + if (!abortedCalled) { + abortedCalled = true; + oldAborted && oldAborted(); + } + } + }, animationOpts); + for (var i = 0; i < separateCount; i++) { + var from = fromIndividuals[i]; + var to = toPathSplittedList[i]; + copyPropsIfDivided && copyPropsIfDivided(toPath, to, true); + morphPath(from, to, morphAnimationOpts); + } + becomeCombiningPath(toPath, toPathSplittedList); + return { + fromIndividuals: fromIndividuals, + toIndividuals: toPathSplittedList, + count: separateCount + }; + } + function becomeCombiningPath(path, combiningSubList) { + if (isCombiningPath(path)) { + updateCombiningPathSubList(path, combiningSubList); + return; + } + var combiningPath = path; + updateCombiningPathSubList(combiningPath, combiningSubList); + combiningPath.__oldAddSelfToZr = path.addSelfToZr; + combiningPath.__oldRemoveSelfFromZr = path.removeSelfFromZr; + combiningPath.addSelfToZr = combiningAddSelfToZr; + combiningPath.removeSelfFromZr = combiningRemoveSelfFromZr; + combiningPath.__oldBuildPath = combiningPath.buildPath; + combiningPath.buildPath = noop; + combiningPath.childrenRef = combiningChildrenRef; + } + function restoreCombiningPath(path) { + if (!isCombiningPath(path)) { + return; + } + var combiningPath = path; + updateCombiningPathSubList(combiningPath, null); + combiningPath.addSelfToZr = combiningPath.__oldAddSelfToZr; + combiningPath.removeSelfFromZr = combiningPath.__oldRemoveSelfFromZr; + combiningPath.buildPath = combiningPath.__oldBuildPath; + combiningPath.childrenRef = + combiningPath.__combiningSubList = + combiningPath.__oldAddSelfToZr = + combiningPath.__oldRemoveSelfFromZr = + combiningPath.__oldBuildPath = null; + } + function updateCombiningPathSubList(combiningPath, combiningSubList) { + if (combiningPath.__combiningSubList !== combiningSubList) { + combiningPathSubListAddRemoveWithZr(combiningPath, 'removeSelfFromZr'); + combiningPath.__combiningSubList = combiningSubList; + if (combiningSubList) { + for (var i = 0; i < combiningSubList.length; i++) { + combiningSubList[i].parent = combiningPath; + } + } + combiningPathSubListAddRemoveWithZr(combiningPath, 'addSelfToZr'); + } + } + function combiningAddSelfToZr(zr) { + this.__oldAddSelfToZr(zr); + combiningPathSubListAddRemoveWithZr(this, 'addSelfToZr'); + } + function combiningPathSubListAddRemoveWithZr(path, method) { + var combiningSubList = path.__combiningSubList; + var zr = path.__zr; + if (combiningSubList && zr) { + for (var i = 0; i < combiningSubList.length; i++) { + var child = combiningSubList[i]; + child[method](zr); + } + } + } + function combiningRemoveSelfFromZr(zr) { + this.__oldRemoveSelfFromZr(zr); + var combiningSubList = this.__combiningSubList; + for (var i = 0; i < combiningSubList.length; i++) { + var child = combiningSubList[i]; + child.removeSelfFromZr(zr); + } + } + function combiningChildrenRef() { + return this.__combiningSubList; + } + function separate(fromPath, toPathList, animationOpts, copyPropsIfDivided) { + var toPathListLen = toPathList.length; + var fromPathList; + var dividingMethod = animationOpts ? animationOpts.dividingMethod : null; + var copyProps = false; + if (isCombiningPath(fromPath)) { + var fromCombiningSubList = fromPath.__combiningSubList; + if (fromCombiningSubList.length === toPathListLen) { + fromPathList = fromCombiningSubList; + } + else { + fromPathList = divideShape(fromPath, toPathListLen, dividingMethod); + copyProps = true; + } + } + else { + fromPathList = divideShape(fromPath, toPathListLen, dividingMethod); + copyProps = true; + } + assert(fromPathList.length === toPathListLen); + for (var i = 0; i < toPathListLen; i++) { + if (copyProps && copyPropsIfDivided) { + copyPropsIfDivided(fromPath, fromPathList[i], false); + } + morphPath(fromPathList[i], toPathList[i], animationOpts); + } + return { + fromIndividuals: fromPathList, + toIndividuals: toPathList, + count: toPathListLen + }; + } + function divideShape(path, separateCount, dividingMethod) { + return dividingMethod === 'duplicate' + ? duplicateShape(path, separateCount) + : splitShape(path, separateCount); + } + function splitShape(path, separateCount) { + var resultPaths = []; + if (separateCount <= 0) { + return resultPaths; + } + if (separateCount === 1) { + return duplicateShape(path, separateCount); + } + if (path instanceof Rect) { + var toPathShape = path.shape; + var splitPropIdx = toPathShape.height > toPathShape.width ? 1 : 0; + var propWH = PROP_WH[splitPropIdx]; + var propXY = PROP_XY[splitPropIdx]; + var subWH = toPathShape[propWH] / separateCount; + var xyCurr = toPathShape[propXY]; + for (var i = 0; i < separateCount; i++, xyCurr += subWH) { + var subShape = { + x: toPathShape.x, + y: toPathShape.y, + width: toPathShape.width, + height: toPathShape.height + }; + subShape[propXY] = xyCurr; + subShape[propWH] = i < separateCount - 1 + ? subWH + : toPathShape[propXY] + toPathShape[propWH] - xyCurr; + var splitted = new Rect({ shape: subShape }); + resultPaths.push(splitted); + } + } + else if (path instanceof Sector) { + var toPathShape = path.shape; + var clockwise = toPathShape.clockwise; + var startAngle = toPathShape.startAngle; + var endAngle = toPathShape.endAngle; + var endAngleNormalized = normalizeRadian$1(startAngle, toPathShape.endAngle, clockwise); + var step = (endAngleNormalized - startAngle) / separateCount; + var angleCurr = startAngle; + for (var i = 0; i < separateCount; i++, angleCurr += step) { + var splitted = new Sector({ + shape: { + cx: toPathShape.cx, + cy: toPathShape.cy, + r: toPathShape.r, + r0: toPathShape.r0, + clockwise: clockwise, + startAngle: angleCurr, + endAngle: i === separateCount - 1 ? endAngle : angleCurr + step + } + }); + resultPaths.push(splitted); + } + } + else { + return duplicateShape(path, separateCount); + } + return resultPaths; + } + function duplicateShape(path, separateCount) { + var resultPaths = []; + if (separateCount <= 0) { + return resultPaths; + } + var ctor = path.constructor; + for (var i = 0; i < separateCount; i++) { + var sub = new ctor({ + shape: clone(path.shape) + }); + resultPaths.push(sub); + } + return resultPaths; + } + function normalizeRadian$1(start, end, clockwise) { + return end + PI2$a * (Math[clockwise ? 'ceil' : 'floor']((start - end) / PI2$a)); + } + + var inner$b = makeInner(); + var TRANSFORM_PROPS = { + x: 1, + y: 1, + scaleX: 1, + scaleY: 1, + originX: 1, + originY: 1, + rotation: 1 + }; + var transformPropNamesStr = keys(TRANSFORM_PROPS).join(', '); + // `visual('color') visual('borderColor')` is supported. + + var STYLE_VISUAL_TYPE = { + color: 'fill', + borderColor: 'stroke' + }; + var NON_STYLE_VISUAL_PROPS = { + symbol: 1, + symbolSize: 1, + symbolKeepAspect: 1, + legendSymbol: 1, + visualMeta: 1, + liftZ: 1, + decal: 1 + }; + var EMPHASIS = 'emphasis'; + var NORMAL = 'normal'; + var BLUR = 'blur'; + var SELECT = 'select'; + var STATES = [NORMAL, EMPHASIS, BLUR, SELECT]; + var PATH_ITEM_STYLE = { + normal: ['itemStyle'], + emphasis: [EMPHASIS, 'itemStyle'], + blur: [BLUR, 'itemStyle'], + select: [SELECT, 'itemStyle'] + }; + var PATH_LABEL = { + normal: ['label'], + emphasis: [EMPHASIS, 'label'], + blur: [BLUR, 'label'], + select: [SELECT, 'label'] + }; // Use prefix to avoid index to be the same as el.name, + // which will cause weird update animation. + + var GROUP_DIFF_PREFIX = 'e\0\0'; + var attachedTxInfoTmp = { + normal: {}, + emphasis: {}, + blur: {}, + select: {} + }; + var LEGACY_TRANSFORM_PROPS = { + position: ['x', 'y'], + scale: ['scaleX', 'scaleY'], + origin: ['originX', 'originY'] + }; + var tmpTransformable = new Transformable(); + /** + * To reduce total package size of each coordinate systems, the modules `prepareCustom` + * of each coordinate systems are not required by each coordinate systems directly, but + * required by the module `custom`. + * + * prepareInfoForCustomSeries {Function}: optional + * @return {Object} {coordSys: {...}, api: { + * coord: function (data, clamp) {}, // return point in global. + * size: function (dataSize, dataItem) {} // return size of each axis in coordSys. + * }} + */ + + var prepareCustoms = { + cartesian2d: cartesianPrepareCustom, + geo: geoPrepareCustom, + singleAxis: singlePrepareCustom, + polar: polarPrepareCustom, + calendar: calendarPrepareCustom + }; + + var CustomSeriesModel = + /** @class */ + function (_super) { + __extends(CustomSeriesModel, _super); + + function CustomSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CustomSeriesModel.type; + return _this; + } + + CustomSeriesModel.prototype.optionUpdated = function () { + this.currentZLevel = this.get('zlevel', true); + this.currentZ = this.get('z', true); + }; + + CustomSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createListFromArray(this.getSource(), this); + }; + + CustomSeriesModel.prototype.getDataParams = function (dataIndex, dataType, el) { + var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); + + el && (params.info = inner$b(el).info); + return params; + }; + + CustomSeriesModel.type = 'series.custom'; + CustomSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + CustomSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + zlevel: 0, + z: 2, + legendHoverLink: true, + // Custom series will not clip by default. + // Some case will use custom series to draw label + // For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight + clip: false // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Polar coordinate system + // polarIndex: 0, + // Geo coordinate system + // geoIndex: 0, + + }; + return CustomSeriesModel; + }(SeriesModel); + + var CustomSeriesView = + /** @class */ + function (_super) { + __extends(CustomSeriesView, _super); + + function CustomSeriesView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CustomSeriesView.type; + return _this; + } + + CustomSeriesView.prototype.render = function (customSeries, ecModel, api, payload) { + var oldData = this._data; + var data = customSeries.getData(); + var group = this.group; + var renderItem = makeRenderItem(customSeries, data, ecModel, api); // By default, merge mode is applied. In most cases, custom series is + // used in the scenario that data amount is not large but graphic elements + // is complicated, where merge mode is probably necessary for optimization. + // For example, reuse graphic elements and only update the transform when + // roam or data zoom according to `actionType`. + + var transOpt = customSeries.__transientTransitionOpt; // Enable user to disable transition animation by both set + // `from` and `to` dimension as `null`/`undefined`. + + if (transOpt && (transOpt.from == null || transOpt.to == null)) { + oldData && oldData.each(function (oldIdx) { + doRemoveEl(oldData.getItemGraphicEl(oldIdx), customSeries, group); + }); + data.each(function (newIdx) { + createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data, null); + }); + } else { + var morphPreparation_1 = new MorphPreparation(customSeries, transOpt); + var diffMode = transOpt ? 'multiple' : 'oneToOne'; + new DataDiffer(oldData ? oldData.getIndices() : [], data.getIndices(), createGetKey(oldData, diffMode, transOpt && transOpt.from), createGetKey(data, diffMode, transOpt && transOpt.to), null, diffMode).add(function (newIdx) { + createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data, null); + }).remove(function (oldIdx) { + doRemoveEl(oldData.getItemGraphicEl(oldIdx), customSeries, group); + }).update(function (newIdx, oldIdx) { + morphPreparation_1.reset('oneToOne'); + var oldEl = oldData.getItemGraphicEl(oldIdx); + morphPreparation_1.findAndAddFrom(oldEl); // PENDING: + // if may morph, currently we alway recreate the whole el. + // because if reuse some of the el in the group tree, the old el has to + // be removed from the group, and consequently we can not calculate + // the "global transition" of the old element. + // But is there performance issue? + + if (morphPreparation_1.hasFrom()) { + removeElementDirectly(oldEl, group); + oldEl = null; + } + + createOrUpdateItem(api, oldEl, newIdx, renderItem(newIdx, payload), customSeries, group, data, morphPreparation_1); + morphPreparation_1.applyMorphing(); + }).updateManyToOne(function (newIdx, oldIndices) { + morphPreparation_1.reset('manyToOne'); + + for (var i = 0; i < oldIndices.length; i++) { + var oldEl = oldData.getItemGraphicEl(oldIndices[i]); + morphPreparation_1.findAndAddFrom(oldEl); + removeElementDirectly(oldEl, group); + } + + createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data, morphPreparation_1); + morphPreparation_1.applyMorphing(); + }).updateOneToMany(function (newIndices, oldIdx) { + morphPreparation_1.reset('oneToMany'); + var newLen = newIndices.length; + var oldEl = oldData.getItemGraphicEl(oldIdx); + morphPreparation_1.findAndAddFrom(oldEl); + removeElementDirectly(oldEl, group); + + for (var i = 0; i < newLen; i++) { + createOrUpdateItem(api, null, newIndices[i], renderItem(newIndices[i], payload), customSeries, group, data, morphPreparation_1); + } + + morphPreparation_1.applyMorphing(); + }).execute(); + } // Do clipping + + + var clipPath = customSeries.get('clip', true) ? createClipPath(customSeries.coordinateSystem, false, customSeries) : null; + + if (clipPath) { + group.setClipPath(clipPath); + } else { + group.removeClipPath(); + } + + this._data = data; + }; + + CustomSeriesView.prototype.incrementalPrepareRender = function (customSeries, ecModel, api) { + this.group.removeAll(); + this._data = null; + }; + + CustomSeriesView.prototype.incrementalRender = function (params, customSeries, ecModel, api, payload) { + var data = customSeries.getData(); + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + + function setIncrementalAndHoverLayer(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = params.start; idx < params.end; idx++) { + var el = createOrUpdateItem(null, null, idx, renderItem(idx, payload), customSeries, this.group, data, null); + el.traverse(setIncrementalAndHoverLayer); + } + }; + + CustomSeriesView.prototype.filterForExposedEvent = function (eventType, query, targetEl, packedEvent) { + var elementName = query.element; + + if (elementName == null || targetEl.name === elementName) { + return true; + } // Enable to give a name on a group made by `renderItem`, and listen + // events that triggerd by its descendents. + + + while ((targetEl = targetEl.__hostTarget || targetEl.parent) && targetEl !== this.group) { + if (targetEl.name === elementName) { + return true; + } + } + + return false; + }; + + CustomSeriesView.type = 'custom'; + return CustomSeriesView; + }(ChartView); + + function createGetKey(data, diffMode, dimension) { + if (!data) { + return; + } + + if (diffMode === 'oneToOne') { + return function (rawIdx, dataIndex) { + return data.getId(dataIndex); + }; + } + + var diffByDimName = data.getDimension(dimension); + var dimInfo = data.getDimensionInfo(diffByDimName); + + if (!dimInfo) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = dimension + " is not a valid dimension."; + } + + throwError(errMsg); + } + + var ordinalMeta = dimInfo.ordinalMeta; + return function (rawIdx, dataIndex) { + var key = data.get(diffByDimName, dataIndex); + + if (ordinalMeta) { + key = ordinalMeta.categories[key]; + } + + return key == null || eqNaN(key) ? rawIdx + '' : '_ec_' + key; + }; + } + + function createEl(elOption) { + var graphicType = elOption.type; + var el; // Those graphic elements are not shapes. They should not be + // overwritten by users, so do them first. + + if (graphicType === 'path') { + var shape = elOption.shape; // Using pathRect brings convenience to users sacle svg path. + + var pathRect = shape.width != null && shape.height != null ? { + x: shape.x || 0, + y: shape.y || 0, + width: shape.width, + height: shape.height + } : null; + var pathData = getPathData(shape); // Path is also used for icon, so layout 'center' by default. + + el = makePath(pathData, null, pathRect, shape.layout || 'center'); + inner$b(el).customPathData = pathData; + } else if (graphicType === 'image') { + el = new ZRImage({}); + inner$b(el).customImagePath = elOption.style.image; + } else if (graphicType === 'text') { + el = new ZRText({}); // inner(el).customText = (elOption.style as TextStyleProps).text; + } else if (graphicType === 'group') { + el = new Group(); + } else if (graphicType === 'compoundPath') { + throw new Error('"compoundPath" is not supported yet.'); + } else { + var Clz = getShapeClass(graphicType); + + if (!Clz) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = 'graphic type "' + graphicType + '" can not be found.'; + } + + throwError(errMsg); + } + + el = new Clz(); + } + + inner$b(el).customGraphicType = graphicType; + el.name = elOption.name; // Compat ec4: the default z2 lift is 1. If changing the number, + // some cases probably be broken: hierarchy layout along z, like circle packing, + // where emphasis only intending to modify color/border rather than lift z2. + + el.z2EmphasisLift = 1; + el.z2SelectLift = 1; + return el; + } + /** + * ---------------------------------------------------------- + * [STRATEGY_MERGE] Merge properties or erase all properties: + * + * Based on the fact that the existing zr element probably be reused, we now consider whether + * merge or erase all properties to the exsiting elements. + * That is, if a certain props is not specified in the lastest return of `renderItem`: + * + "Merge" means that do not modify the value on the existing element. + * + "Erase all" means that use a default value to the existing element. + * + * "Merge" might bring some unexpected state retaining for users and "erase all" seams to be + * more safe. "erase all" force users to specify all of the props each time, which is recommanded + * in most cases. + * But "erase all" theoretically disables the chance of performance optimization (e.g., just + * generete shape and style at the first time rather than always do that). + * So we still use "merge" rather than "erase all". If users need "erase all", they can + * simple always set all of the props each time. + * Some "object-like" config like `textConfig`, `textContent`, `style` which are not needed for + * every elment, so we replace them only when user specify them. And the that is a total replace. + * + * TODO: there is no hint of 'isFirst' to users. So the performance enhancement can not be + * performed yet. Consider the case: + * (1) setOption to "mergeChildren" with a smaller children count + * (2) Use dataZoom to make an item disappear. + * (3) User dataZoom to make the item display again. At that time, renderItem need to return the + * full option rather than partial option to recreate the element. + * + * ---------------------------------------------- + * [STRATEGY_NULL] `hasOwnProperty` or `== null`: + * + * Ditinguishing "own property" probably bring little trouble to user when make el options. + * So we trade a {xx: null} or {xx: undefined} as "not specified" if possible rather than + * "set them to null/undefined". In most cases, props can not be cleared. Some typicall + * clearable props like `style`/`textConfig`/`textContent` we enable `false` to means + * "clear". In some othere special cases that the prop is able to set as null/undefined, + * but not suitable to use `false`, `hasOwnProperty` is checked. + * + * --------------------------------------------- + * [STRATEGY_TRANSITION] The rule of transition: + * + For props on the root level of a element: + * If there is no `transition` specified, tansform props will be transitioned by default, + * which is the same as the previous setting in echarts4 and suitable for the scenario + * of dataZoom change. + * If `transition` specified, only the specified props will be transitioned. + * + For props in `shape` and `style`: + * Only props specified in `transition` will be transitioned. + * + Break: + * Since ec5, do not make transition to shape by default, because it might result in + * performance issue (especially `points` of polygon) and do not necessary in most cases. + * + * @return if `isMorphTo`, return `allPropsFinal`. + */ + + + function updateElNormal( // Can be null/undefined + api, el, // Whether be a morph target. + isMorphTo, dataIndex, elOption, styleOpt, attachedTxInfo, seriesModel, isInit, isTextContent) { + var transFromProps = {}; + var allPropsFinal = {}; + var elDisplayable = el.isGroup ? null : el; // If be "morph to", delay the `updateElNormal` when all of the els in + // this data item processed. Because at that time we can get all of the + // "morph from" and make correct separate/combine. + + !isMorphTo && prepareShapeOrExtraTransitionFrom('shape', el, null, elOption, transFromProps, isInit); + prepareShapeOrExtraAllPropsFinal('shape', elOption, allPropsFinal); + !isMorphTo && prepareShapeOrExtraTransitionFrom('extra', el, null, elOption, transFromProps, isInit); + prepareShapeOrExtraAllPropsFinal('extra', elOption, allPropsFinal); + !isMorphTo && prepareTransformTransitionFrom(el, null, elOption, transFromProps, isInit); + prepareTransformAllPropsFinal(elOption, allPropsFinal); + var txCfgOpt = attachedTxInfo && attachedTxInfo.normal.cfg; + + if (txCfgOpt) { + // PENDING: whether use user object directly rather than clone? + // TODO:5.0 textConfig transition animation? + el.setTextConfig(txCfgOpt); + } + + if (el.type === 'text' && styleOpt) { + var textOptionStyle = styleOpt; // Compatible with ec4: if `textFill` or `textStroke` exists use them. + + hasOwn(textOptionStyle, 'textFill') && (textOptionStyle.fill = textOptionStyle.textFill); + hasOwn(textOptionStyle, 'textStroke') && (textOptionStyle.stroke = textOptionStyle.textStroke); + } + + if (styleOpt) { + var decalPattern = void 0; + var decalObj = isPath$1(el) ? styleOpt.decal : null; + + if (api && decalObj) { + decalObj.dirty = true; + decalPattern = createOrUpdatePatternFromDecal(decalObj, api); + } // Always overwrite in case user specify this prop. + + + styleOpt.__decalPattern = decalPattern; + } + + !isMorphTo && prepareStyleTransitionFrom(el, null, elOption, styleOpt, transFromProps, isInit); + + if (elDisplayable) { + hasOwn(elOption, 'invisible') && (elDisplayable.invisible = elOption.invisible); + } // If `isMorphTo`, we should not update these props to el directly, otherwise, + // when applying morph finally, the original prop are missing for making "animation from". + + + if (!isMorphTo) { + applyPropsFinal(el, allPropsFinal, styleOpt); + applyTransitionFrom(el, dataIndex, elOption, seriesModel, transFromProps, isInit); + } // Merge by default. + + + hasOwn(elOption, 'silent') && (el.silent = elOption.silent); + hasOwn(elOption, 'ignore') && (el.ignore = elOption.ignore); + + if (!isTextContent) { + // `elOption.info` enables user to mount some info on + // elements and use them in event handlers. + // Update them only when user specified, otherwise, remain. + hasOwn(elOption, 'info') && (inner$b(el).info = elOption.info); + } + + styleOpt ? el.dirty() : el.markRedraw(); + return isMorphTo ? allPropsFinal : null; + } + + function applyPropsFinal(el, // Can be null/undefined + allPropsFinal, styleOpt) { + var elDisplayable = el.isGroup ? null : el; + + if (elDisplayable && styleOpt) { + var decalPattern = styleOpt.__decalPattern; + var originalDecalObj = void 0; + + if (decalPattern) { + originalDecalObj = styleOpt.decal; + styleOpt.decal = decalPattern; + } // PENDING: here the input style object is used directly. + // Good for performance but bad for compatibility control. + + + elDisplayable.useStyle(styleOpt); + + if (decalPattern) { + styleOpt.decal = originalDecalObj; + } // When style object changed, how to trade the existing animation? + // It is probably conplicated and not needed to cover all the cases. + // But still need consider the case: + // (1) When using init animation on `style.opacity`, and before the animation + // ended users triggers an update by mousewhell. At that time the init + // animation should better be continued rather than terminated. + // So after `useStyle` called, we should change the animation target manually + // to continue the effect of the init animation. + // (2) PENDING: If the previous animation targeted at a `val1`, and currently we need + // to update the value to `val2` and no animation declared, should be terminate + // the previous animation or just modify the target of the animation? + // Therotically That will happen not only on `style` but also on `shape` and + // `transfrom` props. But we haven't handle this case at present yet. + // (3) PENDING: Is it proper to visit `animators` and `targetName`? + + + var animators = elDisplayable.animators; + + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; // targetName is the "topKey". + + if (animator.targetName === 'style') { + animator.changeTarget(elDisplayable.style); + } + } + } // Set el to the final state firstly. + + + allPropsFinal && el.attr(allPropsFinal); + } + + function applyTransitionFrom(el, dataIndex, elOption, seriesModel, // Can be null/undefined + transFromProps, isInit) { + if (transFromProps) { + // Do not use `el.updateDuringAnimation` here becuase `el.updateDuringAnimation` will + // be called mutiple time in each animation frame. For example, if both "transform" props + // and shape props and style props changed, it will generate three animator and called + // one-by-one in each animation frame. + // We use the during in `animateTo/From` params. + var userDuring = elOption.during; // For simplicity, if during not specified, the previous during will not work any more. + + inner$b(el).userDuring = userDuring; + var cfgDuringCall = userDuring ? bind(duringCall, { + el: el, + userDuring: userDuring + }) : null; + var cfg = { + dataIndex: dataIndex, + isFrom: true, + during: cfgDuringCall + }; + isInit ? initProps(el, transFromProps, seriesModel, cfg) : updateProps(el, transFromProps, seriesModel, cfg); + } + } // See [STRATEGY_TRANSITION] + + + function prepareShapeOrExtraTransitionFrom(mainAttr, el, morphFromEl, elOption, transFromProps, isInit) { + var attrOpt = elOption[mainAttr]; + + if (!attrOpt) { + return; + } + + var elPropsInAttr = el[mainAttr]; + var transFromPropsInAttr; + var enterFrom = attrOpt.enterFrom; + + if (isInit && enterFrom) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + var enterFromKeys = keys(enterFrom); + + for (var i = 0; i < enterFromKeys.length; i++) { + // `enterFrom` props are not necessarily also declared in `shape`/`style`/..., + // for example, `opacity` can only declared in `enterFrom` but not in `style`. + var key = enterFromKeys[i]; // Do not clone, animator will perform that clone. + + transFromPropsInAttr[key] = enterFrom[key]; + } + } + + if (!isInit && elPropsInAttr // Just ignore shape animation in morphing. + && !(morphFromEl != null && mainAttr === 'shape')) { + if (attrOpt.transition) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + var transitionKeys = normalizeToArray(attrOpt.transition); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + var elVal = elPropsInAttr[key]; + + if ("development" !== 'production') { + checkNonStyleTansitionRefer(key, attrOpt[key], elVal); + } // Do not clone, see `checkNonStyleTansitionRefer`. + + + transFromPropsInAttr[key] = elVal; + } + } else if (indexOf(elOption.transition, mainAttr) >= 0) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + var elPropsInAttrKeys = keys(elPropsInAttr); + + for (var i = 0; i < elPropsInAttrKeys.length; i++) { + var key = elPropsInAttrKeys[i]; + var elVal = elPropsInAttr[key]; + + if (isNonStyleTransitionEnabled(attrOpt[key], elVal)) { + transFromPropsInAttr[key] = elVal; + } + } + } + } + + var leaveTo = attrOpt.leaveTo; + + if (leaveTo) { + var leaveToProps = getOrCreateLeaveToPropsFromEl(el); + var leaveToPropsInAttr = leaveToProps[mainAttr] || (leaveToProps[mainAttr] = {}); + var leaveToKeys = keys(leaveTo); + + for (var i = 0; i < leaveToKeys.length; i++) { + var key = leaveToKeys[i]; + leaveToPropsInAttr[key] = leaveTo[key]; + } + } + } + + function prepareShapeOrExtraAllPropsFinal(mainAttr, elOption, allProps) { + var attrOpt = elOption[mainAttr]; + + if (!attrOpt) { + return; + } + + var allPropsInAttr = allProps[mainAttr] = {}; + var keysInAttr = keys(attrOpt); + + for (var i = 0; i < keysInAttr.length; i++) { + var key = keysInAttr[i]; // To avoid share one object with different element, and + // to avoid user modify the object inexpectedly, have to clone. + + allPropsInAttr[key] = cloneValue(attrOpt[key]); + } + } // See [STRATEGY_TRANSITION]. + + + function prepareTransformTransitionFrom(el, morphFromEl, elOption, transFromProps, isInit) { + var enterFrom = elOption.enterFrom; + + if (isInit && enterFrom) { + var enterFromKeys = keys(enterFrom); + + for (var i = 0; i < enterFromKeys.length; i++) { + var key = enterFromKeys[i]; + + if ("development" !== 'production') { + checkTransformPropRefer(key, 'el.enterFrom'); + } // Do not clone, animator will perform that clone. + + + transFromProps[key] = enterFrom[key]; + } + } + + if (!isInit) { + // If morphing, force transition all transform props. + // otherwise might have incorrect morphing animation. + if (morphFromEl) { + var fromTransformable = calcOldElLocalTransformBasedOnNewElParent(morphFromEl, el); + setTransformPropToTransitionFrom(transFromProps, 'x', fromTransformable); + setTransformPropToTransitionFrom(transFromProps, 'y', fromTransformable); + setTransformPropToTransitionFrom(transFromProps, 'scaleX', fromTransformable); + setTransformPropToTransitionFrom(transFromProps, 'scaleY', fromTransformable); + setTransformPropToTransitionFrom(transFromProps, 'originX', fromTransformable); + setTransformPropToTransitionFrom(transFromProps, 'originY', fromTransformable); + setTransformPropToTransitionFrom(transFromProps, 'rotation', fromTransformable); + } else if (elOption.transition) { + var transitionKeys = normalizeToArray(elOption.transition); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + + if (key === 'style' || key === 'shape' || key === 'extra') { + continue; + } + + var elVal = el[key]; + + if ("development" !== 'production') { + checkTransformPropRefer(key, 'el.transition'); + checkNonStyleTansitionRefer(key, elOption[key], elVal); + } // Do not clone, see `checkNonStyleTansitionRefer`. + + + transFromProps[key] = elVal; + } + } // This default transition see [STRATEGY_TRANSITION] + else { + setTransformPropToTransitionFrom(transFromProps, 'x', el); + setTransformPropToTransitionFrom(transFromProps, 'y', el); + } + } + + var leaveTo = elOption.leaveTo; + + if (leaveTo) { + var leaveToProps = getOrCreateLeaveToPropsFromEl(el); + var leaveToKeys = keys(leaveTo); + + for (var i = 0; i < leaveToKeys.length; i++) { + var key = leaveToKeys[i]; + + if ("development" !== 'production') { + checkTransformPropRefer(key, 'el.leaveTo'); + } + + leaveToProps[key] = leaveTo[key]; + } + } + } + + function prepareTransformAllPropsFinal(elOption, allProps) { + setLagecyTransformProp(elOption, allProps, 'position'); + setLagecyTransformProp(elOption, allProps, 'scale'); + setLagecyTransformProp(elOption, allProps, 'origin'); + setTransformProp(elOption, allProps, 'x'); + setTransformProp(elOption, allProps, 'y'); + setTransformProp(elOption, allProps, 'scaleX'); + setTransformProp(elOption, allProps, 'scaleY'); + setTransformProp(elOption, allProps, 'originX'); + setTransformProp(elOption, allProps, 'originY'); + setTransformProp(elOption, allProps, 'rotation'); + } // See [STRATEGY_TRANSITION]. + + + function prepareStyleTransitionFrom(el, morphFromEl, elOption, styleOpt, transFromProps, isInit) { + if (!styleOpt) { + return; + } // At present in "many-to-one"/"one-to-many" case, to not support "many" have + // different styles and make style transitions. That might be a rare case. + + + var fromEl = morphFromEl || el; + var fromElStyle = fromEl.style; + var transFromStyleProps; + var enterFrom = styleOpt.enterFrom; + + if (isInit && enterFrom) { + var enterFromKeys = keys(enterFrom); + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + + for (var i = 0; i < enterFromKeys.length; i++) { + var key = enterFromKeys[i]; // Do not clone, animator will perform that clone. + + transFromStyleProps[key] = enterFrom[key]; + } + } + + if (!isInit && fromElStyle) { + if (styleOpt.transition) { + var transitionKeys = normalizeToArray(styleOpt.transition); + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + var elVal = fromElStyle[key]; // Do not clone, see `checkNonStyleTansitionRefer`. + + transFromStyleProps[key] = elVal; + } + } else if (el.getAnimationStyleProps && indexOf(elOption.transition, 'style') >= 0) { + var animationProps = el.getAnimationStyleProps(); + var animationStyleProps = animationProps ? animationProps.style : null; + + if (animationStyleProps) { + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + var styleKeys = keys(styleOpt); + + for (var i = 0; i < styleKeys.length; i++) { + var key = styleKeys[i]; + + if (animationStyleProps[key]) { + var elVal = fromElStyle[key]; + transFromStyleProps[key] = elVal; + } + } + } + } + } + + var leaveTo = styleOpt.leaveTo; + + if (leaveTo) { + var leaveToKeys = keys(leaveTo); + var leaveToProps = getOrCreateLeaveToPropsFromEl(el); + var leaveToStyleProps = leaveToProps.style || (leaveToProps.style = {}); + + for (var i = 0; i < leaveToKeys.length; i++) { + var key = leaveToKeys[i]; + leaveToStyleProps[key] = leaveTo[key]; + } + } + } + /** + * If make "transform"(x/y/scaleX/scaleY/orient/originX/originY) transition between + * two path elements that have different hierarchy, before we retrieve the "from" props, + * we have to calculate the local transition of the "oldPath" based on the parent of + * the "newPath". + * At present, the case only happend in "morphing". Without morphing, the transform + * transition are all between elements in the same hierarchy, where this kind of process + * is not needed. + * + * [CAVEAT]: + * This method makes sense only if: (very tricky) + * (1) "newEl" has been added to its final parent. + * (2) Local transform props of "newPath.parent" are not at their final value but already + * have been at the "from value". + * This is currently ensured by: + * (2.1) "graphicUtil.animationFrom", which will set the element to the "from value" + * immediately. + * (2.2) "morph" option is not allowed to be set on Group, so all of the groups have + * been finished their "updateElNormal" when calling this method in morphing process. + */ + + + function calcOldElLocalTransformBasedOnNewElParent(oldEl, newEl) { + if (!oldEl || oldEl === newEl || oldEl.parent === newEl.parent) { + return oldEl; + } // Not sure oldEl is rendered (may have "lazyUpdate"), + // so always call `getComputedTransform`. + + + var tmpM = tmpTransformable.transform || (tmpTransformable.transform = identity([])); + var oldGlobalTransform = oldEl.getComputedTransform(); + oldGlobalTransform ? copy$1(tmpM, oldGlobalTransform) : identity(tmpM); + var newParent = newEl.parent; + + if (newParent) { + newParent.getComputedTransform(); + } + + tmpTransformable.originX = oldEl.originX; + tmpTransformable.originY = oldEl.originY; + tmpTransformable.parent = newParent; + tmpTransformable.decomposeTransform(); + return tmpTransformable; + } + + var checkNonStyleTansitionRefer; + + if ("development" !== 'production') { + checkNonStyleTansitionRefer = function (propName, optVal, elVal) { + if (!isArrayLike(optVal)) { + assert(optVal != null && isFinite(optVal), 'Prop `' + propName + '` must refer to a finite number or ArrayLike for transition.'); + } else { + // Try not to copy array for performance, but if user use the same object in different + // call of `renderItem`, it will casue animation transition fail. + assert(optVal !== elVal, 'Prop `' + propName + '` must use different Array object each time for transition.'); + } + }; + } + + function isNonStyleTransitionEnabled(optVal, elVal) { + // The same as `checkNonStyleTansitionRefer`. + return !isArrayLike(optVal) ? optVal != null && isFinite(optVal) : optVal !== elVal; + } + + var checkTransformPropRefer; + + if ("development" !== 'production') { + checkTransformPropRefer = function (key, usedIn) { + assert(hasOwn(TRANSFORM_PROPS, key), 'Prop `' + key + '` is not a permitted in `' + usedIn + '`. ' + 'Only `' + keys(TRANSFORM_PROPS).join('`, `') + '` are permitted.'); + }; + } + + function getOrCreateLeaveToPropsFromEl(el) { + var innerEl = inner$b(el); + return innerEl.leaveToProps || (innerEl.leaveToProps = {}); + } // Use it to avoid it be exposed to user. + + + var tmpDuringScope = {}; + var customDuringAPI = { + // Usually other props do not need to be changed in animation during. + setTransform: function (key, val) { + if ("development" !== 'production') { + assert(hasOwn(TRANSFORM_PROPS, key), 'Only ' + transformPropNamesStr + ' available in `setTransform`.'); + } + + tmpDuringScope.el[key] = val; + return this; + }, + getTransform: function (key) { + if ("development" !== 'production') { + assert(hasOwn(TRANSFORM_PROPS, key), 'Only ' + transformPropNamesStr + ' available in `getTransform`.'); + } + + return tmpDuringScope.el[key]; + }, + setShape: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var shape = tmpDuringScope.el.shape || (tmpDuringScope.el.shape = {}); + shape[key] = val; + tmpDuringScope.isShapeDirty = true; + return this; + }, + getShape: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var shape = tmpDuringScope.el.shape; + + if (shape) { + return shape[key]; + } + }, + setStyle: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var style = tmpDuringScope.el.style; + + if (style) { + if ("development" !== 'production') { + if (eqNaN(val)) { + warn('style.' + key + ' must not be assigned with NaN.'); + } + } + + style[key] = val; + tmpDuringScope.isStyleDirty = true; + } + + return this; + }, + getStyle: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var style = tmpDuringScope.el.style; + + if (style) { + return style[key]; + } + }, + setExtra: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var extra = tmpDuringScope.el.extra || (tmpDuringScope.el.extra = {}); + extra[key] = val; + return this; + }, + getExtra: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var extra = tmpDuringScope.el.extra; + + if (extra) { + return extra[key]; + } + } + }; + + function assertNotReserved(key) { + if ("development" !== 'production') { + if (key === 'transition' || key === 'enterFrom' || key === 'leaveTo') { + throw new Error('key must not be "' + key + '"'); + } + } + } + + function duringCall() { + // Do not provide "percent" until some requirements come. + // Because consider thies case: + // enterFrom: {x: 100, y: 30}, transition: 'x'. + // And enter duration is different from update duration. + // Thus it might be confused about the meaning of "percent" in during callback. + var scope = this; + var el = scope.el; + + if (!el) { + return; + } // If el is remove from zr by reason like legend, during still need to called, + // becuase el will be added back to zr and the prop value should not be incorrect. + + + var newstUserDuring = inner$b(el).userDuring; + var scopeUserDuring = scope.userDuring; // Ensured a during is only called once in each animation frame. + // If a during is called multiple times in one frame, maybe some users' calulation logic + // might be wrong (not sure whether this usage exists). + // The case of a during might be called twice can be: by default there is a animator for + // 'x', 'y' when init. Before the init animation finished, call `setOption` to start + // another animators for 'style'/'shape'/'extra'. + + if (newstUserDuring !== scopeUserDuring) { + // release + scope.el = scope.userDuring = null; + return; + } + + tmpDuringScope.el = el; + tmpDuringScope.isShapeDirty = false; + tmpDuringScope.isStyleDirty = false; // Give no `this` to user in "during" calling. + + scopeUserDuring(customDuringAPI); + + if (tmpDuringScope.isShapeDirty && el.dirtyShape) { + el.dirtyShape(); + } + + if (tmpDuringScope.isStyleDirty && el.dirtyStyle) { + el.dirtyStyle(); + } // markRedraw() will be called by default in during. + // FIXME `this.markRedraw();` directly ? + // FIXME: if in future meet the case that some prop will be both modified in `during` and `state`, + // consider the issue that the prop might be incorrect when return to "normal" state. + + } + + function updateElOnState(state, el, elStateOpt, styleOpt, attachedTxInfo, isRoot, isTextContent) { + var elDisplayable = el.isGroup ? null : el; + var txCfgOpt = attachedTxInfo && attachedTxInfo[state].cfg; // PENDING:5.0 support customize scale change and transition animation? + + if (elDisplayable) { + // By default support auto lift color when hover whether `emphasis` specified. + var stateObj = elDisplayable.ensureState(state); + + if (styleOpt === false) { + var existingEmphasisState = elDisplayable.getState(state); + + if (existingEmphasisState) { + existingEmphasisState.style = null; + } + } else { + // style is needed to enable defaut emphasis. + stateObj.style = styleOpt || null; + } // If `elOption.styleEmphasis` or `elOption.emphasis.style` is `false`, + // remove hover style. + // If `elOption.textConfig` or `elOption.emphasis.textConfig` is null/undefined, it does not + // make sense. So for simplicity, we do not ditinguish `hasOwnProperty` and null/undefined. + + + if (txCfgOpt) { + stateObj.textConfig = txCfgOpt; + } + + setDefaultStateProxy(elDisplayable); + } + } + + function updateZ$1(el, elOption, seriesModel, attachedTxInfo) { + // Group not support textContent and not support z yet. + if (el.isGroup) { + return; + } + + var elDisplayable = el; + var currentZ = seriesModel.currentZ; + var currentZLevel = seriesModel.currentZLevel; // Always erase. + + elDisplayable.z = currentZ; + elDisplayable.zlevel = currentZLevel; // z2 must not be null/undefined, otherwise sort error may occur. + + var optZ2 = elOption.z2; + optZ2 != null && (elDisplayable.z2 = optZ2 || 0); + + for (var i = 0; i < STATES.length; i++) { + updateZForEachState(elDisplayable, elOption, STATES[i]); + } + } + + function updateZForEachState(elDisplayable, elOption, state) { + var isNormal = state === NORMAL; + var elStateOpt = isNormal ? elOption : retrieveStateOption(elOption, state); + var optZ2 = elStateOpt ? elStateOpt.z2 : null; + var stateObj; + + if (optZ2 != null) { + // Do not `ensureState` until required. + stateObj = isNormal ? elDisplayable : elDisplayable.ensureState(state); + stateObj.z2 = optZ2 || 0; + } + } + + function setLagecyTransformProp(elOption, targetProps, legacyName, fromTransformable // If provided, retrieve from the element. + ) { + var legacyArr = elOption[legacyName]; + var xyName = LEGACY_TRANSFORM_PROPS[legacyName]; + + if (legacyArr) { + if (fromTransformable) { + targetProps[xyName[0]] = fromTransformable[xyName[0]]; + targetProps[xyName[1]] = fromTransformable[xyName[1]]; + } else { + targetProps[xyName[0]] = legacyArr[0]; + targetProps[xyName[1]] = legacyArr[1]; + } + } + } + + function setTransformProp(elOption, allProps, name, fromTransformable // If provided, retrieve from the element. + ) { + if (elOption[name] != null) { + allProps[name] = fromTransformable ? fromTransformable[name] : elOption[name]; + } + } + + function setTransformPropToTransitionFrom(transitionFrom, name, fromTransformable // If provided, retrieve from the element. + ) { + if (fromTransformable) { + transitionFrom[name] = fromTransformable[name]; + } + } + + function makeRenderItem(customSeries, data, ecModel, api) { + var renderItem = customSeries.get('renderItem'); + var coordSys = customSeries.coordinateSystem; + var prepareResult = {}; + + if (coordSys) { + if ("development" !== 'production') { + assert(renderItem, 'series.render is required.'); + assert(coordSys.prepareCustoms || prepareCustoms[coordSys.type], 'This coordSys does not support custom series.'); + } // `coordSys.prepareCustoms` is used for external coord sys like bmap. + + + prepareResult = coordSys.prepareCustoms ? coordSys.prepareCustoms(coordSys) : prepareCustoms[coordSys.type](coordSys); + } + + var userAPI = defaults({ + getWidth: api.getWidth, + getHeight: api.getHeight, + getZr: api.getZr, + getDevicePixelRatio: api.getDevicePixelRatio, + value: value, + style: style, + ordinalRawValue: ordinalRawValue, + styleEmphasis: styleEmphasis, + visual: visual, + barLayout: barLayout, + currentSeriesIndices: currentSeriesIndices, + font: font + }, prepareResult.api || {}); + var userParams = { + // The life cycle of context: current round of rendering. + // The global life cycle is probably not necessary, because + // user can store global status by themselves. + context: {}, + seriesId: customSeries.id, + seriesName: customSeries.name, + seriesIndex: customSeries.seriesIndex, + coordSys: prepareResult.coordSys, + dataInsideLength: data.count(), + encode: wrapEncodeDef(customSeries.getData()) + }; // If someday intending to refactor them to a class, should consider do not + // break change: currently these attribute member are encapsulated in a closure + // so that do not need to force user to call these method with a scope. + // Do not support call `api` asynchronously without dataIndexInside input. + + var currDataIndexInside; + var currItemModel; + var currItemStyleModels = {}; + var currLabelModels = {}; + var seriesItemStyleModels = {}; + var seriesLabelModels = {}; + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + seriesItemStyleModels[stateName] = customSeries.getModel(PATH_ITEM_STYLE[stateName]); + seriesLabelModels[stateName] = customSeries.getModel(PATH_LABEL[stateName]); + } + + function getItemModel(dataIndexInside) { + return dataIndexInside === currDataIndexInside ? currItemModel || (currItemModel = data.getItemModel(dataIndexInside)) : data.getItemModel(dataIndexInside); + } + + function getItemStyleModel(dataIndexInside, state) { + return !data.hasItemOption ? seriesItemStyleModels[state] : dataIndexInside === currDataIndexInside ? currItemStyleModels[state] || (currItemStyleModels[state] = getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state])) : getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state]); + } + + function getLabelModel(dataIndexInside, state) { + return !data.hasItemOption ? seriesLabelModels[state] : dataIndexInside === currDataIndexInside ? currLabelModels[state] || (currLabelModels[state] = getItemModel(dataIndexInside).getModel(PATH_LABEL[state])) : getItemModel(dataIndexInside).getModel(PATH_LABEL[state]); + } + + return function (dataIndexInside, payload) { + currDataIndexInside = dataIndexInside; + currItemModel = null; + currItemStyleModels = {}; + currLabelModels = {}; + return renderItem && renderItem(defaults({ + dataIndexInside: dataIndexInside, + dataIndex: data.getRawIndex(dataIndexInside), + // Can be used for optimization when zoom or roam. + actionType: payload ? payload.type : null + }, userParams), userAPI); + }; + /** + * @public + * @param dim by default 0. + * @param dataIndexInside by default `currDataIndexInside`. + */ + + function value(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + return data.get(data.getDimension(dim || 0), dataIndexInside); + } + /** + * @public + * @param dim by default 0. + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function ordinalRawValue(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var dimInfo = data.getDimensionInfo(dim || 0); + + if (!dimInfo) { + return; + } + + var val = data.get(dimInfo.name, dataIndexInside); + var ordinalMeta = dimInfo && dimInfo.ordinalMeta; + return ordinalMeta ? ordinalMeta.categories[val] : val; + } + /** + * @deprecated The orgininal intention of `api.style` is enable to set itemStyle + * like other series. But it not necessary and not easy to give a strict definition + * of what it return. And since echarts5 it needs to be make compat work. So + * deprecates it since echarts5. + * + * By default, `visual` is applied to style (to support visualMap). + * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`, + * it can be implemented as: + * `api.style({stroke: api.visual('color'), fill: null})`; + * + * [Compat]: since ec5, RectText has been separated from its hosts el. + * so `api.style()` will only return the style from `itemStyle` but not handle `label` + * any more. But `series.label` config is never published in doc. + * We still compat it in `api.style()`. But not encourage to use it and will still not + * to pulish it to doc. + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function style(userProps, dataIndexInside) { + if ("development" !== 'production') { + warnDeprecated('api.style', 'Please write literal style directly instead.'); + } + + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var style = data.getItemVisual(dataIndexInside, 'style'); + var visualColor = style && style.fill; + var opacity = style && style.opacity; + var itemStyle = getItemStyleModel(dataIndexInside, NORMAL).getItemStyle(); + visualColor != null && (itemStyle.fill = visualColor); + opacity != null && (itemStyle.opacity = opacity); + var opt = { + inheritColor: isString(visualColor) ? visualColor : '#000' + }; + var labelModel = getLabelModel(dataIndexInside, NORMAL); // Now that the feture of "auto adjust text fill/stroke" has been migrated to zrender + // since ec5, we should set `isAttached` as `false` here and make compat in + // `convertToEC4StyleForCustomSerise`. + + var textStyle = createTextStyle(labelModel, null, opt, false, true); + textStyle.text = labelModel.getShallow('show') ? retrieve2(customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; + var textConfig = createTextConfig(labelModel, opt, false); + preFetchFromExtra(userProps, itemStyle); + itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); + userProps && applyUserPropsAfter(itemStyle, userProps); + itemStyle.legacy = true; + return itemStyle; + } + /** + * @deprecated The reason see `api.style()` + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function styleEmphasis(userProps, dataIndexInside) { + if ("development" !== 'production') { + warnDeprecated('api.styleEmphasis', 'Please write literal style directly instead.'); + } + + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var itemStyle = getItemStyleModel(dataIndexInside, EMPHASIS).getItemStyle(); + var labelModel = getLabelModel(dataIndexInside, EMPHASIS); + var textStyle = createTextStyle(labelModel, null, null, true, true); + textStyle.text = labelModel.getShallow('show') ? retrieve3(customSeries.getFormattedLabel(dataIndexInside, EMPHASIS), customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; + var textConfig = createTextConfig(labelModel, null, true); + preFetchFromExtra(userProps, itemStyle); + itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); + userProps && applyUserPropsAfter(itemStyle, userProps); + itemStyle.legacy = true; + return itemStyle; + } + + function applyUserPropsAfter(itemStyle, extra) { + for (var key in extra) { + if (hasOwn(extra, key)) { + itemStyle[key] = extra[key]; + } + } + } + + function preFetchFromExtra(extra, itemStyle) { + // A trick to retrieve those props firstly, which are used to + // apply auto inside fill/stroke in `convertToEC4StyleForCustomSerise`. + // (It's not reasonable but only for a degree of compat) + if (extra) { + extra.textFill && (itemStyle.textFill = extra.textFill); + extra.textPosition && (itemStyle.textPosition = extra.textPosition); + } + } + /** + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function visual(visualType, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + + if (hasOwn(STYLE_VISUAL_TYPE, visualType)) { + var style_1 = data.getItemVisual(dataIndexInside, 'style'); + return style_1 ? style_1[STYLE_VISUAL_TYPE[visualType]] : null; + } // Only support these visuals. Other visual might be inner tricky + // for performance (like `style`), do not expose to users. + + + if (hasOwn(NON_STYLE_VISUAL_PROPS, visualType)) { + return data.getItemVisual(dataIndexInside, visualType); + } + } + /** + * @public + * @return If not support, return undefined. + */ + + + function barLayout(opt) { + if (coordSys.type === 'cartesian2d') { + var baseAxis = coordSys.getBaseAxis(); + return getLayoutOnAxis(defaults({ + axis: baseAxis + }, opt)); + } + } + /** + * @public + */ + + + function currentSeriesIndices() { + return ecModel.getCurrentSeriesIndices(); + } + /** + * @public + * @return font string + */ + + + function font(opt) { + return getFont(opt, ecModel); + } + } + + function wrapEncodeDef(data) { + var encodeDef = {}; + each(data.dimensions, function (dimName, dataDimIndex) { + var dimInfo = data.getDimensionInfo(dimName); + + if (!dimInfo.isExtraCoord) { + var coordDim = dimInfo.coordDim; + var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || []; + dataDims[dimInfo.coordDimIndex] = dataDimIndex; + } + }); + return encodeDef; + } + + function createOrUpdateItem(api, el, dataIndex, elOption, seriesModel, group, data, morphPreparation) { + // [Rule] + // If `renderItem` returns `null`/`undefined`/`false`, remove the previous el if existing. + // (It seems that violate the "merge" principle, but most of users probably intuitively + // regard "return;" as "show nothing element whatever", so make a exception to meet the + // most cases.) + // The rule or "merge" see [STRATEGY_MERGE]. + // If `elOption` is `null`/`undefined`/`false` (when `renderItem` returns nothing). + if (!elOption) { + removeElementDirectly(el, group); + return; + } + + el = doCreateOrUpdateEl(api, el, dataIndex, elOption, seriesModel, group, true, morphPreparation); + el && data.setItemGraphicEl(dataIndex, el); + enableHoverEmphasis(el, elOption.focus, elOption.blurScope); + return el; + } + + function doCreateOrUpdateEl(api, el, dataIndex, elOption, seriesModel, group, isRoot, morphPreparation) { + if ("development" !== 'production') { + assert(elOption, 'should not have an null/undefined element setting'); + } + + var toBeReplacedIdx = -1; + + if (el && doesElNeedRecreate(el, elOption) // || ( + // // PENDING: even in one-to-one mapping case, if el is marked as morph, + // // do not sure whether the el will be mapped to another el with different + // // hierarchy in Group tree. So always recreate el rather than reuse the el. + // morphPreparation && morphPreparation.isOneToOneFrom(el) + // ) + ) { + // Should keep at the original index, otherwise "merge by index" will be incorrect. + toBeReplacedIdx = group.childrenRef().indexOf(el); + el = null; + } + + var elIsNewCreated = !el; + + if (!el) { + el = createEl(elOption); + } else { + // FIMXE:NEXT unified clearState? + // If in some case the performance issue arised, consider + // do not clearState but update cached normal state directly. + el.clearStates(); + } + + var canMorph = inner$b(el).canMorph = elOption.morph && isPath$1(el); + var thisElIsMorphTo = canMorph && morphPreparation && morphPreparation.hasFrom(); // Use update animation when morph is enabled. + + var isInit = elIsNewCreated && !thisElIsMorphTo; + attachedTxInfoTmp.normal.cfg = attachedTxInfoTmp.normal.conOpt = attachedTxInfoTmp.emphasis.cfg = attachedTxInfoTmp.emphasis.conOpt = attachedTxInfoTmp.blur.cfg = attachedTxInfoTmp.blur.conOpt = attachedTxInfoTmp.select.cfg = attachedTxInfoTmp.select.conOpt = null; + attachedTxInfoTmp.isLegacy = false; + doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfoTmp); + doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit); + var pendingAllPropsFinal = updateElNormal(api, el, thisElIsMorphTo, dataIndex, elOption, elOption.style, attachedTxInfoTmp, seriesModel, isInit, false); + + if (thisElIsMorphTo) { + morphPreparation.addTo(el, elOption, dataIndex, pendingAllPropsFinal); + } + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + + if (stateName !== NORMAL) { + var otherStateOpt = retrieveStateOption(elOption, stateName); + var otherStyleOpt = retrieveStyleOptionOnState(elOption, otherStateOpt, stateName); + updateElOnState(stateName, el, otherStateOpt, otherStyleOpt, attachedTxInfoTmp); + } + } + + updateZ$1(el, elOption, seriesModel); + + if (elOption.type === 'group') { + mergeChildren(api, el, dataIndex, elOption, seriesModel, morphPreparation); + } + + if (toBeReplacedIdx >= 0) { + group.replaceAt(el, toBeReplacedIdx); + } else { + group.add(el); + } + + return el; + } // `el` must not be null/undefined. + + + function doesElNeedRecreate(el, elOption) { + var elInner = inner$b(el); + var elOptionType = elOption.type; + var elOptionShape = elOption.shape; + var elOptionStyle = elOption.style; + return (// If `elOptionType` is `null`, follow the merge principle. + elOptionType != null && elOptionType !== elInner.customGraphicType || elOptionType === 'path' && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== elInner.customPathData || elOptionType === 'image' && hasOwn(elOptionStyle, 'image') && elOptionStyle.image !== elInner.customImagePath // // FIXME test and remove this restriction? + // || (elOptionType === 'text' + // && hasOwn(elOptionStyle, 'text') + // && (elOptionStyle as TextStyleProps).text !== elInner.customText + // ) + + ); + } + + function doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit) { + // Based on the "merge" principle, if no clipPath provided, + // do nothing. The exists clip will be totally removed only if + // `el.clipPath` is `false`. Otherwise it will be merged/replaced. + var clipPathOpt = elOption.clipPath; + + if (clipPathOpt === false) { + if (el && el.getClipPath()) { + el.removeClipPath(); + } + } else if (clipPathOpt) { + var clipPath = el.getClipPath(); + + if (clipPath && doesElNeedRecreate(clipPath, clipPathOpt)) { + clipPath = null; + } + + if (!clipPath) { + clipPath = createEl(clipPathOpt); + + if ("development" !== 'production') { + assert(clipPath instanceof Path, 'Only any type of `path` can be used in `clipPath`, rather than ' + clipPath.type + '.'); + } + + el.setClipPath(clipPath); + } + + updateElNormal(null, clipPath, null, dataIndex, clipPathOpt, null, null, seriesModel, isInit, false); + } // If not define `clipPath` in option, do nothing unnecessary. + + } + + function doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfo) { + // group do not support textContent temporarily untill necessary. + if (el.isGroup) { + return; + } // Normal must be called before emphasis, for `isLegacy` detection. + + + processTxInfo(elOption, null, attachedTxInfo); + processTxInfo(elOption, EMPHASIS, attachedTxInfo); // If `elOption.textConfig` or `elOption.textContent` is null/undefined, it does not make sence. + // So for simplicity, if "elOption hasOwnProperty of them but be null/undefined", we do not + // trade them as set to null to el. + // Especially: + // `elOption.textContent: false` means remove textContent. + // `elOption.textContent.emphasis.style: false` means remove the style from emphasis state. + + var txConOptNormal = attachedTxInfo.normal.conOpt; + var txConOptEmphasis = attachedTxInfo.emphasis.conOpt; + var txConOptBlur = attachedTxInfo.blur.conOpt; + var txConOptSelect = attachedTxInfo.select.conOpt; + + if (txConOptNormal != null || txConOptEmphasis != null || txConOptSelect != null || txConOptBlur != null) { + var textContent = el.getTextContent(); + + if (txConOptNormal === false) { + textContent && el.removeTextContent(); + } else { + txConOptNormal = attachedTxInfo.normal.conOpt = txConOptNormal || { + type: 'text' + }; + + if (!textContent) { + textContent = createEl(txConOptNormal); + el.setTextContent(textContent); + } else { + // If in some case the performance issue arised, consider + // do not clearState but update cached normal state directly. + textContent.clearStates(); + } + + var txConStlOptNormal = txConOptNormal && txConOptNormal.style; + updateElNormal(null, textContent, null, dataIndex, txConOptNormal, txConStlOptNormal, null, seriesModel, isInit, true); + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + + if (stateName !== NORMAL) { + var txConOptOtherState = attachedTxInfo[stateName].conOpt; + updateElOnState(stateName, textContent, txConOptOtherState, retrieveStyleOptionOnState(txConOptNormal, txConOptOtherState, stateName), null); + } + } + + txConStlOptNormal ? textContent.dirty() : textContent.markRedraw(); + } + } + } + + function processTxInfo(elOption, state, attachedTxInfo) { + var stateOpt = !state ? elOption : retrieveStateOption(elOption, state); + var styleOpt = !state ? elOption.style : retrieveStyleOptionOnState(elOption, stateOpt, EMPHASIS); + var elType = elOption.type; + var txCfg = stateOpt ? stateOpt.textConfig : null; + var txConOptNormal = elOption.textContent; + var txConOpt = !txConOptNormal ? null : !state ? txConOptNormal : retrieveStateOption(txConOptNormal, state); + + if (styleOpt && ( // Because emphasis style has little info to detect legacy, + // if normal is legacy, emphasis is trade as legacy. + attachedTxInfo.isLegacy || isEC4CompatibleStyle(styleOpt, elType, !!txCfg, !!txConOpt))) { + attachedTxInfo.isLegacy = true; + var convertResult = convertFromEC4CompatibleStyle(styleOpt, elType, !state); // Explicitly specified `textConfig` and `textContent` has higher priority than + // the ones generated by legacy style. Otherwise if users use them and `api.style` + // at the same time, they not both work and hardly to known why. + + if (!txCfg && convertResult.textConfig) { + txCfg = convertResult.textConfig; + } + + if (!txConOpt && convertResult.textContent) { + txConOpt = convertResult.textContent; + } + } + + if (!state && txConOpt) { + var txConOptNormal_1 = txConOpt; // `textContent: {type: 'text'}`, the "type" is easy to be missing. So we tolerate it. + + !txConOptNormal_1.type && (txConOptNormal_1.type = 'text'); + + if ("development" !== 'production') { + // Do not tolerate incorret type for forward compat. + txConOptNormal_1.type !== 'text' && assert(txConOptNormal_1.type === 'text', 'textContent.type must be "text"'); + } + } + + var info = !state ? attachedTxInfo.normal : attachedTxInfo[state]; + info.cfg = txCfg; + info.conOpt = txConOpt; + } + + function retrieveStateOption(elOption, state) { + return !state ? elOption : elOption ? elOption[state] : null; + } + + function retrieveStyleOptionOnState(stateOptionNormal, stateOption, state) { + var style = stateOption && stateOption.style; + + if (style == null && state === EMPHASIS && stateOptionNormal) { + style = stateOptionNormal.styleEmphasis; + } + + return style; + } // Usage: + // (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates that + // the existing children will not be removed, and enables the feature that + // update some of the props of some of the children simply by construct + // the returned children of `renderItem` like: + // `var children = group.children = []; children[3] = {opacity: 0.5};` + // (2) If `elOption.$mergeChildren` is `'byName'`, add/update/remove children + // by child.name. But that might be lower performance. + // (3) If `elOption.$mergeChildren` is `false`, the existing children will be + // replaced totally. + // (4) If `!elOption.children`, following the "merge" principle, nothing will happen. + // + // For implementation simpleness, do not provide a direct way to remove sinlge + // child (otherwise the total indicies of the children array have to be modified). + // User can remove a single child by set its `ignore` as `true`. + + + function mergeChildren(api, el, dataIndex, elOption, seriesModel, morphPreparation) { + var newChildren = elOption.children; + var newLen = newChildren ? newChildren.length : 0; + var mergeChildren = elOption.$mergeChildren; // `diffChildrenByName` has been deprecated. + + var byName = mergeChildren === 'byName' || elOption.diffChildrenByName; + var notMerge = mergeChildren === false; // For better performance on roam update, only enter if necessary. + + if (!newLen && !byName && !notMerge) { + return; + } + + if (byName) { + diffGroupChildren({ + api: api, + oldChildren: el.children() || [], + newChildren: newChildren || [], + dataIndex: dataIndex, + seriesModel: seriesModel, + group: el, + morphPreparation: morphPreparation + }); + return; + } + + notMerge && el.removeAll(); // Mapping children of a group simply by index, which + // might be better performance. + + var index = 0; + + for (; index < newLen; index++) { + newChildren[index] && doCreateOrUpdateEl(api, el.childAt(index), dataIndex, newChildren[index], seriesModel, el, false, morphPreparation); + } + + for (var i = el.childCount() - 1; i >= index; i--) { + // Do not supprot leave elements that are not mentioned in the latest + // `renderItem` return. Otherwise users may not have a clear and simple + // concept that how to contorl all of the elements. + doRemoveEl(el.childAt(i), seriesModel, el); + } + } + + function diffGroupChildren(context) { + new DataDiffer(context.oldChildren, context.newChildren, getKey, getKey, context).add(processAddUpdate).update(processAddUpdate).remove(processRemove).execute(); + } + + function getKey(item, idx) { + var name = item && item.name; + return name != null ? name : GROUP_DIFF_PREFIX + idx; + } + + function processAddUpdate(newIndex, oldIndex) { + var context = this.context; + var childOption = newIndex != null ? context.newChildren[newIndex] : null; + var child = oldIndex != null ? context.oldChildren[oldIndex] : null; + doCreateOrUpdateEl(context.api, child, context.dataIndex, childOption, context.seriesModel, context.group, false, context.morphPreparation); + } + + function processRemove(oldIndex) { + var context = this.context; + var child = context.oldChildren[oldIndex]; + doRemoveEl(child, context.seriesModel, context.group); + } + + function doRemoveEl(el, seriesModel, group) { + if (el) { + var leaveToProps = inner$b(el).leaveToProps; + leaveToProps ? updateProps(el, leaveToProps, seriesModel, { + cb: function () { + group.remove(el); + } + }) : group.remove(el); + } + } + /** + * @return SVG Path data. + */ + + + function getPathData(shape) { + // "d" follows the SVG convention. + return shape && (shape.pathData || shape.d); + } + + function hasOwnPathData(shape) { + return shape && (hasOwn(shape, 'pathData') || hasOwn(shape, 'd')); + } + + function isPath$1(el) { + return el && el instanceof Path; + } + + function removeElementDirectly(el, group) { + el && group.remove(el); + } + /** + * Any morph-potential el should added by `morphPreparation.addTo(el)`. + * And they may apply morph or not when `morphPreparation.applyMorphing()`. + * But at least, all of the "to" elements will apply all of the updates + * as `doCreateOrUpdateItem` did. + */ + + + var MorphPreparation = + /** @class */ + function () { + function MorphPreparation(seriesModel, transOpt) { + this._fromList = []; + this._toList = []; + this._toElOptionList = []; + this._allPropsFinalList = []; + this._toDataIndices = []; // Key: `toDataIndex`, not `toIdx` + + this._morphConfigList = []; + this._seriesModel = seriesModel; + this._transOpt = transOpt; + } + + MorphPreparation.prototype.hasFrom = function () { + return !!this._fromList.length; + }; // isOneToOneFrom(el: Element): boolean { + // if (el && inner(el).canMorph) { + // const fromList = this._fromList; + // for (let i = 0; i < fromList.length; i++) { + // if (fromList[i] === el) { + // return true; + // } + // } + // } + // } + + + MorphPreparation.prototype.findAndAddFrom = function (el) { + if (!el) { + return; + } + + if (inner$b(el).canMorph) { + this._fromList.push(el); + } + + if (el.isGroup) { + var children = el.childrenRef(); + + for (var i = 0; i < children.length; i++) { + this.findAndAddFrom(children[i]); + } + } + }; + + MorphPreparation.prototype.addTo = function (path, elOption, dataIndex, allPropsFinal) { + if (path) { + this._toList.push(path); + + this._toElOptionList.push(elOption); + + this._toDataIndices.push(dataIndex); + + this._allPropsFinalList.push(allPropsFinal); + } + }; + + MorphPreparation.prototype.applyMorphing = function () { + // [MORPHING_LOGIC_HINT] + // Pay attention to the order: + // (A) Apply `allPropsFinal` and `styleOption` to "to". + // (Then "to" becomes to the final state.) + // (B) Apply `morphPath`/`combine`/`separate`. + // (Based on the current state of "from" and the final state of "to".) + // (Then we may get "from.subList" or "to.subList".) + // (C) Copy the related props from "from" to "from.subList", from "to" to "to.subList". + // (D) Collect `transitionFromProps` for "to" and "to.subList" + // (Based on "from" or "from.subList".) + // (E) Apply `transitionFromProps` to "to" and "to.subList" + // (It might change the prop values to the first frame value.) + // Case_I: + // If (D) should be after (C), we use sequence: A - B - C - D - E + // Case_II: + // If (A) should be after (D), we use sequence: D - A - B - C - E + // [MORPHING_LOGIC_HINT] + // zrender `morphPath`/`combine`/`separate` only manages the shape animation. + // Other props (like transfrom, style transition) will handled in echarts). + // [MORPHING_LOGIC_HINT] + // Make sure `applyPropsFinal` always be called for "to". + var type = this._type; + var fromList = this._fromList; + var toList = this._toList; + var toListLen = toList.length; + var fromListLen = fromList.length; + + if (!fromListLen || !toListLen) { + return; + } + + if (type === 'oneToOne') { + // In one-to-one case, we by default apply a simple rule: + // map "from" and "to" one by one. + // For this case: old_data_item_el and new_data_item_el + // has the same hierarchy of group tree but only some path type changed. + for (var toIdx = 0; toIdx < toListLen; toIdx++) { + this._oneToOneForSingleTo(toIdx, toIdx); + } + } else if (type === 'manyToOne') { + // A rough strategy: if there are more than one "to", we simply divide "fromList" equally. + var fromSingleSegLen = Math.max(1, Math.floor(fromListLen / toListLen)); + + for (var toIdx = 0, fromIdxStart = 0; toIdx < toListLen; toIdx++, fromIdxStart += fromSingleSegLen) { + var fromCount = toIdx + 1 >= toListLen ? fromListLen - fromIdxStart : fromSingleSegLen; + + this._manyToOneForSingleTo(toIdx, fromIdxStart >= fromListLen ? null : fromIdxStart, fromCount); + } + } else if (type === 'oneToMany') { + // A rough strategy: if there are more than one "from", we simply divide "toList" equally. + var toSingleSegLen = Math.max(1, Math.floor(toListLen / fromListLen)); + + for (var toIdxStart = 0, fromIdx = 0; toIdxStart < toListLen; toIdxStart += toSingleSegLen, fromIdx++) { + var toCount = toIdxStart + toSingleSegLen >= toListLen ? toListLen - toIdxStart : toSingleSegLen; + + this._oneToManyForSingleFrom(toIdxStart, toCount, fromIdx >= fromListLen ? null : fromIdx); + } + } + }; + + MorphPreparation.prototype._oneToOneForSingleTo = function ( // "to" must NOT be null/undefined. + toIdx, // May `fromIdx >= this._fromList.length` + fromIdx) { + var to = this._toList[toIdx]; + var toElOption = this._toElOptionList[toIdx]; + var toDataIndex = this._toDataIndices[toIdx]; + var allPropsFinal = this._allPropsFinalList[toIdx]; + var from = this._fromList[fromIdx]; + + var elAnimationConfig = this._getOrCreateMorphConfig(toDataIndex); + + var morphDuration = elAnimationConfig.duration; + + if (from && isCombiningPath(from)) { + applyPropsFinal(to, allPropsFinal, toElOption.style); + + if (morphDuration) { + var combineResult = combine([from], to, elAnimationConfig, copyPropsWhenDivided); + + this._processResultIndividuals(combineResult, toIdx, null); + } // The target el will not be displayed and transition from multiple path. + // transition on the target el does not make sense. + + } else { + var morphFrom = morphDuration // from === to usually happen in scenarios where internal update like + // "dataZoom", "legendToggle" happen. If from is not in any morphing, + // we do not need to call `morphPath`. + && from && (from !== to || isInAnyMorphing(from)) ? from : null; // See [Case_II] above. + // In this case, there is probably `from === to`. And the `transitionFromProps` collecting + // does not depends on morphing. So we collect `transitionFromProps` first. + + var transFromProps = {}; + prepareShapeOrExtraTransitionFrom('shape', to, morphFrom, toElOption, transFromProps, false); + prepareShapeOrExtraTransitionFrom('extra', to, morphFrom, toElOption, transFromProps, false); + prepareTransformTransitionFrom(to, morphFrom, toElOption, transFromProps, false); + prepareStyleTransitionFrom(to, morphFrom, toElOption, toElOption.style, transFromProps, false); + applyPropsFinal(to, allPropsFinal, toElOption.style); + + if (morphFrom) { + morphPath(morphFrom, to, elAnimationConfig); + } + + applyTransitionFrom(to, toDataIndex, toElOption, this._seriesModel, transFromProps, false); + } + }; + + MorphPreparation.prototype._manyToOneForSingleTo = function ( // "to" must NOT be null/undefined. + toIdx, // May be null. + fromIdxStart, fromCount) { + var to = this._toList[toIdx]; + var toElOption = this._toElOptionList[toIdx]; + var allPropsFinal = this._allPropsFinalList[toIdx]; + applyPropsFinal(to, allPropsFinal, toElOption.style); + + var elAnimationConfig = this._getOrCreateMorphConfig(this._toDataIndices[toIdx]); + + if (elAnimationConfig.duration && fromIdxStart != null) { + var combineFromList = []; + + for (var fromIdx = fromIdxStart; fromIdx < fromCount; fromIdx++) { + combineFromList.push(this._fromList[fromIdx]); + } + + var combineResult = combine(combineFromList, to, elAnimationConfig, copyPropsWhenDivided); + + this._processResultIndividuals(combineResult, toIdx, null); + } + }; + + MorphPreparation.prototype._oneToManyForSingleFrom = function ( // "to" must NOT be null/undefined. + toIdxStart, toCount, // May be null + fromIdx) { + var from = fromIdx == null ? null : this._fromList[fromIdx]; + var toList = this._toList; + var separateToList = []; + + for (var toIdx = toIdxStart; toIdx < toCount; toIdx++) { + var to = toList[toIdx]; + applyPropsFinal(to, this._allPropsFinalList[toIdx], this._toElOptionList[toIdx].style); + separateToList.push(to); + } + + var elAnimationConfig = this._getOrCreateMorphConfig(this._toDataIndices[toIdxStart]); + + if (elAnimationConfig.duration && from) { + var separateResult = separate(from, separateToList, elAnimationConfig, copyPropsWhenDivided); + + this._processResultIndividuals(separateResult, toIdxStart, toCount); + } + }; + + MorphPreparation.prototype._processResultIndividuals = function (combineSeparateResult, toIdxStart, toCount) { + var isSeparate = toCount != null; + + for (var i = 0; i < combineSeparateResult.count; i++) { + var fromIndividual = combineSeparateResult.fromIndividuals[i]; + var toIndividual = combineSeparateResult.toIndividuals[i]; // Here it's a trick: + // For "combine" case, all of the `toIndividuals` map to the same `toIdx`. + // For "separate" case, the `toIndividuals` map to some certain segment of `_toList` accurately. + + var toIdx = toIdxStart + (isSeparate ? i : 0); + var toElOption = this._toElOptionList[toIdx]; + var dataIndex = this._toDataIndices[toIdx]; + var transFromProps = {}; + prepareTransformTransitionFrom(toIndividual, fromIndividual, toElOption, transFromProps, false); + prepareStyleTransitionFrom(toIndividual, fromIndividual, toElOption, toElOption.style, transFromProps, false); + applyTransitionFrom(toIndividual, dataIndex, toElOption, this._seriesModel, transFromProps, false); + } + }; + + MorphPreparation.prototype._getOrCreateMorphConfig = function (dataIndex) { + var morphConfigList = this._morphConfigList; + var config = morphConfigList[dataIndex]; + + if (config) { + return config; + } + + var duration; + var easing; + var delay; + var seriesModel = this._seriesModel; + var transOpt = this._transOpt; + + if (seriesModel.isAnimationEnabled()) { + // PENDING: refactor? this is the same logic as `src/util/graphic.ts#animateOrSetProps`. + var animationPayload = void 0; + + if (seriesModel && seriesModel.ecModel) { + var updatePayload = seriesModel.ecModel.getUpdatePayload(); + animationPayload = updatePayload && updatePayload.animation; + } + + if (animationPayload) { + duration = animationPayload.duration || 0; + easing = animationPayload.easing || 'cubicOut'; + delay = animationPayload.delay || 0; + } else { + easing = seriesModel.get('animationEasingUpdate'); + var delayOption = seriesModel.get('animationDelayUpdate'); + delay = isFunction(delayOption) ? delayOption(dataIndex) : delayOption; + var durationOption = seriesModel.get('animationDurationUpdate'); + duration = isFunction(durationOption) ? durationOption(dataIndex) : durationOption; + } + } + + config = { + duration: duration || 0, + delay: delay, + easing: easing, + dividingMethod: transOpt ? transOpt.dividingMethod : null + }; + morphConfigList[dataIndex] = config; + return config; + }; + + MorphPreparation.prototype.reset = function (type) { + // `this._morphConfigList` can be kept. It only related to `dataIndex`. + this._type = type; + this._fromList.length = this._toList.length = this._toElOptionList.length = this._allPropsFinalList.length = this._toDataIndices.length = 0; + }; + + return MorphPreparation; + }(); + + function copyPropsWhenDivided(srcPath, tarPath, willClone) { + // Do not copy transform props. + // Sub paths are transfrom based on their host path. + // tarPath.x = srcPath.x; + // tarPath.y = srcPath.y; + // tarPath.scaleX = srcPath.scaleX; + // tarPath.scaleY = srcPath.scaleY; + // tarPath.originX = srcPath.originX; + // tarPath.originY = srcPath.originY; + // If just carry the style, will not be modifed, so do not copy. + tarPath.style = willClone ? clone(srcPath.style) : srcPath.style; + tarPath.zlevel = srcPath.zlevel; + tarPath.z = srcPath.z; + tarPath.z2 = srcPath.z2; + } + + function install$r(registers) { + registers.registerChartView(CustomSeriesView); + registers.registerSeriesModel(CustomSeriesModel); + } + + var inner$c = makeInner(); + var clone$3 = clone; + var bind$1 = bind; + /** + * Base axis pointer class in 2D. + */ + + var BaseAxisPointer = + /** @class */ + function () { + function BaseAxisPointer() { + this._dragging = false; + /** + * In px, arbitrary value. Do not set too small, + * no animation is ok for most cases. + */ + + this.animationThreshold = 15; + } + /** + * @implement + */ + + + BaseAxisPointer.prototype.render = function (axisModel, axisPointerModel, api, forceRender) { + var value = axisPointerModel.get('value'); + var status = axisPointerModel.get('status'); // Bind them to `this`, not in closure, otherwise they will not + // be replaced when user calling setOption in not merge mode. + + this._axisModel = axisModel; + this._axisPointerModel = axisPointerModel; + this._api = api; // Optimize: `render` will be called repeatly during mouse move. + // So it is power consuming if performing `render` each time, + // especially on mobile device. + + if (!forceRender && this._lastValue === value && this._lastStatus === status) { + return; + } + + this._lastValue = value; + this._lastStatus = status; + var group = this._group; + var handle = this._handle; + + if (!status || status === 'hide') { + // Do not clear here, for animation better. + group && group.hide(); + handle && handle.hide(); + return; + } + + group && group.show(); + handle && handle.show(); // Otherwise status is 'show' + + var elOption = {}; + this.makeElOption(elOption, value, axisModel, axisPointerModel, api); // Enable change axis pointer type. + + var graphicKey = elOption.graphicKey; + + if (graphicKey !== this._lastGraphicKey) { + this.clear(api); + } + + this._lastGraphicKey = graphicKey; + var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel); + + if (!group) { + group = this._group = new Group(); + this.createPointerEl(group, elOption, axisModel, axisPointerModel); + this.createLabelEl(group, elOption, axisModel, axisPointerModel); + api.getZr().add(group); + } else { + var doUpdateProps = curry(updateProps$1, axisPointerModel, moveAnimation); + this.updatePointerEl(group, elOption, doUpdateProps); + this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel); + } + + updateMandatoryProps(group, axisPointerModel, true); + + this._renderHandle(value); + }; + /** + * @implement + */ + + + BaseAxisPointer.prototype.remove = function (api) { + this.clear(api); + }; + /** + * @implement + */ + + + BaseAxisPointer.prototype.dispose = function (api) { + this.clear(api); + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.determineAnimation = function (axisModel, axisPointerModel) { + var animation = axisPointerModel.get('animation'); + var axis = axisModel.axis; + var isCategoryAxis = axis.type === 'category'; + var useSnap = axisPointerModel.get('snap'); // Value axis without snap always do not snap. + + if (!useSnap && !isCategoryAxis) { + return false; + } + + if (animation === 'auto' || animation == null) { + var animationThreshold = this.animationThreshold; + + if (isCategoryAxis && axis.getBandWidth() > animationThreshold) { + return true; + } // It is important to auto animation when snap used. Consider if there is + // a dataZoom, animation will be disabled when too many points exist, while + // it will be enabled for better visual effect when little points exist. + + + if (useSnap) { + var seriesDataCount = getAxisInfo(axisModel).seriesDataCount; + var axisExtent = axis.getExtent(); // Approximate band width + + return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold; + } + + return false; + } + + return animation === true; + }; + /** + * add {pointer, label, graphicKey} to elOption + * @protected + */ + + + BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {// Shoule be implemenented by sub-class. + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.createPointerEl = function (group, elOption, axisModel, axisPointerModel) { + var pointerOption = elOption.pointer; + + if (pointerOption) { + var pointerEl = inner$c(group).pointerEl = new graphic[pointerOption.type](clone$3(elOption.pointer)); + group.add(pointerEl); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.createLabelEl = function (group, elOption, axisModel, axisPointerModel) { + if (elOption.label) { + var labelEl = inner$c(group).labelEl = new ZRText(clone$3(elOption.label)); + group.add(labelEl); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.updatePointerEl = function (group, elOption, updateProps) { + var pointerEl = inner$c(group).pointerEl; + + if (pointerEl && elOption.pointer) { + pointerEl.setStyle(elOption.pointer.style); + updateProps(pointerEl, { + shape: elOption.pointer.shape + }); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.updateLabelEl = function (group, elOption, updateProps, axisPointerModel) { + var labelEl = inner$c(group).labelEl; + + if (labelEl) { + labelEl.setStyle(elOption.label.style); + updateProps(labelEl, { + // Consider text length change in vertical axis, animation should + // be used on shape, otherwise the effect will be weird. + // TODOTODO + // shape: elOption.label.shape, + x: elOption.label.x, + y: elOption.label.y + }); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @private + */ + + + BaseAxisPointer.prototype._renderHandle = function (value) { + if (this._dragging || !this.updateHandleTransform) { + return; + } + + var axisPointerModel = this._axisPointerModel; + + var zr = this._api.getZr(); + + var handle = this._handle; + var handleModel = axisPointerModel.getModel('handle'); + var status = axisPointerModel.get('status'); + + if (!handleModel.get('show') || !status || status === 'hide') { + handle && zr.remove(handle); + this._handle = null; + return; + } + + var isInit; + + if (!this._handle) { + isInit = true; + handle = this._handle = createIcon(handleModel.get('icon'), { + cursor: 'move', + draggable: true, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + onmousedown: bind$1(this._onHandleDragMove, this, 0, 0), + drift: bind$1(this._onHandleDragMove, this), + ondragend: bind$1(this._onHandleDragEnd, this) + }); + zr.add(handle); + } + + updateMandatoryProps(handle, axisPointerModel, false); // update style + + handle.setStyle(handleModel.getItemStyle(null, ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'])); // update position + + var handleSize = handleModel.get('size'); + + if (!isArray(handleSize)) { + handleSize = [handleSize, handleSize]; + } + + handle.scaleX = handleSize[0] / 2; + handle.scaleY = handleSize[1] / 2; + createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate'); + + this._moveHandleToValue(value, isInit); + }; + + BaseAxisPointer.prototype._moveHandleToValue = function (value, isInit) { + updateProps$1(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel))); + }; + + BaseAxisPointer.prototype._onHandleDragMove = function (dx, dy) { + var handle = this._handle; + + if (!handle) { + return; + } + + this._dragging = true; // Persistent for throttle. + + var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel); + this._payloadInfo = trans; + handle.stopAnimation(); + handle.attr(getHandleTransProps(trans)); + inner$c(handle).lastProp = null; + + this._doDispatchAxisPointer(); + }; + /** + * Throttled method. + */ + + + BaseAxisPointer.prototype._doDispatchAxisPointer = function () { + var handle = this._handle; + + if (!handle) { + return; + } + + var payloadInfo = this._payloadInfo; + var axisModel = this._axisModel; + + this._api.dispatchAction({ + type: 'updateAxisPointer', + x: payloadInfo.cursorPoint[0], + y: payloadInfo.cursorPoint[1], + tooltipOption: payloadInfo.tooltipOption, + axesInfo: [{ + axisDim: axisModel.axis.dim, + axisIndex: axisModel.componentIndex + }] + }); + }; + + BaseAxisPointer.prototype._onHandleDragEnd = function () { + this._dragging = false; + var handle = this._handle; + + if (!handle) { + return; + } + + var value = this._axisPointerModel.get('value'); // Consider snap or categroy axis, handle may be not consistent with + // axisPointer. So move handle to align the exact value position when + // drag ended. + + + this._moveHandleToValue(value); // For the effect: tooltip will be shown when finger holding on handle + // button, and will be hidden after finger left handle button. + + + this._api.dispatchAction({ + type: 'hideTip' + }); + }; + /** + * @private + */ + + + BaseAxisPointer.prototype.clear = function (api) { + this._lastValue = null; + this._lastStatus = null; + var zr = api.getZr(); + var group = this._group; + var handle = this._handle; + + if (zr && group) { + this._lastGraphicKey = null; + group && zr.remove(group); + handle && zr.remove(handle); + this._group = null; + this._handle = null; + this._payloadInfo = null; + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.doClear = function () {// Implemented by sub-class if necessary. + }; + + BaseAxisPointer.prototype.buildLabel = function (xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + }; + + return BaseAxisPointer; + }(); + + function updateProps$1(animationModel, moveAnimation, el, props) { + // Animation optimize. + if (!propsEqual(inner$c(el).lastProp, props)) { + inner$c(el).lastProp = props; + moveAnimation ? updateProps(el, props, animationModel) : (el.stopAnimation(), el.attr(props)); + } + } + + function propsEqual(lastProps, newProps) { + if (isObject(lastProps) && isObject(newProps)) { + var equals_1 = true; + each(newProps, function (item, key) { + equals_1 = equals_1 && propsEqual(lastProps[key], item); + }); + return !!equals_1; + } else { + return lastProps === newProps; + } + } + + function updateLabelShowHide(labelEl, axisPointerModel) { + labelEl[axisPointerModel.get(['label', 'show']) ? 'show' : 'hide'](); + } + + function getHandleTransProps(trans) { + return { + x: trans.x || 0, + y: trans.y || 0, + rotation: trans.rotation || 0 + }; + } + + function updateMandatoryProps(group, axisPointerModel, silent) { + var z = axisPointerModel.get('z'); + var zlevel = axisPointerModel.get('zlevel'); + group && group.traverse(function (el) { + if (el.type !== 'group') { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + el.silent = silent; + } + }); + } + + function buildElStyle(axisPointerModel) { + var axisPointerType = axisPointerModel.get('type'); + var styleModel = axisPointerModel.getModel(axisPointerType + 'Style'); + var style; + + if (axisPointerType === 'line') { + style = styleModel.getLineStyle(); + style.fill = null; + } else if (axisPointerType === 'shadow') { + style = styleModel.getAreaStyle(); + style.stroke = null; + } + + return style; + } + /** + * @param {Function} labelPos {align, verticalAlign, position} + */ + + function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) { + var value = axisPointerModel.get('value'); + var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }); + var labelModel = axisPointerModel.getModel('label'); + var paddings = normalizeCssArray$1(labelModel.get('padding') || 0); + var font = labelModel.getFont(); + var textRect = getBoundingRect(text, font); + var position = labelPos.position; + var width = textRect.width + paddings[1] + paddings[3]; + var height = textRect.height + paddings[0] + paddings[2]; // Adjust by align. + + var align = labelPos.align; + align === 'right' && (position[0] -= width); + align === 'center' && (position[0] -= width / 2); + var verticalAlign = labelPos.verticalAlign; + verticalAlign === 'bottom' && (position[1] -= height); + verticalAlign === 'middle' && (position[1] -= height / 2); // Not overflow ec container + + confineInContainer(position, width, height, api); + var bgColor = labelModel.get('backgroundColor'); + + if (!bgColor || bgColor === 'auto') { + bgColor = axisModel.get(['axisLine', 'lineStyle', 'color']); + } + + elOption.label = { + // shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')}, + x: position[0], + y: position[1], + style: createTextStyle(labelModel, { + text: text, + font: font, + fill: labelModel.getTextColor(), + padding: paddings, + backgroundColor: bgColor + }), + // Lable should be over axisPointer. + z2: 10 + }; + } // Do not overflow ec container + + function confineInContainer(position, width, height, api) { + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + position[0] = Math.min(position[0] + width, viewWidth) - width; + position[1] = Math.min(position[1] + height, viewHeight) - height; + position[0] = Math.max(position[0], 0); + position[1] = Math.max(position[1], 0); + } + + function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) { + value = axis.scale.parse(value); + var text = axis.scale.getLabel({ + value: value + }, { + // If `precision` is set, width can be fixed (like '12.00500'), which + // helps to debounce when when moving label. + precision: opt.precision + }); + var formatter = opt.formatter; + + if (formatter) { + var params_1 = { + value: getAxisRawValue(axis, { + value: value + }), + axisDimension: axis.dim, + axisIndex: axis.index, + seriesData: [] + }; + each(seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var dataParams = series && series.getDataParams(dataIndex); + dataParams && params_1.seriesData.push(dataParams); + }); + + if (isString(formatter)) { + text = formatter.replace('{value}', text); + } else if (isFunction(formatter)) { + text = formatter(params_1); + } + } + + return text; + } + function getTransformedPosition(axis, value, layoutInfo) { + var transform = create$1(); + rotate(transform, transform, layoutInfo.rotation); + translate(transform, transform, layoutInfo.position); + return applyTransform$1([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform); + } + function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) { + // @ts-ignore + var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection); + layoutInfo.labelMargin = axisPointerModel.get(['label', 'margin']); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, { + position: getTransformedPosition(axisModel.axis, value, layoutInfo), + align: textLayout.textAlign, + verticalAlign: textLayout.textVerticalAlign + }); + } + function makeLineShape(p1, p2, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x1: p1[xDimIndex], + y1: p1[1 - xDimIndex], + x2: p2[xDimIndex], + y2: p2[1 - xDimIndex] + }; + } + function makeRectShape(xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + } + function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) { + return { + cx: cx, + cy: cy, + r0: r0, + r: r, + startAngle: startAngle, + endAngle: endAngle, + clockwise: true + }; + } + + var CartesianAxisPointer = + /** @class */ + function (_super) { + __extends(CartesianAxisPointer, _super); + + function CartesianAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + CartesianAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisPointerType = axisPointerModel.get('type'); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true)); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$1(grid.model, axisModel); + buildCartesianSingleLabelElOption( // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + + + CartesianAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$1(axisModel.axis.grid.model, axisModel, { + labelInside: false + }); // @ts-ignore + + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var pos = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: pos[0], + y: pos[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + + + CartesianAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisExtent = axis.getGlobalExtent(true); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var dimIndex = axis.dim === 'x' ? 0 : 1; + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; // Make tooltip do not overlap axisPointer and in the middle of the grid. + + var tooltipOptions = [{ + verticalAlign: 'middle' + }, { + align: 'center' + }]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: tooltipOptions[dimIndex] + }; + }; + + return CartesianAxisPointer; + }(BaseAxisPointer); + + function getCartesian(grid, axis) { + var opt = {}; + opt[axis.dim + 'AxisIndex'] = axis.index; + return grid.getCartesian(opt); + } + + var pointerShapeBuilder = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis)) + }; + } + }; + + function getAxisDimIndex(axis) { + return axis.dim === 'x' ? 0 : 1; + } + + var AxisPointerModel = + /** @class */ + function (_super) { + __extends(AxisPointerModel, _super); + + function AxisPointerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisPointerModel.type; + return _this; + } + + AxisPointerModel.type = 'axisPointer'; + AxisPointerModel.defaultOption = { + // 'auto' means that show when triggered by tooltip or handle. + show: 'auto', + zlevel: 0, + z: 50, + type: 'line', + // axispointer triggered by tootip determine snap automatically, + // see `modelHelper`. + snap: false, + triggerTooltip: true, + value: null, + status: null, + link: [], + // Do not set 'auto' here, otherwise global animation: false + // will not effect at this axispointer. + animation: null, + animationDurationUpdate: 200, + lineStyle: { + color: '#B9BEC9', + width: 1, + type: 'dashed' + }, + shadowStyle: { + color: 'rgba(210,219,238,0.2)' + }, + label: { + show: true, + formatter: null, + precision: 'auto', + margin: 3, + color: '#fff', + padding: [5, 7, 5, 7], + backgroundColor: 'auto', + borderColor: null, + borderWidth: 0, + borderRadius: 3 + }, + handle: { + show: false, + // eslint-disable-next-line + icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', + size: 45, + // handle margin is from symbol center to axis, which is stable when circular move. + margin: 50, + // color: '#1b8bbd' + // color: '#2f4554' + color: '#333', + shadowBlur: 3, + shadowColor: '#aaa', + shadowOffsetX: 0, + shadowOffsetY: 2, + // For mobile performance + throttle: 40 + } + }; + return AxisPointerModel; + }(ComponentModel); + + var inner$d = makeInner(); + var each$8 = each; + /** + * @param {string} key + * @param {module:echarts/ExtensionAPI} api + * @param {Function} handler + * param: {string} currTrigger + * param: {Array.} point + */ + + function register(key, api, handler) { + if (env.node) { + return; + } + + var zr = api.getZr(); + inner$d(zr).records || (inner$d(zr).records = {}); + initGlobalListeners(zr, api); + var record = inner$d(zr).records[key] || (inner$d(zr).records[key] = {}); + record.handler = handler; + } + + function initGlobalListeners(zr, api) { + if (inner$d(zr).initialized) { + return; + } + + inner$d(zr).initialized = true; + useHandler('click', curry(doEnter, 'click')); + useHandler('mousemove', curry(doEnter, 'mousemove')); // useHandler('mouseout', onLeave); + + useHandler('globalout', onLeave); + + function useHandler(eventType, cb) { + zr.on(eventType, function (e) { + var dis = makeDispatchAction(api); + each$8(inner$d(zr).records, function (record) { + record && cb(record, e, dis.dispatchAction); + }); + dispatchTooltipFinally(dis.pendings, api); + }); + } + } + + function dispatchTooltipFinally(pendings, api) { + var showLen = pendings.showTip.length; + var hideLen = pendings.hideTip.length; + var actuallyPayload; + + if (showLen) { + actuallyPayload = pendings.showTip[showLen - 1]; + } else if (hideLen) { + actuallyPayload = pendings.hideTip[hideLen - 1]; + } + + if (actuallyPayload) { + actuallyPayload.dispatchAction = null; + api.dispatchAction(actuallyPayload); + } + } + + function onLeave(record, e, dispatchAction) { + record.handler('leave', null, dispatchAction); + } + + function doEnter(currTrigger, record, e, dispatchAction) { + record.handler(currTrigger, e, dispatchAction); + } + + function makeDispatchAction(api) { + var pendings = { + showTip: [], + hideTip: [] + }; // FIXME + // better approach? + // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip, + // which may be conflict, (axisPointer call showTip but tooltip call hideTip); + // So we have to add "final stage" to merge those dispatched actions. + + var dispatchAction = function (payload) { + var pendingList = pendings[payload.type]; + + if (pendingList) { + pendingList.push(payload); + } else { + payload.dispatchAction = dispatchAction; + api.dispatchAction(payload); + } + }; + + return { + dispatchAction: dispatchAction, + pendings: pendings + }; + } + + function unregister(key, api) { + if (env.node) { + return; + } + + var zr = api.getZr(); + var record = (inner$d(zr).records || {})[key]; + + if (record) { + inner$d(zr).records[key] = null; + } + } + + var AxisPointerView = + /** @class */ + function (_super) { + __extends(AxisPointerView, _super); + + function AxisPointerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisPointerView.type; + return _this; + } + + AxisPointerView.prototype.render = function (globalAxisPointerModel, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var triggerOn = globalAxisPointerModel.get('triggerOn') || globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click'; // Register global listener in AxisPointerView to enable + // AxisPointerView to be independent to Tooltip. + + register('axisPointer', api, function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none' && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)) { + dispatchAction({ + type: 'updateAxisPointer', + currTrigger: currTrigger, + x: e && e.offsetX, + y: e && e.offsetY + }); + } + }); + }; + + AxisPointerView.prototype.remove = function (ecModel, api) { + unregister('axisPointer', api); + }; + + AxisPointerView.prototype.dispose = function (ecModel, api) { + unregister('axisPointer', api); + }; + + AxisPointerView.type = 'axisPointer'; + return AxisPointerView; + }(ComponentView); + + /** + * @param finder contains {seriesIndex, dataIndex, dataIndexInside} + * @param ecModel + * @return {point: [x, y], el: ...} point Will not be null. + */ + + function findPointFromSeries(finder, ecModel) { + var point = []; + var seriesIndex = finder.seriesIndex; + var seriesModel; + + if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) { + return { + point: [] + }; + } + + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, finder); + + if (dataIndex == null || dataIndex < 0 || isArray(dataIndex)) { + return { + point: [] + }; + } + + var el = data.getItemGraphicEl(dataIndex); + var coordSys = seriesModel.coordinateSystem; + + if (seriesModel.getTooltipPosition) { + point = seriesModel.getTooltipPosition(dataIndex) || []; + } else if (coordSys && coordSys.dataToPoint) { + if (finder.isStacked) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueAxisDim = valueAxis.dim; + var baseAxisDim = baseAxis.dim; + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var baseDim = data.mapDimension(baseAxisDim); + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseDim, dataIndex); + stackedData[1 - baseDataOffset] = data.get(data.getCalculationInfo('stackResultDimension'), dataIndex); + point = coordSys.dataToPoint(stackedData) || []; + } else { + point = coordSys.dataToPoint(data.getValues(map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }), dataIndex)) || []; + } + } else if (el) { + // Use graphic bounding rect + var rect = el.getBoundingRect().clone(); + rect.applyTransform(el.transform); + point = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + } + + return { + point: point, + el: el + }; + } + + var inner$e = makeInner(); + /** + * Basic logic: check all axis, if they do not demand show/highlight, + * then hide/downplay them. + * + * @return content of event obj for echarts.connect. + */ + + function axisTrigger(payload, ecModel, api) { + var currTrigger = payload.currTrigger; + var point = [payload.x, payload.y]; + var finder = payload; + var dispatchAction = payload.dispatchAction || bind(api.dispatchAction, api); + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; // Pending + // See #6121. But we are not able to reproduce it yet. + + if (!coordSysAxesInfo) { + return; + } + + if (illegalPoint(point)) { + // Used in the default behavior of `connection`: use the sample seriesIndex + // and dataIndex. And also used in the tooltipView trigger. + point = findPointFromSeries({ + seriesIndex: finder.seriesIndex, + // Do not use dataIndexInside from other ec instance. + // FIXME: auto detect it? + dataIndex: finder.dataIndex + }, ecModel).point; + } + + var isIllegalPoint = illegalPoint(point); // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}). + // Notice: In this case, it is difficult to get the `point` (which is necessary to show + // tooltip, so if point is not given, we just use the point found by sample seriesIndex + // and dataIndex. + + var inputAxesInfo = finder.axesInfo; + var axesInfo = coordSysAxesInfo.axesInfo; + var shouldHide = currTrigger === 'leave' || illegalPoint(point); + var outputPayload = {}; + var showValueMap = {}; + var dataByCoordSys = { + list: [], + map: {} + }; + var updaters = { + showPointer: curry(showPointer, showValueMap), + showTooltip: curry(showTooltip, dataByCoordSys) + }; // Process for triggered axes. + + each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) { + // If a point given, it must be contained by the coordinate system. + var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point); + each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) { + var axis = axisInfo.axis; + var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); // If no inputAxesInfo, no axis is restricted. + + if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) { + var val = inputAxisInfo && inputAxisInfo.value; + + if (val == null && !isIllegalPoint) { + val = axis.pointToData(point); + } + + val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload); + } + }); + }); // Process for linked axes. + + var linkTriggers = {}; + each(axesInfo, function (tarAxisInfo, tarKey) { + var linkGroup = tarAxisInfo.linkGroup; // If axis has been triggered in the previous stage, it should not be triggered by link. + + if (linkGroup && !showValueMap[tarKey]) { + each(linkGroup.axesInfo, function (srcAxisInfo, srcKey) { + var srcValItem = showValueMap[srcKey]; // If srcValItem exist, source axis is triggered, so link to target axis. + + if (srcAxisInfo !== tarAxisInfo && srcValItem) { + var val = srcValItem.value; + linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo)))); + linkTriggers[tarAxisInfo.key] = val; + } + }); + } + }); + each(linkTriggers, function (val, tarKey) { + processOnAxis(axesInfo[tarKey], val, updaters, true, outputPayload); + }); + updateModelActually(showValueMap, axesInfo, outputPayload); + dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction); + dispatchHighDownActually(axesInfo, dispatchAction, api); + return outputPayload; + } + + function processOnAxis(axisInfo, newValue, updaters, noSnap, outputFinder) { + var axis = axisInfo.axis; + + if (axis.scale.isBlank() || !axis.containData(newValue)) { + return; + } + + if (!axisInfo.involveSeries) { + updaters.showPointer(axisInfo, newValue); + return; + } // Heavy calculation. So put it after axis.containData checking. + + + var payloadInfo = buildPayloadsBySeries(newValue, axisInfo); + var payloadBatch = payloadInfo.payloadBatch; + var snapToValue = payloadInfo.snapToValue; // Fill content of event obj for echarts.connect. + // By default use the first involved series data as a sample to connect. + + if (payloadBatch[0] && outputFinder.seriesIndex == null) { + extend(outputFinder, payloadBatch[0]); + } // If no linkSource input, this process is for collecting link + // target, where snap should not be accepted. + + + if (!noSnap && axisInfo.snap) { + if (axis.containData(snapToValue) && snapToValue != null) { + newValue = snapToValue; + } + } + + updaters.showPointer(axisInfo, newValue, payloadBatch); // Tooltip should always be snapToValue, otherwise there will be + // incorrect "axis value ~ series value" mapping displayed in tooltip. + + updaters.showTooltip(axisInfo, payloadInfo, snapToValue); + } + + function buildPayloadsBySeries(value, axisInfo) { + var axis = axisInfo.axis; + var dim = axis.dim; + var snapToValue = value; + var payloadBatch = []; + var minDist = Number.MAX_VALUE; + var minDiff = -1; + each(axisInfo.seriesModels, function (series, idx) { + var dataDim = series.getData().mapDimensionsAll(dim); + var seriesNestestValue; + var dataIndices; + + if (series.getAxisTooltipData) { + var result = series.getAxisTooltipData(dataDim, value, axis); + dataIndices = result.dataIndices; + seriesNestestValue = result.nestestValue; + } else { + dataIndices = series.getData().indicesOfNearest(dataDim[0], value, // Add a threshold to avoid find the wrong dataIndex + // when data length is not same. + // false, + axis.type === 'category' ? 0.5 : null); + + if (!dataIndices.length) { + return; + } + + seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]); + } + + if (seriesNestestValue == null || !isFinite(seriesNestestValue)) { + return; + } + + var diff = value - seriesNestestValue; + var dist = Math.abs(diff); // Consider category case + + if (dist <= minDist) { + if (dist < minDist || diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + snapToValue = seriesNestestValue; + payloadBatch.length = 0; + } + + each(dataIndices, function (dataIndex) { + payloadBatch.push({ + seriesIndex: series.seriesIndex, + dataIndexInside: dataIndex, + dataIndex: series.getData().getRawIndex(dataIndex) + }); + }); + } + }); + return { + payloadBatch: payloadBatch, + snapToValue: snapToValue + }; + } + + function showPointer(showValueMap, axisInfo, value, payloadBatch) { + showValueMap[axisInfo.key] = { + value: value, + payloadBatch: payloadBatch + }; + } + + function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) { + var payloadBatch = payloadInfo.payloadBatch; + var axis = axisInfo.axis; + var axisModel = axis.model; + var axisPointerModel = axisInfo.axisPointerModel; // If no data, do not create anything in dataByCoordSys, + // whose length will be used to judge whether dispatch action. + + if (!axisInfo.triggerTooltip || !payloadBatch.length) { + return; + } + + var coordSysModel = axisInfo.coordSys.model; + var coordSysKey = makeKey(coordSysModel); + var coordSysItem = dataByCoordSys.map[coordSysKey]; + + if (!coordSysItem) { + coordSysItem = dataByCoordSys.map[coordSysKey] = { + coordSysId: coordSysModel.id, + coordSysIndex: coordSysModel.componentIndex, + coordSysType: coordSysModel.type, + coordSysMainType: coordSysModel.mainType, + dataByAxis: [] + }; + dataByCoordSys.list.push(coordSysItem); + } + + coordSysItem.dataByAxis.push({ + axisDim: axis.dim, + axisIndex: axisModel.componentIndex, + axisType: axisModel.type, + axisId: axisModel.id, + value: value, + // Caustion: viewHelper.getValueLabel is actually on "view stage", which + // depends that all models have been updated. So it should not be performed + // here. Considering axisPointerModel used here is volatile, which is hard + // to be retrieve in TooltipView, we prepare parameters here. + valueLabelOpt: { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }, + seriesDataIndices: payloadBatch.slice() + }); + } + + function updateModelActually(showValueMap, axesInfo, outputPayload) { + var outputAxesInfo = outputPayload.axesInfo = []; // Basic logic: If no 'show' required, 'hide' this axisPointer. + + each(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + var valItem = showValueMap[key]; + + if (valItem) { + !axisInfo.useHandle && (option.status = 'show'); + option.value = valItem.value; // For label formatter param and highlight. + + option.seriesDataIndices = (valItem.payloadBatch || []).slice(); + } // When always show (e.g., handle used), remain + // original value and status. + else { + // If hide, value still need to be set, consider + // click legend to toggle axis blank. + !axisInfo.useHandle && (option.status = 'hide'); + } // If status is 'hide', should be no info in payload. + + + option.status === 'show' && outputAxesInfo.push({ + axisDim: axisInfo.axis.dim, + axisIndex: axisInfo.axis.model.componentIndex, + value: option.value + }); + }); + } + + function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) { + // Basic logic: If no showTip required, hideTip will be dispatched. + if (illegalPoint(point) || !dataByCoordSys.list.length) { + dispatchAction({ + type: 'hideTip' + }); + return; + } // In most case only one axis (or event one series is used). It is + // convinient to fetch payload.seriesIndex and payload.dataIndex + // dirtectly. So put the first seriesIndex and dataIndex of the first + // axis on the payload. + + + var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; + dispatchAction({ + type: 'showTip', + escapeConnect: true, + x: point[0], + y: point[1], + tooltipOption: payload.tooltipOption, + position: payload.position, + dataIndexInside: sampleItem.dataIndexInside, + dataIndex: sampleItem.dataIndex, + seriesIndex: sampleItem.seriesIndex, + dataByCoordSys: dataByCoordSys.list + }); + } + + function dispatchHighDownActually(axesInfo, dispatchAction, api) { + // FIXME + // highlight status modification shoule be a stage of main process? + // (Consider confilct (e.g., legend and axisPointer) and setOption) + var zr = api.getZr(); + var highDownKey = 'axisPointerLastHighlights'; + var lastHighlights = inner$e(zr)[highDownKey] || {}; + var newHighlights = inner$e(zr)[highDownKey] = {}; // Update highlight/downplay status according to axisPointer model. + // Build hash map and remove duplicate incidentally. + + each(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + option.status === 'show' && each(option.seriesDataIndices, function (batchItem) { + var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex; + newHighlights[key] = batchItem; + }); + }); // Diff. + + var toHighlight = []; + var toDownplay = []; + each(lastHighlights, function (batchItem, key) { + !newHighlights[key] && toDownplay.push(batchItem); + }); + each(newHighlights, function (batchItem, key) { + !lastHighlights[key] && toHighlight.push(batchItem); + }); + toDownplay.length && api.dispatchAction({ + type: 'downplay', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toDownplay + }); + toHighlight.length && api.dispatchAction({ + type: 'highlight', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toHighlight + }); + } + + function findInputAxisInfo(inputAxesInfo, axisInfo) { + for (var i = 0; i < (inputAxesInfo || []).length; i++) { + var inputAxisInfo = inputAxesInfo[i]; + + if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) { + return inputAxisInfo; + } + } + } + + function makeMapperParam(axisInfo) { + var axisModel = axisInfo.axis.model; + var item = {}; + var dim = item.axisDim = axisInfo.axis.dim; + item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex; + item.axisName = item[dim + 'AxisName'] = axisModel.name; + item.axisId = item[dim + 'AxisId'] = axisModel.id; + return item; + } + + function illegalPoint(point) { + return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]); + } + + function install$s(registers) { + // CartesianAxisPointer is not supposed to be required here. But consider + // echarts.simple.js and online build tooltip, which only require gridSimple, + // CartesianAxisPointer should be able to required somewhere. + AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer); + registers.registerComponentModel(AxisPointerModel); + registers.registerComponentView(AxisPointerView); + registers.registerPreprocessor(function (option) { + // Always has a global axisPointerModel for default setting. + if (option) { + (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {}); + var link = option.axisPointer.link; // Normalize to array to avoid object mergin. But if link + // is not set, remain null/undefined, otherwise it will + // override existent link setting. + + if (link && !isArray(link)) { + option.axisPointer.link = [link]; + } + } + }); // This process should proformed after coordinate systems created + // and series data processed. So put it on statistic processing stage. + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) { + // Build axisPointerModel, mergin tooltip.axisPointer model for each axis. + // allAxesInfo should be updated when setOption performed. + ecModel.getComponent('axisPointer').coordSysAxesInfo = collect(ecModel, api); + }); // Broadcast to all views. + + registers.registerAction({ + type: 'updateAxisPointer', + event: 'updateAxisPointer', + update: ':updateAxisPointer' + }, axisTrigger); + } + + function install$t(registers) { + use(install$5); + use(install$s); + } + + var PolarAxisPointer = + /** @class */ + function (_super) { + __extends(PolarAxisPointer, _super); + + function PolarAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + PolarAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + + if (axis.dim === 'angle') { + this.animationThreshold = Math.PI / 18; + } + + var polar = axis.polar; + var otherAxis = polar.getOtherAxis(axis); + var otherExtent = otherAxis.getExtent(); + var coordValue = axis.dataToCoord(value); + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$1[axisPointerType](axis, polar, coordValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var labelMargin = axisPointerModel.get(['label', 'margin']); + var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos); + }; + + return PolarAxisPointer; + }(BaseAxisPointer); + + function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) { + var axis = axisModel.axis; + var coord = axis.dataToCoord(value); + var axisAngle = polar.getAngleAxis().getExtent()[0]; + axisAngle = axisAngle / 180 * Math.PI; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var position; + var align; + var verticalAlign; + + if (axis.dim === 'radius') { + var transform = create$1(); + rotate(transform, transform, axisAngle); + translate(transform, transform, [polar.cx, polar.cy]); + position = applyTransform$1([coord, -labelMargin], transform); + var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0; // @ts-ignore + + var labelLayout = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1); + align = labelLayout.textAlign; + verticalAlign = labelLayout.textVerticalAlign; + } else { + // angle axis + var r = radiusExtent[1]; + position = polar.coordToPoint([r + labelMargin, coord]); + var cx = polar.cx; + var cy = polar.cy; + align = Math.abs(position[0] - cx) / r < 0.3 ? 'center' : position[0] > cx ? 'left' : 'right'; + verticalAlign = Math.abs(position[1] - cy) / r < 0.3 ? 'middle' : position[1] > cy ? 'top' : 'bottom'; + } + + return { + position: position, + align: align, + verticalAlign: verticalAlign + }; + } + + var pointerShapeBuilder$1 = { + line: function (axis, polar, coordValue, otherExtent) { + return axis.dim === 'angle' ? { + type: 'Line', + shape: makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue])) + } : { + type: 'Circle', + shape: { + cx: polar.cx, + cy: polar.cy, + r: coordValue + } + }; + }, + shadow: function (axis, polar, coordValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var radian = Math.PI / 180; + return axis.dim === 'angle' ? { + type: 'Sector', + shape: makeSectorShape(polar.cx, polar.cy, otherExtent[0], otherExtent[1], // In ECharts y is negative if angle is positive + (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian) + } : { + type: 'Sector', + shape: makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2) + }; + } + }; + + var PolarModel = + /** @class */ + function (_super) { + __extends(PolarModel, _super); + + function PolarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PolarModel.type; + return _this; + } + + PolarModel.prototype.findAxisModel = function (axisType) { + var foundAxisModel; + var ecModel = this.ecModel; + ecModel.eachComponent(axisType, function (axisModel) { + if (axisModel.getCoordSysModel() === this) { + foundAxisModel = axisModel; + } + }, this); + return foundAxisModel; + }; + + PolarModel.type = 'polar'; + PolarModel.dependencies = ['radiusAxis', 'angleAxis']; + PolarModel.defaultOption = { + zlevel: 0, + z: 0, + center: ['50%', '50%'], + radius: '80%' + }; + return PolarModel; + }(ComponentModel); + + var PolarAxisModel = + /** @class */ + function (_super) { + __extends(PolarAxisModel, _super); + + function PolarAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + PolarAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + }; + + PolarAxisModel.type = 'polarAxis'; + return PolarAxisModel; + }(ComponentModel); + + mixin(PolarAxisModel, AxisModelCommonMixin); + + var AngleAxisModel = + /** @class */ + function (_super) { + __extends(AngleAxisModel, _super); + + function AngleAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AngleAxisModel.type; + return _this; + } + + AngleAxisModel.type = 'angleAxis'; + return AngleAxisModel; + }(PolarAxisModel); + + var RadiusAxisModel = + /** @class */ + function (_super) { + __extends(RadiusAxisModel, _super); + + function RadiusAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadiusAxisModel.type; + return _this; + } + + RadiusAxisModel.type = 'radiusAxis'; + return RadiusAxisModel; + }(PolarAxisModel); + + var RadiusAxis = + /** @class */ + function (_super) { + __extends(RadiusAxis, _super); + + function RadiusAxis(scale, radiusExtent) { + return _super.call(this, 'radius', scale, radiusExtent) || this; + } + + RadiusAxis.prototype.pointToData = function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }; + + return RadiusAxis; + }(Axis); + + RadiusAxis.prototype.dataToRadius = Axis.prototype.dataToCoord; + RadiusAxis.prototype.radiusToData = Axis.prototype.coordToData; + + var inner$f = makeInner(); + + var AngleAxis = + /** @class */ + function (_super) { + __extends(AngleAxis, _super); + + function AngleAxis(scale, angleExtent) { + return _super.call(this, 'angle', scale, angleExtent || [0, 360]) || this; + } + + AngleAxis.prototype.pointToData = function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }; + /** + * Only be called in category axis. + * Angle axis uses text height to decide interval + * + * @override + * @return {number} Auto interval for cateogry axis tick and label + */ + + + AngleAxis.prototype.calculateCategoryInterval = function () { + var axis = this; + var labelModel = axis.getLabelModel(); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitH = Math.abs(unitSpan); // Not precise, just use height as text width + // and each distance from axis line yet. + + var rect = getBoundingRect(tickValue == null ? '' : tickValue + '', labelModel.getFont(), 'center', 'top'); + var maxH = Math.max(rect.height, 7); + var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity. + + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(dh)); + var cache = inner$f(axis.model); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval) { + interval = lastAutoInterval; + } // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + } + + return interval; + }; + + return AngleAxis; + }(Axis); + + AngleAxis.prototype.dataToAngle = Axis.prototype.dataToCoord; + AngleAxis.prototype.angleToData = Axis.prototype.coordToData; + + var Polar = + /** @class */ + function () { + function Polar(name) { + this.dimensions = ['radius', 'angle']; + this.type = 'polar'; + /** + * x of polar center + */ + + this.cx = 0; + /** + * y of polar center + */ + + this.cy = 0; + this._radiusAxis = new RadiusAxis(); + this._angleAxis = new AngleAxis(); + this.axisPointerEnabled = true; + this.name = name || ''; + this._radiusAxis.polar = this._angleAxis.polar = this; + } + /** + * If contain coord + */ + + + Polar.prototype.containPoint = function (point) { + var coord = this.pointToCoord(point); + return this._radiusAxis.contain(coord[0]) && this._angleAxis.contain(coord[1]); + }; + /** + * If contain data + */ + + + Polar.prototype.containData = function (data) { + return this._radiusAxis.containData(data[0]) && this._angleAxis.containData(data[1]); + }; + + Polar.prototype.getAxis = function (dim) { + var key = '_' + dim + 'Axis'; + return this[key]; + }; + + Polar.prototype.getAxes = function () { + return [this._radiusAxis, this._angleAxis]; + }; + /** + * Get axes by type of scale + */ + + + Polar.prototype.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; + }; + + Polar.prototype.getAngleAxis = function () { + return this._angleAxis; + }; + + Polar.prototype.getRadiusAxis = function () { + return this._radiusAxis; + }; + + Polar.prototype.getOtherAxis = function (axis) { + var angleAxis = this._angleAxis; + return axis === angleAxis ? this._radiusAxis : angleAxis; + }; + /** + * Base axis will be used on stacking. + * + */ + + + Polar.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAngleAxis(); + }; + + Polar.prototype.getTooltipAxes = function (dim) { + var baseAxis = dim != null && dim !== 'auto' ? this.getAxis(dim) : this.getBaseAxis(); + return { + baseAxes: [baseAxis], + otherAxes: [this.getOtherAxis(baseAxis)] + }; + }; + /** + * 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 + */ + + + Polar.prototype.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 + */ + + + Polar.prototype.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 + */ + + + Polar.prototype.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 + */ + + + Polar.prototype.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]; + }; + /** + * Get ring area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + + + Polar.prototype.getArea = function () { + var angleAxis = this.getAngleAxis(); + var radiusAxis = this.getRadiusAxis(); + var radiusExtent = radiusAxis.getExtent().slice(); + radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse(); + var angleExtent = angleAxis.getExtent(); + var RADIAN = Math.PI / 180; + return { + cx: this.cx, + cy: this.cy, + r0: radiusExtent[0], + r: radiusExtent[1], + startAngle: -angleExtent[0] * RADIAN, + endAngle: -angleExtent[1] * RADIAN, + clockwise: angleAxis.inverse, + contain: function (x, y) { + // It's a ring shape. + // Start angle and end angle don't matter + var dx = x - this.cx; + var dy = y - this.cy; + var d2 = dx * dx + dy * dy; + var r = this.r; + var r0 = this.r0; + return d2 <= r * r && d2 >= r0 * r0; + } + }; + }; + + Polar.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$2(finder); + return coordSys === this ? this.dataToPoint(value) : null; + }; + + Polar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$2(finder); + return coordSys === this ? this.pointToData(pixel) : null; + }; + + return Polar; + }(); + + function getCoordSys$2(finder) { + var seriesModel = finder.seriesModel; + var polarModel = finder.polarModel; + return polarModel && polarModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; + } + + /** + * Resize method bound to the polar + */ + + function resizePolar(polar, polarModel, api) { + var center = polarModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + polar.cx = parsePercent$1(center[0], width); + polar.cy = parsePercent$1(center[1], height); + var radiusAxis = polar.getRadiusAxis(); + var size = Math.min(width, height) / 2; + var radius = polarModel.get('radius'); + + if (radius == null) { + radius = [0, '100%']; + } else if (!isArray(radius)) { + // r0 = 0 + radius = [0, radius]; + } + + var parsedRadius = [parsePercent$1(radius[0], size), parsePercent$1(radius[1], size)]; + radiusAxis.inverse ? radiusAxis.setExtent(parsedRadius[1], parsedRadius[0]) : radiusAxis.setExtent(parsedRadius[0], parsedRadius[1]); + } + /** + * 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_1 = seriesModel.getData(); + each(getDataDimensionsOnAxis(data_1, 'radius'), function (dim) { + radiusAxis.scale.unionExtentFromData(data_1, dim); + }); + each(getDataDimensionsOnAxis(data_1, 'angle'), function (dim) { + angleAxis.scale.unionExtentFromData(data_1, dim); + }); + } + }); + niceScaleExtent(angleAxis.scale, angleAxis.model); + niceScaleExtent(radiusAxis.scale, 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]); + } + } + + function isAngleAxisModel(axisModel) { + return axisModel.mainType === 'angleAxis'; + } + /** + * Set common axis properties + */ + + + function setAxis(axis, axisModel) { + axis.type = axisModel.get('type'); + axis.scale = createScaleByModel(axisModel); + axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category'; + axis.inverse = axisModel.get('inverse'); + + if (isAngleAxisModel(axisModel)) { + axis.inverse = axis.inverse !== axisModel.get('clockwise'); + var startAngle = axisModel.get('startAngle'); + 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.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); + resizePolar(polar, polarModel, api); + polarList.push(polar); + polarModel.coordinateSystem = polar; + polar.model = polarModel; + }); // Inject coordinateSystem to series + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'polar') { + var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!polarModel) { + throw new Error('Polar "' + retrieve(seriesModel.get('polarIndex'), seriesModel.get('polarId'), 0) + '" not found'); + } + } + + seriesModel.coordinateSystem = polarModel.coordinateSystem; + } + }); + return polarList; + } + }; + + var elementList$1 = ['axisLine', 'axisLabel', 'axisTick', 'minorTick', 'splitLine', 'minorSplitLine', 'splitArea']; + + function getAxisLineShape(polar, rExtent, angle) { + rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse()); + var start = polar.coordToPoint([rExtent[0], angle]); + var end = polar.coordToPoint([rExtent[1], angle]); + return { + x1: start[0], + y1: start[1], + x2: end[0], + y2: end[1] + }; + } + + function getRadiusIdx(polar) { + var radiusAxis = polar.getRadiusAxis(); + return radiusAxis.inverse ? 0 : 1; + } // Remove the last tick which will overlap the first tick + + + function fixAngleOverlap(list) { + var firstItem = list[0]; + var lastItem = list[list.length - 1]; + + if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) { + list.pop(); + } + } + + var AngleAxisView = + /** @class */ + function (_super) { + __extends(AngleAxisView, _super); + + function AngleAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AngleAxisView.type; + _this.axisPointerClass = 'PolarAxisPointer'; + return _this; + } + + AngleAxisView.prototype.render = function (angleAxisModel, ecModel) { + this.group.removeAll(); + + if (!angleAxisModel.get('show')) { + return; + } + + var angleAxis = angleAxisModel.axis; + var polar = angleAxis.polar; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var ticksAngles = angleAxis.getTicksCoords(); + var minorTickAngles = angleAxis.getMinorTicksCoords(); + var labels = map(angleAxis.getViewLabels(), function (labelItem) { + labelItem = clone(labelItem); + var scale = angleAxis.scale; + var tickValue = scale.type === 'ordinal' ? scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + labelItem.coord = angleAxis.dataToCoord(tickValue); + return labelItem; + }); + fixAngleOverlap(labels); + fixAngleOverlap(ticksAngles); + each(elementList$1, function (name) { + if (angleAxisModel.get([name, 'show']) && (!angleAxis.scale.isBlank() || name === 'axisLine')) { + angelAxisElementsBuilders[name](this.group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels); + } + }, this); + }; + + AngleAxisView.type = 'angleAxis'; + return AngleAxisView; + }(AxisView); + + var angelAxisElementsBuilders = { + axisLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var lineStyleModel = angleAxisModel.getModel(['axisLine', 'lineStyle']); // extent id of the axis radius (r0 and r) + + var rId = getRadiusIdx(polar); + var r0Id = rId ? 0 : 1; + var shape; + + if (radiusExtent[r0Id] === 0) { + shape = new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[rId] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + } else { + shape = new Ring({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[rId], + r0: radiusExtent[r0Id] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + } + + shape.style.fill = null; + group.add(shape); + }, + axisTick: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var tickModel = angleAxisModel.getModel('axisTick'); + var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + var lines = map(ticksAngles, function (tickAngleItem) { + return new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord) + }); + }); + group.add(mergePath$1(lines, { + style: defaults(tickModel.getModel('lineStyle').getLineStyle(), { + stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) + }) + })); + }, + minorTick: function (group, angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) { + if (!minorTickAngles.length) { + return; + } + + var tickModel = angleAxisModel.getModel('axisTick'); + var minorTickModel = angleAxisModel.getModel('minorTick'); + var tickLen = (tickModel.get('inside') ? -1 : 1) * minorTickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + var lines = []; + + for (var i = 0; i < minorTickAngles.length; i++) { + for (var k = 0; k < minorTickAngles[i].length; k++) { + lines.push(new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord) + })); + } + } + + group.add(mergePath$1(lines, { + style: defaults(minorTickModel.getModel('lineStyle').getLineStyle(), defaults(tickModel.getLineStyle(), { + stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) + })) + })); + }, + axisLabel: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) { + var rawCategoryData = angleAxisModel.getCategories(true); + var commonLabelModel = angleAxisModel.getModel('axisLabel'); + var labelMargin = commonLabelModel.get('margin'); + var triggerEvent = angleAxisModel.get('triggerEvent'); // Use length of ticksAngles because it may remove the last tick to avoid overlapping + + each(labels, function (labelItem, idx) { + var labelModel = commonLabelModel; + var tickValue = labelItem.tickValue; + var r = radiusExtent[getRadiusIdx(polar)]; + var p = polar.coordToPoint([r + labelMargin, labelItem.coord]); + 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 labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? 'middle' : p[1] > cy ? 'top' : 'bottom'; + + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + + if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) { + labelModel = new Model(rawCategoryItem.textStyle, commonLabelModel, commonLabelModel.ecModel); + } + } + + var textEl = new ZRText({ + silent: AxisBuilder.isLabelSilent(angleAxisModel), + style: createTextStyle(labelModel, { + x: p[0], + y: p[1], + fill: labelModel.getTextColor() || angleAxisModel.get(['axisLine', 'lineStyle', 'color']), + text: labelItem.formattedLabel, + align: labelTextAlign, + verticalAlign: labelTextVerticalAlign + }) + }); + group.add(textEl); // Pack data for mouse event + + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel); + eventData.targetType = 'axisLabel'; + eventData.value = labelItem.rawLabel; + getECData(textEl).eventData = eventData; + } + }, this); + }, + splitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, 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 Line({ + shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord) + })); + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitLines.length; i++) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyleModel.getLineStyle()), + silent: true, + z: angleAxisModel.get('z') + })); + } + }, + minorSplitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + if (!minorTickAngles.length) { + return; + } + + var minorSplitLineModel = angleAxisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var lines = []; + + for (var i = 0; i < minorTickAngles.length; i++) { + for (var k = 0; k < minorTickAngles[i].length; k++) { + lines.push(new Line({ + shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord) + })); + } + } + + group.add(mergePath$1(lines, { + style: lineStyleModel.getLineStyle(), + silent: true, + z: angleAxisModel.get('z') + })); + }, + splitArea: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + if (!ticksAngles.length) { + return; + } + + 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].coord * 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, len = ticksAngles.length; i <= len; i++) { + var coord = i === len ? ticksAngles[0].coord : ticksAngles[i].coord; + var colorIndex = lineCount++ % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: r0, + r: r1, + startAngle: prevAngle, + endAngle: -coord * RADIAN, + clockwise: clockwise + }, + silent: true + })); + prevAngle = -coord * RADIAN; + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitAreas.length; i++) { + group.add(mergePath$1(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }; + + var axisBuilderAttrs$2 = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs$1 = ['splitLine', 'splitArea', 'minorSplitLine']; + + var RadiusAxisView = + /** @class */ + function (_super) { + __extends(RadiusAxisView, _super); + + function RadiusAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadiusAxisView.type; + _this.axisPointerClass = 'PolarAxisPointer'; + return _this; + } + + RadiusAxisView.prototype.render = function (radiusAxisModel, ecModel) { + this.group.removeAll(); + + if (!radiusAxisModel.get('show')) { + return; + } + + var oldAxisGroup = this._axisGroup; + var newAxisGroup = this._axisGroup = new Group(); + this.group.add(newAxisGroup); + var radiusAxis = radiusAxisModel.axis; + var polar = radiusAxis.polar; + var angleAxis = polar.getAngleAxis(); + var ticksCoords = radiusAxis.getTicksCoords(); + var minorTicksCoords = radiusAxis.getMinorTicksCoords(); + var axisAngle = angleAxis.getExtent()[0]; + var radiusExtent = radiusAxis.getExtent(); + var layout = layoutAxis(polar, radiusAxisModel, axisAngle); + var axisBuilder = new AxisBuilder(radiusAxisModel, layout); + each(axisBuilderAttrs$2, axisBuilder.add, axisBuilder); + newAxisGroup.add(axisBuilder.getGroup()); + groupTransition(oldAxisGroup, newAxisGroup, radiusAxisModel); + each(selfBuilderAttrs$1, function (name) { + if (radiusAxisModel.get([name, 'show']) && !radiusAxis.scale.isBlank()) { + axisElementBuilders$1[name](this.group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords); + } + }, this); + }; + + RadiusAxisView.type = 'radiusAxis'; + return RadiusAxisView; + }(AxisView); + + var axisElementBuilders$1 = { + splitLine: function (group, 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 Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: ticksCoords[i].coord + } + })); + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitLines.length; i++) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length], + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + } + }, + minorSplitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords) { + if (!minorTicksCoords.length) { + return; + } + + var minorSplitLineModel = radiusAxisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var lines = []; + + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + lines.push(new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: minorTicksCoords[i][k].coord + } + })); + } + } + + group.add(mergePath$1(lines, { + style: defaults({ + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + }, + splitArea: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + if (!ticksCoords.length) { + return; + } + + 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].coord; + + for (var i = 1; i < ticksCoords.length; i++) { + var colorIndex = lineCount++ % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: prevRadius, + r: ticksCoords[i].coord, + startAngle: 0, + endAngle: Math.PI * 2 + }, + silent: true + })); + prevRadius = ticksCoords[i].coord; + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitAreas.length; i++) { + group.add(mergePath$1(splitAreas[i], { + style: 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, + labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'), + // Over splitLine and splitArea + z2: 1 + }; + } + + function getSeriesStackId$1(seriesModel) { + return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex; + } + + function getAxisKey$1(polar, axis) { + return axis.dim + polar.model.componentIndex; + } + + function barLayoutPolar(seriesType, ecModel, api) { + var lastStackCoords = {}; + var barWidthAndOffset = calRadialBar(filter(ecModel.getSeriesByType(seriesType), function (seriesModel) { + return !ecModel.isSeriesFiltered(seriesModel) && seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'polar'; + })); + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for polar only + if (seriesModel.coordinateSystem.type !== 'polar') { + return; + } + + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + var axisKey = getAxisKey$1(polar, baseAxis); + var stackId = getSeriesStackId$1(seriesModel); + var columnLayoutInfo = barWidthAndOffset[axisKey][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = polar.getOtherAxis(baseAxis); + var cx = seriesModel.coordinateSystem.cx; + var cy = seriesModel.coordinateSystem.cy; + var barMinHeight = seriesModel.get('barMinHeight') || 0; + var barMinAngle = seriesModel.get('barMinAngle') || 0; + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var stacked = isDimensionStacked(data, valueDim + /*, baseDim*/ + ); + var clampLayout = baseAxis.dim !== 'radius' || !seriesModel.get('roundCap', true); + var valueAxisStart = valueAxis.dataToCoord(0); + + for (var idx = 0, len = data.count(); idx < len; idx++) { + var value = data.get(valueDim, idx); + var baseValue = data.get(baseDim, idx); + var sign = value >= 0 ? 'p' : 'n'; + var baseCoord = valueAxisStart; // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + // Only ordinal axis can be stacked. + + if (stacked) { + if (!lastStackCoords[stackId][baseValue]) { + lastStackCoords[stackId][baseValue] = { + p: valueAxisStart, + n: valueAxisStart // Negative stack + + }; + } // Should also consider #4243 + + + baseCoord = lastStackCoords[stackId][baseValue][sign]; + } + + var r0 = void 0; + var r = void 0; + var startAngle = void 0; + var endAngle = void 0; // radial sector + + if (valueAxis.dim === 'radius') { + var radiusSpan = valueAxis.dataToCoord(value) - valueAxisStart; + var angle = baseAxis.dataToCoord(baseValue); + + if (Math.abs(radiusSpan) < barMinHeight) { + radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight; + } + + r0 = baseCoord; + r = baseCoord + radiusSpan; + startAngle = angle - columnOffset; + endAngle = startAngle - columnWidth; + stacked && (lastStackCoords[stackId][baseValue][sign] = r); + } // tangential sector + else { + var angleSpan = valueAxis.dataToCoord(value, clampLayout) - valueAxisStart; + var radius = baseAxis.dataToCoord(baseValue); + + if (Math.abs(angleSpan) < barMinAngle) { + angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle; + } + + r0 = radius + columnOffset; + r = r0 + columnWidth; + startAngle = baseCoord; + endAngle = baseCoord + angleSpan; // if the previous stack is at the end of the ring, + // add a round to differentiate it from origin + // let extent = angleAxis.getExtent(); + // let stackCoord = angle; + // if (stackCoord === extent[0] && value > 0) { + // stackCoord = extent[1]; + // } + // else if (stackCoord === extent[1] && value < 0) { + // stackCoord = extent[0]; + // } + + stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle); + } + + data.setItemLayout(idx, { + cx: cx, + cy: cy, + r0: r0, + r: r, + // Consider that positive angle is anti-clockwise, + // while positive radian of sector is clockwise + startAngle: -startAngle * Math.PI / 180, + endAngle: -endAngle * Math.PI / 180 + }); + } + }); + } + /** + * Calculate bar width and offset for radial bar charts + */ + + + function calRadialBar(barSeries) { + // Columns info on each category axis. Key is polar name + var columnsMap = {}; + each(barSeries, function (seriesModel, idx) { + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + var axisKey = getAxisKey$1(polar, baseAxis); + var axisExtent = baseAxis.getExtent(); + var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = getSeriesStackId$1(seriesModel); + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + + 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 = {}; + each(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent$1(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 + + each(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + + if (maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + + if (column.width) { + maxWidth = Math.min(maxWidth, column.width); + } + + 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; + 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; + each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; + } + + var angleAxisExtraOption = { + startAngle: 90, + clockwise: true, + splitNumber: 12, + axisLabel: { + rotate: 0 + } + }; + var radiusAxisExtraOption = { + splitNumber: 5 + }; + + var PolarView = + /** @class */ + function (_super) { + __extends(PolarView, _super); + + function PolarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PolarView.type; + return _this; + } + + PolarView.type = 'polar'; + return PolarView; + }(ComponentView); + + function install$u(registers) { + use(install$s); + AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer); + registers.registerCoordinateSystem('polar', polarCreator); + registers.registerComponentModel(PolarModel); + registers.registerComponentView(PolarView); // Model and view for angleAxis and radiusAxis + + axisModelCreator(registers, 'angle', AngleAxisModel, angleAxisExtraOption); + axisModelCreator(registers, 'radius', RadiusAxisModel, radiusAxisExtraOption); + registers.registerComponentView(AngleAxisView); + registers.registerComponentView(RadiusAxisView); + registers.registerLayout(curry(barLayoutPolar, 'bar')); + } + + function layout$2(axisModel, opt) { + opt = opt || {}; + var single = axisModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var axisPosition = axis.position; + var orient = axis.orient; + var rect = single.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var positionMap = { + horizontal: { + top: rectBound[2], + bottom: rectBound[3] + }, + vertical: { + left: rectBound[0], + right: rectBound[1] + } + }; + layout.position = [orient === 'vertical' ? positionMap.vertical[axisPosition] : rectBound[0], orient === 'horizontal' ? positionMap.horizontal[axisPosition] : rectBound[3]]; + var r = { + horizontal: 0, + vertical: 1 + }; + layout.rotation = Math.PI / 2 * r[orient]; + var directionMap = { + top: -1, + bottom: 1, + right: 1, + left: -1 + }; + layout.labelDirection = layout.tickDirection = layout.nameDirection = directionMap[axisPosition]; + + if (axisModel.get(['axisTick', 'inside'])) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { + layout.labelDirection = -layout.labelDirection; + } + + var labelRotation = opt.rotate; + labelRotation == null && (labelRotation = axisModel.get(['axisLabel', 'rotate'])); + layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation; + layout.z2 = 1; + return layout; + } + + var axisBuilderAttrs$3 = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs$2 = ['splitArea', 'splitLine']; + + var SingleAxisView = + /** @class */ + function (_super) { + __extends(SingleAxisView, _super); + + function SingleAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleAxisView.type; + _this.axisPointerClass = 'SingleAxisPointer'; + return _this; + } + + SingleAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + var group = this.group; + group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + var layout = layout$2(axisModel); + var axisBuilder = new AxisBuilder(axisModel, layout); + each(axisBuilderAttrs$3, axisBuilder.add, axisBuilder); + group.add(this._axisGroup); + group.add(axisBuilder.getGroup()); + each(selfBuilderAttrs$2, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders$2[name](this, this.group, this._axisGroup, axisModel); + } + }, this); + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + + SingleAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + + SingleAxisView.type = 'singleAxis'; + return SingleAxisView; + }(AxisView); + + var axisElementBuilders$2 = { + splitLine: function (axisView, group, axisGroup, axisModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var gridRect = axisModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var splitLines = []; + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + + for (var i = 0; i < ticksCoords.length; ++i) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + 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 Line({ + subPixelOptimize: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + silent: true + })); + } + + var lineStyle = lineStyleModel.getLineStyle(['color']); + + for (var i = 0; i < splitLines.length; ++i) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyle), + silent: true + })); + } + }, + splitArea: function (axisView, group, axisGroup, axisModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel); + } + }; + + var SingleAxisModel = + /** @class */ + function (_super) { + __extends(SingleAxisModel, _super); + + function SingleAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleAxisModel.type; + return _this; + } + + SingleAxisModel.prototype.getCoordSysModel = function () { + return this; + }; + + SingleAxisModel.type = 'singleAxis'; + SingleAxisModel.layoutMode = 'box'; + SingleAxisModel.defaultOption = { + left: '5%', + top: '5%', + right: '5%', + bottom: '5%', + type: 'value', + position: 'bottom', + orient: 'horizontal', + axisLine: { + show: true, + lineStyle: { + width: 1, + type: 'solid' + } + }, + // Single coordinate system and single axis is the, + // which is used as the parent tooltip model. + // same model, so we set default tooltip show as true. + tooltip: { + show: true + }, + axisTick: { + show: true, + length: 6, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + interval: 'auto' + }, + splitLine: { + show: true, + lineStyle: { + type: 'dashed', + opacity: 0.2 + } + } + }; + return SingleAxisModel; + }(ComponentModel); + + mixin(SingleAxisModel, AxisModelCommonMixin.prototype); + + var SingleAxis = + /** @class */ + function (_super) { + __extends(SingleAxis, _super); + + function SingleAxis(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + /** + * Judge the orient of the axis. + */ + + + SingleAxis.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + + SingleAxis.prototype.pointToData = function (point, clamp) { + return this.coordinateSystem.pointToData(point)[0]; + }; + + return SingleAxis; + }(Axis); + + /** + * Create a single coordinates system. + */ + + var Single = + /** @class */ + function () { + function Single(axisModel, ecModel, api) { + this.type = 'single'; + this.dimension = 'single'; + /** + * Add it just for draw tooltip. + */ + + this.dimensions = ['single']; + this.axisPointerEnabled = true; + this.model = axisModel; + + this._init(axisModel, ecModel, api); + } + /** + * Initialize single coordinate system. + */ + + + Single.prototype._init = function (axisModel, ecModel, api) { + var dim = this.dimension; + var axis = new SingleAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisModel.get('position')); + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + axis.orient = axisModel.get('orient'); + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = this; + this._axis = axis; + }; + /** + * Update axis scale after data processed + */ + + + Single.prototype.update = function (ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === this) { + var data_1 = seriesModel.getData(); + each(data_1.mapDimensionsAll(this.dimension), function (dim) { + this._axis.scale.unionExtentFromData(data_1, dim); + }, this); + niceScaleExtent(this._axis.scale, this._axis.model); + } + }, this); + }; + /** + * Resize the single coordinate system. + */ + + + Single.prototype.resize = function (axisModel, api) { + this._rect = getLayoutRect({ + left: axisModel.get('left'), + top: axisModel.get('top'), + right: axisModel.get('right'), + bottom: axisModel.get('bottom'), + width: axisModel.get('width'), + height: axisModel.get('height') + }, { + width: api.getWidth(), + height: api.getHeight() + }); + + this._adjustAxis(); + }; + + Single.prototype.getRect = function () { + return this._rect; + }; + + Single.prototype._adjustAxis = function () { + var rect = this._rect; + var axis = this._axis; + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, rect.width] : [0, rect.height]; + var idx = axis.reverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + + this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y); + }; + + Single.prototype._updateAxisTransform = function (axis, coordBase) { + var axisExtent = axis.getExtent(); + var extentSum = axisExtent[0] + axisExtent[1]; + var isHorizontal = axis.isHorizontal(); + axis.toGlobalCoord = isHorizontal ? function (coord) { + return coord + coordBase; + } : function (coord) { + return extentSum - coord + coordBase; + }; + axis.toLocalCoord = isHorizontal ? function (coord) { + return coord - coordBase; + } : function (coord) { + return extentSum - coord + coordBase; + }; + }; + /** + * Get axis. + */ + + + Single.prototype.getAxis = function () { + return this._axis; + }; + /** + * Get axis, add it just for draw tooltip. + */ + + + Single.prototype.getBaseAxis = function () { + return this._axis; + }; + + Single.prototype.getAxes = function () { + return [this._axis]; + }; + + Single.prototype.getTooltipAxes = function () { + return { + baseAxes: [this.getAxis()], + // Empty otherAxes + otherAxes: [] + }; + }; + /** + * If contain point. + */ + + + Single.prototype.containPoint = function (point) { + var rect = this.getRect(); + var axis = this.getAxis(); + var orient = axis.orient; + + if (orient === 'horizontal') { + return axis.contain(axis.toLocalCoord(point[0])) && point[1] >= rect.y && point[1] <= rect.y + rect.height; + } else { + return axis.contain(axis.toLocalCoord(point[1])) && point[0] >= rect.y && point[0] <= rect.y + rect.height; + } + }; + + Single.prototype.pointToData = function (point) { + var axis = this.getAxis(); + return [axis.coordToData(axis.toLocalCoord(point[axis.orient === 'horizontal' ? 0 : 1]))]; + }; + /** + * Convert the series data to concrete point. + * Can be [val] | val + */ + + + Single.prototype.dataToPoint = function (val) { + var axis = this.getAxis(); + var rect = this.getRect(); + var pt = []; + var idx = axis.orient === 'horizontal' ? 0 : 1; + + if (val instanceof Array) { + val = val[0]; + } + + pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val)); + pt[1 - idx] = idx === 0 ? rect.y + rect.height / 2 : rect.x + rect.width / 2; + return pt; + }; + + Single.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$3(finder); + return coordSys === this ? this.dataToPoint(value) : null; + }; + + Single.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$3(finder); + return coordSys === this ? this.pointToData(pixel) : null; + }; + + return Single; + }(); + + function getCoordSys$3(finder) { + var seriesModel = finder.seriesModel; + var singleModel = finder.singleAxisModel; + return singleModel && singleModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; + } + + /** + * Create single coordinate system and inject it into seriesModel. + */ + + function create$2(ecModel, api) { + var singles = []; + ecModel.eachComponent('singleAxis', function (axisModel, idx) { + var single = new Single(axisModel, ecModel, api); + single.name = 'single_' + idx; + single.resize(axisModel, api); + axisModel.coordinateSystem = single; + singles.push(single); + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'singleAxis') { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem; + } + }); + return singles; + } + + var singleCreator = { + create: create$2, + dimensions: Single.prototype.dimensions + }; + + var XY = ['x', 'y']; + var WH = ['width', 'height']; + + var SingleAxisPointer = + /** @class */ + function (_super) { + __extends(SingleAxisPointer, _super); + + function SingleAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + SingleAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis)); + var pixelValue = coordSys.dataToPoint(value)[0]; + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$2[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$2(axisModel); + buildCartesianSingleLabelElOption( // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + + + SingleAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$2(axisModel, { + labelInside: false + }); // @ts-ignore + + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var position = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: position[0], + y: position[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + + + SingleAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var dimIndex = getPointDimIndex(axis); + var axisExtent = getGlobalExtent(coordSys, dimIndex); + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: { + verticalAlign: 'middle' + } + }; + }; + + return SingleAxisPointer; + }(BaseAxisPointer); + + var pointerShapeBuilder$2 = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getPointDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = axis.getBandWidth(); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getPointDimIndex(axis)) + }; + } + }; + + function getPointDimIndex(axis) { + return axis.isHorizontal() ? 0 : 1; + } + + function getGlobalExtent(coordSys, dimIndex) { + var rect = coordSys.getRect(); + return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]]; + } + + var SingleView = + /** @class */ + function (_super) { + __extends(SingleView, _super); + + function SingleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleView.type; + return _this; + } + + SingleView.type = 'single'; + return SingleView; + }(ComponentView); + + function install$v(registers) { + use(install$s); + AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer); + registers.registerComponentView(SingleView); // Axis + + registers.registerComponentView(SingleAxisView); + registers.registerComponentModel(SingleAxisModel); + axisModelCreator(registers, 'single', SingleAxisModel, SingleAxisModel.defaultOption); + registers.registerCoordinateSystem('single', singleCreator); + } + + var CalendarModel = + /** @class */ + function (_super) { + __extends(CalendarModel, _super); + + function CalendarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CalendarModel.type; + return _this; + } + /** + * @override + */ + + + CalendarModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + + _super.prototype.init.apply(this, arguments); + + mergeAndNormalizeLayoutParams(option, inputPositionParams); + }; + /** + * @override + */ + + + CalendarModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + mergeAndNormalizeLayoutParams(this.option, option); + }; + + CalendarModel.prototype.getCellSize = function () { + // Has been normalized + return this.option.cellSize; + }; + + CalendarModel.type = 'calendar'; + CalendarModel.defaultOption = { + zlevel: 0, + z: 2, + left: 80, + top: 60, + cellSize: 20, + // horizontal vertical + orient: 'horizontal', + // month separate line style + splitLine: { + show: true, + lineStyle: { + color: '#000', + width: 1, + type: 'solid' + } + }, + // rect style temporarily unused emphasis + itemStyle: { + color: '#fff', + borderWidth: 1, + borderColor: '#ccc' + }, + // week text style + dayLabel: { + show: true, + firstDay: 0, + // start end + position: 'start', + margin: '50%', + nameMap: 'en', + color: '#000' + }, + // month text style + monthLabel: { + show: true, + // start end + position: 'start', + margin: 5, + // center or left + align: 'center', + // cn en [] + nameMap: 'en', + formatter: null, + color: '#000' + }, + // year text style + yearLabel: { + show: true, + // top bottom left right + position: null, + margin: 30, + formatter: null, + color: '#ccc', + fontFamily: 'sans-serif', + fontWeight: 'bolder', + fontSize: 20 + } + }; + return CalendarModel; + }(ComponentModel); + + function mergeAndNormalizeLayoutParams(target, raw) { + // Normalize cellSize + var cellSize = target.cellSize; + var cellSizeArr; + + if (!isArray(cellSize)) { + cellSizeArr = target.cellSize = [cellSize, cellSize]; + } else { + cellSizeArr = cellSize; + } + + if (cellSizeArr.length === 1) { + cellSizeArr[1] = cellSizeArr[0]; + } + + var ignoreSize = map([0, 1], function (hvIdx) { + // If user have set `width` or both `left` and `right`, cellSizeArr + // will be automatically set to 'auto', otherwise the default + // setting of cellSizeArr will make `width` setting not work. + if (sizeCalculable(raw, hvIdx)) { + cellSizeArr[hvIdx] = 'auto'; + } + + return cellSizeArr[hvIdx] != null && cellSizeArr[hvIdx] !== 'auto'; + }); + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: ignoreSize + }); + } + + var MONTH_TEXT = { + EN: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + CN: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'] + }; + var WEEK_TEXT = { + EN: ['S', 'M', 'T', 'W', 'T', 'F', 'S'], + CN: ['日', '一', '二', '三', '四', '五', '六'] + }; + + var CalendarView = + /** @class */ + function (_super) { + __extends(CalendarView, _super); + + function CalendarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CalendarView.type; + return _this; + } + + CalendarView.prototype.render = function (calendarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + var coordSys = calendarModel.coordinateSystem; // range info + + var rangeData = coordSys.getRangeInfo(); + var orient = coordSys.getOrient(); + + this._renderDayRect(calendarModel, rangeData, group); // _renderLines must be called prior to following function + + + this._renderLines(calendarModel, rangeData, orient, group); + + this._renderYearText(calendarModel, rangeData, orient, group); + + this._renderMonthText(calendarModel, orient, group); + + this._renderWeekText(calendarModel, rangeData, orient, group); + }; // render day rect + + + CalendarView.prototype._renderDayRect = function (calendarModel, rangeData, group) { + var coordSys = calendarModel.coordinateSystem; + var itemRectStyleModel = calendarModel.getModel('itemStyle').getItemStyle(); + var sw = coordSys.getCellWidth(); + var sh = coordSys.getCellHeight(); + + for (var i = rangeData.start.time; i <= rangeData.end.time; i = coordSys.getNextNDay(i, 1).time) { + var point = coordSys.dataToRect([i], false).tl; // every rect + + var rect = new Rect({ + shape: { + x: point[0], + y: point[1], + width: sw, + height: sh + }, + cursor: 'default', + style: itemRectStyleModel + }); + group.add(rect); + } + }; // render separate line + + + CalendarView.prototype._renderLines = function (calendarModel, rangeData, orient, group) { + var self = this; + var coordSys = calendarModel.coordinateSystem; + var lineStyleModel = calendarModel.getModel(['splitLine', 'lineStyle']).getLineStyle(); + var show = calendarModel.get(['splitLine', 'show']); + var lineWidth = lineStyleModel.lineWidth; + this._tlpoints = []; + this._blpoints = []; + this._firstDayOfMonth = []; + this._firstDayPoints = []; + var firstDay = rangeData.start; + + for (var i = 0; firstDay.time <= rangeData.end.time; i++) { + addPoints(firstDay.formatedDate); + + if (i === 0) { + firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m); + } + + var date = firstDay.date; + date.setMonth(date.getMonth() + 1); + firstDay = coordSys.getDateInfo(date); + } + + addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate); + + function addPoints(date) { + self._firstDayOfMonth.push(coordSys.getDateInfo(date)); + + self._firstDayPoints.push(coordSys.dataToRect([date], false).tl); + + var points = self._getLinePointsOfOneWeek(calendarModel, date, orient); + + self._tlpoints.push(points[0]); + + self._blpoints.push(points[points.length - 1]); + + show && self._drawSplitline(points, lineStyleModel, group); + } // render top/left line + + + show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group); // render bottom/right line + + show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group); + }; // get points at both ends + + + CalendarView.prototype._getEdgesPoints = function (points, lineWidth, orient) { + var rs = [points[0].slice(), points[points.length - 1].slice()]; + var idx = orient === 'horizontal' ? 0 : 1; // both ends of the line are extend half lineWidth + + rs[0][idx] = rs[0][idx] - lineWidth / 2; + rs[1][idx] = rs[1][idx] + lineWidth / 2; + return rs; + }; // render split line + + + CalendarView.prototype._drawSplitline = function (points, lineStyle, group) { + var poyline = new Polyline({ + z2: 20, + shape: { + points: points + }, + style: lineStyle + }); + group.add(poyline); + }; // render month line of one week points + + + CalendarView.prototype._getLinePointsOfOneWeek = function (calendarModel, date, orient) { + var coordSys = calendarModel.coordinateSystem; + var parsedDate = coordSys.getDateInfo(date); + var points = []; + + for (var i = 0; i < 7; i++) { + var tmpD = coordSys.getNextNDay(parsedDate.time, i); + var point = coordSys.dataToRect([tmpD.time], false); + points[2 * tmpD.day] = point.tl; + points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr']; + } + + return points; + }; + + CalendarView.prototype._formatterLabel = function (formatter, params) { + if (typeof formatter === 'string' && formatter) { + return formatTplSimple(formatter, params); + } + + if (typeof formatter === 'function') { + return formatter(params); + } + + return params.nameMap; + }; + + CalendarView.prototype._yearTextPositionControl = function (textEl, point, orient, position, margin) { + var x = point[0]; + var y = point[1]; + var aligns = ['center', 'bottom']; + + if (position === 'bottom') { + y += margin; + aligns = ['center', 'top']; + } else if (position === 'left') { + x -= margin; + } else if (position === 'right') { + x += margin; + aligns = ['center', 'top']; + } else { + // top + y -= margin; + } + + var rotate = 0; + + if (position === 'left' || position === 'right') { + rotate = Math.PI / 2; + } + + return { + rotation: rotate, + x: x, + y: y, + style: { + align: aligns[0], + verticalAlign: aligns[1] + } + }; + }; // render year + + + CalendarView.prototype._renderYearText = function (calendarModel, rangeData, orient, group) { + var yearLabel = calendarModel.getModel('yearLabel'); + + if (!yearLabel.get('show')) { + return; + } + + var margin = yearLabel.get('margin'); + var pos = yearLabel.get('position'); + + if (!pos) { + pos = orient !== 'horizontal' ? 'top' : 'left'; + } + + var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]]; + var xc = (points[0][0] + points[1][0]) / 2; + var yc = (points[0][1] + points[1][1]) / 2; + var idx = orient === 'horizontal' ? 0 : 1; + var posPoints = { + top: [xc, points[idx][1]], + bottom: [xc, points[1 - idx][1]], + left: [points[1 - idx][0], yc], + right: [points[idx][0], yc] + }; + var name = rangeData.start.y; + + if (+rangeData.end.y > +rangeData.start.y) { + name = name + '-' + rangeData.end.y; + } + + var formatter = yearLabel.get('formatter'); + var params = { + start: rangeData.start.y, + end: rangeData.end.y, + nameMap: name + }; + + var content = this._formatterLabel(formatter, params); + + var yearText = new ZRText({ + z2: 30, + style: createTextStyle(yearLabel, { + text: content + }) + }); + yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin)); + group.add(yearText); + }; + + CalendarView.prototype._monthTextPositionControl = function (point, isCenter, orient, position, margin) { + var align = 'left'; + var vAlign = 'top'; + var x = point[0]; + var y = point[1]; + + if (orient === 'horizontal') { + y = y + margin; + + if (isCenter) { + align = 'center'; + } + + if (position === 'start') { + vAlign = 'bottom'; + } + } else { + x = x + margin; + + if (isCenter) { + vAlign = 'middle'; + } + + if (position === 'start') { + align = 'right'; + } + } + + return { + x: x, + y: y, + align: align, + verticalAlign: vAlign + }; + }; // render month and year text + + + CalendarView.prototype._renderMonthText = function (calendarModel, orient, group) { + var monthLabel = calendarModel.getModel('monthLabel'); + + if (!monthLabel.get('show')) { + return; + } + + var nameMap = monthLabel.get('nameMap'); + var margin = monthLabel.get('margin'); + var pos = monthLabel.get('position'); + var align = monthLabel.get('align'); + var termPoints = [this._tlpoints, this._blpoints]; + + if (isString(nameMap)) { + nameMap = MONTH_TEXT[nameMap.toUpperCase()] || []; + } + + var idx = pos === 'start' ? 0 : 1; + var axis = orient === 'horizontal' ? 0 : 1; + margin = pos === 'start' ? -margin : margin; + var isCenter = align === 'center'; + + for (var i = 0; i < termPoints[idx].length - 1; i++) { + var tmp = termPoints[idx][i].slice(); + var firstDay = this._firstDayOfMonth[i]; + + if (isCenter) { + var firstDayPoints = this._firstDayPoints[i]; + tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2; + } + + var formatter = monthLabel.get('formatter'); + var name_1 = nameMap[+firstDay.m - 1]; + var params = { + yyyy: firstDay.y, + yy: (firstDay.y + '').slice(2), + MM: firstDay.m, + M: +firstDay.m, + nameMap: name_1 + }; + + var content = this._formatterLabel(formatter, params); + + var monthText = new ZRText({ + z2: 30, + style: extend(createTextStyle(monthLabel, { + text: content + }), this._monthTextPositionControl(tmp, isCenter, orient, pos, margin)) + }); + group.add(monthText); + } + }; + + CalendarView.prototype._weekTextPositionControl = function (point, orient, position, margin, cellSize) { + var align = 'center'; + var vAlign = 'middle'; + var x = point[0]; + var y = point[1]; + var isStart = position === 'start'; + + if (orient === 'horizontal') { + x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2; + align = isStart ? 'right' : 'left'; + } else { + y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2; + vAlign = isStart ? 'bottom' : 'top'; + } + + return { + x: x, + y: y, + align: align, + verticalAlign: vAlign + }; + }; // render weeks + + + CalendarView.prototype._renderWeekText = function (calendarModel, rangeData, orient, group) { + var dayLabel = calendarModel.getModel('dayLabel'); + + if (!dayLabel.get('show')) { + return; + } + + var coordSys = calendarModel.coordinateSystem; + var pos = dayLabel.get('position'); + var nameMap = dayLabel.get('nameMap'); + var margin = dayLabel.get('margin'); + var firstDayOfWeek = coordSys.getFirstDayOfWeek(); + + if (isString(nameMap)) { + nameMap = WEEK_TEXT[nameMap.toUpperCase()] || []; + } + + var start = coordSys.getNextNDay(rangeData.end.time, 7 - rangeData.lweek).time; + var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()]; + margin = parsePercent$1(margin, cellSize[orient === 'horizontal' ? 0 : 1]); + + if (pos === 'start') { + start = coordSys.getNextNDay(rangeData.start.time, -(7 + rangeData.fweek)).time; + margin = -margin; + } + + for (var i = 0; i < 7; i++) { + var tmpD = coordSys.getNextNDay(start, i); + var point = coordSys.dataToRect([tmpD.time], false).center; + var day = i; + day = Math.abs((i + firstDayOfWeek) % 7); + var weekText = new ZRText({ + z2: 30, + style: extend(createTextStyle(dayLabel, { + text: nameMap[day] + }), this._weekTextPositionControl(point, orient, pos, margin, cellSize)) + }); + group.add(weekText); + } + }; + + CalendarView.type = 'calendar'; + return CalendarView; + }(ComponentView); + + var PROXIMATE_ONE_DAY = 86400000; + + var Calendar = + /** @class */ + function () { + function Calendar(calendarModel, ecModel, api) { + this.type = 'calendar'; + this.dimensions = Calendar.dimensions; // Required in createListFromData + + this.getDimensionsInfo = Calendar.getDimensionsInfo; + this._model = calendarModel; + } + + Calendar.getDimensionsInfo = function () { + return [{ + name: 'time', + type: 'time' + }, 'value']; + }; + + Calendar.prototype.getRangeInfo = function () { + return this._rangeInfo; + }; + + Calendar.prototype.getModel = function () { + return this._model; + }; + + Calendar.prototype.getRect = function () { + return this._rect; + }; + + Calendar.prototype.getCellWidth = function () { + return this._sw; + }; + + Calendar.prototype.getCellHeight = function () { + return this._sh; + }; + + Calendar.prototype.getOrient = function () { + return this._orient; + }; + /** + * getFirstDayOfWeek + * + * @example + * 0 : start at Sunday + * 1 : start at Monday + * + * @return {number} + */ + + + Calendar.prototype.getFirstDayOfWeek = function () { + return this._firstDayOfWeek; + }; + /** + * get date info + * } + */ + + + Calendar.prototype.getDateInfo = function (date) { + date = parseDate(date); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + var mStr = m < 10 ? '0' + m : '' + m; + var d = date.getDate(); + var dStr = d < 10 ? '0' + d : '' + d; + var day = date.getDay(); + day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7); + return { + y: y + '', + m: mStr, + d: dStr, + day: day, + time: date.getTime(), + formatedDate: y + '-' + mStr + '-' + dStr, + date: date + }; + }; + + Calendar.prototype.getNextNDay = function (date, n) { + n = n || 0; + + if (n === 0) { + return this.getDateInfo(date); + } + + date = new Date(this.getDateInfo(date).time); + date.setDate(date.getDate() + n); + return this.getDateInfo(date); + }; + + Calendar.prototype.update = function (ecModel, api) { + this._firstDayOfWeek = +this._model.getModel('dayLabel').get('firstDay'); + this._orient = this._model.get('orient'); + this._lineWidth = this._model.getModel('itemStyle').getItemStyle().lineWidth || 0; + this._rangeInfo = this._getRangeInfo(this._initRangeOption()); + var weeks = this._rangeInfo.weeks || 1; + var whNames = ['width', 'height']; + + var cellSize = this._model.getCellSize().slice(); + + var layoutParams = this._model.getBoxLayoutParams(); + + var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks]; + each([0, 1], function (idx) { + if (cellSizeSpecified(cellSize, idx)) { + layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx]; + } + }); + var whGlobal = { + width: api.getWidth(), + height: api.getHeight() + }; + var calendarRect = this._rect = getLayoutRect(layoutParams, whGlobal); + each([0, 1], function (idx) { + if (!cellSizeSpecified(cellSize, idx)) { + cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx]; + } + }); + + function cellSizeSpecified(cellSize, idx) { + return cellSize[idx] != null && cellSize[idx] !== 'auto'; + } // Has been calculated out number. + + + this._sw = cellSize[0]; + this._sh = cellSize[1]; + }; + /** + * Convert a time data(time, value) item to (x, y) point. + */ + // TODO Clamp of calendar is not same with cartesian coordinate systems. + // It will return NaN if data exceeds. + + + Calendar.prototype.dataToPoint = function (data, clamp) { + isArray(data) && (data = data[0]); + clamp == null && (clamp = true); + var dayInfo = this.getDateInfo(data); + var range = this._rangeInfo; + var date = dayInfo.formatedDate; // if not in range return [NaN, NaN] + + if (clamp && !(dayInfo.time >= range.start.time && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY)) { + return [NaN, NaN]; + } + + var week = dayInfo.day; + + var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek; + + if (this._orient === 'vertical') { + return [this._rect.x + week * this._sw + this._sw / 2, this._rect.y + nthWeek * this._sh + this._sh / 2]; + } + + return [this._rect.x + nthWeek * this._sw + this._sw / 2, this._rect.y + week * this._sh + this._sh / 2]; + }; + /** + * Convert a (x, y) point to time data + */ + + + Calendar.prototype.pointToData = function (point) { + var date = this.pointToDate(point); + return date && date.time; + }; + /** + * Convert a time date item to (x, y) four point. + */ + + + Calendar.prototype.dataToRect = function (data, clamp) { + var point = this.dataToPoint(data, clamp); + return { + contentShape: { + x: point[0] - (this._sw - this._lineWidth) / 2, + y: point[1] - (this._sh - this._lineWidth) / 2, + width: this._sw - this._lineWidth, + height: this._sh - this._lineWidth + }, + center: point, + tl: [point[0] - this._sw / 2, point[1] - this._sh / 2], + tr: [point[0] + this._sw / 2, point[1] - this._sh / 2], + br: [point[0] + this._sw / 2, point[1] + this._sh / 2], + bl: [point[0] - this._sw / 2, point[1] + this._sh / 2] + }; + }; + /** + * Convert a (x, y) point to time date + * + * @param {Array} point point + * @return {Object} date + */ + + + Calendar.prototype.pointToDate = function (point) { + var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1; + var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1; + var range = this._rangeInfo.range; + + if (this._orient === 'vertical') { + return this._getDateByWeeksAndDay(nthY, nthX - 1, range); + } + + return this._getDateByWeeksAndDay(nthX, nthY - 1, range); + }; + + Calendar.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$4(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + Calendar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$4(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + + Calendar.prototype.containPoint = function (point) { + console.warn('Not implemented.'); + return false; + }; + /** + * initRange + * Normalize to an [start, end] array + */ + + + Calendar.prototype._initRangeOption = function () { + var range = this._model.get('range'); + + var normalizedRange; // Convert [1990] to 1990 + + if (isArray(range) && range.length === 1) { + range = range[0]; + } + + if (!isArray(range)) { + var rangeStr = range.toString(); // One year. + + if (/^\d{4}$/.test(rangeStr)) { + normalizedRange = [rangeStr + '-01-01', rangeStr + '-12-31']; + } // One month + + + if (/^\d{4}[\/|-]\d{1,2}$/.test(rangeStr)) { + var start = this.getDateInfo(rangeStr); + var firstDay = start.date; + firstDay.setMonth(firstDay.getMonth() + 1); + var end = this.getNextNDay(firstDay, -1); + normalizedRange = [start.formatedDate, end.formatedDate]; + } // One day + + + if (/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(rangeStr)) { + normalizedRange = [rangeStr, rangeStr]; + } + } else { + normalizedRange = range; + } + + if (!normalizedRange) { + if ("development" !== 'production') { + logError('Invalid date range.'); + } // Not handling it. + + + return range; + } + + var tmp = this._getRangeInfo(normalizedRange); + + if (tmp.start.time > tmp.end.time) { + normalizedRange.reverse(); + } + + return normalizedRange; + }; + /** + * range info + * + * @private + * @param {Array} range range ['2017-01-01', '2017-07-08'] + * If range[0] > range[1], they will not be reversed. + * @return {Object} obj + */ + + + Calendar.prototype._getRangeInfo = function (range) { + var parsedRange = [this.getDateInfo(range[0]), this.getDateInfo(range[1])]; + var reversed; + + if (parsedRange[0].time > parsedRange[1].time) { + reversed = true; + parsedRange.reverse(); + } + + var allDay = Math.floor(parsedRange[1].time / PROXIMATE_ONE_DAY) - Math.floor(parsedRange[0].time / PROXIMATE_ONE_DAY) + 1; // Consider case1 (#11677 #10430): + // Set the system timezone as "UK", set the range to `['2016-07-01', '2016-12-31']` + // Consider case2: + // Firstly set system timezone as "Time Zone: America/Toronto", + // ``` + // let first = new Date(1478412000000 - 3600 * 1000 * 2.5); + // let second = new Date(1478412000000); + // let allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1; + // ``` + // will get wrong result because of DST. So we should fix it. + + var date = new Date(parsedRange[0].time); + var startDateNum = date.getDate(); + var endDateNum = parsedRange[1].date.getDate(); + date.setDate(startDateNum + allDay - 1); // The bias can not over a month, so just compare date. + + var dateNum = date.getDate(); + + if (dateNum !== endDateNum) { + var sign = date.getTime() - parsedRange[1].time > 0 ? 1 : -1; + + while ((dateNum = date.getDate()) !== endDateNum && (date.getTime() - parsedRange[1].time) * sign > 0) { + allDay -= sign; + date.setDate(dateNum - sign); + } + } + + var weeks = Math.floor((allDay + parsedRange[0].day + 6) / 7); + var nthWeek = reversed ? -weeks + 1 : weeks - 1; + reversed && parsedRange.reverse(); + return { + range: [parsedRange[0].formatedDate, parsedRange[1].formatedDate], + start: parsedRange[0], + end: parsedRange[1], + allDay: allDay, + weeks: weeks, + // From 0. + nthWeek: nthWeek, + fweek: parsedRange[0].day, + lweek: parsedRange[1].day + }; + }; + /** + * get date by nthWeeks and week day in range + * + * @private + * @param {number} nthWeek the week + * @param {number} day the week day + * @param {Array} range [d1, d2] + * @return {Object} + */ + + + Calendar.prototype._getDateByWeeksAndDay = function (nthWeek, day, range) { + var rangeInfo = this._getRangeInfo(range); + + if (nthWeek > rangeInfo.weeks || nthWeek === 0 && day < rangeInfo.fweek || nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) { + return null; + } + + var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day; + var date = new Date(rangeInfo.start.time); + date.setDate(+rangeInfo.start.d + nthDay); + return this.getDateInfo(date); + }; + + Calendar.create = function (ecModel, api) { + var calendarList = []; + ecModel.eachComponent('calendar', function (calendarModel) { + var calendar = new Calendar(calendarModel, ecModel, api); + calendarList.push(calendar); + calendarModel.coordinateSystem = calendar; + }); + ecModel.eachSeries(function (calendarSeries) { + if (calendarSeries.get('coordinateSystem') === 'calendar') { + // Inject coordinate system + calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0]; + } + }); + return calendarList; + }; + + Calendar.dimensions = ['time', 'value']; + return Calendar; + }(); + + function getCoordSys$4(finder) { + var calendarModel = finder.calendarModel; + var seriesModel = finder.seriesModel; + var coordSys = calendarModel ? calendarModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null; + return coordSys; + } + + function install$w(registers) { + registers.registerComponentModel(CalendarModel); + registers.registerComponentView(CalendarView); + registers.registerCoordinateSystem('calendar', Calendar); + } + + var inner$g = makeInner(); + var _nonShapeGraphicElements = { + // Reserved but not supported in graphic component. + path: null, + compoundPath: null, + // Supported in graphic component. + group: Group, + image: ZRImage, + text: ZRText + }; // ------------------------ + // Preprocessor + // ------------------------ + + var preprocessor = function (option) { + var graphicOption = option.graphic; // Convert + // {graphic: [{left: 10, type: 'circle'}, ...]} + // or + // {graphic: {left: 10, type: 'circle'}} + // to + // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]} + + if (isArray(graphicOption)) { + if (!graphicOption[0] || !graphicOption[0].elements) { + option.graphic = [{ + elements: graphicOption + }]; + } else { + // Only one graphic instance can be instantiated. (We dont + // want that too many views are created in echarts._viewMap) + option.graphic = [option.graphic[0]]; + } + } else if (graphicOption && !graphicOption.elements) { + option.graphic = [{ + elements: [graphicOption] + }]; + } + }; + + var GraphicComponentModel = + /** @class */ + function (_super) { + __extends(GraphicComponentModel, _super); + + function GraphicComponentModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphicComponentModel.type; + return _this; + } + + GraphicComponentModel.prototype.mergeOption = function (option, ecModel) { + // Prevent default merge to elements + var elements = this.option.elements; + this.option.elements = null; + + _super.prototype.mergeOption.call(this, option, ecModel); + + this.option.elements = elements; + }; + + GraphicComponentModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + var newList = (isInit ? thisOption : newOption).elements; + var existList = thisOption.elements = isInit ? [] : thisOption.elements; + var flattenedList = []; + + this._flatten(newList, flattenedList, null); + + var mappingResult = mappingToExists(existList, flattenedList, 'normalMerge'); // Clear elOptionsToUpdate + + var elOptionsToUpdate = this._elOptionsToUpdate = []; + each(mappingResult, function (resultItem, index) { + var newElOption = resultItem.newOption; + + if ("development" !== 'production') { + assert(isObject(newElOption) || resultItem.existing, 'Empty graphic option definition'); + } + + if (!newElOption) { + return; + } + + elOptionsToUpdate.push(newElOption); + setKeyInfoToNewElOption(resultItem, newElOption); + mergeNewElOptionToExist(existList, index, newElOption); + setLayoutInfoToExist(existList[index], newElOption); + }, this); // Clean + + for (var i = existList.length - 1; i >= 0; i--) { + if (existList[i] == null) { + existList.splice(i, 1); + } else { + // $action should be volatile, otherwise option gotten from + // `getOption` will contain unexpected $action. + delete existList[i].$action; + } + } + }; + /** + * Convert + * [{ + * type: 'group', + * id: 'xx', + * children: [{type: 'circle'}, {type: 'polygon'}] + * }] + * to + * [ + * {type: 'group', id: 'xx'}, + * {type: 'circle', parentId: 'xx'}, + * {type: 'polygon', parentId: 'xx'} + * ] + */ + + + GraphicComponentModel.prototype._flatten = function (optionList, result, parentOption) { + each(optionList, function (option) { + if (!option) { + return; + } + + if (parentOption) { + option.parentOption = parentOption; + } + + result.push(option); + var children = option.children; + + if (option.type === 'group' && children) { + this._flatten(children, result, option); + } // Deleting for JSON output, and for not affecting group creation. + + + delete option.children; + }, this); + }; // FIXME + // Pass to view using payload? setOption has a payload? + + + GraphicComponentModel.prototype.useElOptionsToUpdate = function () { + var els = this._elOptionsToUpdate; // Clear to avoid render duplicately when zooming. + + this._elOptionsToUpdate = null; + return els; + }; + + GraphicComponentModel.type = 'graphic'; + GraphicComponentModel.defaultOption = { + elements: [] // parentId: null + + }; + return GraphicComponentModel; + }(ComponentModel); // ------------------------ + // View + // ------------------------ + + + var GraphicComponentView = + /** @class */ + function (_super) { + __extends(GraphicComponentView, _super); + + function GraphicComponentView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphicComponentView.type; + return _this; + } + + GraphicComponentView.prototype.init = function () { + this._elMap = createHashMap(); + }; + + GraphicComponentView.prototype.render = function (graphicModel, ecModel, api) { + // Having leveraged between use cases and algorithm complexity, a very + // simple layout mechanism is used: + // The size(width/height) can be determined by itself or its parent (not + // implemented yet), but can not by its children. (Top-down travel) + // The location(x/y) can be determined by the bounding rect of itself + // (can including its descendants or not) and the size of its parent. + // (Bottom-up travel) + // When `chart.clear()` or `chart.setOption({...}, true)` with the same id, + // view will be reused. + if (graphicModel !== this._lastGraphicModel) { + this._clear(); + } + + this._lastGraphicModel = graphicModel; + + this._updateElements(graphicModel); + + this._relocate(graphicModel, api); + }; + /** + * Update graphic elements. + */ + + + GraphicComponentView.prototype._updateElements = function (graphicModel) { + var elOptionsToUpdate = graphicModel.useElOptionsToUpdate(); + + if (!elOptionsToUpdate) { + return; + } + + var elMap = this._elMap; + var rootGroup = this.group; // Top-down tranverse to assign graphic settings to each elements. + + each(elOptionsToUpdate, function (elOption) { + var id = convertOptionIdName(elOption.id, null); + var elExisting = id != null ? elMap.get(id) : null; + var parentId = convertOptionIdName(elOption.parentId, null); + var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup; + var elType = elOption.type; + var elOptionStyle = elOption.style; + + if (elType === 'text' && elOptionStyle) { + // In top/bottom mode, textVerticalAlign should not be used, which cause + // inaccurately locating. + if (elOption.hv && elOption.hv[1]) { + elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = elOptionStyle.verticalAlign = elOptionStyle.align = null; + } + } + + var textContentOption = elOption.textContent; + var textConfig = elOption.textConfig; + + if (elOptionStyle && isEC4CompatibleStyle(elOptionStyle, elType, !!textConfig, !!textContentOption)) { + var convertResult = convertFromEC4CompatibleStyle(elOptionStyle, elType, true); + + if (!textConfig && convertResult.textConfig) { + textConfig = elOption.textConfig = convertResult.textConfig; + } + + if (!textContentOption && convertResult.textContent) { + textContentOption = convertResult.textContent; + } + } // Remove unnecessary props to avoid potential problems. + + + var elOptionCleaned = getCleanedElOption(elOption); // For simple, do not support parent change, otherwise reorder is needed. + + if ("development" !== 'production') { + elExisting && assert(targetElParent === elExisting.parent, 'Changing parent is not supported.'); + } + + var $action = elOption.$action || 'merge'; + + if ($action === 'merge') { + elExisting ? elExisting.attr(elOptionCleaned) : createEl$1(id, targetElParent, elOptionCleaned, elMap); + } else if ($action === 'replace') { + removeEl(elExisting, elMap); + createEl$1(id, targetElParent, elOptionCleaned, elMap); + } else if ($action === 'remove') { + removeEl(elExisting, elMap); + } + + var el = elMap.get(id); + + if (el && textContentOption) { + if ($action === 'merge') { + var textContentExisting = el.getTextContent(); + textContentExisting ? textContentExisting.attr(textContentOption) : el.setTextContent(new ZRText(textContentOption)); + } else if ($action === 'replace') { + el.setTextContent(new ZRText(textContentOption)); + } + } + + if (el) { + var elInner = inner$g(el); + elInner.__ecGraphicWidthOption = elOption.width; + elInner.__ecGraphicHeightOption = elOption.height; + setEventData(el, graphicModel, elOption); + } + }); + }; + /** + * Locate graphic elements. + */ + + + GraphicComponentView.prototype._relocate = function (graphicModel, api) { + var elOptions = graphicModel.option.elements; + var rootGroup = this.group; + var elMap = this._elMap; + var apiWidth = api.getWidth(); + var apiHeight = api.getHeight(); // Top-down to calculate percentage width/height of group + + for (var i = 0; i < elOptions.length; i++) { + var elOption = elOptions[i]; + var id = convertOptionIdName(elOption.id, null); + var el = id != null ? elMap.get(id) : null; + + if (!el || !el.isGroup) { + continue; + } + + var parentEl = el.parent; + var isParentRoot = parentEl === rootGroup; // Like 'position:absolut' in css, default 0. + + var elInner = inner$g(el); + var parentElInner = inner$g(parentEl); + elInner.__ecGraphicWidth = parsePercent$1(elInner.__ecGraphicWidthOption, isParentRoot ? apiWidth : parentElInner.__ecGraphicWidth) || 0; + elInner.__ecGraphicHeight = parsePercent$1(elInner.__ecGraphicHeightOption, isParentRoot ? apiHeight : parentElInner.__ecGraphicHeight) || 0; + } // Bottom-up tranvese all elements (consider ec resize) to locate elements. + + + for (var i = elOptions.length - 1; i >= 0; i--) { + var elOption = elOptions[i]; + var id = convertOptionIdName(elOption.id, null); + var el = id != null ? elMap.get(id) : null; + + if (!el) { + continue; + } + + var parentEl = el.parent; + var parentElInner = inner$g(parentEl); + var containerInfo = parentEl === rootGroup ? { + width: apiWidth, + height: apiHeight + } : { + width: parentElInner.__ecGraphicWidth, + height: parentElInner.__ecGraphicHeight + }; // PENDING + // Currently, when `bounding: 'all'`, the union bounding rect of the group + // does not include the rect of [0, 0, group.width, group.height], which + // is probably weird for users. Should we make a break change for it? + + positionElement(el, elOption, containerInfo, null, { + hv: elOption.hv, + boundingMode: elOption.bounding + }); + } + }; + /** + * Clear all elements. + */ + + + GraphicComponentView.prototype._clear = function () { + var elMap = this._elMap; + elMap.each(function (el) { + removeEl(el, elMap); + }); + this._elMap = createHashMap(); + }; + + GraphicComponentView.prototype.dispose = function () { + this._clear(); + }; + + GraphicComponentView.type = 'graphic'; + return GraphicComponentView; + }(ComponentView); + + function createEl$1(id, targetElParent, elOption, elMap) { + var graphicType = elOption.type; + + if ("development" !== 'production') { + assert(graphicType, 'graphic type MUST be set'); + } + + var Clz = hasOwn(_nonShapeGraphicElements, graphicType) // Those graphic elements are not shapes. They should not be + // overwritten by users, so do them first. + ? _nonShapeGraphicElements[graphicType] : getShapeClass(graphicType); + + if ("development" !== 'production') { + assert(Clz, 'graphic type can not be found'); + } + + var el = new Clz(elOption); + targetElParent.add(el); + elMap.set(id, el); + inner$g(el).__ecGraphicId = id; + } + + function removeEl(elExisting, elMap) { + var existElParent = elExisting && elExisting.parent; + + if (existElParent) { + elExisting.type === 'group' && elExisting.traverse(function (el) { + removeEl(el, elMap); + }); + elMap.removeKey(inner$g(elExisting).__ecGraphicId); + existElParent.remove(elExisting); + } + } // Remove unnecessary props to avoid potential problems. + + + function getCleanedElOption(elOption) { + elOption = extend({}, elOption); + each(['id', 'parentId', '$action', 'hv', 'bounding', 'textContent'].concat(LOCATION_PARAMS), function (name) { + delete elOption[name]; + }); + return elOption; + } + + function isSetLoc(obj, props) { + var isSet; + each(props, function (prop) { + obj[prop] != null && obj[prop] !== 'auto' && (isSet = true); + }); + return isSet; + } + + function setKeyInfoToNewElOption(resultItem, newElOption) { + var existElOption = resultItem.existing; // Set id and type after id assigned. + + newElOption.id = resultItem.keyInfo.id; + !newElOption.type && existElOption && (newElOption.type = existElOption.type); // Set parent id if not specified + + if (newElOption.parentId == null) { + var newElParentOption = newElOption.parentOption; + + if (newElParentOption) { + newElOption.parentId = newElParentOption.id; + } else if (existElOption) { + newElOption.parentId = existElOption.parentId; + } + } // Clear + + + newElOption.parentOption = null; + } + + function mergeNewElOptionToExist(existList, index, newElOption) { + // Update existing options, for `getOption` feature. + var newElOptCopy = extend({}, newElOption); + var existElOption = existList[index]; + var $action = newElOption.$action || 'merge'; + + if ($action === 'merge') { + if (existElOption) { + if ("development" !== 'production') { + var newType = newElOption.type; + assert(!newType || existElOption.type === newType, 'Please set $action: "replace" to change `type`'); + } // We can ensure that newElOptCopy and existElOption are not + // the same object, so `merge` will not change newElOptCopy. + + + merge(existElOption, newElOptCopy, true); // Rigid body, use ignoreSize. + + mergeLayoutParam(existElOption, newElOptCopy, { + ignoreSize: true + }); // Will be used in render. + + copyLayoutParams(newElOption, existElOption); + } else { + existList[index] = newElOptCopy; + } + } else if ($action === 'replace') { + existList[index] = newElOptCopy; + } else if ($action === 'remove') { + // null will be cleaned later. + existElOption && (existList[index] = null); + } + } + + function setLayoutInfoToExist(existItem, newElOption) { + if (!existItem) { + return; + } + + existItem.hv = newElOption.hv = [// Rigid body, dont care `width`. + isSetLoc(newElOption, ['left', 'right']), // Rigid body, dont care `height`. + isSetLoc(newElOption, ['top', 'bottom'])]; // Give default group size. Otherwise layout error may occur. + + if (existItem.type === 'group') { + var existingGroupOpt = existItem; + var newGroupOpt = newElOption; + existingGroupOpt.width == null && (existingGroupOpt.width = newGroupOpt.width = 0); + existingGroupOpt.height == null && (existingGroupOpt.height = newGroupOpt.height = 0); + } + } + + function setEventData(el, graphicModel, elOption) { + var eventData = getECData(el).eventData; // Simple optimize for large amount of elements that no need event. + + if (!el.silent && !el.ignore && !eventData) { + eventData = getECData(el).eventData = { + componentType: 'graphic', + componentIndex: graphicModel.componentIndex, + name: el.name + }; + } // `elOption.info` enables user to mount some info on + // elements and use them in event handlers. + + + if (eventData) { + eventData.info = elOption.info; + } + } + + function install$x(registers) { + registers.registerComponentModel(GraphicComponentModel); + registers.registerComponentView(GraphicComponentView); + registers.registerPreprocessor(preprocessor); + } + + var DATA_ZOOM_AXIS_DIMENSIONS = ['x', 'y', 'radius', 'angle', 'single']; // Supported coords. + // FIXME: polar has been broken (but rarely used). + + var SERIES_COORDS = ['cartesian2d', 'polar', 'singleAxis']; + function isCoordSupported(seriesModel) { + var coordType = seriesModel.get('coordinateSystem'); + return indexOf(SERIES_COORDS, coordType) >= 0; + } + function getAxisMainType(axisDim) { + if ("development" !== 'production') { + assert(axisDim); + } + + return axisDim + 'Axis'; + } + /** + * If two dataZoomModels has the same axis controlled, we say that they are 'linked'. + * This function finds all linked dataZoomModels start from the given payload. + */ + + function findEffectedDataZooms(ecModel, payload) { + // Key: `DataZoomAxisDimension` + var axisRecords = createHashMap(); + var effectedModels = []; // Key: uid of dataZoomModel + + var effectedModelMap = createHashMap(); // Find the dataZooms specified by payload. + + ecModel.eachComponent({ + mainType: 'dataZoom', + query: payload + }, function (dataZoomModel) { + if (!effectedModelMap.get(dataZoomModel.uid)) { + addToEffected(dataZoomModel); + } + }); // Start from the given dataZoomModels, travel the graph to find + // all of the linked dataZoom models. + + var foundNewLink; + + do { + foundNewLink = false; + ecModel.eachComponent('dataZoom', processSingle); + } while (foundNewLink); + + function processSingle(dataZoomModel) { + if (!effectedModelMap.get(dataZoomModel.uid) && isLinked(dataZoomModel)) { + addToEffected(dataZoomModel); + foundNewLink = true; + } + } + + function addToEffected(dataZoom) { + effectedModelMap.set(dataZoom.uid, true); + effectedModels.push(dataZoom); + markAxisControlled(dataZoom); + } + + function isLinked(dataZoomModel) { + var isLink = false; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisIdxArr = axisRecords.get(axisDim); + + if (axisIdxArr && axisIdxArr[axisIndex]) { + isLink = true; + } + }); + return isLink; + } + + function markAxisControlled(dataZoomModel) { + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + (axisRecords.get(axisDim) || axisRecords.set(axisDim, []))[axisIndex] = true; + }); + } + + return effectedModels; + } + /** + * Find the first target coordinate system. + * Available after model built. + * + * @return Like { + * grid: [ + * {model: coord0, axisModels: [axis1, axis3], coordIndex: 1}, + * {model: coord1, axisModels: [axis0, axis2], coordIndex: 0}, + * ... + * ], // cartesians must not be null/undefined. + * polar: [ + * {model: coord0, axisModels: [axis4], coordIndex: 0}, + * ... + * ], // polars must not be null/undefined. + * singleAxis: [ + * {model: coord0, axisModels: [], coordIndex: 0} + * ] + * } + */ + + function collectReferCoordSysModelInfo(dataZoomModel) { + var ecModel = dataZoomModel.ecModel; + var coordSysInfoWrap = { + infoList: [], + infoMap: createHashMap() + }; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + + if (!axisModel) { + return; + } + + var coordSysModel = axisModel.getCoordSysModel(); + + if (!coordSysModel) { + return; + } + + var coordSysUid = coordSysModel.uid; + var coordSysInfo = coordSysInfoWrap.infoMap.get(coordSysUid); + + if (!coordSysInfo) { + coordSysInfo = { + model: coordSysModel, + axisModels: [] + }; + coordSysInfoWrap.infoList.push(coordSysInfo); + coordSysInfoWrap.infoMap.set(coordSysUid, coordSysInfo); + } + + coordSysInfo.axisModels.push(axisModel); + }); + return coordSysInfoWrap; + } + + var DataZoomAxisInfo = + /** @class */ + function () { + function DataZoomAxisInfo() { + this.indexList = []; + this.indexMap = []; + } + + DataZoomAxisInfo.prototype.add = function (axisCmptIdx) { + // Remove duplication. + if (!this.indexMap[axisCmptIdx]) { + this.indexList.push(axisCmptIdx); + this.indexMap[axisCmptIdx] = true; + } + }; + + return DataZoomAxisInfo; + }(); + + var DataZoomModel = + /** @class */ + function (_super) { + __extends(DataZoomModel, _super); + + function DataZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = DataZoomModel.type; + _this._autoThrottle = true; + _this._noTarget = true; + /** + * It is `[rangeModeForMin, rangeModeForMax]`. + * The optional values for `rangeMode`: + * + `'value'` mode: the axis extent will always be determined by + * `dataZoom.startValue` and `dataZoom.endValue`, despite + * how data like and how `axis.min` and `axis.max` are. + * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`, + * where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`, + * and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`. + * Axis extent will be determined by the result of the percent of `[dMin, dMax]`. + * + * For example, when users are using dynamic data (update data periodically via `setOption`), + * if in `'value`' mode, the window will be kept in a fixed value range despite how + * data are appended, while if in `'percent'` mode, whe window range will be changed alone with + * the appended data (suppose `axis.min` and `axis.max` are not specified). + */ + + _this._rangePropMode = ['percent', 'percent']; + return _this; + } + + DataZoomModel.prototype.init = function (option, parentModel, ecModel) { + var inputRawOption = retrieveRawOption(option); + /** + * Suppose a "main process" start at the point that model prepared (that is, + * model initialized or merged or method called in `action`). + * We should keep the `main process` idempotent, that is, given a set of values + * on `option`, we get the same result. + * + * But sometimes, values on `option` will be updated for providing users + * a "final calculated value" (`dataZoomProcessor` will do that). Those value + * should not be the base/input of the `main process`. + * + * So in that case we should save and keep the input of the `main process` + * separately, called `settledOption`. + * + * For example, consider the case: + * (Step_1) brush zoom the grid by `toolbox.dataZoom`, + * where the original input `option.startValue`, `option.endValue` are earsed by + * calculated value. + * (Step)2) click the legend to hide and show a series, + * where the new range is calculated by the earsed `startValue` and `endValue`, + * which brings incorrect result. + */ + + this.settledOption = inputRawOption; + this.mergeDefaultAndTheme(option, ecModel); + + this._doInit(inputRawOption); + }; + + DataZoomModel.prototype.mergeOption = function (newOption) { + var inputRawOption = retrieveRawOption(newOption); //FIX #2591 + + merge(this.option, newOption, true); + merge(this.settledOption, inputRawOption, true); + + this._doInit(inputRawOption); + }; + + DataZoomModel.prototype._doInit = function (inputRawOption) { + var thisOption = this.option; // if (!env.canvasSupported) { + // thisOption.realtime = false; + // } + + this._setDefaultThrottle(inputRawOption); + + this._updateRangeUse(inputRawOption); + + var settledOption = this.settledOption; + each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + // start/end has higher priority over startValue/endValue if they + // both set, but we should make chart.setOption({endValue: 1000}) + // effective, rather than chart.setOption({endValue: 1000, end: null}). + if (this._rangePropMode[index] === 'value') { + thisOption[names[0]] = settledOption[names[0]] = null; + } // Otherwise do nothing and use the merge result. + + }, this); + + this._resetTarget(); + }; + + DataZoomModel.prototype._resetTarget = function () { + var optionOrient = this.get('orient', true); + var targetAxisIndexMap = this._targetAxisInfoMap = createHashMap(); + + var hasAxisSpecified = this._fillSpecifiedTargetAxis(targetAxisIndexMap); + + if (hasAxisSpecified) { + this._orient = optionOrient || this._makeAutoOrientByTargetAxis(); + } else { + this._orient = optionOrient || 'horizontal'; + + this._fillAutoTargetAxisByOrient(targetAxisIndexMap, this._orient); + } + + this._noTarget = true; + targetAxisIndexMap.each(function (axisInfo) { + if (axisInfo.indexList.length) { + this._noTarget = false; + } + }, this); + }; + + DataZoomModel.prototype._fillSpecifiedTargetAxis = function (targetAxisIndexMap) { + var hasAxisSpecified = false; + each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { + var refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING); // 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 (!refering.specified) { + return; + } + + hasAxisSpecified = true; + var axisInfo = new DataZoomAxisInfo(); + each(refering.models, function (axisModel) { + axisInfo.add(axisModel.componentIndex); + }); + targetAxisIndexMap.set(axisDim, axisInfo); + }, this); + return hasAxisSpecified; + }; + + DataZoomModel.prototype._fillAutoTargetAxisByOrient = function (targetAxisIndexMap, orient) { + var ecModel = this.ecModel; + var needAuto = true; // Find axis that parallel to dataZoom as default. + + if (needAuto) { + var axisDim = orient === 'vertical' ? 'y' : 'x'; + var axisModels = ecModel.findComponents({ + mainType: axisDim + 'Axis' + }); + setParallelAxis(axisModels, axisDim); + } // Find axis that parallel to dataZoom as default. + + + if (needAuto) { + var axisModels = ecModel.findComponents({ + mainType: 'singleAxis', + filter: function (axisModel) { + return axisModel.get('orient', true) === orient; + } + }); + setParallelAxis(axisModels, 'single'); + } + + function setParallelAxis(axisModels, axisDim) { + // At least use the first parallel axis as the target axis. + var axisModel = axisModels[0]; + + if (!axisModel) { + return; + } + + var axisInfo = new DataZoomAxisInfo(); + axisInfo.add(axisModel.componentIndex); + targetAxisIndexMap.set(axisDim, axisInfo); + needAuto = false; // Find parallel axes in the same grid. + + if (axisDim === 'x' || axisDim === 'y') { + var gridModel_1 = axisModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + gridModel_1 && each(axisModels, function (axModel) { + if (axisModel.componentIndex !== axModel.componentIndex && gridModel_1 === axModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]) { + axisInfo.add(axModel.componentIndex); + } + }); + } + } + + if (needAuto) { + // If no parallel axis, find the first category axis as default. (Also consider polar). + each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { + if (!needAuto) { + return; + } + + var axisModels = ecModel.findComponents({ + mainType: getAxisMainType(axisDim), + filter: function (axisModel) { + return axisModel.get('type', true) === 'category'; + } + }); + + if (axisModels[0]) { + var axisInfo = new DataZoomAxisInfo(); + axisInfo.add(axisModels[0].componentIndex); + targetAxisIndexMap.set(axisDim, axisInfo); + needAuto = false; + } + }, this); + } + }; + + DataZoomModel.prototype._makeAutoOrientByTargetAxis = function () { + var dim; // Find the first axis + + this.eachTargetAxis(function (axisDim) { + !dim && (dim = axisDim); + }, this); + return dim === 'y' ? 'vertical' : 'horizontal'; + }; + + DataZoomModel.prototype._setDefaultThrottle = function (inputRawOption) { + // When first time user set throttle, auto throttle ends. + if (inputRawOption.hasOwnProperty('throttle')) { + this._autoThrottle = false; + } + + if (this._autoThrottle) { + var globalOption = this.ecModel.option; + this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20; + } + }; + + DataZoomModel.prototype._updateRangeUse = function (inputRawOption) { + var rangePropMode = this._rangePropMode; + var rangeModeInOption = this.get('rangeMode'); + each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + var percentSpecified = inputRawOption[names[0]] != null; + var valueSpecified = inputRawOption[names[1]] != null; + + if (percentSpecified && !valueSpecified) { + rangePropMode[index] = 'percent'; + } else if (!percentSpecified && valueSpecified) { + rangePropMode[index] = 'value'; + } else if (rangeModeInOption) { + rangePropMode[index] = rangeModeInOption[index]; + } else if (percentSpecified) { + // percentSpecified && valueSpecified + rangePropMode[index] = 'percent'; + } // else remain its original setting. + + }); + }; + + DataZoomModel.prototype.noTarget = function () { + return this._noTarget; + }; + + DataZoomModel.prototype.getFirstTargetAxisModel = function () { + var firstAxisModel; + this.eachTargetAxis(function (axisDim, axisIndex) { + if (firstAxisModel == null) { + firstAxisModel = this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + } + }, this); + return firstAxisModel; + }; + /** + * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel + */ + + + DataZoomModel.prototype.eachTargetAxis = function (callback, context) { + this._targetAxisInfoMap.each(function (axisInfo, axisDim) { + each(axisInfo.indexList, function (axisIndex) { + callback.call(context, axisDim, axisIndex); + }); + }); + }; + /** + * @return If not found, return null/undefined. + */ + + + DataZoomModel.prototype.getAxisProxy = function (axisDim, axisIndex) { + var axisModel = this.getAxisModel(axisDim, axisIndex); + + if (axisModel) { + return axisModel.__dzAxisProxy; + } + }; + /** + * @return If not found, return null/undefined. + */ + + + DataZoomModel.prototype.getAxisModel = function (axisDim, axisIndex) { + if ("development" !== 'production') { + assert(axisDim && axisIndex != null); + } + + var axisInfo = this._targetAxisInfoMap.get(axisDim); + + if (axisInfo && axisInfo.indexMap[axisIndex]) { + return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + } + }; + /** + * If not specified, set to undefined. + */ + + + DataZoomModel.prototype.setRawRange = function (opt) { + var thisOption = this.option; + var settledOption = this.settledOption; + each([['start', 'startValue'], ['end', 'endValue']], function (names) { + // Consider the pair : + // If one has value and the other one is `null/undefined`, we both set them + // to `settledOption`. This strategy enables the feature to clear the original + // value in `settledOption` to `null/undefined`. + // But if both of them are `null/undefined`, we do not set them to `settledOption` + // and keep `settledOption` with the original value. This strategy enables users to + // only set but not set when calling + // `dispatchAction`. + // The pair is treated in the same way. + if (opt[names[0]] != null || opt[names[1]] != null) { + thisOption[names[0]] = settledOption[names[0]] = opt[names[0]]; + thisOption[names[1]] = settledOption[names[1]] = opt[names[1]]; + } + }, this); + + this._updateRangeUse(opt); + }; + + DataZoomModel.prototype.setCalculatedRange = function (opt) { + var option = this.option; + each(['start', 'startValue', 'end', 'endValue'], function (name) { + option[name] = opt[name]; + }); + }; + + DataZoomModel.prototype.getPercentRange = function () { + var axisProxy = this.findRepresentativeAxisProxy(); + + if (axisProxy) { + return axisProxy.getDataPercentWindow(); + } + }; + /** + * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0); + * + * @return [startValue, endValue] value can only be '-' or finite number. + */ + + + DataZoomModel.prototype.getValueRange = function (axisDim, axisIndex) { + if (axisDim == null && axisIndex == null) { + var axisProxy = this.findRepresentativeAxisProxy(); + + if (axisProxy) { + return axisProxy.getDataValueWindow(); + } + } else { + return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow(); + } + }; + /** + * @param axisModel If axisModel given, find axisProxy + * corresponding to the axisModel + */ + + + DataZoomModel.prototype.findRepresentativeAxisProxy = function (axisModel) { + if (axisModel) { + return axisModel.__dzAxisProxy; + } // Find the first hosted axisProxy + + + var firstProxy; + + var axisDimList = this._targetAxisInfoMap.keys(); + + for (var i = 0; i < axisDimList.length; i++) { + var axisDim = axisDimList[i]; + + var axisInfo = this._targetAxisInfoMap.get(axisDim); + + for (var j = 0; j < axisInfo.indexList.length; j++) { + var proxy = this.getAxisProxy(axisDim, axisInfo.indexList[j]); + + if (proxy.hostedBy(this)) { + return proxy; + } + + if (!firstProxy) { + firstProxy = proxy; + } + } + } // If no hosted proxy found, still need to return a proxy. + // This case always happens in toolbox dataZoom, where axes are all hosted by + // other dataZooms. + + + return firstProxy; + }; + + DataZoomModel.prototype.getRangePropMode = function () { + return this._rangePropMode.slice(); + }; + + DataZoomModel.prototype.getOrient = function () { + if ("development" !== 'production') { + // Should not be called before initialized. + assert(this._orient); + } + + return this._orient; + }; + + DataZoomModel.type = 'dataZoom'; + DataZoomModel.dependencies = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series', 'toolbox']; + DataZoomModel.defaultOption = { + zlevel: 0, + z: 4, + filterMode: 'filter', + start: 0, + end: 100 + }; + return DataZoomModel; + }(ComponentModel); + /** + * Retrieve the those raw params from option, which will be cached separately. + * becasue they will be overwritten by normalized/calculated values in the main + * process. + */ + + + function retrieveRawOption(option) { + var ret = {}; + each(['start', 'end', 'startValue', 'endValue', 'throttle'], function (name) { + option.hasOwnProperty(name) && (ret[name] = option[name]); + }); + return ret; + } + + var SelectDataZoomModel = + /** @class */ + function (_super) { + __extends(SelectDataZoomModel, _super); + + function SelectDataZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SelectDataZoomModel.type; + return _this; + } + + SelectDataZoomModel.type = 'dataZoom.select'; + return SelectDataZoomModel; + }(DataZoomModel); + + var DataZoomView = + /** @class */ + function (_super) { + __extends(DataZoomView, _super); + + function DataZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = DataZoomView.type; + return _this; + } + + DataZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) { + this.dataZoomModel = dataZoomModel; + this.ecModel = ecModel; + this.api = api; + }; + + DataZoomView.type = 'dataZoom'; + return DataZoomView; + }(ComponentView); + + var SelectDataZoomView = + /** @class */ + function (_super) { + __extends(SelectDataZoomView, _super); + + function SelectDataZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SelectDataZoomView.type; + return _this; + } + + SelectDataZoomView.type = 'dataZoom.select'; + return SelectDataZoomView; + }(DataZoomView); + + var each$9 = each; + var asc$1 = 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. + */ + + var AxisProxy = + /** @class */ + function () { + function AxisProxy(dimName, axisIndex, dataZoomModel, ecModel) { + this._dimName = dimName; + this._axisIndex = axisIndex; + this.ecModel = ecModel; + this._dataZoomModel = dataZoomModel; // /** + // * @readOnly + // * @private + // */ + // this.hasSeriesStacked; + } + /** + * Whether the axisProxy is hosted by dataZoomModel. + */ + + + AxisProxy.prototype.hostedBy = function (dataZoomModel) { + return this._dataZoomModel === dataZoomModel; + }; + /** + * @return Value can only be NaN or finite value. + */ + + + AxisProxy.prototype.getDataValueWindow = function () { + return this._valueWindow.slice(); + }; + /** + * @return {Array.} + */ + + + AxisProxy.prototype.getDataPercentWindow = function () { + return this._percentWindow.slice(); + }; + + AxisProxy.prototype.getTargetSeriesModels = function () { + var seriesModels = []; + this.ecModel.eachSeries(function (seriesModel) { + if (isCoordSupported(seriesModel)) { + var axisMainType = getAxisMainType(this._dimName); + var axisModel = seriesModel.getReferringComponents(axisMainType, SINGLE_REFERRING).models[0]; + + if (axisModel && this._axisIndex === axisModel.componentIndex) { + seriesModels.push(seriesModel); + } + } + }, this); + return seriesModels; + }; + + AxisProxy.prototype.getAxisModel = function () { + return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex); + }; + + AxisProxy.prototype.getMinMaxSpan = function () { + return clone(this._minMaxSpan); + }; + /** + * Only calculate by given range and this._dataExtent, do not change anything. + */ + + + AxisProxy.prototype.calculateDataWindow = function (opt) { + var dataExtent = this._dataExtent; + var axisModel = this.getAxisModel(); + var scale = axisModel.axis.scale; + + var rangePropMode = this._dataZoomModel.getRangePropMode(); + + var percentExtent = [0, 100]; + var percentWindow = []; + var valueWindow = []; + var hasPropModeValue; + each$9(['start', 'end'], function (prop, idx) { + var boundPercent = opt[prop]; + var boundValue = opt[prop + 'Value']; // Notice: dataZoom is based either on `percentProp` ('start', 'end') or + // on `valueProp` ('startValue', 'endValue'). (They are based on the data extent + // but not min/max of axis, which will be calculated by data window then). + // The former one is suitable for cases that a dataZoom component controls multiple + // axes with different unit or extent, and the latter one is suitable for accurate + // zoom by pixel (e.g., in dataZoomSelect). + // we use `getRangePropMode()` to mark which prop is used. `rangePropMode` is updated + // only when setOption or dispatchAction, otherwise it remains its original value. + // (Why not only record `percentProp` and always map to `valueProp`? Because + // the map `valueProp` -> `percentProp` -> `valueProp` probably not the original + // `valueProp`. consider two axes constrolled by one dataZoom. They have different + // data extent. All of values that are overflow the `dataExtent` will be calculated + // to percent '100%'). + + if (rangePropMode[idx] === 'percent') { + boundPercent == null && (boundPercent = percentExtent[idx]); // Use scale.parse to math round for category or time axis. + + boundValue = scale.parse(linearMap(boundPercent, percentExtent, dataExtent)); + } else { + hasPropModeValue = true; + boundValue = boundValue == null ? dataExtent[idx] : scale.parse(boundValue); // Calculating `percent` from `value` may be not accurate, because + // This calculation can not be inversed, because all of values that + // are overflow the `dataExtent` will be calculated to percent '100%' + + boundPercent = linearMap(boundValue, dataExtent, percentExtent); + } // valueWindow[idx] = round(boundValue); + // percentWindow[idx] = round(boundPercent); + + + valueWindow[idx] = boundValue; + percentWindow[idx] = boundPercent; + }); + asc$1(valueWindow); + asc$1(percentWindow); // The windows from user calling of `dispatchAction` might be out of the extent, + // or do not obey the `min/maxSpan`, `min/maxValueSpan`. But we dont restrict window + // by `zoomLock` here, because we see `zoomLock` just as a interaction constraint, + // where API is able to initialize/modify the window size even though `zoomLock` + // specified. + + var spans = this._minMaxSpan; + hasPropModeValue ? restrictSet(valueWindow, percentWindow, dataExtent, percentExtent, false) : restrictSet(percentWindow, valueWindow, percentExtent, dataExtent, true); + + function restrictSet(fromWindow, toWindow, fromExtent, toExtent, toValue) { + var suffix = toValue ? 'Span' : 'ValueSpan'; + sliderMove(0, fromWindow, fromExtent, 'all', spans['min' + suffix], spans['max' + suffix]); + + for (var i = 0; i < 2; i++) { + toWindow[i] = linearMap(fromWindow[i], fromExtent, toExtent, true); + toValue && (toWindow[i] = scale.parse(toWindow[i])); + } + } + + return { + valueWindow: valueWindow, + percentWindow: percentWindow + }; + }; + /** + * 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". + */ + + + AxisProxy.prototype.reset = function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var targetSeries = this.getTargetSeriesModels(); // Culculate data window and data extent, and record them. + + this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries); // this.hasSeriesStacked = false; + // each(targetSeries, function (series) { + // let data = series.getData(); + // let dataDim = data.mapDimension(this._dimName); + // let stackedDimension = data.getCalculationInfo('stackedDimension'); + // if (stackedDimension && stackedDimension === dataDim) { + // this.hasSeriesStacked = true; + // } + // }, this); + // `calculateDataWindow` uses min/maxSpan. + + this._updateMinMaxSpan(); + + var dataWindow = this.calculateDataWindow(dataZoomModel.settledOption); + this._valueWindow = dataWindow.valueWindow; + this._percentWindow = dataWindow.percentWindow; // Update axis setting then. + + this._setAxisModel(); + }; + + AxisProxy.prototype.filterData = function (dataZoomModel, api) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var axisDim = this._dimName; + var seriesModels = this.getTargetSeriesModels(); + var filterMode = dataZoomModel.get('filterMode'); + var valueWindow = this._valueWindow; + + if (filterMode === 'none') { + return; + } // 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. + // In fect, it is not a big deal that do not support filterMode-'filter' + // when using toolbox#dataZoom, utill tooltip#dataZoom support "single axis + // selection" some day, which might need "adapt to data extent on the + // otherAxis", which is disabled by filterMode-'empty'. + // But currently, stack has been fixed to based on value but not index, + // so this is not an issue any more. + // let otherAxisModel = this.getOtherAxisModel(); + // if (dataZoomModel.get('$fromToolbox') + // && otherAxisModel + // && otherAxisModel.hasSeriesStacked + // ) { + // filterMode = 'empty'; + // } + // TODO + // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet. + + + each$9(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + var dataDims = seriesData.mapDimensionsAll(axisDim); + + if (!dataDims.length) { + return; + } + + if (filterMode === 'weakFilter') { + seriesData.filterSelf(function (dataIndex) { + var leftOut; + var rightOut; + var hasValue; + + for (var i = 0; i < dataDims.length; i++) { + var value = seriesData.get(dataDims[i], dataIndex); + var thisHasValue = !isNaN(value); + var thisLeftOut = value < valueWindow[0]; + var thisRightOut = value > valueWindow[1]; + + if (thisHasValue && !thisLeftOut && !thisRightOut) { + return true; + } + + thisHasValue && (hasValue = true); + thisLeftOut && (leftOut = true); + thisRightOut && (rightOut = true); + } // If both left out and right out, do not filter. + + + return hasValue && leftOut && rightOut; + }); + } else { + each$9(dataDims, function (dim) { + if (filterMode === 'empty') { + seriesModel.setData(seriesData = seriesData.map(dim, function (value) { + return !isInWindow(value) ? NaN : value; + })); + } else { + var range = {}; + range[dim] = valueWindow; // console.time('select'); + + seriesData.selectRange(range); // console.timeEnd('select'); + } + }); + } + + each$9(dataDims, function (dim) { + seriesData.setApproximateExtent(valueWindow, dim); + }); + }); + + function isInWindow(value) { + return value >= valueWindow[0] && value <= valueWindow[1]; + } + }; + + AxisProxy.prototype._updateMinMaxSpan = function () { + var minMaxSpan = this._minMaxSpan = {}; + var dataZoomModel = this._dataZoomModel; + var dataExtent = this._dataExtent; + each$9(['min', 'max'], function (minMax) { + var percentSpan = dataZoomModel.get(minMax + 'Span'); + var valueSpan = dataZoomModel.get(minMax + 'ValueSpan'); + valueSpan != null && (valueSpan = this.getAxisModel().axis.scale.parse(valueSpan)); // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan + + if (valueSpan != null) { + percentSpan = linearMap(dataExtent[0] + valueSpan, dataExtent, [0, 100], true); + } else if (percentSpan != null) { + valueSpan = linearMap(percentSpan, [0, 100], dataExtent, true) - dataExtent[0]; + } + + minMaxSpan[minMax + 'Span'] = percentSpan; + minMaxSpan[minMax + 'ValueSpan'] = valueSpan; + }, this); + }; + + AxisProxy.prototype._setAxisModel = function () { + var axisModel = this.getAxisModel(); + var percentWindow = this._percentWindow; + var valueWindow = this._valueWindow; + + if (!percentWindow) { + return; + } // [0, 500]: arbitrary value, guess axis extent. + + + var precision = getPixelPrecision(valueWindow, [0, 500]); + precision = Math.min(precision, 20); // For value axis, if min/max/scale are not set, we just use the extent obtained + // by series data, which may be a little different from the extent calculated by + // `axisHelper.getScaleExtent`. But the different just affects the experience a + // little when zooming. So it will not be fixed until some users require it strongly. + + var rawExtentInfo = axisModel.axis.scale.rawExtentInfo; + + if (percentWindow[0] !== 0) { + rawExtentInfo.setDeterminedMinMax('min', +valueWindow[0].toFixed(precision)); + } + + if (percentWindow[1] !== 100) { + rawExtentInfo.setDeterminedMinMax('max', +valueWindow[1].toFixed(precision)); + } + + rawExtentInfo.freeze(); + }; + + return AxisProxy; + }(); + + function calculateDataExtent(axisProxy, axisDim, seriesModels) { + var dataExtent = [Infinity, -Infinity]; + each$9(seriesModels, function (seriesModel) { + unionAxisExtentFromData(dataExtent, seriesModel.getData(), axisDim); + }); // It is important to get "consistent" extent when more then one axes is + // controlled by a `dataZoom`, otherwise those axes will not be synchronized + // when zooming. But it is difficult to know what is "consistent", considering + // axes have different type or even different meanings (For example, two + // time axes are used to compare data of the same date in different years). + // So basically dataZoom just obtains extent by series.data (in category axis + // extent can be obtained from axis.data). + // Nevertheless, user can set min/max/scale on axes to make extent of axes + // consistent. + + var axisModel = axisProxy.getAxisModel(); + var rawExtentResult = ensureScaleRawExtentInfo(axisModel.axis.scale, axisModel, dataExtent).calculate(); + return [rawExtentResult.min, rawExtentResult.max]; + } + + var dataZoomProcessor = { + // `dataZoomProcessor` will only be performed in needed series. Consider if + // there is a line series and a pie series, it is better not to update the + // line series if only pie series is needed to be updated. + getTargetSeries: function (ecModel) { + function eachAxisModel(cb) { + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + cb(axisDim, axisIndex, axisModel, dataZoomModel); + }); + }); + } // FIXME: it brings side-effect to `getTargetSeries`. + // Prepare axis proxies. + + + eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) { + // dispose all last axis proxy, in case that some axis are deleted. + axisModel.__dzAxisProxy = null; + }); + var proxyList = []; + eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) { + // Different dataZooms may constrol the same axis. In that case, + // an axisProxy serves both of them. + if (!axisModel.__dzAxisProxy) { + // Use the first dataZoomModel as the main model of axisProxy. + axisModel.__dzAxisProxy = new AxisProxy(axisDim, axisIndex, dataZoomModel, ecModel); + proxyList.push(axisModel.__dzAxisProxy); + } + }); + var seriesModelMap = createHashMap(); + each(proxyList, function (axisProxy) { + each(axisProxy.getTargetSeriesModels(), function (seriesModel) { + seriesModelMap.set(seriesModel.uid, seriesModel); + }); + }); + return seriesModelMap; + }, + // Consider appendData, where filter should be performed. Because data process is + // in block mode currently, it is not need to worry about that the overallProgress + // execute every frame. + overallReset: 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(function (axisDim, axisIndex) { + dataZoomModel.getAxisProxy(axisDim, axisIndex).reset(dataZoomModel); + }); // 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(function (axisDim, axisIndex) { + dataZoomModel.getAxisProxy(axisDim, axisIndex).filterData(dataZoomModel, api); + }); + }); + 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(); + + if (axisProxy) { + var percentRange = axisProxy.getDataPercentWindow(); + var valueRange = axisProxy.getDataValueWindow(); + dataZoomModel.setCalculatedRange({ + start: percentRange[0], + end: percentRange[1], + startValue: valueRange[0], + endValue: valueRange[1] + }); + } + }); + } + }; + + function installDataZoomAction(registers) { + registers.registerAction('dataZoom', function (payload, ecModel) { + var effectedModels = findEffectedDataZooms(ecModel, payload); + each(effectedModels, function (dataZoomModel) { + dataZoomModel.setRawRange({ + start: payload.start, + end: payload.end, + startValue: payload.startValue, + endValue: payload.endValue + }); + }); + }); + } + + var installed = false; + function installCommon(registers) { + if (installed) { + return; + } + + installed = true; + registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, dataZoomProcessor); + installDataZoomAction(registers); + registers.registerSubTypeDefaulter('dataZoom', function () { + // Default 'slider' when no type specified. + return 'slider'; + }); + } + + function install$y(registers) { + registers.registerComponentModel(SelectDataZoomModel); + registers.registerComponentView(SelectDataZoomView); + installCommon(registers); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + var ToolboxFeature = + /** @class */ + function () { + function ToolboxFeature() {} + + return ToolboxFeature; + }(); + var features = {}; + function registerFeature(name, ctor) { + features[name] = ctor; + } + function getFeature(name) { + return features[name]; + } + + var ToolboxModel = + /** @class */ + function (_super) { + __extends(ToolboxModel, _super); + + function ToolboxModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ToolboxModel.type; + return _this; + } + + ToolboxModel.prototype.optionUpdated = function () { + _super.prototype.optionUpdated.apply(this, arguments); + + var ecModel = this.ecModel; + each(this.option.feature, function (featureOpt, featureName) { + var Feature = getFeature(featureName); + + if (Feature) { + if (Feature.getDefaultOption) { + Feature.defaultOption = Feature.getDefaultOption(ecModel); + } + + merge(featureOpt, Feature.defaultOption); + } + }); + }; + + ToolboxModel.type = 'toolbox'; + ToolboxModel.layoutMode = { + type: 'box', + ignoreSize: true + }; + ToolboxModel.defaultOption = { + show: true, + z: 6, + zlevel: 0, + orient: 'horizontal', + left: 'right', + top: 'top', + // right + // bottom + backgroundColor: 'transparent', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemSize: 15, + itemGap: 8, + showTitle: true, + iconStyle: { + borderColor: '#666', + color: 'none' + }, + emphasis: { + iconStyle: { + borderColor: '#3E98C5' + } + }, + // textStyle: {}, + // feature + tooltip: { + show: false + } + }; + return ToolboxModel; + }(ComponentModel); + + /** + * 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} + */ + + function layout$3(group, componentModel, api) { + var boxLayoutParams = componentModel.getBoxLayoutParams(); + var padding = componentModel.get('padding'); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var rect = getLayoutRect(boxLayoutParams, viewportSize, padding); + box(componentModel.get('orient'), group, componentModel.get('itemGap'), rect.width, rect.height); + positionElement(group, boxLayoutParams, viewportSize, padding); + } + function makeBackground(rect, componentModel) { + var padding = normalizeCssArray$1(componentModel.get('padding')); + var style = componentModel.getItemStyle(['color', 'opacity']); + style.fill = componentModel.get('backgroundColor'); + rect = new Rect({ + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[1] + padding[3], + height: rect.height + padding[0] + padding[2], + r: componentModel.get('borderRadius') + }, + style: style, + silent: true, + z2: -1 + }); // FIXME + // `subPixelOptimizeRect` may bring some gap between edge of viewpart + // and background rect when setting like `left: 0`, `top: 0`. + // graphic.subPixelOptimizeRect(rect); + + return rect; + } + + var ToolboxView = + /** @class */ + function (_super) { + __extends(ToolboxView, _super); + + function ToolboxView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + ToolboxView.prototype.render = function (toolboxModel, ecModel, api, payload) { + 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 = []; + each(featureOpts, function (opt, name) { + featureNames.push(name); + }); + new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(curry(processFeature, null)).execute(); // Keep for diff. + + this._featureNames = featureNames; + + function processFeature(newIndex, oldIndex) { + var featureName = featureNames[newIndex]; + var oldName = featureNames[oldIndex]; + var featureOpt = featureOpts[featureName]; + var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); + var feature; // FIX#11236, merge feature title from MagicType newOption. TODO: consider seriesIndex ? + + if (payload && payload.newTitle != null && payload.featureName === featureName) { + featureOpt.title = payload.newTitle; + } + + if (featureName && !oldName) { + // Create + if (isUserFeatureName(featureName)) { + feature = { + onclick: featureModel.option.onclick, + featureName: featureName + }; + } else { + var Feature = getFeature(featureName); + + if (!Feature) { + return; + } + + feature = new Feature(); + } + + features[featureName] = feature; + } else { + feature = features[oldName]; // If feature does not exsit. + + if (!feature) { + return; + } + } + + feature.uid = getUID('toolbox-feature'); + feature.model = featureModel; + feature.ecModel = ecModel; + feature.api = api; + + if (feature instanceof ToolboxFeature) { + 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; + + if (iconPaths[iconName]) { + (status === 'emphasis' ? enterEmphasis : leaveEmphasis)(iconPaths[iconName]); + } + }; + + if (feature instanceof ToolboxFeature) { + if (feature.render) { + feature.render(featureModel, ecModel, api, payload); + } + } + } + + function createIconPaths(featureModel, feature, featureName) { + var iconStyleModel = featureModel.getModel('iconStyle'); + var iconStyleEmphasisModel = featureModel.getModel(['emphasis', 'iconStyle']); // If one feature has mutiple icon. they are orginaized as + // { + // icon: { + // foo: '', + // bar: '' + // }, + // title: { + // foo: '', + // bar: '' + // } + // } + + var icons = feature instanceof ToolboxFeature && feature.getIcons ? feature.getIcons() : featureModel.get('icon'); + var titles = featureModel.get('title') || {}; + var iconsMap; + var titlesMap; + + if (typeof icons === 'string') { + iconsMap = {}; + iconsMap[featureName] = icons; + } else { + iconsMap = icons; + } + + if (typeof titles === 'string') { + titlesMap = {}; + titlesMap[featureName] = titles; + } else { + titlesMap = titles; + } + + var iconPaths = featureModel.iconPaths = {}; + each(iconsMap, function (iconStr, iconName) { + var path = createIcon(iconStr, {}, { + x: -itemSize / 2, + y: -itemSize / 2, + width: itemSize, + height: itemSize + }); // TODO handling image + + path.setStyle(iconStyleModel.getItemStyle()); + var pathEmphasisState = path.ensureState('emphasis'); + pathEmphasisState.style = iconStyleEmphasisModel.getItemStyle(); // Text position calculation + + var textContent = new ZRText({ + style: { + text: titlesMap[iconName], + align: iconStyleEmphasisModel.get('textAlign'), + borderRadius: iconStyleEmphasisModel.get('textBorderRadius'), + padding: iconStyleEmphasisModel.get('textPadding'), + fill: null + }, + ignore: true + }); + path.setTextContent(textContent); + var tooltipModel = toolboxModel.getModel('tooltip'); + + if (tooltipModel && tooltipModel.get('show')) { + path.tooltip = extend({ + content: titlesMap[iconName], + formatter: tooltipModel.get('formatter', true) || function () { + return titlesMap[iconName]; + }, + formatterParams: { + componentType: 'toolbox', + name: iconName, + title: titlesMap[iconName], + $vars: ['name', 'title'] + }, + position: tooltipModel.get('position', true) || 'bottom' + }, tooltipModel.option); + } // graphic.enableHoverEmphasis(path); + + + path.__title = titlesMap[iconName]; + path.on('mouseover', function () { + // Should not reuse above hoverStyle, which might be modified. + var hoverStyle = iconStyleEmphasisModel.getItemStyle(); + var defaultTextPosition = toolboxModel.get('orient') === 'vertical' ? toolboxModel.get('right') == null ? 'right' : 'left' : toolboxModel.get('bottom') == null ? 'bottom' : 'top'; + textContent.setStyle({ + fill: iconStyleEmphasisModel.get('textFill') || hoverStyle.fill || hoverStyle.stroke || '#000', + backgroundColor: iconStyleEmphasisModel.get('textBackgroundColor') + }); + path.setTextConfig({ + position: iconStyleEmphasisModel.get('textPosition') || defaultTextPosition + }); + textContent.ignore = !toolboxModel.get('showTitle'); // Use enterEmphasis and leaveEmphasis provide by ec. + // There are flags managed by the echarts. + + enterEmphasis(this); + }).on('mouseout', function () { + if (featureModel.get(['iconStatus', iconName]) !== 'emphasis') { + leaveEmphasis(this); + } + + textContent.hide(); + }); + (featureModel.get(['iconStatus', iconName]) === 'emphasis' ? enterEmphasis : leaveEmphasis)(path); + group.add(path); + path.on('click', bind(feature.onclick, feature, ecModel, api, iconName)); + iconPaths[iconName] = path; + }); + } + + layout$3(group, toolboxModel, api); // Render background after group is layout + // FIXME + + group.add(makeBackground(group.getBoundingRect(), toolboxModel)); // Adjust icon title positions to avoid them out of screen + + group.eachChild(function (icon) { + var titleText = icon.__title; // const hoverStyle = icon.hoverStyle; + // TODO simplify code? + + var emphasisState = icon.ensureState('emphasis'); + var emphasisTextConfig = emphasisState.textConfig || (emphasisState.textConfig = {}); + var textContent = icon.getTextContent(); + var emphasisTextState = textContent && textContent.states.emphasis; // May be background element + + if (emphasisTextState && !isFunction(emphasisTextState) && titleText) { + var emphasisTextStyle = emphasisTextState.style || (emphasisTextState.style = {}); + var rect = getBoundingRect(titleText, ZRText.makeFont(emphasisTextStyle)); + var offsetX = icon.x + group.x; + var offsetY = icon.y + group.y + itemSize; + var needPutOnTop = false; + + if (offsetY + rect.height > api.getHeight()) { + emphasisTextConfig.position = 'top'; + needPutOnTop = true; + } + + var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 8; + + if (offsetX + rect.width / 2 > api.getWidth()) { + emphasisTextConfig.position = ['100%', topOffset]; + emphasisTextStyle.align = 'right'; + } else if (offsetX - rect.width / 2 < 0) { + emphasisTextConfig.position = [0, topOffset]; + emphasisTextStyle.align = 'left'; + } + } + }); + }; + + ToolboxView.prototype.updateView = function (toolboxModel, ecModel, api, payload) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.updateView && feature.updateView(feature.model, ecModel, api, payload); + }); + }; // updateLayout(toolboxModel, ecModel, api, payload) { + // zrUtil.each(this._features, function (feature) { + // feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload); + // }); + // }, + + + ToolboxView.prototype.remove = function (ecModel, api) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.remove && feature.remove(ecModel, api); + }); + this.group.removeAll(); + }; + + ToolboxView.prototype.dispose = function (ecModel, api) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.dispose && feature.dispose(ecModel, api); + }); + }; + + ToolboxView.type = 'toolbox'; + return ToolboxView; + }(ComponentView); + + function isUserFeatureName(featureName) { + return featureName.indexOf('my') === 0; + } + + var SaveAsImage = + /** @class */ + function (_super) { + __extends(SaveAsImage, _super); + + function SaveAsImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + + SaveAsImage.prototype.onclick = function (ecModel, api) { + var model = this.model; + var title = model.get('name') || ecModel.get('title.0.text') || 'echarts'; + var isSvg = api.getZr().painter.getType() === 'svg'; + var type = isSvg ? 'svg' : model.get('type', true) || 'png'; + var url = api.getConnectedDataURL({ + type: type, + backgroundColor: model.get('backgroundColor', true) || ecModel.get('backgroundColor') || '#fff', + connectedBackgroundColor: model.get('connectedBackgroundColor'), + excludeComponents: model.get('excludeComponents'), + pixelRatio: model.get('pixelRatio') + }); // Chrome, Firefox, New Edge + + if (typeof MouseEvent === 'function' && (env.browser.newEdge || !env.browser.ie && !env.browser.edge)) { + var $a = document.createElement('a'); + $a.download = title + '.' + type; + $a.target = '_blank'; + $a.href = url; + var evt = new MouseEvent('click', { + // some micro front-end framework, window maybe is a Proxy + view: document.defaultView, + bubbles: true, + cancelable: false + }); + $a.dispatchEvent(evt); + } // IE or old Edge + else { + if (window.navigator.msSaveOrOpenBlob || isSvg) { + var parts = url.split(','); // data:[][;charset=][;base64], + + var base64Encoded = parts[0].indexOf('base64') > -1; + var bstr = isSvg // should decode the svg data uri first + ? decodeURIComponent(parts[1]) : parts[1]; // only `atob` when the data uri is encoded with base64 + // otherwise, like `svg` data uri exported by zrender, + // there will be an error, for it's not encoded with base64. + // (just a url-encoded string through `encodeURIComponent`) + + base64Encoded && (bstr = atob(bstr)); + var filename = title + '.' + type; + + if (window.navigator.msSaveOrOpenBlob) { + var n = bstr.length; + var u8arr = new Uint8Array(n); + + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + + var blob = new Blob([u8arr]); + window.navigator.msSaveOrOpenBlob(blob, filename); + } else { + var frame = document.createElement('iframe'); + document.body.appendChild(frame); + var cw = frame.contentWindow; + var doc = cw.document; + doc.open('image/svg+xml', 'replace'); + doc.write(bstr); + doc.close(); + cw.focus(); + doc.execCommand('SaveAs', true, filename); + document.body.removeChild(frame); + } + } else { + var lang = model.get('lang'); + var html = '' + '' + '' + ''; + var tab = window.open(); + tab.document.write(html); + tab.document.title = title; + } + } + }; + + SaveAsImage.getDefaultOption = function (ecModel) { + var 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: ecModel.getLocale(['toolbox', 'saveAsImage', 'title']), + type: 'png', + // Default use option.backgroundColor + // backgroundColor: '#fff', + connectedBackgroundColor: '#fff', + name: '', + excludeComponents: ['toolbox'], + // use current pixel ratio of device by default + // pixelRatio: 1, + lang: ecModel.getLocale(['toolbox', 'saveAsImage', 'lang']) + }; + return defaultOption; + }; + + return SaveAsImage; + }(ToolboxFeature); + + SaveAsImage.prototype.unusable = !env.canvasSupported; + + var INNER_STACK_KEYWORD = '__ec_magicType_stack__'; + var radioTypes = [['line', 'bar'], ['stack']]; + + var MagicType = + /** @class */ + function (_super) { + __extends(MagicType, _super); + + function MagicType() { + return _super !== null && _super.apply(this, arguments) || this; + } + + MagicType.prototype.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon'); + var icons = {}; + each(model.get('type'), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + MagicType.getDefaultOption = function (ecModel) { + var 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', + // eslint-disable-next-line + 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 + + }, + // `line`, `bar`, `stack`, `tiled` + title: ecModel.getLocale(['toolbox', 'magicType', 'title']), + option: {}, + seriesIndex: {} + }; + return defaultOption; + }; + + MagicType.prototype.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? + 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 axisType = axisDim + 'Axis'; + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + var axisIndex = axisModel.componentIndex; + newOption[axisType] = newOption[axisType] || []; + + for (var i = 0; i <= axisIndex; i++) { + newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {}; + } + + newOption[axisType][axisIndex].boundaryGap = type === 'bar'; + } + } + }; + + each(radioTypes, function (radio) { + if (indexOf(radio, type) >= 0) { + each(radio, function (item) { + model.setIconStatus(item, 'normal'); + }); + } + }); + model.setIconStatus(type, 'emphasis'); + ecModel.eachComponent({ + mainType: 'series', + query: seriesIndex == null ? null : { + seriesIndex: seriesIndex + } + }, generateNewSeriesTypes); + var newTitle; // Change title of stack + + if (type === 'stack') { + // use titles in model instead of ecModel + // as stack and tiled appears in pair, just flip them + // no need of checking stack state + newTitle = merge({ + stack: model.option.title.tiled, + tiled: model.option.title.stack + }, model.option.title); + } + + api.dispatchAction({ + type: 'changeMagicType', + currentType: type, + newOption: newOption, + newTitle: newTitle, + featureName: 'magicType' + }); + }; + + return MagicType; + }(ToolboxFeature); + + var seriesOptGenreator = { + 'line': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'bar') { + return 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 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) { + var isStack = seriesModel.get('stack') === INNER_STACK_KEYWORD; + + if (seriesType === 'line' || seriesType === 'bar') { + model.setIconStatus('stack', isStack ? 'normal' : 'emphasis'); + return merge({ + id: seriesId, + stack: isStack ? '' : INNER_STACK_KEYWORD + }, model.get(['option', 'stack']) || {}, true); + } + } + }; // TODO: SELF REGISTERED. + + registerAction({ + type: 'changeMagicType', + event: 'magicTypeChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.mergeOption(payload.newOption); + }); + + 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 + */ + + 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')) { + // TODO: TYPE Consider polar? Include polar may increase unecessary bundle size. + 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 + * @inner + */ + + + function assembleSeriesWithCategoryAxis(groups) { + var tables = []; + each(groups, function (group, key) { + var categoryAxis = group.categoryAxis; + var valueAxis = group.valueAxis; + var valueAxisDim = valueAxis.dim; + var headers = [' '].concat(map(group.series, function (series) { + return series.name; + })); // @ts-ignore TODO Polar + + var columns = [categoryAxis.model.getCategories()]; + each(group.series, function (series) { + var rawData = series.getRawData(); + columns.push(series.getRawData().mapArray(rawData.mapDimension(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 + */ + + + function assembleOtherSeries(series) { + return 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'); + } + + function getContentFromModel(ecModel) { + var result = groupSeries(ecModel); + return { + value: 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$1(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 {Object} + */ + + function parseTSVContents(tsv) { + var tsvLines = tsv.split(/\n+/g); + var headers = trim$1(tsvLines.shift()).split(itemSplitRegex); + var categories = []; + var series = map(headers, function (header) { + return { + name: header, + data: [] + }; + }); + + for (var i = 0; i < tsvLines.length; i++) { + var items = trim$1(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 + }; + } + + function parseListContents(str) { + var lines = str.split(/\n+/g); + var seriesName = trim$1(lines.shift()); + var data = []; + + for (var i = 0; i < lines.length; i++) { + // if line is empty, ignore it. + // there is a case that a user forgot to delete `\n`. + var line = trim$1(lines[i]); + + if (!line) { + continue; + } + + var items = line.split(itemSplitRegex); + var name_1 = ''; + var value = void 0; + var hasName = false; + + if (isNaN(items[0])) { + // First item is name + hasName = true; + name_1 = items[0]; + items = items.slice(1); + data[i] = { + name: name_1, + 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 + }; + } + + function parseContents(str, blockMetaList) { + var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g')); + var newOption = { + series: [] + }; + 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; + } + + var DataView = + /** @class */ + function (_super) { + __extends(DataView, _super); + + function DataView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + 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:auto;'; + 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 (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; + } + + addEventListener(closeButton, 'click', close); + addEventListener(refreshButton, 'click', function () { + if (contentToOption == null && optionToContent != null || contentToOption != null && optionToContent == null) { + if ("development" !== 'production') { + // eslint-disable-next-line + console.warn('It seems you have just provided one of `contentToOption` and `optionToContent` functions but missed the other one. Data change is ignored.'); + } + + close(); + return; + } + + 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); + 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); + }; + + DataView.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + readOnly: false, + optionToContent: null, + contentToOption: null, + // eslint-disable-next-line + 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: ecModel.getLocale(['toolbox', 'dataView', 'title']), + lang: ecModel.getLocale(['toolbox', 'dataView', 'lang']), + backgroundColor: '#fff', + textColor: '#000', + textareaColor: '#fff', + textareaBorderColor: '#333', + buttonColor: '#c23531', + buttonTextColor: '#fff' + }; + return defaultOption; + }; + + return DataView; + }(ToolboxFeature); + /** + * @inner + */ + + + function tryMergeDataOption(newData, originalData) { + return map(newData, function (newVal, idx) { + var original = originalData && originalData[idx]; + + if (isObject(original) && !isArray(original)) { + var newValIsObject = isObject(newVal) && !isArray(newVal); + + if (!newValIsObject) { + newVal = { + value: newVal + }; + } // original data has name but new data has no name + + + var shouldDeleteName = original.name != null && newVal.name == null; // Original data has option + + newVal = defaults(newVal, original); + shouldDeleteName && delete newVal.name; + return newVal; + } else { + return newVal; + } + }); + } // TODO: SELF REGISTERED. + + + registerAction({ + type: 'changeDataView', + event: 'dataViewChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + var newSeriesOptList = []; + each(payload.newOption.series, function (seriesOpt) { + var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; + + if (!seriesModel) { + // New created series + // Geuss the series type + newSeriesOptList.push(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(defaults({ + series: newSeriesOptList + }, payload.newOption)); + }); + + var each$a = each; + var inner$h = makeInner(); + /** + * @param ecModel + * @param newSnapshot key is dataZoomId + */ + + function push(ecModel, newSnapshot) { + var storedSnapshots = getStoreSnapshots(ecModel); // If previous dataZoom can not be found, + // complete an range with current range. + + each$a(newSnapshot, function (batchItem, dataZoomId) { + var i = storedSnapshots.length - 1; + + for (; i >= 0; i--) { + var snapshot = storedSnapshots[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(); + storedSnapshots[0][dataZoomId] = { + dataZoomId: dataZoomId, + start: percentRange[0], + end: percentRange[1] + }; + } + } + }); + storedSnapshots.push(newSnapshot); + } + function pop(ecModel) { + var storedSnapshots = getStoreSnapshots(ecModel); + var head = storedSnapshots[storedSnapshots.length - 1]; + storedSnapshots.length > 1 && storedSnapshots.pop(); // Find top for all dataZoom. + + var snapshot = {}; + each$a(head, function (batchItem, dataZoomId) { + for (var i = storedSnapshots.length - 1; i >= 0; i--) { + batchItem = storedSnapshots[i][dataZoomId]; + + if (batchItem) { + snapshot[dataZoomId] = batchItem; + break; + } + } + }); + return snapshot; + } + function clear$1(ecModel) { + inner$h(ecModel).snapshots = null; + } + function count(ecModel) { + return getStoreSnapshots(ecModel).length; + } + /** + * History length of each dataZoom may be different. + * this._history[0] is used to store origin range. + */ + + function getStoreSnapshots(ecModel) { + var store = inner$h(ecModel); + + if (!store.snapshots) { + store.snapshots = [{}]; + } + + return store.snapshots; + } + + var RestoreOption = + /** @class */ + function (_super) { + __extends(RestoreOption, _super); + + function RestoreOption() { + return _super !== null && _super.apply(this, arguments) || this; + } + + RestoreOption.prototype.onclick = function (ecModel, api) { + clear$1(ecModel); + api.dispatchAction({ + type: 'restore', + from: this.uid + }); + }; + + RestoreOption.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + // eslint-disable-next-line + 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: ecModel.getLocale(['toolbox', 'restore', 'title']) + }; + return defaultOption; + }; + + return RestoreOption; + }(ToolboxFeature); // TODO: SELF REGISTERED. + + + registerAction({ + type: 'restore', + event: 'restore', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.resetOption('recreate'); + }); + + var COORD_CONVERTS = ['dataToPoint', 'pointToData']; // FIXME + // how to genarialize to more coordinate systems. + + var INCLUDE_FINDER_MAIN_TYPES = ['grid', 'xAxis', 'yAxis', 'geo', 'graph', 'polar', 'radiusAxis', 'angleAxis', 'bmap']; + + var BrushTargetManager = + /** @class */ + function () { + /** + * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid + * Each can be {number|Array.}. like: {xAxisIndex: [3, 4]} + * @param opt.include include coordinate system types. + */ + function BrushTargetManager(finder, ecModel, opt) { + var _this = this; + + this._targetInfoList = []; + var foundCpts = parseFinder$1(ecModel, finder); + each(targetInfoBuilders, function (builder, type) { + if (!opt || !opt.include || indexOf(opt.include, type) >= 0) { + builder(foundCpts, _this._targetInfoList); + } + }); + } + + BrushTargetManager.prototype.setOutputRanges = function (areas, ecModel) { + this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + (area.coordRanges || (area.coordRanges = [])).push(coordRange); // area.coordRange is the first of area.coordRanges + + if (!area.coordRange) { + area.coordRange = coordRange; // In 'category' axis, coord to pixel is not reversible, so we can not + // rebuild range by coordRange accrately, which may bring trouble when + // brushing only one item. So we use __rangeOffset to rebuilding range + // by coordRange. And this it only used in brush component so it is no + // need to be adapted to coordRanges. + + var result = coordConvert[area.brushType](0, coordSys, coordRange); + area.__rangeOffset = { + offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]), + xyMinMax: result.xyMinMax + }; + } + }); + return areas; + }; + + BrushTargetManager.prototype.matchOutputRanges = function (areas, ecModel, cb) { + each(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if (targetInfo && targetInfo !== true) { + each(targetInfo.coordSyses, function (coordSys) { + var result = coordConvert[area.brushType](1, coordSys, area.range); + cb(area, result.values, coordSys, ecModel); + }); + } + }, this); + }; + /** + * the `areas` is `BrushModel.areas`. + * Called in layout stage. + * convert `area.coordRange` to global range and set panelId to `area.range`. + */ + + + BrushTargetManager.prototype.setInputRanges = function (areas, ecModel) { + each(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if ("development" !== 'production') { + assert(!targetInfo || targetInfo === true || area.coordRange, 'coordRange must be specified when coord index specified.'); + assert(!targetInfo || targetInfo !== true || area.range, 'range must be specified in global brush.'); + } + + area.range = area.range || []; // convert coordRange to global range and set panelId. + + if (targetInfo && targetInfo !== true) { + area.panelId = targetInfo.panelId; // (1) area.range shoule always be calculate from coordRange but does + // not keep its original value, for the sake of the dataZoom scenario, + // where area.coordRange remains unchanged but area.range may be changed. + // (2) Only support converting one coordRange to pixel range in brush + // component. So do not consider `coordRanges`. + // (3) About __rangeOffset, see comment above. + + var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange); + var rangeOffset = area.__rangeOffset; + area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values; + } + }, this); + }; + + BrushTargetManager.prototype.makePanelOpts = function (api, getDefaultBrushType) { + return map(this._targetInfoList, function (targetInfo) { + var rect = targetInfo.getPanelRect(); + return { + panelId: targetInfo.panelId, + defaultBrushType: getDefaultBrushType ? getDefaultBrushType(targetInfo) : null, + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect) + }; + }); + }; + + BrushTargetManager.prototype.controlSeries = function (area, seriesModel, ecModel) { + // Check whether area is bound in coord, and series do not belong to that coord. + // If do not do this check, some brush (like lineX) will controll all axes. + var targetInfo = this.findTargetInfo(area, ecModel); + return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0; + }; + /** + * If return Object, a coord found. + * If reutrn true, global found. + * Otherwise nothing found. + */ + + + BrushTargetManager.prototype.findTargetInfo = function (area, ecModel) { + var targetInfoList = this._targetInfoList; + var foundCpts = parseFinder$1(ecModel, area); + + for (var i = 0; i < targetInfoList.length; i++) { + var targetInfo = targetInfoList[i]; + var areaPanelId = area.panelId; + + if (areaPanelId) { + if (targetInfo.panelId === areaPanelId) { + return targetInfo; + } + } else { + for (var j = 0; j < targetInfoMatchers.length; j++) { + if (targetInfoMatchers[j](foundCpts, targetInfo)) { + return targetInfo; + } + } + } + } + + return true; + }; + + return BrushTargetManager; + }(); + + function formatMinMax(minMax) { + minMax[0] > minMax[1] && minMax.reverse(); + return minMax; + } + + function parseFinder$1(ecModel, finder) { + return parseFinder(ecModel, finder, { + includeMainTypes: INCLUDE_FINDER_MAIN_TYPES + }); + } + + var targetInfoBuilders = { + grid: function (foundCpts, targetInfoList) { + var xAxisModels = foundCpts.xAxisModels; + var yAxisModels = foundCpts.yAxisModels; + var gridModels = foundCpts.gridModels; // Remove duplicated. + + var gridModelMap = createHashMap(); + var xAxesHas = {}; + var yAxesHas = {}; + + if (!xAxisModels && !yAxisModels && !gridModels) { + return; + } + + each(xAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + }); + each(yAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + yAxesHas[gridModel.id] = true; + }); + each(gridModels, function (gridModel) { + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + yAxesHas[gridModel.id] = true; + }); + gridModelMap.each(function (gridModel) { + var grid = gridModel.coordinateSystem; + var cartesians = []; + each(grid.getCartesians(), function (cartesian, index) { + if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0 || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0) { + cartesians.push(cartesian); + } + }); + targetInfoList.push({ + panelId: 'grid--' + gridModel.id, + gridModel: gridModel, + coordSysModel: gridModel, + // Use the first one as the representitive coordSys. + coordSys: cartesians[0], + coordSyses: cartesians, + getPanelRect: panelRectBuilders.grid, + xAxisDeclared: xAxesHas[gridModel.id], + yAxisDeclared: yAxesHas[gridModel.id] + }); + }); + }, + geo: function (foundCpts, targetInfoList) { + each(foundCpts.geoModels, function (geoModel) { + var coordSys = geoModel.coordinateSystem; + targetInfoList.push({ + panelId: 'geo--' + geoModel.id, + geoModel: geoModel, + coordSysModel: geoModel, + coordSys: coordSys, + coordSyses: [coordSys], + getPanelRect: panelRectBuilders.geo + }); + }); + } + }; + var targetInfoMatchers = [// grid + function (foundCpts, targetInfo) { + var xAxisModel = foundCpts.xAxisModel; + var yAxisModel = foundCpts.yAxisModel; + var gridModel = foundCpts.gridModel; + !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model); + !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model); + return gridModel && gridModel === targetInfo.gridModel; + }, // geo + function (foundCpts, targetInfo) { + var geoModel = foundCpts.geoModel; + return geoModel && geoModel === targetInfo.geoModel; + }]; + var panelRectBuilders = { + grid: function () { + // grid is not Transformable. + return this.coordSys.master.getRect().clone(); + }, + geo: function () { + var coordSys = this.coordSys; + var rect = coordSys.getBoundingRect().clone(); // geo roam and zoom transform + + rect.applyTransform(getTransform(coordSys)); + return rect; + } + }; + var coordConvert = { + lineX: curry(axisConvert, 0), + lineY: curry(axisConvert, 1), + rect: function (to, coordSys, rangeOrCoordRange) { + var xminymin = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]]); + var xmaxymax = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]]); + var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])]; + return { + values: values, + xyMinMax: values + }; + }, + polygon: function (to, coordSys, rangeOrCoordRange) { + var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]]; + var values = map(rangeOrCoordRange, function (item) { + var p = coordSys[COORD_CONVERTS[to]](item); + xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]); + xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]); + xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]); + xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]); + return p; + }); + return { + values: values, + xyMinMax: xyMinMax + }; + } + }; + + function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) { + if ("development" !== 'production') { + assert(coordSys.type === 'cartesian2d', 'lineX/lineY brush is available only in cartesian2d.'); + } + + var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]); + var values = formatMinMax(map([0, 1], function (i) { + return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i])) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i])); + })); + var xyMinMax = []; + xyMinMax[axisNameIndex] = values; + xyMinMax[1 - axisNameIndex] = [NaN, NaN]; + return { + values: values, + xyMinMax: xyMinMax + }; + } + + var diffProcessor = { + lineX: curry(axisDiffProcessor, 0), + lineY: curry(axisDiffProcessor, 1), + rect: function (values, refer, scales) { + return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]]; + }, + polygon: function (values, refer, scales) { + return map(values, function (item, idx) { + return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]]; + }); + } + }; + + function axisDiffProcessor(axisNameIndex, values, refer, scales) { + return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]]; + } // We have to process scale caused by dataZoom manually, + // although it might be not accurate. + // Return [0~1, 0~1] + + + function getScales(xyMinMaxCurr, xyMinMaxOrigin) { + var sizeCurr = getSize(xyMinMaxCurr); + var sizeOrigin = getSize(xyMinMaxOrigin); + var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]]; + isNaN(scales[0]) && (scales[0] = 1); + isNaN(scales[1]) && (scales[1] = 1); + return scales; + } + + function getSize(xyMinMax) { + return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN]; + } + + var each$b = each; + var DATA_ZOOM_ID_BASE = makeInternalComponentId('toolbox-dataZoom_'); + + var DataZoomFeature = + /** @class */ + function (_super) { + __extends(DataZoomFeature, _super); + + function DataZoomFeature() { + return _super !== null && _super.apply(this, arguments) || this; + } + + DataZoomFeature.prototype.render = function (featureModel, ecModel, api, payload) { + if (!this._brushController) { + this._brushController = new BrushController(api.getZr()); + + this._brushController.on('brush', bind(this._onBrush, this)).mount(); + } + + updateZoomBtnStatus(featureModel, ecModel, this, payload, api); + updateBackBtnStatus(featureModel, ecModel); + }; + + DataZoomFeature.prototype.onclick = function (ecModel, api, type) { + handlers$1[type].call(this); + }; + + DataZoomFeature.prototype.remove = function (ecModel, api) { + this._brushController && this._brushController.unmount(); + }; + + DataZoomFeature.prototype.dispose = function (ecModel, api) { + this._brushController && this._brushController.dispose(); + }; + + DataZoomFeature.prototype._onBrush = function (eventParam) { + var areas = eventParam.areas; + + if (!eventParam.isEnd || !areas.length) { + return; + } + + var snapshot = {}; + var ecModel = this.ecModel; + + this._brushController.updateCovers([]); // remove cover + + + var brushTargetManager = new BrushTargetManager(makeAxisFinder(this.model), ecModel, { + include: ['grid'] + }); + brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + if (coordSys.type !== 'cartesian2d') { + return; + } + + var brushType = area.brushType; + + if (brushType === 'rect') { + setBatch('x', coordSys, coordRange[0]); + setBatch('y', coordSys, coordRange[1]); + } else { + setBatch({ + lineX: 'x', + lineY: 'y' + }[brushType], coordSys, coordRange); + } + }); + push(ecModel, snapshot); + + this._dispatchZoomAction(snapshot); + + function setBatch(dimName, coordSys, minMax) { + var axis = coordSys.getAxis(dimName); + var axisModel = axis.model; + var dataZoomModel = findDataZoom(dimName, axisModel, ecModel); // Restrict range. + + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan(); + + if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) { + minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan); + } + + dataZoomModel && (snapshot[dataZoomModel.id] = { + dataZoomId: dataZoomModel.id, + startValue: minMax[0], + endValue: minMax[1] + }); + } + + function findDataZoom(dimName, axisModel, ecModel) { + var found; + ecModel.eachComponent({ + mainType: 'dataZoom', + subType: 'select' + }, function (dzModel) { + var has = dzModel.getAxisModel(dimName, axisModel.componentIndex); + has && (found = dzModel); + }); + return found; + } + }; + + DataZoomFeature.prototype._dispatchZoomAction = function (snapshot) { + var batch = []; // Convert from hash map to array. + + each$b(snapshot, function (batchItem, dataZoomId) { + batch.push(clone(batchItem)); + }); + batch.length && this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + batch: batch + }); + }; + + DataZoomFeature.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + filterMode: 'filter', + // 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' + }, + // `zoom`, `back` + title: ecModel.getLocale(['toolbox', 'dataZoom', 'title']), + brushStyle: { + borderWidth: 0, + color: 'rgba(210,219,238,0.2)' + } + }; + return defaultOption; + }; + + return DataZoomFeature; + }(ToolboxFeature); + + var handlers$1 = { + zoom: function () { + var nextActive = !this._isZoomActive; + this.api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'dataZoomSelect', + dataZoomSelectActive: nextActive + }); + }, + back: function () { + this._dispatchZoomAction(pop(this.ecModel)); + } + }; + + function makeAxisFinder(dzFeatureModel) { + var setting = { + xAxisIndex: dzFeatureModel.get('xAxisIndex', true), + yAxisIndex: dzFeatureModel.get('yAxisIndex', true), + xAxisId: dzFeatureModel.get('xAxisId', true), + yAxisId: dzFeatureModel.get('yAxisId', true) + }; // If both `xAxisIndex` `xAxisId` not set, it means 'all'. + // If both `yAxisIndex` `yAxisId` not set, it means 'all'. + // Some old cases set like this below to close yAxis control but leave xAxis control: + // `{ feature: { dataZoom: { yAxisIndex: false } }`. + + if (setting.xAxisIndex == null && setting.xAxisId == null) { + setting.xAxisIndex = 'all'; + } + + if (setting.yAxisIndex == null && setting.yAxisId == null) { + setting.yAxisIndex = 'all'; + } + + return setting; + } + + function updateBackBtnStatus(featureModel, ecModel) { + featureModel.setIconStatus('back', count(ecModel) > 1 ? 'emphasis' : 'normal'); + } + + function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) { + var zoomActive = view._isZoomActive; + + if (payload && payload.type === 'takeGlobalCursor') { + zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false; + } + + view._isZoomActive = zoomActive; + featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal'); + var brushTargetManager = new BrushTargetManager(makeAxisFinder(featureModel), ecModel, { + include: ['grid'] + }); + var panels = brushTargetManager.makePanelOpts(api, function (targetInfo) { + return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect'; + }); + + view._brushController.setPanels(panels).enableBrush(zoomActive && panels.length ? { + brushType: 'auto', + brushStyle: featureModel.getModel('brushStyle').getItemStyle() + } : false); + } + + registerInternalOptionCreator('dataZoom', function (ecModel) { + var toolboxModel = ecModel.getComponent('toolbox', 0); + + if (!toolboxModel) { + return; + } + + var dzFeatureModel = toolboxModel.getModel(['feature', 'dataZoom']); + var dzOptions = []; + var finder = makeAxisFinder(dzFeatureModel); + var finderResult = parseFinder(ecModel, finder); + each$b(finderResult.xAxisModels, function (axisModel) { + return buildInternalOptions(axisModel, 'xAxis', 'xAxisIndex'); + }); + each$b(finderResult.yAxisModels, function (axisModel) { + return buildInternalOptions(axisModel, 'yAxis', 'yAxisIndex'); + }); + + function buildInternalOptions(axisModel, axisMainType, axisIndexPropName) { + var axisIndex = axisModel.componentIndex; + var newOpt = { + type: 'select', + $fromToolbox: true, + // Default to be filter + filterMode: dzFeatureModel.get('filterMode', true) || 'filter', + // Id for merge mapping. + id: DATA_ZOOM_ID_BASE + axisMainType + axisIndex + }; + newOpt[axisIndexPropName] = axisIndex; + dzOptions.push(newOpt); + } + + return dzOptions; + }); + + function install$z(registers) { + registers.registerComponentModel(ToolboxModel); + registers.registerComponentView(ToolboxView); + registerFeature('saveAsImage', SaveAsImage); + registerFeature('magicType', MagicType); + registerFeature('dataView', DataView); + registerFeature('dataZoom', DataZoomFeature); + registerFeature('restore', RestoreOption); + use(install$y); + } + + var TooltipModel = + /** @class */ + function (_super) { + __extends(TooltipModel, _super); + + function TooltipModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TooltipModel.type; + return _this; + } + + TooltipModel.type = 'tooltip'; + TooltipModel.dependencies = ['axisPointer']; + TooltipModel.defaultOption = { + zlevel: 0, + z: 60, + show: true, + // tooltip main content + showContent: true, + // 'trigger' only works on coordinate system. + // 'item' | 'axis' | 'none' + trigger: 'item', + // 'click' | 'mousemove' | 'none' + triggerOn: 'mousemove|click', + alwaysShowContent: false, + displayMode: 'single', + renderMode: 'auto', + // whether restraint content inside viewRect. + // If renderMode: 'richText', default true. + // If renderMode: 'html', defaut false (for backward compat). + confine: null, + showDelay: 0, + hideDelay: 100, + // Animation transition time, unit is second + transitionDuration: 0.4, + enterable: false, + backgroundColor: '#fff', + // box shadow + shadowBlur: 10, + shadowColor: 'rgba(0, 0, 0, .2)', + shadowOffsetX: 1, + shadowOffsetY: 2, + // tooltip border radius, unit is px, default is 4 + borderRadius: 4, + // tooltip border width, unit is px, default is 0 (no border) + borderWidth: 1, + // Tooltip inside padding, default is 5 for all direction + // Array is allowed to set up, right, bottom, left, same with css + // The default value: See `tooltip/tooltipMarkup.ts#getPaddingFromTooltipModel`. + padding: null, + // Extra css text + extraCssText: '', + // axis indicator, trigger by axis + axisPointer: { + // default is line + // legal values: 'line' | 'shadow' | 'cross' + type: 'line', + // Valid when type is line, appoint tooltip line locate on which line. Optional + // legal values: 'x' | 'y' | 'angle' | 'radius' | 'auto' + // default is 'auto', chose the axis which type is category. + // for multiply y axis, cartesian coord chose x axis, polar chose angle axis + axis: 'auto', + animation: 'auto', + animationDurationUpdate: 200, + animationEasingUpdate: 'exponentialOut', + crossStyle: { + color: '#999', + width: 1, + type: 'dashed', + // TODO formatter + textStyle: {} + } // lineStyle and shadowStyle should not be specified here, + // otherwise it will always override those styles on option.axisPointer. + + }, + textStyle: { + color: '#666', + fontSize: 14 + } + }; + return TooltipModel; + }(ComponentModel); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function shouldTooltipConfine(tooltipModel) { + var confineOption = tooltipModel.get('confine'); + return confineOption != null ? !!confineOption // In richText mode, the outside part can not be visible. + : tooltipModel.get('renderMode') === 'richText'; + } + + var vendors = ['-ms-', '-moz-', '-o-', '-webkit-', '']; + var gCssText = 'position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;'; + + function mirrorPos(pos) { + pos = pos === 'left' ? 'right' : pos === 'right' ? 'left' : pos === 'top' ? 'bottom' : 'top'; + return pos; + } + + function assembleArrow(backgroundColor, borderColor, arrowPosition) { + if (!isString(arrowPosition) || arrowPosition === 'inside') { + return ''; + } + + borderColor = convertToColorString(borderColor); + var arrowPos = mirrorPos(arrowPosition); + var positionStyle = ''; + var transformStyle = ''; + + if (indexOf(['left', 'right'], arrowPos) > -1) { + positionStyle = arrowPos + ":-6px;top:50%;"; + transformStyle = "translateY(-50%) rotate(" + (arrowPos === 'left' ? -225 : -45) + "deg)"; + } else { + positionStyle = arrowPos + ":-6px;left:50%;"; + transformStyle = "translateX(-50%) rotate(" + (arrowPos === 'top' ? 225 : 45) + "deg)"; + } + + transformStyle = map(vendors, function (vendorPrefix) { + return vendorPrefix + 'transform:' + transformStyle; + }).join(';'); + var styleCss = ['position:absolute;width:10px;height:10px;', "" + positionStyle + transformStyle + ";", "border-bottom: " + borderColor + " solid 1px;", "border-right: " + borderColor + " solid 1px;", "background-color: " + backgroundColor + ";", 'box-shadow: 8px 8px 16px -3px #000;']; + return "
                                  "; + } + + function assembleTransition(duration, onlyFade) { + var transitionCurve = 'cubic-bezier(0.23, 1, 0.32, 1)'; + var transitionText = 'opacity ' + duration / 2 + 's ' + transitionCurve + ',' + 'visibility ' + duration / 2 + 's ' + transitionCurve; + + if (!onlyFade) { + transitionText += ',left ' + duration + 's ' + transitionCurve + ',top ' + duration + 's ' + transitionCurve; + } + + return 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 // @ts-ignore, leave it to the tooltip refactor. + && cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px'); + var shadowColor = textStyleModel.get('textShadowColor'); + var shadowBlur = textStyleModel.get('textShadowBlur') || 0; + var shadowOffsetX = textStyleModel.get('textShadowOffsetX') || 0; + var shadowOffsetY = textStyleModel.get('textShadowOffsetY') || 0; + shadowColor && shadowBlur && cssText.push('text-shadow:' + shadowOffsetX + 'px ' + shadowOffsetY + 'px ' + shadowBlur + 'px ' + shadowColor); + each(['decoration', 'align'], function (name) { + var val = textStyleModel.get(name); + val && cssText.push('text-' + name + ':' + val); + }); + return cssText.join(';'); + } + + function assembleCssText(tooltipModel, enableTransition, onlyFade) { + var cssText = []; + var transitionDuration = tooltipModel.get('transitionDuration'); + var backgroundColor = tooltipModel.get('backgroundColor'); + var shadowBlur = tooltipModel.get('shadowBlur'); + var shadowColor = tooltipModel.get('shadowColor'); + var shadowOffsetX = tooltipModel.get('shadowOffsetX'); + var shadowOffsetY = tooltipModel.get('shadowOffsetY'); + var textStyleModel = tooltipModel.getModel('textStyle'); + var padding = getPaddingFromTooltipModel(tooltipModel, 'html'); + var boxShadow = shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor; + cssText.push('box-shadow:' + boxShadow); // Animation transition. Do not animate when transitionDuration is 0. + + enableTransition && transitionDuration && cssText.push(assembleTransition(transitionDuration, onlyFade)); + + if (backgroundColor) { + if (env.canvasSupported) { + cssText.push('background-Color:' + backgroundColor); + } else { + // for ie + cssText.push('background-Color:#' + toHex(backgroundColor)); + cssText.push('filter:alpha(opacity=70)'); + } + } // 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:' + normalizeCssArray$1(padding).join('px ') + 'px'); + } + + return cssText.join(';') + ';'; + } // If not able to make, do not modify the input `out`. + + + function makeStyleCoord(out, zr, appendToBody, zrX, zrY) { + var zrPainter = zr && zr.painter; + + if (appendToBody) { + var zrViewportRoot = zrPainter && zrPainter.getViewportRoot(); + + if (zrViewportRoot) { + // Some APPs might use scale on body, so we support CSS transform here. + transformLocalCoord(out, zrViewportRoot, document.body, zrX, zrY); + } + } else { + out[0] = zrX; + out[1] = zrY; // xy should be based on canvas root. But tooltipContent is + // the sibling of canvas root. So padding of ec container + // should be considered here. + + var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset(); + + if (viewportRootOffset) { + out[0] += viewportRootOffset.offsetLeft; + out[1] += viewportRootOffset.offsetTop; + } + } + + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); + } + + var TooltipHTMLContent = + /** @class */ + function () { + function TooltipHTMLContent(container, api, opt) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._enterable = true; + this._firstShow = true; + this._longHide = true; + + if (env.wxa) { + return null; + } + + var el = document.createElement('div'); // TODO: TYPE + + el.domBelongToZr = true; + this.el = el; + var zr = this._zr = api.getZr(); + var appendToBody = this._appendToBody = opt && opt.appendToBody; + makeStyleCoord(this._styleCoord, zr, appendToBody, api.getWidth() / 2, api.getHeight() / 2); + + if (appendToBody) { + document.body.appendChild(el); + } else { + container.appendChild(el); + } + + this._container = container; // FIXME + // Is it needed to trigger zr event manually if + // the browser do not support `pointer-events: none`. + + 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) { + e = e || window.event; + + if (!self._enterable) { + // `pointer-events: none` is set to tooltip content div + // if `enterable` is set as `false`, and `el.onmousemove` + // can not be triggered. But in browser that do not + // support `pointer-events`, we need to do this: + // Try trigger zrender event to avoid mouse + // in and out shape too frequently + var handler = zr.handler; + var zrViewportRoot = zr.painter.getViewportRoot(); + normalizeEvent(zrViewportRoot, e, true); + handler.dispatch('mousemove', e); + } + }; + + el.onmouseleave = function () { + // set `_inContent` to `false` before `hideLater` + self._inContent = false; + + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + }; + } + /** + * Update when tooltip is rendered + */ + + + TooltipHTMLContent.prototype.update = function (tooltipModel) { + // FIXME + // Move this logic to ec main? + 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'; + } // move tooltip if chart resized + + + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); // update className + + this.el.className = tooltipModel.get('className') || ''; // Hide the tooltip + // PENDING + // this.hide(); + }; + + TooltipHTMLContent.prototype.show = function (tooltipModel, nearPointColor) { + clearTimeout(this._hideTimeout); + clearTimeout(this._longHideTimeout); + var el = this.el; + var styleCoord = this._styleCoord; + var offset = el.offsetHeight / 2; + nearPointColor = convertToColorString(nearPointColor); + el.style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide) // Because of the reason described in: + // http://stackoverflow.com/questions/21125587/css3-transition-not-working-in-chrome-anymore + // we should set initial value to `left` and `top`. + + ';left:' + styleCoord[0] + 'px;top:' + (styleCoord[1] - offset) + 'px;' + ("border-color: " + nearPointColor + ";") + (tooltipModel.get('extraCssText') || ''); + el.style.display = el.innerHTML ? 'block' : 'none'; // If mouse occasionally move over the tooltip, a mouseout event will be + // triggered by canvas, and cause some unexpectable result like dragging + // stop, "unfocusAdjacency". Here `pointer-events: none` is used to solve + // it. Although it is not supported by IE8~IE10, fortunately it is a rare + // scenario. + + el.style.pointerEvents = this._enterable ? 'auto' : 'none'; + this._show = true; + this._firstShow = false; + this._longHide = false; + }; + + TooltipHTMLContent.prototype.setContent = function (content, markers, tooltipModel, borderColor, arrowPosition) { + if (content == null) { + return; + } + + var el = this.el; + + if (isString(arrowPosition) && tooltipModel.get('trigger') === 'item' && !shouldTooltipConfine(tooltipModel)) { + content += assembleArrow(tooltipModel.get('backgroundColor'), borderColor, arrowPosition); + } + + if (isString(content)) { + el.innerHTML = content; + } else if (content) { + // Clear previous + el.innerHTML = ''; + + if (!isArray(content)) { + content = [content]; + } + + for (var i = 0; i < content.length; i++) { + if (isDom(content[i]) && content[i].parentNode !== el) { + el.appendChild(content[i]); + } + } + } + }; + + TooltipHTMLContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + + TooltipHTMLContent.prototype.getSize = function () { + var el = this.el; + return [el.clientWidth, el.clientHeight]; + }; + + TooltipHTMLContent.prototype.moveTo = function (zrX, zrY) { + var styleCoord = this._styleCoord; + makeStyleCoord(styleCoord, this._zr, this._appendToBody, zrX, zrY); + + if (styleCoord[0] != null && styleCoord[1] != null) { + var style = this.el.style; // If using float on style, the final width of the dom might + // keep changing slightly while mouse move. So `toFixed(0)` them. + + style.left = styleCoord[0].toFixed(0) + 'px'; + style.top = styleCoord[1].toFixed(0) + 'px'; + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + + + TooltipHTMLContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; // The ratio of top to height + + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + + TooltipHTMLContent.prototype.hide = function () { + var _this = this; + + this.el.style.visibility = 'hidden'; + this.el.style.opacity = '0'; + this._show = false; + this._longHideTimeout = setTimeout(function () { + return _this._longHide = true; + }, 500); + }; + + TooltipHTMLContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable)) { + if (time) { + this._hideDelay = time; // Set show false to avoid invoke hideLater multiple times + + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } else { + this.hide(); + } + } + }; + + TooltipHTMLContent.prototype.isShow = function () { + return this._show; + }; + + TooltipHTMLContent.prototype.dispose = function () { + this.el.parentNode.removeChild(this.el); + }; + + TooltipHTMLContent.prototype.getOuterSize = function () { + var width = this.el.clientWidth; + var height = this.el.clientHeight; // Consider browser compatibility. + // IE8 does not support getComputedStyle. + + if (document.defaultView && document.defaultView.getComputedStyle) { + var stl = document.defaultView.getComputedStyle(this.el); + + if (stl) { + width += parseInt(stl.borderLeftWidth, 10) + parseInt(stl.borderRightWidth, 10); + height += parseInt(stl.borderTopWidth, 10) + parseInt(stl.borderBottomWidth, 10); + } + } + + return { + width: width, + height: height + }; + }; + + return TooltipHTMLContent; + }(); + + var TooltipRichContent = + /** @class */ + function () { + function TooltipRichContent(api) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._enterable = true; + this._zr = api.getZr(); + makeStyleCoord$1(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2); + } + /** + * Update when tooltip is rendered + */ + + + TooltipRichContent.prototype.update = function (tooltipModel) { + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); + }; + + TooltipRichContent.prototype.show = function () { + if (this._hideTimeout) { + clearTimeout(this._hideTimeout); + } + + this.el.show(); + this._show = true; + }; + /** + * Set tooltip content + */ + + + TooltipRichContent.prototype.setContent = function (content, markupStyleCreator, tooltipModel, borderColor, arrowPosition) { + if (isObject(content)) { + throwError("development" !== 'production' ? 'Passing DOM nodes as content is not supported in richText tooltip!' : ''); + } + + if (this.el) { + this._zr.remove(this.el); + } + + var textStyleModel = tooltipModel.getModel('textStyle'); + this.el = new ZRText({ + style: { + rich: markupStyleCreator.richTextStyles, + text: content, + lineHeight: 22, + backgroundColor: tooltipModel.get('backgroundColor'), + borderRadius: tooltipModel.get('borderRadius'), + borderWidth: 1, + borderColor: borderColor, + shadowColor: tooltipModel.get('shadowColor'), + shadowBlur: tooltipModel.get('shadowBlur'), + shadowOffsetX: tooltipModel.get('shadowOffsetX'), + shadowOffsetY: tooltipModel.get('shadowOffsetY'), + textShadowColor: textStyleModel.get('textShadowColor'), + textShadowBlur: textStyleModel.get('textShadowBlur') || 0, + textShadowOffsetX: textStyleModel.get('textShadowOffsetX') || 0, + textShadowOffsetY: textStyleModel.get('textShadowOffsetY') || 0, + fill: tooltipModel.get(['textStyle', 'color']), + padding: getPaddingFromTooltipModel(tooltipModel, 'richText'), + verticalAlign: 'top', + align: 'left' + }, + z: tooltipModel.get('z') + }); + + this._zr.add(this.el); + + var self = this; + this.el.on('mouseover', function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + + self._inContent = true; + }); + this.el.on('mouseout', function () { + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + + self._inContent = false; + }); + }; + + TooltipRichContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + + TooltipRichContent.prototype.getSize = function () { + var el = this.el; + var bounding = this.el.getBoundingRect(); // bounding rect does not include shadow. For renderMode richText, + // if overflow, it will be cut. So calculate them accurately. + + var shadowOuterSize = calcShadowOuterSize(el.style); + return [bounding.width + shadowOuterSize.left + shadowOuterSize.right, bounding.height + shadowOuterSize.top + shadowOuterSize.bottom]; + }; + + TooltipRichContent.prototype.moveTo = function (x, y) { + var el = this.el; + + if (el) { + var styleCoord = this._styleCoord; + makeStyleCoord$1(styleCoord, this._zr, x, y); + x = styleCoord[0]; + y = styleCoord[1]; + var style = el.style; + var borderWidth = mathMaxWith0(style.borderWidth || 0); + var shadowOuterSize = calcShadowOuterSize(style); // rich text x, y do not include border. + + el.x = x + borderWidth + shadowOuterSize.left; + el.y = y + borderWidth + shadowOuterSize.top; + el.markRedraw(); + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + + + TooltipRichContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; // The ratio of top to height + + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + + TooltipRichContent.prototype.hide = function () { + if (this.el) { + this.el.hide(); + } + + this._show = false; + }; + + TooltipRichContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable)) { + if (time) { + this._hideDelay = time; // Set show false to avoid invoke hideLater multiple times + + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } else { + this.hide(); + } + } + }; + + TooltipRichContent.prototype.isShow = function () { + return this._show; + }; + + TooltipRichContent.prototype.getOuterSize = function () { + var size = this.getSize(); + return { + width: size[0], + height: size[1] + }; + }; + + TooltipRichContent.prototype.dispose = function () { + this._zr.remove(this.el); + }; + + return TooltipRichContent; + }(); + + function mathMaxWith0(val) { + return Math.max(0, val); + } + + function calcShadowOuterSize(style) { + var shadowBlur = mathMaxWith0(style.shadowBlur || 0); + var shadowOffsetX = mathMaxWith0(style.shadowOffsetX || 0); + var shadowOffsetY = mathMaxWith0(style.shadowOffsetY || 0); + return { + left: mathMaxWith0(shadowBlur - shadowOffsetX), + right: mathMaxWith0(shadowBlur + shadowOffsetX), + top: mathMaxWith0(shadowBlur - shadowOffsetY), + bottom: mathMaxWith0(shadowBlur + shadowOffsetY) + }; + } + + function makeStyleCoord$1(out, zr, zrX, zrY) { + out[0] = zrX; + out[1] = zrY; + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); + } + + var bind$2 = bind; + var each$c = each; + var parsePercent$3 = parsePercent$1; + var proxyRect = new Rect({ + shape: { + x: -1, + y: -1, + width: 2, + height: 2 + } + }); + + var TooltipView = + /** @class */ + function (_super) { + __extends(TooltipView, _super); + + function TooltipView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TooltipView.type; + return _this; + } + + TooltipView.prototype.init = function (ecModel, api) { + if (env.node) { + return; + } + + var tooltipModel = ecModel.getComponent('tooltip'); + var renderMode = tooltipModel.get('renderMode'); + this._renderMode = getTooltipRenderMode(renderMode); + this._tooltipContent = this._renderMode === 'richText' ? new TooltipRichContent(api) : new TooltipHTMLContent(api.getDom(), api, { + appendToBody: tooltipModel.get('appendToBody', true) + }); + }; + + TooltipView.prototype.render = function (tooltipModel, ecModel, api) { + if (env.node) { + return; + } // Reset + + + this.group.removeAll(); + this._tooltipModel = tooltipModel; + this._ecModel = ecModel; + this._api = api; + /** + * @private + * @type {boolean} + */ + + this._alwaysShowContent = tooltipModel.get('alwaysShowContent'); + var tooltipContent = this._tooltipContent; + tooltipContent.update(tooltipModel); + tooltipContent.setEnterable(tooltipModel.get('enterable')); + + this._initGlobalListener(); + + this._keepShow(); + }; + + TooltipView.prototype._initGlobalListener = function () { + var tooltipModel = this._tooltipModel; + var triggerOn = tooltipModel.get('triggerOn'); + register('itemTooltip', this._api, bind$2(function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none') { + if (triggerOn.indexOf(currTrigger) >= 0) { + this._tryShow(e, dispatchAction); + } else if (currTrigger === 'leave') { + this._hide(dispatchAction); + } + } + }, this)); + }; + + TooltipView.prototype._keepShow = function () { + var tooltipModel = this._tooltipModel; + var ecModel = this._ecModel; + var api = this._api; // Try to keep the tooltip show when refreshing + + if (this._lastX != null && this._lastY != null // When user is willing to control tooltip totally using API, + // self.manuallyShowTip({x, y}) might cause tooltip hide, + // which is not expected. + && tooltipModel.get('triggerOn') !== 'none') { + var self_1 = 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 + !api.isDisposed() && self_1.manuallyShowTip(tooltipModel, ecModel, api, { + x: self_1._lastX, + y: self_1._lastY, + dataByCoordSys: self_1._lastDataByCoordSys + }); + }); + } + }; + /** + * Show tip manually by + * dispatchAction({ + * type: 'showTip', + * x: 10, + * y: 10 + * }); + * Or + * dispatchAction({ + * type: 'showTip', + * seriesIndex: 0, + * dataIndex or dataIndexInside or name + * }); + * + * TODO Batch + */ + + + TooltipView.prototype.manuallyShowTip = function (tooltipModel, ecModel, api, payload) { + if (payload.from === this.uid || env.node) { + return; + } + + var dispatchAction = makeDispatchAction$1(payload, api); // Reset ticket + + this._ticket = ''; // When triggered from axisPointer. + + var dataByCoordSys = payload.dataByCoordSys; + + if (payload.tooltip && payload.x != null && payload.y != null) { + var el = proxyRect; + el.x = payload.x; + el.y = payload.y; + el.update(); + el.tooltip = payload.tooltip; // Manually show tooltip while view is not using zrender elements. + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + target: el + }, dispatchAction); + } else if (dataByCoordSys) { + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + dataByCoordSys: dataByCoordSys, + tooltipOption: payload.tooltipOption + }, dispatchAction); + } else if (payload.seriesIndex != null) { + if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) { + return; + } + + var pointInfo = findPointFromSeries(payload, ecModel); + var cx = pointInfo.point[0]; + var cy = pointInfo.point[1]; + + if (cx != null && cy != null) { + this._tryShow({ + offsetX: cx, + offsetY: cy, + position: payload.position, + target: pointInfo.el + }, dispatchAction); + } + } else if (payload.x != null && payload.y != null) { + // FIXME + // should wrap dispatchAction like `axisPointer/globalListener` ? + api.dispatchAction({ + type: 'updateAxisPointer', + x: payload.x, + y: payload.y + }); + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + target: api.getZr().findHover(payload.x, payload.y).target + }, dispatchAction); + } + }; + + TooltipView.prototype.manuallyHideTip = function (tooltipModel, ecModel, api, payload) { + var tooltipContent = this._tooltipContent; + + if (!this._alwaysShowContent && this._tooltipModel) { + tooltipContent.hideLater(this._tooltipModel.get('hideDelay')); + } + + this._lastX = this._lastY = this._lastDataByCoordSys = null; + + if (payload.from !== this.uid) { + this._hide(makeDispatchAction$1(payload, api)); + } + }; // Be compatible with previous design, that is, when tooltip.type is 'axis' and + // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer + // and tooltip. + + + TooltipView.prototype._manuallyAxisShowTip = function (tooltipModel, ecModel, api, payload) { + var seriesIndex = payload.seriesIndex; + var dataIndex = payload.dataIndex; // @ts-ignore + + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; + + if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) { + return; + } + + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + if (!seriesModel) { + return; + } + + var data = seriesModel.getData(); + var tooltipCascadedModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model, tooltipModel]); + + if (tooltipCascadedModel.get('trigger') !== 'axis') { + return; + } + + api.dispatchAction({ + type: 'updateAxisPointer', + seriesIndex: seriesIndex, + dataIndex: dataIndex, + position: payload.position + }); + return true; + }; + + TooltipView.prototype._tryShow = function (e, dispatchAction) { + var el = e.target; + var tooltipModel = this._tooltipModel; + + 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; + var dataByCoordSys = e.dataByCoordSys; + + if (dataByCoordSys && dataByCoordSys.length) { + this._showAxisTooltip(dataByCoordSys, e); + } // Always show item tooltip if mouse is on the element with dataIndex + else if (el && findEventDispatcher(el, function (target) { + return getECData(target).dataIndex != null; + }, true)) { + this._lastDataByCoordSys = null; + + this._showSeriesItemTooltip(e, el, dispatchAction); + } // Tooltip provided directly. Like legend. + else if (el && el.tooltip) { + this._lastDataByCoordSys = null; + + this._showComponentItemTooltip(e, el, dispatchAction); + } else { + this._lastDataByCoordSys = null; + + this._hide(dispatchAction); + } + }; + + TooltipView.prototype._showOrMove = function (tooltipModel, cb) { + // showDelay is used in this case: tooltip.enterable is set + // as true. User intent to move mouse into tooltip and click + // something. `showDelay` makes it easier to enter the content + // but tooltip do not move immediately. + var delay = tooltipModel.get('showDelay'); + cb = bind(cb, this); + clearTimeout(this._showTimout); + delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb(); + }; + + TooltipView.prototype._showAxisTooltip = function (dataByCoordSys, e) { + var ecModel = this._ecModel; + var globalTooltipModel = this._tooltipModel; + var point = [e.offsetX, e.offsetY]; + var singleTooltipModel = buildTooltipModel([e.tooltipOption, globalTooltipModel]); + var renderMode = this._renderMode; + var cbParamsList = []; + var articleMarkup = createTooltipMarkup('section', { + blocks: [], + noHeader: true + }); // Only for legacy: `Serise['formatTooltip']` returns a string. + + var markupTextArrLegacy = []; + var markupStyleCreator = new TooltipMarkupStyleCreator(); + each$c(dataByCoordSys, function (itemCoordSys) { + each$c(itemCoordSys.dataByAxis, function (axisItem) { + var axisModel = ecModel.getComponent(axisItem.axisDim + 'Axis', axisItem.axisIndex); + var axisValue = axisItem.value; + + if (!axisModel || axisValue == null) { + return; + } + + var axisValueLabel = getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt); + var axisSectionMarkup = createTooltipMarkup('section', { + header: axisValueLabel, + noHeader: !trim(axisValueLabel), + sortBlocks: true, + blocks: [] + }); + articleMarkup.blocks.push(axisSectionMarkup); + each(axisItem.seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var cbParams = series.getDataParams(dataIndex); + cbParams.axisDim = axisItem.axisDim; + cbParams.axisIndex = axisItem.axisIndex; + cbParams.axisType = axisItem.axisType; + cbParams.axisId = axisItem.axisId; + cbParams.axisValue = getAxisRawValue(axisModel.axis, { + value: axisValue + }); + cbParams.axisValueLabel = axisValueLabel; // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + + cbParams.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(cbParams.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(series.formatTooltip(dataIndex, true, null)); + + if (seriesTooltipResult.markupFragment) { + axisSectionMarkup.blocks.push(seriesTooltipResult.markupFragment); + } + + if (seriesTooltipResult.markupText) { + markupTextArrLegacy.push(seriesTooltipResult.markupText); + } + + cbParamsList.push(cbParams); + }); + }); + }); // In most cases, the second axis is displays upper on the first one. + // So we reverse it to look better. + + articleMarkup.blocks.reverse(); + markupTextArrLegacy.reverse(); + var positionExpr = e.position; + var orderMode = singleTooltipModel.get('order'); + var builtMarkupText = buildTooltipMarkup(articleMarkup, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), singleTooltipModel.get('textStyle')); + builtMarkupText && markupTextArrLegacy.unshift(builtMarkupText); + var blockBreak = renderMode === 'richText' ? '\n\n' : '
                                  '; + var allMarkupText = markupTextArrLegacy.join(blockBreak); + + this._showOrMove(singleTooltipModel, function () { + if (this._updateContentNotChangedOnAxis(dataByCoordSys)) { + this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, cbParamsList); + } else { + this._showTooltipContent(singleTooltipModel, allMarkupText, cbParamsList, Math.random() + '', point[0], point[1], positionExpr, null, markupStyleCreator); + } + }); // Do not trigger events here, because this branch only be entered + // from dispatchAction. + + }; + + TooltipView.prototype._showSeriesItemTooltip = function (e, el, dispatchAction) { + var dispatcher = findEventDispatcher(el, function (target) { + return getECData(target).dataIndex != null; + }, true); + var ecModel = this._ecModel; + var ecData = getECData(dispatcher); // 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 seriesIndex = ecData.seriesIndex; + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); // For example, graph link. + + var dataModel = ecData.dataModel || seriesModel; + var dataIndex = ecData.dataIndex; + var dataType = ecData.dataType; + var data = dataModel.getData(dataType); + var renderMode = this._renderMode; + var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model, this._tooltipModel]); + var tooltipTrigger = tooltipModel.get('trigger'); + + if (tooltipTrigger != null && tooltipTrigger !== 'item') { + return; + } + + var params = dataModel.getDataParams(dataIndex, dataType); + var markupStyleCreator = new TooltipMarkupStyleCreator(); // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + + params.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(params.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(dataModel.formatTooltip(dataIndex, false, dataType)); + var orderMode = tooltipModel.get('order'); + var markupText = seriesTooltipResult.markupFragment ? buildTooltipMarkup(seriesTooltipResult.markupFragment, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), tooltipModel.get('textStyle')) : seriesTooltipResult.markupText; + var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex; + + this._showOrMove(tooltipModel, function () { + this._showTooltipContent(tooltipModel, markupText, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markupStyleCreator); + }); // FIXME + // duplicated showtip if manuallyShowTip is called from dispatchAction. + + + dispatchAction({ + type: 'showTip', + dataIndexInside: dataIndex, + dataIndex: data.getRawIndex(dataIndex), + seriesIndex: seriesIndex, + from: this.uid + }); + }; + + TooltipView.prototype._showComponentItemTooltip = function (e, el, dispatchAction) { + var tooltipOpt = el.tooltip; + + if (isString(tooltipOpt)) { + var content = tooltipOpt; + tooltipOpt = { + content: content, + // Fixed formatter + formatter: content + }; + } + + var subTooltipModel = new Model(tooltipOpt, this._tooltipModel, this._ecModel); + var defaultHtml = subTooltipModel.get('content'); + var asyncTicket = Math.random() + ''; // PENDING: this case do not support richText style yet. + + var markupStyleCreator = new TooltipMarkupStyleCreator(); // Do not check whether `trigger` is 'none' here, because `trigger` + // only works on coordinate system. In fact, we have not found case + // that requires setting `trigger` nothing on component yet. + + this._showOrMove(subTooltipModel, function () { + this._showTooltipContent( // Use formatterParams from element defined in component + subTooltipModel, defaultHtml, subTooltipModel.get('formatterParams') || {}, asyncTicket, e.offsetX, e.offsetY, e.position, el, markupStyleCreator); + }); // If not dispatch showTip, tip may be hide triggered by axis. + + + dispatchAction({ + type: 'showTip', + from: this.uid + }); + }; + + TooltipView.prototype._showTooltipContent = function ( // Use Model insteadof TooltipModel because this model may be from series or other options. + // Instead of top level tooltip. + tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markupStyleCreator) { + // Reset ticket + this._ticket = ''; + + if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) { + return; + } + + var tooltipContent = this._tooltipContent; + var formatter = tooltipModel.get('formatter'); + positionExpr = positionExpr || tooltipModel.get('position'); + var html = defaultHtml; + + var nearPoint = this._getNearestPoint([x, y], params, tooltipModel.get('trigger'), tooltipModel.get('borderColor')); + + if (formatter && isString(formatter)) { + var useUTC = tooltipModel.ecModel.get('useUTC'); + var params0 = isArray(params) ? params[0] : params; + var isTimeAxis = params0 && params0.axisType && params0.axisType.indexOf('time') >= 0; + html = formatter; + + if (isTimeAxis) { + html = format(params0.axisValue, html, useUTC); + } + + html = formatTpl(html, params, true); + } else if (isFunction(formatter)) { + var callback = bind$2(function (cbTicket, html) { + if (cbTicket === this._ticket) { + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPoint.color, positionExpr); + + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + } + }, this); + this._ticket = asyncTicket; + html = formatter(params, asyncTicket, callback); + } + + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPoint.color, positionExpr); + tooltipContent.show(tooltipModel, nearPoint.color); + + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + }; + + TooltipView.prototype._getNearestPoint = function (point, tooltipDataParams, trigger, borderColor) { + if (trigger === 'axis' || isArray(tooltipDataParams)) { + return { + color: borderColor || (this._renderMode === 'html' ? '#fff' : 'none') + }; + } + + if (!isArray(tooltipDataParams)) { + return { + color: borderColor || tooltipDataParams.color || tooltipDataParams.borderColor + }; + } + }; + + TooltipView.prototype._updatePosition = function (tooltipModel, positionExpr, x, // Mouse x + y, // Mouse y + content, params, el) { + var viewWidth = this._api.getWidth(); + + var viewHeight = this._api.getHeight(); + + positionExpr = positionExpr || tooltipModel.get('position'); + var contentSize = content.getSize(); + var align = tooltipModel.get('align'); + var vAlign = tooltipModel.get('verticalAlign'); + var rect = el && el.getBoundingRect().clone(); + el && rect.applyTransform(el.transform); + + if (isFunction(positionExpr)) { + // Callback of position can be an array or a string specify the position + positionExpr = positionExpr([x, y], params, content.el, rect, { + viewSize: [viewWidth, viewHeight], + contentSize: contentSize.slice() + }); + } + + if (isArray(positionExpr)) { + x = parsePercent$3(positionExpr[0], viewWidth); + y = parsePercent$3(positionExpr[1], viewHeight); + } else if (isObject(positionExpr)) { + var boxLayoutPosition = positionExpr; + boxLayoutPosition.width = contentSize[0]; + boxLayoutPosition.height = contentSize[1]; + var layoutRect = getLayoutRect(boxLayoutPosition, { + width: viewWidth, + height: viewHeight + }); + x = layoutRect.x; + y = layoutRect.y; + align = null; // When positionExpr is left/top/right/bottom, + // align and verticalAlign will not work. + + vAlign = null; + } // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element + else if (isString(positionExpr) && el) { + var pos = calcTooltipPosition(positionExpr, rect, contentSize); + x = pos[0]; + y = pos[1]; + } else { + var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20); + x = pos[0]; + y = pos[1]; + } + + align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0); + vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0); + + if (shouldTooltipConfine(tooltipModel)) { + var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight); + x = pos[0]; + y = pos[1]; + } + + content.moveTo(x, y); + }; // FIXME + // Should we remove this but leave this to user? + + + TooltipView.prototype._updateContentNotChangedOnAxis = function (dataByCoordSys) { + var lastCoordSys = this._lastDataByCoordSys; + var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length; + contentNotChanged && each$c(lastCoordSys, function (lastItemCoordSys, indexCoordSys) { + var lastDataByAxis = lastItemCoordSys.dataByAxis || []; + var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {}; + var thisDataByAxis = thisItemCoordSys.dataByAxis || []; + contentNotChanged = contentNotChanged && lastDataByAxis.length === thisDataByAxis.length; + contentNotChanged && each$c(lastDataByAxis, function (lastItem, indexAxis) { + var thisItem = thisDataByAxis[indexAxis] || {}; + var lastIndices = lastItem.seriesDataIndices || []; + var newIndices = thisItem.seriesDataIndices || []; + contentNotChanged = contentNotChanged && lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length; + contentNotChanged && each$c(lastIndices, function (lastIdxItem, j) { + var newIdxItem = newIndices[j]; + contentNotChanged = contentNotChanged && lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex; + }); + }); + }); + this._lastDataByCoordSys = dataByCoordSys; + return !!contentNotChanged; + }; + + TooltipView.prototype._hide = function (dispatchAction) { + // Do not directly hideLater here, because this behavior may be prevented + // in dispatchAction when showTip is dispatched. + // FIXME + // duplicated hideTip if manuallyHideTip is called from dispatchAction. + this._lastDataByCoordSys = null; + dispatchAction({ + type: 'hideTip', + from: this.uid + }); + }; + + TooltipView.prototype.dispose = function (ecModel, api) { + if (env.node) { + return; + } + + this._tooltipContent.dispose(); + + unregister('itemTooltip', api); + }; + + TooltipView.type = 'tooltip'; + return TooltipView; + }(ComponentView); + /** + * From top to bottom. (the last one should be globalTooltipModel); + */ + + + function buildTooltipModel(modelCascade) { + // Last is always tooltip model. + var resultModel = modelCascade.pop(); + + while (modelCascade.length) { + var tooltipOpt = modelCascade.pop(); + + if (tooltipOpt) { + if (tooltipOpt instanceof Model) { + tooltipOpt = tooltipOpt.get('tooltip', true); + } // In each data item tooltip can be simply write: + // { + // value: 10, + // tooltip: 'Something you need to know' + // } + + + if (isString(tooltipOpt)) { + tooltipOpt = { + formatter: tooltipOpt + }; + } + + resultModel = new Model(tooltipOpt, resultModel, resultModel.ecModel); + } + } + + return resultModel; + } + + function makeDispatchAction$1(payload, api) { + return payload.dispatchAction || bind(api.dispatchAction, api); + } + + function refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) { + var size = content.getOuterSize(); + var width = size.width; + var height = size.height; + + if (gapH != null) { + // Add extra 2 pixels for this case: + // At present the "values" in defaut tooltip are using CSS `float: right`. + // When the right edge of the tooltip box is on the right side of the + // viewport, the `float` layout might push the "values" to the second line. + if (x + width + gapH + 2 > viewWidth) { + x -= width + gapH; + } else { + x += gapH; + } + } + + if (gapV != null) { + if (y + height + gapV > viewHeight) { + y -= height + gapV; + } else { + y += gapV; + } + } + + return [x, y]; + } + + function confineTooltipPosition(x, y, content, viewWidth, viewHeight) { + var size = content.getOuterSize(); + var width = size.width; + var height = size.height; + x = Math.min(x + width, viewWidth) - width; + y = Math.min(y + height, viewHeight) - height; + x = Math.max(x, 0); + y = Math.max(y, 0); + return [x, y]; + } + + function calcTooltipPosition(position, rect, contentSize) { + var domWidth = contentSize[0]; + var domHeight = contentSize[1]; + var gap = 10; + var offset = 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 - offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + + case 'right': + x = rect.x + rectWidth + gap + offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + } + + return [x, y]; + } + + function isCenterAlign(align) { + return align === 'center' || align === 'middle'; + } + + function install$A(registers) { + use(install$s); + registers.registerComponentModel(TooltipModel); + registers.registerComponentView(TooltipView); + /** + * @action + * @property {string} type + * @property {number} seriesIndex + * @property {number} dataIndex + * @property {number} [x] + * @property {number} [y] + */ + + registers.registerAction({ + type: 'showTip', + event: 'showTip', + update: 'tooltip:manuallyShowTip' + }, // noop + function () {}); + registers.registerAction({ + type: 'hideTip', + event: 'hideTip', + update: 'tooltip:manuallyHideTip' + }, // noop + function () {}); + } + + var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear']; + function brushPreprocessor(option, isNew) { + var brushComponents = normalizeToArray(option ? option.brush : []); + + if (!brushComponents.length) { + return; + } + + var brushComponentSpecifiedBtns = []; + each(brushComponents, function (brushOpt) { + var tbs = brushOpt.hasOwnProperty('toolbox') ? brushOpt.toolbox : []; + + if (tbs instanceof Array) { + brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs); + } + }); + var toolbox = option && option.toolbox; + + if (isArray(toolbox)) { + toolbox = toolbox[0]; + } + + if (!toolbox) { + toolbox = { + feature: {} + }; + option.toolbox = [toolbox]; + } + + var toolboxFeature = toolbox.feature || (toolbox.feature = {}); + var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {}); + var brushTypes = toolboxBrush.type || (toolboxBrush.type = []); + brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns); + removeDuplicate(brushTypes); + + if (isNew && !brushTypes.length) { + brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS); + } + } + + function removeDuplicate(arr) { + var map = {}; + each(arr, function (val) { + map[val] = 1; + }); + arr.length = 0; + each(map, function (flag, val) { + arr.push(val); + }); + } + + var each$d = each; + + function hasKeys(obj) { + if (obj) { + for (var name_1 in obj) { + if (obj.hasOwnProperty(name_1)) { + return true; + } + } + } + } + + function createVisualMappings(option, stateList, supplementVisualOption) { + var visualMappings = {}; + each$d(stateList, function (state) { + var mappings = visualMappings[state] = createMappings(); + each$d(option[state], function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var mappingOption = { + type: visualType, + visual: visualData + }; + supplementVisualOption && supplementVisualOption(mappingOption, state); + mappings[visualType] = new VisualMapping(mappingOption); // Prepare a alpha for opacity, for some case that opacity + // is not supported, such as rendering using gradient color. + + if (visualType === 'opacity') { + mappingOption = clone(mappingOption); + mappingOption.type = 'colorAlpha'; + mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption); + } + }); + }); + return visualMappings; + + function createMappings() { + var Creater = function () {}; // Make sure hidden fields will not be visited by + // object iteration (with hasOwnProperty checking). + + + Creater.prototype.__hidden = Creater.prototype; + var obj = new Creater(); + return obj; + } + } + function replaceVisualOption(thisOption, newOption, keys) { + // Visual attributes merge is not supported, otherwise it + // brings overcomplicated merge logic. See #2853. So if + // newOption has anyone of these keys, all of these keys + // will be reset. Otherwise, all keys remain. + var has; + each(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + has = true; + } + }); + has && each(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + thisOption[key] = clone(newOption[key]); + } else { + delete thisOption[key]; + } + }); + } + /** + * @param stateList + * @param visualMappings + * @param list + * @param getValueState param: valueOrIndex, return: state. + * @param scope Scope for getValueState + * @param dimension Concrete dimension, if used. + */ + // ???! handle brush? + + function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) { + var visualTypesMap = {}; + each(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + var dataIndex; + + function getVisual(key) { + return getItemVisualFromData(data, dataIndex, key); + } + + function setVisual(key, value) { + setItemVisualFromData(data, dataIndex, key, value); + } + + if (dimension == null) { + data.each(eachItem); + } else { + data.each([dimension], eachItem); + } + + function eachItem(valueOrIndex, index) { + dataIndex = dimension == null ? valueOrIndex // First argument is index + : index; + var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance + // @ts-ignore + + if (rawDataItem && rawDataItem.visualMap === false) { + return; + } + + var valueState = getValueState.call(scope, valueOrIndex); + 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(valueOrIndex, getVisual, setVisual); + } + } + } + /** + * @param data + * @param stateList + * @param visualMappings > + * @param getValueState param: valueOrIndex, return: state. + * @param dim dimension or dimension index. + */ + + function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) { + var visualTypesMap = {}; + each(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + return { + progress: function progress(params, data) { + var dimName; + + if (dim != null) { + dimName = data.getDimension(dim); + } + + function getVisual(key) { + return getItemVisualFromData(data, dataIndex, key); + } + + function setVisual(key, value) { + setItemVisualFromData(data, dataIndex, key, value); + } + + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance + // @ts-ignore + + if (rawDataItem && rawDataItem.visualMap === false) { + continue; + } + + var value = dim != null ? data.get(dimName, dataIndex) : dataIndex; + var valueState = 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); + } + } + } + }; + } + + function makeBrushCommonSelectorForSeries(area) { + var brushType = area.brushType; // Do not use function binding or curry for performance. + + var selectors = { + point: function (itemLayout) { + return selector[brushType].point(itemLayout, selectors, area); + }, + rect: function (itemLayout) { + return selector[brushType].rect(itemLayout, selectors, area); + } + }; + return selectors; + } + var selector = { + lineX: getLineSelectors(0), + lineY: getLineSelectors(1), + rect: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.intersect(itemLayout); + } + }, + polygon: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]) && contain$2(area.range, itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + var points = area.range; + + if (!itemLayout || points.length <= 1) { + return false; + } + + var x = itemLayout.x; + var y = itemLayout.y; + var width = itemLayout.width; + var height = itemLayout.height; + var p = points[0]; + + if (contain$2(points, x, y) || contain$2(points, x + width, y) || contain$2(points, x, y + height) || contain$2(points, x + width, y + height) || BoundingRect.create(itemLayout).contain(p[0], p[1]) || linePolygonIntersect(x, y, x + width, y, points) || linePolygonIntersect(x, y, x, y + height, points) || linePolygonIntersect(x + width, y, x + width, y + height, points) || linePolygonIntersect(x, y + height, x + width, y + height, points)) { + return true; + } + } + } + }; + + function getLineSelectors(xyIndex) { + var xy = ['x', 'y']; + var wh = ['width', 'height']; + return { + point: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var p = itemLayout[xyIndex]; + return inLineRange(p, range); + } + }, + rect: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var layoutRange = [itemLayout[xy[xyIndex]], itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]]; + layoutRange[1] < layoutRange[0] && layoutRange.reverse(); + return inLineRange(layoutRange[0], range) || inLineRange(layoutRange[1], range) || inLineRange(range[0], layoutRange) || inLineRange(range[1], layoutRange); + } + } + }; + } + + function inLineRange(p, range) { + return range[0] <= p && p <= range[1]; + } + + var STATE_LIST = ['inBrush', 'outOfBrush']; + var DISPATCH_METHOD = '__ecBrushSelect'; + var DISPATCH_FLAG = '__ecInBrushSelectEvent'; + function layoutCovers(ecModel) { + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel); + brushTargetManager.setInputRanges(brushModel.areas, ecModel); + }); + } + /** + * Register the visual encoding if this modules required. + */ + + function brushVisual(ecModel, api, payload) { + var brushSelected = []; + var throttleType; + var throttleDelay; + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(payload.key === 'brush' ? payload.brushOption : { + brushType: false + }); + }); + layoutCovers(ecModel); + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel, brushIndex) { + var thisBrushSelected = { + brushId: brushModel.id, + brushIndex: brushIndex, + brushName: brushModel.name, + areas: clone(brushModel.areas), + selected: [] + }; // Every brush component exists in event params, convenient + // for user to find by index. + + brushSelected.push(thisBrushSelected); + var brushOption = brushModel.option; + var brushLink = brushOption.brushLink; + var linkedSeriesMap = []; + var selectedDataIndexForLink = []; + var rangeInfoBySeries = []; + var hasBrushExists = false; + + if (!brushIndex) { + // Only the first throttle setting works. + throttleType = brushOption.throttleType; + throttleDelay = brushOption.throttleDelay; + } // Add boundingRect and selectors to range. + + + var areas = map(brushModel.areas, function (area) { + var builder = boundingRectBuilders[area.brushType]; + var selectableArea = defaults({ + boundingRect: builder ? builder(area) : void 0 + }, area); + selectableArea.selectors = makeBrushCommonSelectorForSeries(selectableArea); + return selectableArea; + }); + var visualMappings = createVisualMappings(brushModel.option, STATE_LIST, function (mappingOption) { + mappingOption.mappingMethod = 'fixed'; + }); + isArray(brushLink) && each(brushLink, function (seriesIndex) { + linkedSeriesMap[seriesIndex] = 1; + }); + + function linkOthers(seriesIndex) { + return brushLink === 'all' || !!linkedSeriesMap[seriesIndex]; + } // If no supported brush or no brush on the series, + // all visuals should be in original state. + + + function brushed(rangeInfoList) { + return !!rangeInfoList.length; + } + /** + * Logic for each series: (If the logic has to be modified one day, do it carefully!) + * + * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers ) => StepA: ┬record, ┬ StepB: ┬visualByRecord. + * !brushed┘ ├hasBrushExist ┤ └nothing,┘ ├visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( !brushed && ┬hasBrushExist ┬ && linkOthers ) => StepA: nothing, StepB: ┬visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( brushed ┬ && !linkOthers ) => StepA: nothing, StepB: ┬visualByCheck. + * !brushed┘ └nothing. + * ( !brushed && !linkOthers ) => StepA: nothing, StepB: nothing. + */ + // Step A + + + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var rangeInfoList = rangeInfoBySeries[seriesIndex] = []; + seriesModel.subType === 'parallel' ? stepAParallel(seriesModel, seriesIndex) : stepAOthers(seriesModel, seriesIndex, rangeInfoList); + }); + + function stepAParallel(seriesModel, seriesIndex) { + var coordSys = seriesModel.coordinateSystem; + hasBrushExists = hasBrushExists || coordSys.hasAxisBrushed(); + linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function (activeState, dataIndex) { + activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1); + }); + } + + function stepAOthers(seriesModel, seriesIndex, rangeInfoList) { + if (!seriesModel.brushSelector || brushModelNotControll(brushModel, seriesIndex)) { + return; + } + + each(areas, function (area) { + if (brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)) { + rangeInfoList.push(area); + } + + hasBrushExists = hasBrushExists || brushed(rangeInfoList); + }); + + if (linkOthers(seriesIndex) && brushed(rangeInfoList)) { + var data_1 = seriesModel.getData(); + data_1.each(function (dataIndex) { + if (checkInRange(seriesModel, rangeInfoList, data_1, dataIndex)) { + selectedDataIndexForLink[dataIndex] = 1; + } + }); + } + } // Step B + + + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var seriesBrushSelected = { + seriesId: seriesModel.id, + seriesIndex: seriesIndex, + seriesName: seriesModel.name, + dataIndex: [] + }; // Every series exists in event params, convenient + // for user to find series by seriesIndex. + + thisBrushSelected.selected.push(seriesBrushSelected); + var rangeInfoList = rangeInfoBySeries[seriesIndex]; + var data = seriesModel.getData(); + var getValueState = linkOthers(seriesIndex) ? function (dataIndex) { + return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush'; + } : function (dataIndex) { + return checkInRange(seriesModel, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush'; + }; // If no supported brush or no brush, all visuals are in original state. + + (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && applyVisual(STATE_LIST, visualMappings, data, getValueState); + }); + }); + dispatchAction(api, throttleType, throttleDelay, brushSelected, payload); + } + + function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) { + // This event will not be triggered when `setOpion`, otherwise dead lock may + // triggered when do `setOption` in event listener, which we do not find + // satisfactory way to solve yet. Some considered resolutions: + // (a) Diff with prevoius selected data ant only trigger event when changed. + // But store previous data and diff precisely (i.e., not only by dataIndex, but + // also detect value changes in selected data) might bring complexity or fragility. + // (b) Use spectial param like `silent` to suppress event triggering. + // But such kind of volatile param may be weird in `setOption`. + if (!payload) { + return; + } + + var zr = api.getZr(); + + if (zr[DISPATCH_FLAG]) { + return; + } + + if (!zr[DISPATCH_METHOD]) { + zr[DISPATCH_METHOD] = doDispatch; + } + + var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType); + fn(api, brushSelected); + } + + function doDispatch(api, brushSelected) { + if (!api.isDisposed()) { + var zr = api.getZr(); + zr[DISPATCH_FLAG] = true; + api.dispatchAction({ + type: 'brushSelect', + batch: brushSelected + }); + zr[DISPATCH_FLAG] = false; + } + } + + function checkInRange(seriesModel, rangeInfoList, data, dataIndex) { + for (var i = 0, len = rangeInfoList.length; i < len; i++) { + var area = rangeInfoList[i]; + + if (seriesModel.brushSelector(dataIndex, data, area.selectors, area)) { + return true; + } + } + } + + function brushModelNotControll(brushModel, seriesIndex) { + var seriesIndices = brushModel.option.seriesIndex; + return seriesIndices != null && seriesIndices !== 'all' && (isArray(seriesIndices) ? indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices); + } + + var boundingRectBuilders = { + rect: function (area) { + return getBoundingRectFromMinMax(area.range); + }, + polygon: function (area) { + var minMax; + var range = area.range; + + for (var i = 0, len = range.length; i < len; i++) { + minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]]; + var rg = range[i]; + rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]); + rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]); + rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]); + rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]); + } + + return minMax && getBoundingRectFromMinMax(minMax); + } + }; + + function getBoundingRectFromMinMax(minMax) { + return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]); + } + + var BrushView = + /** @class */ + function (_super) { + __extends(BrushView, _super); + + function BrushView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BrushView.type; + return _this; + } + + BrushView.prototype.init = function (ecModel, api) { + this.ecModel = ecModel; + this.api = api; + this.model; + (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)).mount(); + }; + + BrushView.prototype.render = function (brushModel, ecModel, api, payload) { + this.model = brushModel; + + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateTransform = function (brushModel, ecModel, api, payload) { + // PENDING: `updateTransform` is a little tricky, whose layout need + // to be calculate mandatorily and other stages will not be performed. + // Take care the correctness of the logic. See #11754 . + layoutCovers(ecModel); + + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateVisual = function (brushModel, ecModel, api, payload) { + this.updateTransform(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateView = function (brushModel, ecModel, api, payload) { + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype._updateController = function (brushModel, ecModel, api, payload) { + // Do not update controller when drawing. + (!payload || payload.$from !== brushModel.id) && this._brushController.setPanels(brushModel.brushTargetManager.makePanelOpts(api)).enableBrush(brushModel.brushOption).updateCovers(brushModel.areas.slice()); + }; // updateLayout: updateController, + // updateVisual: updateController, + + + BrushView.prototype.dispose = function () { + this._brushController.dispose(); + }; + + BrushView.prototype._onBrush = function (eventParam) { + var modelId = this.model.id; + var areas = this.model.brushTargetManager.setOutputRanges(eventParam.areas, this.ecModel); // Action is not dispatched on drag end, because the drag end + // emits the same params with the last drag move event, and + // may have some delay when using touch pad, which makes + // animation not smooth (when using debounce). + + (!eventParam.isEnd || eventParam.removeOnClick) && this.api.dispatchAction({ + type: 'brush', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + eventParam.isEnd && this.api.dispatchAction({ + type: 'brushEnd', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + }; + + BrushView.type = 'brush'; + return BrushView; + }(ComponentView); + + var DEFAULT_OUT_OF_BRUSH_COLOR = '#ddd'; + + var BrushModel = + /** @class */ + function (_super) { + __extends(BrushModel, _super); + + function BrushModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BrushModel.type; + /** + * @readOnly + */ + + _this.areas = []; + /** + * Current brush painting area settings. + * @readOnly + */ + + _this.brushOption = {}; + return _this; + } + + BrushModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + !isInit && replaceVisualOption(thisOption, newOption, ['inBrush', 'outOfBrush']); + var inBrush = thisOption.inBrush = thisOption.inBrush || {}; // Always give default visual, consider setOption at the second time. + + thisOption.outOfBrush = thisOption.outOfBrush || { + color: DEFAULT_OUT_OF_BRUSH_COLOR + }; + + if (!inBrush.hasOwnProperty('liftZ')) { + // Bigger than the highlight z lift, otherwise it will + // be effected by the highlight z when brush. + inBrush.liftZ = 5; + } + }; + /** + * If `areas` is null/undefined, range state remain. + */ + + + BrushModel.prototype.setAreas = function (areas) { + if ("development" !== 'production') { + assert(isArray(areas)); + each(areas, function (area) { + assert(area.brushType, 'Illegal areas'); + }); + } // If areas is null/undefined, range state remain. + // This helps user to dispatchAction({type: 'brush'}) with no areas + // set but just want to get the current brush select info from a `brush` event. + + + if (!areas) { + return; + } + + this.areas = map(areas, function (area) { + return generateBrushOption(this.option, area); + }, this); + }; + /** + * Set the current painting brush option. + */ + + + BrushModel.prototype.setBrushOption = function (brushOption) { + this.brushOption = generateBrushOption(this.option, brushOption); + this.brushType = this.brushOption.brushType; + }; + + BrushModel.type = 'brush'; + BrushModel.dependencies = ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series']; + BrushModel.defaultOption = { + seriesIndex: 'all', + brushType: 'rect', + brushMode: 'single', + transformable: true, + brushStyle: { + borderWidth: 1, + color: 'rgba(210,219,238,0.3)', + borderColor: '#D2DBEE' + }, + throttleType: 'fixRate', + throttleDelay: 0, + removeOnClick: true, + z: 10000 + }; + return BrushModel; + }(ComponentModel); + + function generateBrushOption(option, brushOption) { + return merge({ + brushType: option.brushType, + brushMode: option.brushMode, + transformable: option.transformable, + brushStyle: new Model(option.brushStyle).getItemStyle(), + removeOnClick: option.removeOnClick, + z: option.z + }, brushOption, true); + } + + var ICON_TYPES = ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear']; + + var BrushFeature = + /** @class */ + function (_super) { + __extends(BrushFeature, _super); + + function BrushFeature() { + return _super !== null && _super.apply(this, arguments) || this; + } + + BrushFeature.prototype.render = function (featureModel, ecModel, api) { + var brushType; + var brushMode; + var isBrushed; + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + brushType = brushModel.brushType; + brushMode = brushModel.brushOption.brushMode || 'single'; + isBrushed = isBrushed || !!brushModel.areas.length; + }); + this._brushType = brushType; + this._brushMode = brushMode; + each(featureModel.get('type', true), function (type) { + featureModel.setIconStatus(type, (type === 'keep' ? brushMode === 'multiple' : type === 'clear' ? isBrushed : type === brushType) ? 'emphasis' : 'normal'); + }); + }; + + BrushFeature.prototype.updateView = function (featureModel, ecModel, api) { + this.render(featureModel, ecModel, api); + }; + + BrushFeature.prototype.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon', true); + var icons = {}; + each(model.get('type', true), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + BrushFeature.prototype.onclick = function (ecModel, api, type) { + var brushType = this._brushType; + var brushMode = this._brushMode; + + if (type === 'clear') { + // Trigger parallel action firstly + api.dispatchAction({ + type: 'axisAreaSelect', + intervals: [] + }); + api.dispatchAction({ + type: 'brush', + command: 'clear', + // Clear all areas of all brush components. + areas: [] + }); + } else { + api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'brush', + brushOption: { + brushType: type === 'keep' ? brushType : brushType === type ? false : type, + brushMode: type === 'keep' ? brushMode === 'multiple' ? 'single' : 'multiple' : brushMode + } + }); + } + }; + + BrushFeature.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + type: ICON_TYPES.slice(), + icon: { + /* eslint-disable */ + rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13', + polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2', + lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4', + lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4', + keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z', + clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line + + /* eslint-enable */ + + }, + // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear` + title: ecModel.getLocale(['toolbox', 'brush', 'title']) + }; + return defaultOption; + }; + + return BrushFeature; + }(ToolboxFeature); + + function install$B(registers) { + registers.registerComponentView(BrushView); + registers.registerComponentModel(BrushModel); + registers.registerPreprocessor(brushPreprocessor); + registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, brushVisual); + registers.registerAction({ + type: 'brush', + event: 'brush', + update: 'updateVisual' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'brush', + query: payload + }, function (brushModel) { + brushModel.setAreas(payload.areas); + }); + }); + /** + * payload: { + * brushComponents: [ + * { + * brushId, + * brushIndex, + * brushName, + * series: [ + * { + * seriesId, + * seriesIndex, + * seriesName, + * rawIndices: [21, 34, ...] + * }, + * ... + * ] + * }, + * ... + * ] + * } + */ + + registers.registerAction({ + type: 'brushSelect', + event: 'brushSelected', + update: 'none' + }, function () {}); + registers.registerAction({ + type: 'brushEnd', + event: 'brushEnd', + update: 'none' + }, function () {}); + registerFeature('brush', BrushFeature); + } + + var TitleModel = + /** @class */ + function (_super) { + __extends(TitleModel, _super); + + function TitleModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TitleModel.type; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + return _this; + } + + TitleModel.type = 'title'; + TitleModel.defaultOption = { + zlevel: 0, + z: 6, + show: true, + 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: 'bold', + color: '#464646' + }, + subtextStyle: { + fontSize: 12, + color: '#6E7079' + } + }; + return TitleModel; + }(ComponentModel); // View + + + var TitleView = + /** @class */ + function (_super) { + __extends(TitleView, _super); + + function TitleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TitleView.type; + return _this; + } + + TitleView.prototype.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 textVerticalAlign = retrieve2(titleModel.get('textBaseline'), titleModel.get('textVerticalAlign')); + var textEl = new ZRText({ + style: createTextStyle(textStyleModel, { + text: titleModel.get('text'), + fill: textStyleModel.getTextColor() + }, { + disableBox: true + }), + z2: 10 + }); + var textRect = textEl.getBoundingRect(); + var subText = titleModel.get('subtext'); + var subTextEl = new ZRText({ + style: createTextStyle(subtextStyleModel, { + text: subText, + fill: subtextStyleModel.getTextColor(), + y: textRect.height + titleModel.get('itemGap'), + verticalAlign: 'top' + }, { + disableBox: true + }), + z2: 10 + }); + var link = titleModel.get('link'); + var sublink = titleModel.get('sublink'); + var triggerEvent = titleModel.get('triggerEvent', true); + textEl.silent = !link && !triggerEvent; + subTextEl.silent = !sublink && !triggerEvent; + + if (link) { + textEl.on('click', function () { + windowOpen(link, '_' + titleModel.get('target')); + }); + } + + if (sublink) { + subTextEl.on('click', function () { + windowOpen(sublink, '_' + titleModel.get('subtarget')); + }); + } + + getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent ? { + componentType: 'title', + componentIndex: titleModel.componentIndex + } : null; + 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 = 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'); // @ts-ignore + + 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; + } + } + + if (!textVerticalAlign) { + textVerticalAlign = titleModel.get('top') || titleModel.get('bottom'); // @ts-ignore + + if (textVerticalAlign === 'center') { + textVerticalAlign = 'middle'; + } + + if (textVerticalAlign === 'bottom') { + layoutRect.y += layoutRect.height; + } else if (textVerticalAlign === 'middle') { + layoutRect.y += layoutRect.height / 2; + } + + textVerticalAlign = textVerticalAlign || 'top'; + } + + group.x = layoutRect.x; + group.y = layoutRect.y; + group.markRedraw(); + var alignStyle = { + align: textAlign, + verticalAlign: textVerticalAlign + }; + textEl.setStyle(alignStyle); + subTextEl.setStyle(alignStyle); // 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 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], + r: titleModel.get('borderRadius') + }, + style: style, + subPixelOptimize: true, + silent: true + }); + group.add(rect); + }; + + TitleView.type = 'title'; + return TitleView; + }(ComponentView); + + function install$C(registers) { + registers.registerComponentModel(TitleModel); + registers.registerComponentView(TitleView); + } + + var TimelineModel = + /** @class */ + function (_super) { + __extends(TimelineModel, _super); + + function TimelineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TimelineModel.type; + _this.layoutMode = 'box'; + return _this; + } + /** + * @override + */ + + + TimelineModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + + this._initData(); + }; + /** + * @override + */ + + + TimelineModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + this._initData(); + }; + + TimelineModel.prototype.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 + */ + + + TimelineModel.prototype.getCurrentIndex = function () { + return this.option.currentIndex; + }; + /** + * @return {boolean} + */ + + + TimelineModel.prototype.isIndexMax = function () { + return this.getCurrentIndex() >= this._data.count() - 1; + }; + /** + * @param {boolean} state true: play, false: stop + */ + + + TimelineModel.prototype.setPlayState = function (state) { + this.option.autoPlay = !!state; + }; + /** + * @return {boolean} true: play, false: stop + */ + + + TimelineModel.prototype.getPlayState = function () { + return !!this.option.autoPlay; + }; + /** + * @private + */ + + + TimelineModel.prototype._initData = function () { + var thisOption = this.option; + var dataArr = thisOption.data || []; + var axisType = thisOption.axisType; + var names = this._names = []; + var processedDataArr; + + if (axisType === 'category') { + processedDataArr = []; + each(dataArr, function (item, index) { + var value = convertOptionIdName(getDataItemValue(item), ''); + var newItem; + + if (isObject(item)) { + newItem = clone(item); + newItem.value = index; + } else { + newItem = index; + } + + processedDataArr.push(newItem); + names.push(value); + }); + } else { + processedDataArr = dataArr; + } + + var dimType = { + category: 'ordinal', + time: 'time', + value: 'number' + }[axisType] || 'number'; + var data = this._data = new List([{ + name: 'value', + type: dimType + }], this); + data.initData(processedDataArr, names); + }; + + TimelineModel.prototype.getData = function () { + return this._data; + }; + /** + * @public + * @return {Array.} categoreis + */ + + + TimelineModel.prototype.getCategories = function () { + if (this.get('axisType') === 'category') { + return this._names.slice(); + } + }; + + TimelineModel.type = 'timeline'; + /** + * @protected + */ + + TimelineModel.defaultOption = { + zlevel: 0, + z: 4, + show: true, + axisType: 'time', + realtime: true, + left: '20%', + top: null, + right: '20%', + bottom: 0, + width: null, + height: 40, + padding: 5, + controlPosition: 'left', + autoPlay: false, + rewind: false, + loop: true, + playInterval: 2000, + currentIndex: 0, + itemStyle: {}, + label: { + color: '#000' + }, + data: [] + }; + return TimelineModel; + }(ComponentModel); + + var SliderTimelineModel = + /** @class */ + function (_super) { + __extends(SliderTimelineModel, _super); + + function SliderTimelineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderTimelineModel.type; + return _this; + } + + SliderTimelineModel.type = 'timeline.slider'; + /** + * @protected + */ + + SliderTimelineModel.defaultOption = inheritDefaultOption(TimelineModel.defaultOption, { + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderWidth: 0, + orient: 'horizontal', + inverse: false, + tooltip: { + trigger: 'item' // data item may also have tootip attr. + + }, + symbol: 'circle', + symbolSize: 12, + lineStyle: { + show: true, + width: 2, + color: '#DAE1F5' + }, + label: { + position: 'auto', + // When using number, label position is not + // restricted by viewRect. + // positive: right/bottom, negative: left/top + show: true, + interval: 'auto', + rotate: 0, + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#A4B1D7' + }, + itemStyle: { + color: '#A4B1D7', + borderWidth: 1 + }, + checkpointStyle: { + symbol: 'circle', + symbolSize: 15, + color: '#316bf3', + borderColor: '#fff', + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0, 0, 0, 0.3)', + // borderColor: 'rgba(194,53,49, 0.5)', + animation: true, + animationDuration: 300, + animationEasing: 'quinticInOut' + }, + controlStyle: { + show: true, + showPlayBtn: true, + showPrevBtn: true, + showNextBtn: true, + itemSize: 24, + itemGap: 12, + position: 'left', + 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', + 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', + nextIcon: 'M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z', + prevIcon: 'M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z', + prevBtnSize: 18, + nextBtnSize: 18, + color: '#A4B1D7', + borderColor: '#A4B1D7', + borderWidth: 1 + }, + emphasis: { + label: { + show: true, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#6f778d' + }, + itemStyle: { + color: '#316BF3' + }, + controlStyle: { + color: '#316BF3', + borderColor: '#316BF3', + borderWidth: 2 + } + }, + progress: { + lineStyle: { + color: '#316BF3' + }, + itemStyle: { + color: '#316BF3' + }, + label: { + color: '#6f778d' + } + }, + data: [] + }); + return SliderTimelineModel; + }(TimelineModel); + + mixin(SliderTimelineModel, DataFormatMixin.prototype); + + var TimelineView = + /** @class */ + function (_super) { + __extends(TimelineView, _super); + + function TimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TimelineView.type; + return _this; + } + + TimelineView.type = 'timeline'; + return TimelineView; + }(ComponentView); + + /** + * Extend axis 2d + */ + + var TimelineAxis = + /** @class */ + function (_super) { + __extends(TimelineAxis, _super); + + function TimelineAxis(dim, scale, coordExtent, axisType) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + return _this; + } + /** + * @override + */ + + + TimelineAxis.prototype.getLabelModel = function () { + // Force override + return this.model.getModel('label'); + }; + /** + * @override + */ + + + TimelineAxis.prototype.isHorizontal = function () { + return this.model.get('orient') === 'horizontal'; + }; + + return TimelineAxis; + }(Axis); + + var PI$8 = Math.PI; + var labelDataIndexStore = makeInner(); + + var SliderTimelineView = + /** @class */ + function (_super) { + __extends(SliderTimelineView, _super); + + function SliderTimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderTimelineView.type; + return _this; + } + + SliderTimelineView.prototype.init = function (ecModel, api) { + this.api = api; + }; + /** + * @override + */ + + + SliderTimelineView.prototype.render = function (timelineModel, ecModel, api) { + this.model = timelineModel; + this.api = api; + this.ecModel = ecModel; + this.group.removeAll(); + + if (timelineModel.get('show', true)) { + var layoutInfo_1 = this._layout(timelineModel, api); + + var mainGroup_1 = this._createGroup('_mainGroup'); + + var labelGroup = this._createGroup('_labelGroup'); + + var axis_1 = this._axis = this._createAxis(layoutInfo_1, timelineModel); + + timelineModel.formatTooltip = function (dataIndex) { + var name = axis_1.scale.getLabel({ + value: dataIndex + }); + return createTooltipMarkup('nameValue', { + noName: true, + value: name + }); + }; + + each(['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], function (name) { + this['_render' + name](layoutInfo_1, mainGroup_1, axis_1, timelineModel); + }, this); + + this._renderAxisLabel(layoutInfo_1, labelGroup, axis_1, timelineModel); + + this._position(layoutInfo_1, timelineModel); + } + + this._doPlayStop(); + + this._updateTicksStatus(); + }; + /** + * @override + */ + + + SliderTimelineView.prototype.remove = function () { + this._clearTimer(); + + this.group.removeAll(); + }; + /** + * @override + */ + + + SliderTimelineView.prototype.dispose = function () { + this._clearTimer(); + }; + + SliderTimelineView.prototype._layout = function (timelineModel, api) { + var labelPosOpt = timelineModel.get(['label', 'position']); + var orient = timelineModel.get('orient'); + var viewRect = getViewRect$5(timelineModel, api); + var parsedLabelPos; // Auto label offset. + + if (labelPosOpt == null || labelPosOpt === 'auto') { + parsedLabelPos = orient === 'horizontal' ? viewRect.y + viewRect.height / 2 < api.getHeight() / 2 ? '-' : '+' : viewRect.x + viewRect.width / 2 < api.getWidth() / 2 ? '+' : '-'; + } else if (isString(labelPosOpt)) { + parsedLabelPos = { + horizontal: { + top: '-', + bottom: '+' + }, + vertical: { + left: '-', + right: '+' + } + }[orient][labelPosOpt]; + } else { + // is number + parsedLabelPos = labelPosOpt; + } + + var labelAlignMap = { + horizontal: 'center', + vertical: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'left' : 'right' + }; + var labelBaselineMap = { + horizontal: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'top' : 'bottom', + vertical: 'middle' + }; + var rotationMap = { + horizontal: 0, + vertical: PI$8 / 2 + }; // Position + + var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width; + var controlModel = timelineModel.getModel('controlStyle'); + var showControl = controlModel.get('show', true); + 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', 'rotate']) || 0; + labelRotation = labelRotation * PI$8 / 180; // To radian. + + var playPosition; + var prevBtnPosition; + var nextBtnPosition; + var controlPosition = controlModel.get('position', 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); + } + + var axisExtent = [xLeft, xRight]; + + if (timelineModel.get('inverse')) { + axisExtent.reverse(); + } + + return { + viewRect: viewRect, + mainLength: mainLength, + orient: orient, + rotation: rotationMap[orient], + labelRotation: labelRotation, + labelPosOpt: parsedLabelPos, + labelAlign: timelineModel.get(['label', 'align']) || labelAlignMap[orient], + labelBaseline: timelineModel.get(['label', 'verticalAlign']) || timelineModel.get(['label', 'baseline']) || labelBaselineMap[orient], + // Based on mainGroup. + playPosition: playPosition, + prevBtnPosition: prevBtnPosition, + nextBtnPosition: nextBtnPosition, + axisExtent: axisExtent, + controlSize: controlSize, + controlGap: controlGap + }; + }; + + SliderTimelineView.prototype._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') { + // transform to horizontal, inverse rotate by left-top point. + var m = create$1(); + var rotateOriginX = viewRect.x; + var rotateOriginY = viewRect.y + viewRect.height; + translate(m, m, [-rotateOriginX, -rotateOriginY]); + rotate(m, m, -PI$8 / 2); + 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.x, mainGroup.y]; + var labelsPosition = [labelGroup.x, labelGroup.y]; + labelsPosition[0] = mainPosition[0] = viewBound[0][0]; + var labelPosOpt = layoutInfo.labelPosOpt; + + if (labelPosOpt == null || isString(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.setPosition(mainPosition); + labelGroup.setPosition(labelsPosition); + mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation; + setOrigin(mainGroup); + setOrigin(labelGroup); + + function setOrigin(targetGroup) { + targetGroup.originX = viewBound[0][0] - targetGroup.x; + targetGroup.originY = viewBound[1][0] - targetGroup.y; + } + + 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]; + } + }; + + SliderTimelineView.prototype._createAxis = function (layoutInfo, timelineModel) { + var data = timelineModel.getData(); + var axisType = timelineModel.get('axisType'); + var scale = createScaleByModel$1(timelineModel, axisType); // Customize scale. The `tickValue` is `dataIndex`. + + scale.getTicks = function () { + return data.mapArray(['value'], function (value) { + return { + value: value + }; + }); + }; + + var dataExtent = data.getDataExtent('value'); + scale.setExtent(dataExtent[0], dataExtent[1]); + scale.niceTicks(); + var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType); + axis.model = timelineModel; + return axis; + }; + + SliderTimelineView.prototype._createGroup = function (key) { + var newGroup = this[key] = new Group(); + this.group.add(newGroup); + return newGroup; + }; + + SliderTimelineView.prototype._renderAxisLine = function (layoutInfo, group, axis, timelineModel) { + var axisExtent = axis.getExtent(); + + if (!timelineModel.get(['lineStyle', 'show'])) { + return; + } + + var line = new Line({ + shape: { + x1: axisExtent[0], + y1: 0, + x2: axisExtent[1], + y2: 0 + }, + style: extend({ + lineCap: 'round' + }, timelineModel.getModel('lineStyle').getLineStyle()), + silent: true, + z2: 1 + }); + group.add(line); + var progressLine = this._progressLine = new Line({ + shape: { + x1: axisExtent[0], + x2: this._currentPointer ? this._currentPointer.x : axisExtent[0], + y1: 0, + y2: 0 + }, + style: defaults({ + lineCap: 'round', + lineWidth: line.style.lineWidth + }, timelineModel.getModel(['progress', 'lineStyle']).getLineStyle()), + silent: true, + z2: 1 + }); + group.add(progressLine); + }; + + SliderTimelineView.prototype._renderAxisTick = function (layoutInfo, group, axis, timelineModel) { + var _this = this; + + var data = timelineModel.getData(); // Show all ticks, despite ignoring strategy. + + var ticks = axis.scale.getTicks(); + this._tickSymbols = []; // The value is dataIndex, see the costomized scale. + + each(ticks, function (tick) { + var tickCoord = axis.dataToCoord(tick.value); + var itemModel = data.getItemModel(tick.value); + var itemStyleModel = itemModel.getModel('itemStyle'); + var hoverStyleModel = itemModel.getModel(['emphasis', 'itemStyle']); + var progressStyleModel = itemModel.getModel(['progress', 'itemStyle']); + var symbolOpt = { + x: tickCoord, + y: 0, + onclick: bind(_this._changeTimeline, _this, tick.value) + }; + var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt); + el.ensureState('emphasis').style = hoverStyleModel.getItemStyle(); + el.ensureState('progress').style = progressStyleModel.getItemStyle(); + enableHoverEmphasis(el); + var ecData = getECData(el); + + if (itemModel.get('tooltip')) { + ecData.dataIndex = tick.value; + ecData.dataModel = timelineModel; + } else { + ecData.dataIndex = ecData.dataModel = null; + } + + _this._tickSymbols.push(el); + }); + }; + + SliderTimelineView.prototype._renderAxisLabel = function (layoutInfo, group, axis, timelineModel) { + var _this = this; + + var labelModel = axis.getLabelModel(); + + if (!labelModel.get('show')) { + return; + } + + var data = timelineModel.getData(); + var labels = axis.getViewLabels(); + this._tickLabels = []; + each(labels, function (labelItem) { + // The tickValue is dataIndex, see the costomized scale. + var dataIndex = labelItem.tickValue; + var itemModel = data.getItemModel(dataIndex); + var normalLabelModel = itemModel.getModel('label'); + var hoverLabelModel = itemModel.getModel(['emphasis', 'label']); + var progressLabelModel = itemModel.getModel(['progress', 'label']); + var tickCoord = axis.dataToCoord(labelItem.tickValue); + var textEl = new ZRText({ + x: tickCoord, + y: 0, + rotation: layoutInfo.labelRotation - layoutInfo.rotation, + onclick: bind(_this._changeTimeline, _this, dataIndex), + silent: false, + style: createTextStyle(normalLabelModel, { + text: labelItem.formattedLabel, + align: layoutInfo.labelAlign, + verticalAlign: layoutInfo.labelBaseline + }) + }); + textEl.ensureState('emphasis').style = createTextStyle(hoverLabelModel); + textEl.ensureState('progress').style = createTextStyle(progressLabelModel); + group.add(textEl); + enableHoverEmphasis(textEl); + labelDataIndexStore(textEl).dataIndex = dataIndex; + + _this._tickLabels.push(textEl); + }); + }; + + SliderTimelineView.prototype._renderControl = function (layoutInfo, group, axis, timelineModel) { + var controlSize = layoutInfo.controlSize; + var rotation = layoutInfo.rotation; + var itemStyle = timelineModel.getModel('controlStyle').getItemStyle(); + var hoverStyle = timelineModel.getModel(['emphasis', 'controlStyle']).getItemStyle(); + var playState = timelineModel.getPlayState(); + var inverse = timelineModel.get('inverse', true); + makeBtn(layoutInfo.nextBtnPosition, 'next', bind(this._changeTimeline, this, inverse ? '-' : '+')); + makeBtn(layoutInfo.prevBtnPosition, 'prev', bind(this._changeTimeline, this, inverse ? '+' : '-')); + makeBtn(layoutInfo.playPosition, playState ? 'stop' : 'play', bind(this._handlePlayClick, this, !playState), true); + + function makeBtn(position, iconName, onclick, willRotate) { + if (!position) { + return; + } + + var iconSize = parsePercent(retrieve2(timelineModel.get(['controlStyle', iconName + 'BtnSize']), controlSize), controlSize); + var rect = [0, -iconSize / 2, iconSize, iconSize]; + var opt = { + position: position, + origin: [controlSize / 2, 0], + rotation: willRotate ? -rotation : 0, + rectHover: true, + style: itemStyle, + onclick: onclick + }; + var btn = makeControlIcon(timelineModel, iconName + 'Icon', rect, opt); + btn.ensureState('emphasis').style = hoverStyle; + group.add(btn); + enableHoverEmphasis(btn); + } + }; + + SliderTimelineView.prototype._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, me._progressLine, currentIndex, axis, timelineModel, true); + }, + onUpdate: function (pointer) { + pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel); + } + }; // Reuse when exists, for animation and drag. + + this._currentPointer = giveSymbol(pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback); + }; + + SliderTimelineView.prototype._handlePlayClick = function (nextState) { + this._clearTimer(); + + this.api.dispatchAction({ + type: 'timelinePlayChange', + playState: nextState, + from: this.uid + }); + }; + + SliderTimelineView.prototype._handlePointerDrag = function (dx, dy, e) { + this._clearTimer(); + + this._pointerChangeTimeline([e.offsetX, e.offsetY]); + }; + + SliderTimelineView.prototype._handlePointerDragend = function (e) { + this._pointerChangeTimeline([e.offsetX, e.offsetY], true); + }; + + SliderTimelineView.prototype._pointerChangeTimeline = function (mousePos, trigger) { + var toCoord = this._toAxisCoord(mousePos)[0]; + + var axis = this._axis; + var axisExtent = asc(axis.getExtent().slice()); + toCoord > axisExtent[1] && (toCoord = axisExtent[1]); + toCoord < axisExtent[0] && (toCoord = axisExtent[0]); + this._currentPointer.x = toCoord; + + this._currentPointer.markRedraw(); + + this._progressLine.shape.x2 = toCoord; + + this._progressLine.dirty(); + + var targetDataIndex = this._findNearestTick(toCoord); + + var timelineModel = this.model; + + if (trigger || targetDataIndex !== timelineModel.getCurrentIndex() && timelineModel.get('realtime')) { + this._changeTimeline(targetDataIndex); + } + }; + + SliderTimelineView.prototype._doPlayStop = function () { + var _this = this; + + this._clearTimer(); + + if (this.model.getPlayState()) { + this._timer = setTimeout(function () { + // Do not cache + var timelineModel = _this.model; + + _this._changeTimeline(timelineModel.getCurrentIndex() + (timelineModel.get('rewind', true) ? -1 : 1)); + }, this.model.get('playInterval')); + } + }; + + SliderTimelineView.prototype._toAxisCoord = function (vertex) { + var trans = this._mainGroup.getLocalTransform(); + + return applyTransform$1(vertex, trans, true); + }; + + SliderTimelineView.prototype._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; + }; + + SliderTimelineView.prototype._clearTimer = function () { + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + }; + + SliderTimelineView.prototype._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 + }); + }; + + SliderTimelineView.prototype._updateTicksStatus = function () { + var currentIndex = this.model.getCurrentIndex(); + var tickSymbols = this._tickSymbols; + var tickLabels = this._tickLabels; + + if (tickSymbols) { + for (var i = 0; i < tickSymbols.length; i++) { + tickSymbols && tickSymbols[i] && tickSymbols[i].toggleState('progress', i < currentIndex); + } + } + + if (tickLabels) { + for (var i = 0; i < tickLabels.length; i++) { + tickLabels && tickLabels[i] && tickLabels[i].toggleState('progress', labelDataIndexStore(tickLabels[i]).dataIndex <= currentIndex); + } + } + }; + + SliderTimelineView.type = 'timeline.slider'; + return SliderTimelineView; + }(TimelineView); + + function createScaleByModel$1(model, axisType) { + axisType = axisType || model.get('type'); + + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getCategories(), + extent: [Infinity, -Infinity] + }); + + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + + default: + // default to be value + return new IntervalScale(); + } + } + } + + function getViewRect$5(model, api) { + return getLayoutRect(model.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }, model.get('padding')); + } + + function makeControlIcon(timelineModel, objPath, rect, opts) { + var style = opts.style; + var icon = createIcon(timelineModel.get(['controlStyle', objPath]), opts || {}, new BoundingRect(rect[0], rect[1], rect[2], rect[3])); // TODO createIcon won't use style in opt. + + if (style) { + icon.setStyle(style); + } + + return icon; + } + /** + * Create symbol or update symbol + * opt: basic position and event handlers + */ + + + function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) { + var color = itemStyleModel.get('color'); + + if (!symbol) { + var symbolType = hostModel.get('symbol'); + symbol = createSymbol(symbolType, -1, -1, 2, 2, color); + symbol.setStyle('strokeNoScale', true); + group.add(symbol); + callback && callback.onCreate(symbol); + } else { + symbol.setColor(color); + group.add(symbol); // Group may be new, also need to add. + + callback && callback.onUpdate(symbol); + } // Style + + + var itemStyle = itemStyleModel.getItemStyle(['color']); + symbol.setStyle(itemStyle); // Transform and events. + + opt = merge({ + rectHover: true, + z2: 100 + }, opt, true); + var symbolSize = hostModel.get('symbolSize'); + symbolSize = symbolSize instanceof Array ? symbolSize.slice() : [+symbolSize, +symbolSize]; + opt.scaleX = symbolSize[0] / 2; + opt.scaleY = symbolSize[1] / 2; + var symbolOffset = hostModel.get('symbolOffset'); + + if (symbolOffset) { + opt.x = opt.x || 0; + opt.y = opt.y || 0; + opt.x += parsePercent$1(symbolOffset[0], symbolSize[0]); + opt.y += parsePercent$1(symbolOffset[1], symbolSize[1]); + } + + var symbolRotate = hostModel.get('symbolRotate'); + opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + symbol.attr(opt); // FIXME + // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed, + // getBoundingRect will return wrong result. + // (This is supposed to be resolved in zrender, but it is a little difficult to + // leverage performance and auto updateTransform) + // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol. + + symbol.updateTransform(); + return symbol; + } + + function pointerMoveTo(pointer, progressLine, 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({ + x: toCoord, + y: 0 + }); + progressLine && progressLine.attr({ + shape: { + x2: toCoord + } + }); + } else { + var animationCfg = { + duration: pointerModel.get('animationDuration', true), + easing: pointerModel.get('animationEasing', true) + }; + pointer.stopAnimation(null, true); + pointer.animateTo({ + x: toCoord, + y: 0 + }, animationCfg); + progressLine && progressLine.animateTo({ + shape: { + x2: toCoord + } + }, animationCfg); + } + } + + function installTimelineAction(registers) { + registers.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); + } + } // Set normalized currentIndex to payload. + + + ecModel.resetOption('timeline', { + replaceMerge: timelineModel.get('replaceMerge', true) + }); + return defaults({ + currentIndex: timelineModel.option.currentIndex + }, payload); + }); + registers.registerAction({ + type: 'timelinePlayChange', + event: 'timelinePlayChanged', + update: 'update' + }, function (payload, ecModel) { + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel && payload.playState != null) { + timelineModel.setPlayState(payload.playState); + } + }); + } + + function timelinePreprocessor(option) { + var timelineOpt = option && option.timeline; + + if (!isArray(timelineOpt)) { + timelineOpt = timelineOpt ? [timelineOpt] : []; + } + + 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; + } + + each(opt.data || [], function (dataItem) { + if (isObject(dataItem) && !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 + }; + 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); + } + + function install$D(registers) { + registers.registerComponentModel(SliderTimelineModel); + registers.registerComponentView(SliderTimelineView); + registers.registerSubTypeDefaulter('timeline', function () { + // Only slider now. + return 'slider'; + }); + installTimelineAction(registers); + registers.registerPreprocessor(timelinePreprocessor); + } + + function fillLabel(opt) { + defaultEmphasis(opt, 'label', ['show']); + } // { [componentType]: MarkerModel } + + + var inner$i = makeInner(); + + var MarkerModel = + /** @class */ + function (_super) { + __extends(MarkerModel, _super); + + function MarkerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkerModel.type; + /** + * If marker model is created by self from series + */ + + _this.createdBySelf = false; + return _this; + } + /** + * @overrite + */ + + + MarkerModel.prototype.init = function (option, parentModel, ecModel) { + if ("development" !== 'production') { + if (this.type === 'marker') { + throw new Error('Marker component is abstract component. Use markLine, markPoint, markArea instead.'); + } + } + + this.mergeDefaultAndTheme(option, ecModel); + + this._mergeOption(option, ecModel, false, true); + }; + + MarkerModel.prototype.isAnimationEnabled = function () { + if (env.node) { + return false; + } + + var hostSeries = this.__hostSeries; + return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled(); + }; + /** + * @overrite + */ + + + MarkerModel.prototype.mergeOption = function (newOpt, ecModel) { + this._mergeOption(newOpt, ecModel, false, false); + }; + + MarkerModel.prototype._mergeOption = function (newOpt, ecModel, createdBySelf, isInit) { + var componentType = this.mainType; + + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + // mainType can be markPoint, markLine, markArea + var markerOpt = seriesModel.get(this.mainType, true); + var markerModel = inner$i(seriesModel)[componentType]; + + if (!markerOpt || !markerOpt.data) { + inner$i(seriesModel)[componentType] = null; + return; + } + + if (!markerModel) { + if (isInit) { + // Default label emphasis `position` and `show` + fillLabel(markerOpt); + } + + each(markerOpt.data, function (item) { + // FIXME Overwrite fillLabel method ? + if (item instanceof Array) { + fillLabel(item[0]); + fillLabel(item[1]); + } else { + fillLabel(item); + } + }); + markerModel = this.createMarkerModelFromSeries(markerOpt, this, ecModel); // markerModel = new ImplementedMarkerModel( + // markerOpt, this, ecModel + // ); + + extend(markerModel, { + mainType: this.mainType, + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }); + markerModel.__hostSeries = seriesModel; + } else { + markerModel._mergeOption(markerOpt, ecModel, true); + } + + inner$i(seriesModel)[componentType] = markerModel; + }, this); + } + }; + + MarkerModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var itemName = data.getName(dataIndex); + return createTooltipMarkup('section', { + header: this.name, + blocks: [createTooltipMarkup('nameValue', { + name: itemName, + value: value, + noName: !itemName, + noValue: value == null + })] + }); + }; + + MarkerModel.prototype.getData = function () { + return this._data; + }; + + MarkerModel.prototype.setData = function (data) { + this._data = data; + }; + + MarkerModel.getMarkerModelFromSeries = function (seriesModel, // Support three types of markers. Strict check. + componentType) { + return inner$i(seriesModel)[componentType]; + }; + + MarkerModel.type = 'marker'; + MarkerModel.dependencies = ['series', 'grid', 'polar', 'geo']; + return MarkerModel; + }(ComponentModel); + + mixin(MarkerModel, DataFormatMixin.prototype); + + var MarkPointModel = + /** @class */ + function (_super) { + __extends(MarkPointModel, _super); + + function MarkPointModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkPointModel.type; + return _this; + } + + MarkPointModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkPointModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkPointModel.type = 'markPoint'; + MarkPointModel.defaultOption = { + zlevel: 0, + z: 5, + symbol: 'pin', + symbolSize: 50, + //symbolRotate: 0, + //symbolOffset: [0, 0] + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'inside' + }, + itemStyle: { + borderWidth: 2 + }, + emphasis: { + label: { + show: true + } + } + }; + return MarkPointModel; + }(MarkerModel); + + function hasXOrY(item) { + return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y))); + } + + function hasXAndY(item) { + return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y)); + } // Make it simple, do not visit all stacked value to count precision. + // function getPrecision(data, valueAxisDim, dataIndex) { + // let precision = -1; + // let stackedDim = data.mapDimension(valueAxisDim); + // do { + // precision = Math.max( + // numberUtil.getPrecision(data.get(stackedDim, dataIndex)), + // precision + // ); + // let stackedOnSeries = data.getCalculationInfo('stackedOnSeries'); + // if (stackedOnSeries) { + // let byValue = data.get(data.getCalculationInfo('stackedByDimension'), dataIndex); + // data = stackedOnSeries.getData(); + // dataIndex = data.indexOf(data.getCalculationInfo('stackedByDimension'), byValue); + // stackedDim = data.getCalculationInfo('stackedDimension'); + // } + // else { + // data = null; + // } + // } while (data); + // return precision; + // } + + + function markerTypeCalculatorWithExtent(markerType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex) { + var coordArr = []; + var stacked = isDimensionStacked(data, targetDataDim + /*, otherDataDim*/ + ); + var calcDataDim = stacked ? data.getCalculationInfo('stackResultDimension') : targetDataDim; + var value = numCalculate(data, calcDataDim, markerType); + var dataIndex = data.indicesOfNearest(calcDataDim, value)[0]; + coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex); + coordArr[targetCoordIndex] = data.get(calcDataDim, dataIndex); + var coordArrValue = data.get(targetDataDim, dataIndex); // Make it simple, do not visit all stacked value to count precision. + + var precision = getPrecision(data.get(targetDataDim, dataIndex)); + precision = Math.min(precision, 20); + + if (precision >= 0) { + coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision); + } + + return [coordArr, coordArrValue]; + } // TODO Specified percent + + + var markerTypeCalculator = { + min: curry(markerTypeCalculatorWithExtent, 'min'), + max: curry(markerTypeCalculatorWithExtent, 'max'), + average: curry(markerTypeCalculatorWithExtent, 'average'), + median: curry(markerTypeCalculatorWithExtent, 'median') + }; + /** + * 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} + */ + + function dataTransform(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 + // parseFloat first because item.x and item.y can be percent string like '20%' + + if (item && !hasXAndY(item) && !isArray(item.coord) && coordSys) { + var dims = coordSys.dimensions; + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); // Clone the option + // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value + + item = clone(item); + + if (item.type && markerTypeCalculator[item.type] && axisInfo.baseAxis && axisInfo.valueAxis) { + var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim); + var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim); + var coordInfo = markerTypeCalculator[item.type](data, axisInfo.baseDataDim, axisInfo.valueDataDim, otherCoordIndex, targetCoordIndex); + item.coord = coordInfo[0]; // Force to use the value of calculated value. + // let item use the value without stack. + + item.value = coordInfo[1]; + } else { + // FIXME Only has one of xAxis and yAxis. + var coord = [item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis]; // Each coord support max, min, average + + for (var i = 0; i < 2; i++) { + if (markerTypeCalculator[coord[i]]) { + coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]); + } + } + + item.coord = coord; + } + } + + return item; + } + function getAxisInfo$1(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(dataDimToCoordDim(seriesModel, ret.valueDataDim)); + ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + } else { + ret.baseAxis = seriesModel.getBaseAxis(); + ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + ret.valueDataDim = data.mapDimension(ret.valueAxis.dim); + } + + return ret; + } + + function dataDimToCoordDim(seriesModel, dataDim) { + var data = seriesModel.getData(); + var dimensions = data.dimensions; + dataDim = data.getDimension(dataDim); + + for (var i = 0; i < dimensions.length; i++) { + var dimItem = data.getDimensionInfo(dimensions[i]); + + if (dimItem.name === dataDim) { + return dimItem.coordDim; + } + } + } + /** + * Filter data which is out of coordinateSystem range + * [dataFilter description] + */ + + + function dataFilter$1( // Currently only polar and cartesian has containData. + coordSys, item) { + // Alwalys return true if there is no coordSys + return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true; + } + function dimValueGetter(item, dimName, dataIndex, dimIndex) { + // x, y, radius, angle + if (dimIndex < 2) { + return item.coord && item.coord[dimIndex]; + } + + return item.value; + } + function numCalculate(data, valueDataDim, type) { + if (type === 'average') { + var sum_1 = 0; + var count_1 = 0; + data.each(valueDataDim, function (val, idx) { + if (!isNaN(val)) { + sum_1 += val; + count_1++; + } + }); + return sum_1 / count_1; + } else if (type === 'median') { + return data.getMedian(valueDataDim); + } else { + // max & min + return data.getDataExtent(valueDataDim)[type === 'max' ? 1 : 0]; + } + } + + var inner$j = makeInner(); + + var MarkerView = + /** @class */ + function (_super) { + __extends(MarkerView, _super); + + function MarkerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkerView.type; + return _this; + } + + MarkerView.prototype.init = function () { + this.markerGroupMap = createHashMap(); + }; + + MarkerView.prototype.render = function (markerModel, ecModel, api) { + var _this = this; + + var markerGroupMap = this.markerGroupMap; + markerGroupMap.each(function (item) { + inner$j(item).keep = false; + }); + ecModel.eachSeries(function (seriesModel) { + var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); + markerModel && _this.renderSeries(seriesModel, markerModel, ecModel, api); + }); + markerGroupMap.each(function (item) { + !inner$j(item).keep && _this.group.remove(item.group); + }); + }; + + MarkerView.prototype.markKeep = function (drawGroup) { + inner$j(drawGroup).keep = true; + }; + + MarkerView.prototype.blurSeries = function (seriesModelList) { + var _this = this; + + each(seriesModelList, function (seriesModel) { + var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); + + if (markerModel) { + var data = markerModel.getData(); + data.eachItemGraphicEl(function (el) { + if (el) { + enterBlur(el); + } + }); + } + }); + }; + + MarkerView.type = 'marker'; + return MarkerView; + }(ComponentView); + + function updateMarkerLayout(mpData, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } // 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]); + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + + mpData.setItemLayout(idx, point); + }); + } + + var MarkPointView = + /** @class */ + function (_super) { + __extends(MarkPointView, _super); + + function MarkPointView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkPointView.type; + return _this; + } + + MarkPointView.prototype.updateTransform = function (markPointModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mpModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markPoint'); + + if (mpModel) { + updateMarkerLayout(mpModel.getData(), seriesModel, api); + this.markerGroupMap.get(seriesModel.id).updateLayout(); + } + }, this); + }; + + MarkPointView.prototype.renderSeries = function (seriesModel, mpModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var symbolDrawMap = this.markerGroupMap; + var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw()); + var mpData = createList$1(coordSys, seriesModel, mpModel); // FIXME + + mpModel.setData(mpData); + updateMarkerLayout(mpModel.getData(), seriesModel, api); + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var symbol = itemModel.getShallow('symbol'); + var symbolSize = itemModel.getShallow('symbolSize'); + var symbolRotate = itemModel.getShallow('symbolRotate'); + + if (isFunction(symbol) || isFunction(symbolSize) || isFunction(symbolRotate)) { + var rawIdx = mpModel.getRawValue(idx); + var dataParams = mpModel.getDataParams(idx); + + if (isFunction(symbol)) { + symbol = symbol(rawIdx, dataParams); + } + + if (isFunction(symbolSize)) { + // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据? + symbolSize = symbolSize(rawIdx, dataParams); + } + + if (isFunction(symbolRotate)) { + symbolRotate = symbolRotate(rawIdx, dataParams); + } + } + + var style = itemModel.getModel('itemStyle').getItemStyle(); + var color = getVisualFromData(seriesData, 'color'); + + if (!style.fill) { + style.fill = color; + } + + mpData.setItemVisual(idx, { + symbol: symbol, + symbolSize: symbolSize, + symbolRotate: symbolRotate, + style: style + }); + }); // 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) { + getECData(child).dataModel = mpModel; + }); + }); + this.markKeep(symbolDraw); + symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent'); + }; + + MarkPointView.type = 'markPoint'; + return MarkPointView; + }(MarkerView); + + function createList$1(coordSys, seriesModel, mpModel) { + var coordDimsInfos; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return defaults({ + name: coordDim + }, info); + }); + } else { + coordDimsInfos = [{ + name: 'value', + type: 'float' + }]; + } + + var mpData = new List(coordDimsInfos, mpModel); + var dataOpt = map(mpModel.get('data'), curry(dataTransform, seriesModel)); + + if (coordSys) { + dataOpt = filter(dataOpt, curry(dataFilter$1, coordSys)); + } + + mpData.initData(dataOpt, null, coordSys ? dimValueGetter : function (item) { + return item.value; + }); + return mpData; + } + + function install$E(registers) { + registers.registerComponentModel(MarkPointModel); + registers.registerComponentView(MarkPointView); + registers.registerPreprocessor(function (opt) { + // Make sure markPoint component is enabled + opt.markPoint = opt.markPoint || {}; + }); + } + + var MarkLineModel = + /** @class */ + function (_super) { + __extends(MarkLineModel, _super); + + function MarkLineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkLineModel.type; + return _this; + } + + MarkLineModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkLineModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkLineModel.type = 'markLine'; + MarkLineModel.defaultOption = { + zlevel: 0, + z: 5, + symbol: ['circle', 'arrow'], + symbolSize: [8, 16], + //symbolRotate: 0, + precision: 2, + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'end', + distance: 5 + }, + lineStyle: { + type: 'dashed' + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + width: 3 + } + }, + animationEasing: 'linear' + }; + return MarkLineModel; + }(MarkerModel); + + var inner$k = makeInner(); + + var markLineTransform = function (seriesModel, coordSys, mlModel, item) { + var data = seriesModel.getData(); + var itemArray; + + if (!isArray(item)) { + // Special type markLine like 'min', 'max', 'average', 'median' + var mlType = item.type; + + if (mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median' // In case + // data: [{ + // yAxis: 10 + // }] + || item.xAxis != null || item.yAxis != null) { + var valueAxis = void 0; + var value = void 0; + + if (item.yAxis != null || item.xAxis != null) { + valueAxis = coordSys.getAxis(item.yAxis != null ? 'y' : 'x'); + value = retrieve(item.yAxis, item.xAxis); + } else { + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); + valueAxis = axisInfo.valueAxis; + var valueDataDim = getStackedDimension(data, axisInfo.valueDataDim); + value = numCalculate(data, valueDataDim, mlType); + } + + var valueIndex = valueAxis.dim === 'x' ? 0 : 1; + var baseIndex = 1 - valueIndex; // Normized to 2d data with start and end point + + var mlFrom = clone(item); + var mlTo = { + coord: [] + }; + mlFrom.type = null; + mlFrom.coord = []; + mlFrom.coord[baseIndex] = -Infinity; + mlTo.coord[baseIndex] = Infinity; + var precision = mlModel.get('precision'); + + if (precision >= 0 && typeof value === 'number') { + value = +value.toFixed(Math.min(precision, 20)); + } + + mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value; + itemArray = [mlFrom, mlTo, { + type: mlType, + valueIndex: item.valueIndex, + // Force to use the value of calculated value. + value: value + }]; + } else { + // Invalid data + if ("development" !== 'production') { + logError('Invalid markLine data.'); + } + + itemArray = []; + } + } else { + itemArray = item; + } + + var normalizedItem = [dataTransform(seriesModel, itemArray[0]), dataTransform(seriesModel, itemArray[1]), extend({}, itemArray[2])]; // Avoid line data type is extended by from(to) data type + + normalizedItem[2].type = normalizedItem[2].type || null; // Merge from option and to option into line option + + merge(normalizedItem[2], normalizedItem[0]); + merge(normalizedItem[2], normalizedItem[1]); + return normalizedItem; + }; + + function isInifinity(val) { + return !isNaN(val) && !isFinite(val); + } // If a markLine has one dim + + + function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + var dimName = coordSys.dimensions[dimIndex]; + return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]); + } + + function markLineFilter(coordSys, item) { + if (coordSys.type === 'cartesian2d') { + var fromCoord = item[0].coord; + var toCoord = item[1].coord; // In case + // { + // markLine: { + // data: [{ yAxis: 2 }] + // } + // } + + if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) { + return true; + } + } + + return dataFilter$1(coordSys, item[0]) && dataFilter$1(coordSys, item[1]); + } + + function updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } 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 line to the edge of grid if value on one axis is Inifnity + // In case + // markLine: { + // data: [{ + // yAxis: 2 + // // or + // type: 'average' + // }] + // } + + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var dims = coordSys.dimensions; + + if (isInifinity(data.get(dims[0], idx))) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]); + } else if (isInifinity(data.get(dims[1], idx))) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]); + } + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + data.setItemLayout(idx, point); + } + + var MarkLineView = + /** @class */ + function (_super) { + __extends(MarkLineView, _super); + + function MarkLineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkLineView.type; + return _this; + } + + MarkLineView.prototype.updateTransform = function (markLineModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mlModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markLine'); + + if (mlModel) { + var mlData_1 = mlModel.getData(); + var fromData_1 = inner$k(mlModel).from; + var toData_1 = inner$k(mlModel).to; // Update visual and layout of from symbol and to symbol + + fromData_1.each(function (idx) { + updateSingleMarkerEndLayout(fromData_1, idx, true, seriesModel, api); + updateSingleMarkerEndLayout(toData_1, idx, false, seriesModel, api); + }); // Update layout of line + + mlData_1.each(function (idx) { + mlData_1.setItemLayout(idx, [fromData_1.getItemLayout(idx), toData_1.getItemLayout(idx)]); + }); + this.markerGroupMap.get(seriesModel.id).updateLayout(); + } + }, this); + }; + + MarkLineView.prototype.renderSeries = function (seriesModel, mlModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var lineDrawMap = this.markerGroupMap; + var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw()); + this.group.add(lineDraw.group); + var mlData = createList$2(coordSys, seriesModel, mlModel); + var fromData = mlData.from; + var toData = mlData.to; + var lineData = mlData.line; + inner$k(mlModel).from = fromData; + inner$k(mlModel).to = toData; // Line data for tooltip and formatter + + mlModel.setData(lineData); + var symbolType = mlModel.get('symbol'); + var symbolSize = mlModel.get('symbolSize'); + + if (!isArray(symbolType)) { + symbolType = [symbolType, symbolType]; + } + + if (!isArray(symbolSize)) { + symbolSize = [symbolSize, symbolSize]; + } // Update visual and layout of from symbol and to symbol + + + mlData.from.each(function (idx) { + updateDataVisualAndLayout(fromData, idx, true); + updateDataVisualAndLayout(toData, idx, false); + }); // Update visual and layout of line + + lineData.each(function (idx) { + var lineStyle = lineData.getItemModel(idx).getModel('lineStyle').getLineStyle(); // lineData.setItemVisual(idx, { + // color: lineColor || fromData.getItemVisual(idx, 'color') + // }); + + lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]); + + if (lineStyle.stroke == null) { + lineStyle.stroke = fromData.getItemVisual(idx, 'style').fill; + } + + lineData.setItemVisual(idx, { + fromSymbolRotate: fromData.getItemVisual(idx, 'symbolRotate'), + fromSymbolSize: fromData.getItemVisual(idx, 'symbolSize'), + fromSymbol: fromData.getItemVisual(idx, 'symbol'), + toSymbolRotate: toData.getItemVisual(idx, 'symbolRotate'), + toSymbolSize: toData.getItemVisual(idx, 'symbolSize'), + toSymbol: toData.getItemVisual(idx, 'symbol'), + style: lineStyle + }); + }); + lineDraw.updateData(lineData); // Set host model for tooltip + // FIXME + + mlData.line.eachItemGraphicEl(function (el, idx) { + el.traverse(function (child) { + getECData(child).dataModel = mlModel; + }); + }); + + function updateDataVisualAndLayout(data, idx, isFrom) { + var itemModel = data.getItemModel(idx); + updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api); + var style = itemModel.getModel('itemStyle').getItemStyle(); + + if (style.fill == null) { + style.fill = getVisualFromData(seriesData, 'color'); + } + + data.setItemVisual(idx, { + symbolRotate: itemModel.get('symbolRotate'), + symbolSize: itemModel.get('symbolSize') || symbolSize[isFrom ? 0 : 1], + symbol: itemModel.get('symbol', true) || symbolType[isFrom ? 0 : 1], + style: style + }); + } + + this.markKeep(lineDraw); + lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent'); + }; + + MarkLineView.type = 'markLine'; + return MarkLineView; + }(MarkerView); + + function createList$2(coordSys, seriesModel, mlModel) { + var coordDimsInfos; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return defaults({ + name: coordDim + }, 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 = map(mlModel.get('data'), curry(markLineTransform, seriesModel, coordSys, mlModel)); + + if (coordSys) { + optData = filter(optData, curry(markLineFilter, coordSys)); + } + + var dimValueGetter$1 = coordSys ? dimValueGetter : function (item) { + return item.value; + }; + fromData.initData(map(optData, function (item) { + return item[0]; + }), null, dimValueGetter$1); + toData.initData(map(optData, function (item) { + return item[1]; + }), null, dimValueGetter$1); + lineData.initData(map(optData, function (item) { + return item[2]; + })); + lineData.hasItemOption = true; + return { + from: fromData, + to: toData, + line: lineData + }; + } + + function install$F(registers) { + registers.registerComponentModel(MarkLineModel); + registers.registerComponentView(MarkLineView); + registers.registerPreprocessor(function (opt) { + // Make sure markLine component is enabled + opt.markLine = opt.markLine || {}; + }); + } + + var MarkAreaModel = + /** @class */ + function (_super) { + __extends(MarkAreaModel, _super); + + function MarkAreaModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkAreaModel.type; + return _this; + } + + MarkAreaModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkAreaModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkAreaModel.type = 'markArea'; + MarkAreaModel.defaultOption = { + zlevel: 0, + // PENDING + z: 1, + tooltip: { + trigger: 'item' + }, + // markArea should fixed on the coordinate system + animation: false, + label: { + show: true, + position: 'top' + }, + itemStyle: { + // color and borderColor default to use color from series + // color: 'auto' + // borderColor: 'auto' + borderWidth: 0 + }, + emphasis: { + label: { + show: true, + position: 'top' + } + } + }; + return MarkAreaModel; + }(MarkerModel); + + var inner$l = makeInner(); + + var markAreaTransform = function (seriesModel, coordSys, maModel, item) { + var lt = dataTransform(seriesModel, item[0]); + var rb = dataTransform(seriesModel, item[1]); // FIXME make sure lt is less than rb + + var ltCoord = lt.coord; + var rbCoord = rb.coord; + ltCoord[0] = retrieve(ltCoord[0], -Infinity); + ltCoord[1] = retrieve(ltCoord[1], -Infinity); + rbCoord[0] = retrieve(rbCoord[0], Infinity); + rbCoord[1] = retrieve(rbCoord[1], Infinity); // Merge option into one + + var result = mergeAll([{}, lt, rb]); + result.coord = [lt.coord, rb.coord]; + result.x0 = lt.x; + result.y0 = lt.y; + result.x1 = rb.x; + result.y1 = rb.y; + return result; + }; + + function isInifinity$1(val) { + return !isNaN(val) && !isFinite(val); + } // If a markArea has one dim + + + function ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + return isInifinity$1(fromCoord[otherDimIndex]) && isInifinity$1(toCoord[otherDimIndex]); + } + + function markAreaFilter(coordSys, item) { + var fromCoord = item.coord[0]; + var toCoord = item.coord[1]; + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // In case + // { + // markArea: { + // data: [{ yAxis: 2 }] + // } + // } + if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord))) { + return true; + } + } + + return dataFilter$1(coordSys, { + coord: fromCoord, + x: item.x0, + y: item.y0 + }) || dataFilter$1(coordSys, { + coord: toCoord, + x: item.x1, + y: item.y1 + }); + } // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0'] + + + function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get(dims[0]), api.getWidth()); + var yPx = parsePercent$1(itemModel.get(dims[1]), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition(data.getValues(dims, idx)); + } else { + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + var pt = [x, y]; + coordSys.clampData && coordSys.clampData(pt, pt); + point = coordSys.dataToPoint(pt, true); + } + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + + if (isInifinity$1(x)) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]); + } else if (isInifinity$1(y)) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]); + } + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + return point; + } + + var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']]; + + var MarkAreaView = + /** @class */ + function (_super) { + __extends(MarkAreaView, _super); + + function MarkAreaView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkAreaView.type; + return _this; + } + + MarkAreaView.prototype.updateTransform = function (markAreaModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markArea'); + + if (maModel) { + var areaData_1 = maModel.getData(); + areaData_1.each(function (idx) { + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api); + }); // Layout + + areaData_1.setItemLayout(idx, points); + var el = areaData_1.getItemGraphicEl(idx); + el.setShape('points', points); + }); + } + }, this); + }; + + MarkAreaView.prototype.renderSeries = function (seriesModel, maModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var areaGroupMap = this.markerGroupMap; + var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, { + group: new Group() + }); + this.group.add(polygonGroup.group); + this.markKeep(polygonGroup); + var areaData = createList$3(coordSys, seriesModel, maModel); // Line data for tooltip and formatter + + maModel.setData(areaData); // Update visual and layout of line + + areaData.each(function (idx) { + // Layout + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); + }); // If none of the area is inside coordSys, allClipped is set to be true + // in layout so that label will not be displayed. See #12591 + + var allClipped = true; + each(dimPermutations, function (dim) { + if (!allClipped) { + return; + } + + var xValue = areaData.get(dim[0], idx); + var yValue = areaData.get(dim[1], idx); // If is infinity, the axis should be considered not clipped + + if ((isInifinity$1(xValue) || coordSys.getAxis('x').containData(xValue)) && (isInifinity$1(yValue) || coordSys.getAxis('y').containData(yValue))) { + allClipped = false; + } + }); + areaData.setItemLayout(idx, { + points: points, + allClipped: allClipped + }); + var style = areaData.getItemModel(idx).getModel('itemStyle').getItemStyle(); + var color$1 = getVisualFromData(seriesData, 'color'); + + if (!style.fill) { + style.fill = color$1; + + if (typeof style.fill === 'string') { + style.fill = modifyAlpha(style.fill, 0.4); + } + } + + if (!style.stroke) { + style.stroke = color$1; + } // Visual + + + areaData.setItemVisual(idx, 'style', style); + }); + areaData.diff(inner$l(polygonGroup).data).add(function (idx) { + var layout = areaData.getItemLayout(idx); + + if (!layout.allClipped) { + var polygon = new Polygon({ + shape: { + points: layout.points + } + }); + areaData.setItemGraphicEl(idx, polygon); + polygonGroup.group.add(polygon); + } + }).update(function (newIdx, oldIdx) { + var polygon = inner$l(polygonGroup).data.getItemGraphicEl(oldIdx); + var layout = areaData.getItemLayout(newIdx); + + if (!layout.allClipped) { + if (polygon) { + updateProps(polygon, { + shape: { + points: layout.points + } + }, maModel, newIdx); + } else { + polygon = new Polygon({ + shape: { + points: layout.points + } + }); + } + + areaData.setItemGraphicEl(newIdx, polygon); + polygonGroup.group.add(polygon); + } else if (polygon) { + polygonGroup.group.remove(polygon); + } + }).remove(function (idx) { + var polygon = inner$l(polygonGroup).data.getItemGraphicEl(idx); + polygonGroup.group.remove(polygon); + }).execute(); + areaData.eachItemGraphicEl(function (polygon, idx) { + var itemModel = areaData.getItemModel(idx); + var style = areaData.getItemVisual(idx, 'style'); + polygon.useStyle(areaData.getItemVisual(idx, 'style')); + setLabelStyle(polygon, getLabelStatesModels(itemModel), { + labelFetcher: maModel, + labelDataIndex: idx, + defaultText: areaData.getName(idx) || '', + inheritColor: typeof style.fill === 'string' ? modifyAlpha(style.fill, 1) : '#000' + }); + setStatesStylesFromModel(polygon, itemModel); + enableHoverEmphasis(polygon); + getECData(polygon).dataModel = maModel; + }); + inner$l(polygonGroup).data = areaData; + polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent'); + }; + + MarkAreaView.type = 'markArea'; + return MarkAreaView; + }(MarkerView); + + function createList$3(coordSys, seriesModel, maModel) { + var coordDimsInfos; + var areaData; + var dims = ['x0', 'y0', 'x1', 'y1']; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var data = seriesModel.getData(); + var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return defaults({ + name: coordDim + }, info); + }); + areaData = new List(map(dims, function (dim, idx) { + return { + name: dim, + type: coordDimsInfos[idx % 2].type + }; + }), maModel); + } else { + coordDimsInfos = [{ + name: 'value', + type: 'float' + }]; + areaData = new List(coordDimsInfos, maModel); + } + + var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel)); + + if (coordSys) { + optData = filter(optData, curry(markAreaFilter, coordSys)); + } + + var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) { + // TODO should convert to ParsedValue? + return item.coord[Math.floor(dimIndex / 2)][dimIndex % 2]; + } : function (item) { + return item.value; + }; + areaData.initData(optData, null, dimValueGetter); + areaData.hasItemOption = true; + return areaData; + } + + function install$G(registers) { + registers.registerComponentModel(MarkAreaModel); + registers.registerComponentView(MarkAreaView); + registers.registerPreprocessor(function (opt) { + // Make sure markArea component is enabled + opt.markArea = opt.markArea || {}; + }); + } + + var getDefaultSelectorOptions = function (ecModel, type) { + if (type === 'all') { + return { + type: 'all', + title: ecModel.getLocale(['legend', 'selector', 'all']) + }; + } else if (type === 'inverse') { + return { + type: 'inverse', + title: ecModel.getLocale(['legend', 'selector', 'inverse']) + }; + } + }; + + var LegendModel = + /** @class */ + function (_super) { + __extends(LegendModel, _super); + + function LegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LegendModel.type; + _this.layoutMode = { + type: 'box', + // legend.width/height are maxWidth/maxHeight actually, + // whereas realy width/height is calculated by its content. + // (Setting {left: 10, right: 10} does not make sense). + // So consider the case: + // `setOption({legend: {left: 10});` + // then `setOption({legend: {right: 10});` + // The previous `left` should be cleared by setting `ignoreSize`. + ignoreSize: true + }; + return _this; + } + + LegendModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + option.selected = option.selected || {}; + + this._updateSelector(option); + }; + + LegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + + this._updateSelector(option); + }; + + LegendModel.prototype._updateSelector = function (option) { + var selector = option.selector; + var ecModel = this.ecModel; + + if (selector === true) { + selector = option.selector = ['all', 'inverse']; + } + + if (isArray(selector)) { + each(selector, function (item, index) { + isString(item) && (item = { + type: item + }); + selector[index] = merge(item, getDefaultSelectorOptions(ecModel, item.type)); + }); + } + }; + + LegendModel.prototype.optionUpdated = function () { + this._updateData(this.ecModel); + + var legendData = this._data; // If selectedMode is single, try to select one + + if (legendData[0] && this.get('selectedMode') === 'single') { + var hasSelected = false; // If has any selected in option.selected + + for (var i = 0; i < legendData.length; i++) { + var name_1 = legendData[i].get('name'); + + if (this.isSelected(name_1)) { + // Force to unselect others + this.select(name_1); + hasSelected = true; + break; + } + } // Try select the first if selectedMode is single + + + !hasSelected && this.select(legendData[0].get('name')); + } + }; + + LegendModel.prototype._updateData = function (ecModel) { + var potentialData = []; + var availableNames = []; + ecModel.eachRawSeries(function (seriesModel) { + var seriesName = seriesModel.name; + availableNames.push(seriesName); + var isPotential; + + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + var names = provider.getAllNames(); + + if (!ecModel.isSeriesFiltered(seriesModel)) { + availableNames = availableNames.concat(names); + } + + if (names.length) { + potentialData = potentialData.concat(names); + } else { + isPotential = true; + } + } else { + isPotential = true; + } + + if (isPotential && isNameSpecified(seriesModel)) { + potentialData.push(seriesModel.name); + } + }); + /** + * @type {Array.} + * @private + */ + + this._availableNames = availableNames; // If legend.data not specified in option, use availableNames as data, + // which is convinient for user preparing option. + + var rawData = this.get('data') || potentialData; + var legendData = map(rawData, function (dataItem) { + // Can be string or number + if (typeof dataItem === 'string' || typeof dataItem === 'number') { + dataItem = { + name: dataItem + }; + } + + return new Model(dataItem, this, this.ecModel); + }, this); + /** + * @type {Array.} + * @private + */ + + this._data = legendData; + }; + + LegendModel.prototype.getData = function () { + return this._data; + }; + + LegendModel.prototype.select = function (name) { + var selected = this.option.selected; + var selectedMode = this.get('selectedMode'); + + if (selectedMode === 'single') { + var data = this._data; + each(data, function (dataItem) { + selected[dataItem.get('name')] = false; + }); + } + + selected[name] = true; + }; + + LegendModel.prototype.unSelect = function (name) { + if (this.get('selectedMode') !== 'single') { + this.option.selected[name] = false; + } + }; + + LegendModel.prototype.toggleSelected = function (name) { + var selected = this.option.selected; // Default is true + + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + + this[selected[name] ? 'unSelect' : 'select'](name); + }; + + LegendModel.prototype.allSelect = function () { + var data = this._data; + var selected = this.option.selected; + each(data, function (dataItem) { + selected[dataItem.get('name', true)] = true; + }); + }; + + LegendModel.prototype.inverseSelect = function () { + var data = this._data; + var selected = this.option.selected; + each(data, function (dataItem) { + var name = dataItem.get('name', true); // Initially, default value is true + + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + + selected[name] = !selected[name]; + }); + }; + + LegendModel.prototype.isSelected = function (name) { + var selected = this.option.selected; + return !(selected.hasOwnProperty(name) && !selected[name]) && indexOf(this._availableNames, name) >= 0; + }; + + LegendModel.prototype.getOrient = function () { + return this.get('orient') === 'vertical' ? { + index: 1, + name: 'vertical' + } : { + index: 0, + name: 'horizontal' + }; + }; + + LegendModel.type = 'legend.plain'; + LegendModel.dependencies = ['series']; + LegendModel.defaultOption = { + zlevel: 0, + z: 4, + show: true, + orient: 'horizontal', + left: 'center', + // right: 'center', + top: 0, + // bottom: null, + align: 'auto', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemGap: 10, + itemWidth: 25, + itemHeight: 14, + inactiveColor: '#ccc', + inactiveBorderColor: '#ccc', + itemStyle: { + borderWidth: 0 + }, + textStyle: { + color: '#333' + }, + selectedMode: true, + selector: false, + selectorLabel: { + show: true, + borderRadius: 10, + padding: [3, 5, 3, 5], + fontSize: 12, + fontFamily: ' sans-serif', + color: '#666', + borderWidth: 1, + borderColor: '#666' + }, + emphasis: { + selectorLabel: { + show: true, + color: '#eee', + backgroundColor: '#666' + } + }, + selectorPosition: 'auto', + selectorItemGap: 7, + selectorButtonGap: 10, + tooltip: { + show: false + } + }; + return LegendModel; + }(ComponentModel); + + var curry$1 = curry; + var each$e = each; + var Group$2 = Group; + + var LegendView = + /** @class */ + function (_super) { + __extends(LegendView, _super); + + function LegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LegendView.type; + _this.newlineDisabled = false; + return _this; + } + + LegendView.prototype.init = function () { + this.group.add(this._contentGroup = new Group$2()); + this.group.add(this._selectorGroup = new Group$2()); + this._isFirstRender = true; + }; + /** + * @protected + */ + + + LegendView.prototype.getContentGroup = function () { + return this._contentGroup; + }; + /** + * @protected + */ + + + LegendView.prototype.getSelectorGroup = function () { + return this._selectorGroup; + }; + /** + * @override + */ + + + LegendView.prototype.render = function (legendModel, ecModel, api) { + var isFirstRender = this._isFirstRender; + this._isFirstRender = false; + this.resetInner(); + + if (!legendModel.get('show', true)) { + return; + } + + var itemAlign = legendModel.get('align'); + var orient = legendModel.get('orient'); + + if (!itemAlign || itemAlign === 'auto') { + itemAlign = legendModel.get('left') === 'right' && orient === 'vertical' ? 'right' : 'left'; + } // selector has been normalized to an array in model + + + var selector = legendModel.get('selector', true); + var selectorPosition = legendModel.get('selectorPosition', true); + + if (selector && (!selectorPosition || selectorPosition === 'auto')) { + selectorPosition = orient === 'horizontal' ? 'end' : 'start'; + } + + this.renderInner(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); // Perform layout. + + var positionInfo = legendModel.getBoxLayoutParams(); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var padding = legendModel.get('padding'); + var maxSize = getLayoutRect(positionInfo, viewportSize, padding); + var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition); // Place mainGroup, based on the calculated `mainRect`. + + var layoutRect = getLayoutRect(defaults({ + width: mainRect.width, + height: mainRect.height + }, positionInfo), viewportSize, padding); + this.group.x = layoutRect.x - mainRect.x; + this.group.y = layoutRect.y - mainRect.y; + this.group.markRedraw(); // Render background after group is layout. + + this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel)); + }; + + LegendView.prototype.resetInner = function () { + this.getContentGroup().removeAll(); + this._backgroundEl && this.group.remove(this._backgroundEl); + this.getSelectorGroup().removeAll(); + }; + + LegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var contentGroup = this.getContentGroup(); + var legendDrawnMap = createHashMap(); + var selectMode = legendModel.get('selectedMode'); + var excludeSeriesId = []; + ecModel.eachRawSeries(function (seriesModel) { + !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id); + }); + each$e(legendModel.getData(), function (itemModel, dataIndex) { + var name = itemModel.get('name'); // Use empty string or \n as a newline string + + if (!this.newlineDisabled && (name === '' || name === '\n')) { + var g = new Group$2(); // @ts-ignore + + g.newline = true; + contentGroup.add(g); + return; + } // Representitive series. + + + var seriesModel = ecModel.getSeriesByName(name)[0]; + + if (legendDrawnMap.get(name)) { + // Have been drawed + return; + } // Legend to control series. + + + if (seriesModel) { + var data = seriesModel.getData(); + var style = data.getVisual('style'); + var color = style[data.getVisual('drawType')] || style.fill; + var borderColor = style.stroke; + var decal = style.decal; // Using rect symbol defaultly + + var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect'; + var symbolType = data.getVisual('symbol'); + + var itemGroup = this._createItem(name, dataIndex, itemModel, legendModel, legendSymbolType, symbolType, itemAlign, color, borderColor, decal, selectMode); + + itemGroup.on('click', curry$1(dispatchSelectAction, name, null, api, excludeSeriesId)).on('mouseover', curry$1(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId)); + legendDrawnMap.set(name, true); + } else { + // Legend to control data. In pie and funnel. + ecModel.eachRawSeries(function (seriesModel) { + // In case multiple series has same data name + if (legendDrawnMap.get(name)) { + return; + } + + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + + if (!provider.containName(name)) { + return; + } + + var idx = provider.indexOfName(name); + var style = provider.getItemVisual(idx, 'style'); + var borderColor = style.stroke; + var decal = style.decal; + var color = style.fill; + var colorArr = parse(style.fill); // Color may be set to transparent in visualMap when data is out of range. + // Do not show nothing. + + if (colorArr && colorArr[3] === 0) { + colorArr[3] = 0.2; // TODO color is set to 0, 0, 0, 0. Should show correct RGBA + + color = stringify(colorArr, 'rgba'); + } + + var legendSymbolType = 'roundRect'; + + var itemGroup = this._createItem(name, dataIndex, itemModel, legendModel, legendSymbolType, null, itemAlign, color, borderColor, decal, selectMode); // FIXME: consider different series has items with the same name. + + + itemGroup.on('click', curry$1(dispatchSelectAction, null, name, api, excludeSeriesId)) // Should not specify the series name, consider legend controls + // more than one pie series. + .on('mouseover', curry$1(dispatchHighlightAction, null, name, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, null, name, api, excludeSeriesId)); + legendDrawnMap.set(name, true); + } + }, this); + } + + if ("development" !== 'production') { + if (!legendDrawnMap.get(name)) { + console.warn(name + ' series not exists. Legend data should be same with series name or data name.'); + } + } + }, this); + + if (selector) { + this._createSelector(selector, legendModel, api, orient, selectorPosition); + } + }; + + LegendView.prototype._createSelector = function (selector, legendModel, api, orient, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + each$e(selector, function createSelectorButton(selectorItem) { + var type = selectorItem.type; + var labelText = new ZRText({ + style: { + x: 0, + y: 0, + align: 'center', + verticalAlign: 'middle' + }, + onclick: function () { + api.dispatchAction({ + type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect' + }); + } + }); + selectorGroup.add(labelText); + var labelModel = legendModel.getModel('selectorLabel'); + var emphasisLabelModel = legendModel.getModel(['emphasis', 'selectorLabel']); + setLabelStyle(labelText, { + normal: labelModel, + emphasis: emphasisLabelModel + }, { + defaultText: selectorItem.title + }); + enableHoverEmphasis(labelText); + }); + }; + + LegendView.prototype._createItem = function (name, dataIndex, itemModel, legendModel, legendSymbolType, symbolType, itemAlign, color, borderColor, decal, selectMode) { + var itemWidth = legendModel.get('itemWidth'); + var itemHeight = legendModel.get('itemHeight'); + var inactiveColor = legendModel.get('inactiveColor'); + var inactiveBorderColor = legendModel.get('inactiveBorderColor'); + var symbolKeepAspect = legendModel.get('symbolKeepAspect'); + var legendModelItemStyle = legendModel.getModel('itemStyle'); + var isSelected = legendModel.isSelected(name); + var itemGroup = new Group$2(); + var textStyleModel = itemModel.getModel('textStyle'); + var itemIcon = itemModel.get('icon'); + var tooltipModel = itemModel.getModel('tooltip'); + var legendGlobalTooltipModel = tooltipModel.parentModel; // Use user given icon first + + legendSymbolType = itemIcon || legendSymbolType; + var legendSymbol = createSymbol(legendSymbolType, 0, 0, itemWidth, itemHeight, isSelected ? color : inactiveColor, // symbolKeepAspect default true for legend + symbolKeepAspect == null ? true : symbolKeepAspect); + itemGroup.add(setSymbolStyle(legendSymbol, legendSymbolType, legendModelItemStyle, borderColor, inactiveBorderColor, decal, isSelected)); // 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'; + } + + var legendSymbolCenter = createSymbol(symbolType, (itemWidth - size) / 2, (itemHeight - size) / 2, size, size, isSelected ? color : inactiveColor, // symbolKeepAspect default true for legend + symbolKeepAspect == null ? true : symbolKeepAspect); // Put symbol in the center + + itemGroup.add(setSymbolStyle(legendSymbolCenter, symbolType, legendModelItemStyle, borderColor, inactiveBorderColor, decal, isSelected)); + } + + var textX = itemAlign === 'left' ? itemWidth + 5 : -5; + var textAlign = itemAlign; + var formatter = legendModel.get('formatter'); + var content = name; + + if (typeof formatter === 'string' && formatter) { + content = formatter.replace('{name}', name != null ? name : ''); + } else if (typeof formatter === 'function') { + content = formatter(name); + } + + itemGroup.add(new ZRText({ + style: createTextStyle(textStyleModel, { + text: content, + x: textX, + y: itemHeight / 2, + fill: isSelected ? textStyleModel.getTextColor() : inactiveColor, + align: textAlign, + verticalAlign: 'middle' + }) + })); // Add a invisible rect to increase the area of mouse hover + + var hitRect = new Rect({ + shape: itemGroup.getBoundingRect(), + invisible: true + }); + + if (tooltipModel.get('show')) { + var formatterParams = { + componentType: 'legend', + legendIndex: legendModel.componentIndex, + name: name, + $vars: ['name'] + }; + hitRect.tooltip = extend({ + content: name, + // Defaul formatter + formatter: legendGlobalTooltipModel.get('formatter', true) || function (params) { + return params.name; + }, + formatterParams: formatterParams + }, tooltipModel.option); + } + + itemGroup.add(hitRect); + itemGroup.eachChild(function (child) { + child.silent = true; + }); + hitRect.silent = !selectMode; + this.getContentGroup().add(itemGroup); + enableHoverEmphasis(itemGroup); // @ts-ignore + + itemGroup.__legendDataIndex = dataIndex; + return itemGroup; + }; + + LegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var contentGroup = this.getContentGroup(); + var selectorGroup = this.getSelectorGroup(); // Place items in contentGroup. + + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), maxSize.width, maxSize.height); + var contentRect = contentGroup.getBoundingRect(); + var contentPos = [-contentRect.x, -contentRect.y]; + selectorGroup.markRedraw(); + contentGroup.markRedraw(); + + if (selector) { + // Place buttons in selectorGroup + box( // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var orientIdx = legendModel.getOrient().index; + var wh = orientIdx === 0 ? 'width' : 'height'; + var hw = orientIdx === 0 ? 'height' : 'width'; + var yx = orientIdx === 0 ? 'y' : 'x'; + + if (selectorPosition === 'end') { + selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap; + } else { + contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap; + } //Always align selector to content as 'middle' + + + selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2; + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + var mainRect = { + x: 0, + y: 0 + }; + mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]); + return mainRect; + } else { + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + return this.group.getBoundingRect(); + } + }; + /** + * @protected + */ + + + LegendView.prototype.remove = function () { + this.getContentGroup().removeAll(); + this._isFirstRender = true; + }; + + LegendView.type = 'legend.plain'; + return LegendView; + }(ComponentView); + + function setSymbolStyle(symbol, symbolType, legendModelItemStyle, borderColor, inactiveBorderColor, decal, isSelected) { + var itemStyle; + + if (symbolType !== 'line' && symbolType.indexOf('empty') < 0) { + itemStyle = legendModelItemStyle.getItemStyle(); + symbol.style.stroke = borderColor; + symbol.style.decal = decal; + + if (!isSelected) { + itemStyle.stroke = inactiveBorderColor; + } + } else { + itemStyle = legendModelItemStyle.getItemStyle(['borderWidth', 'borderColor']); + } + + symbol.setStyle(itemStyle); + return symbol; + } + + function dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) { + // downplay before unselect + dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId); + api.dispatchAction({ + type: 'legendToggleSelect', + name: seriesName != null ? seriesName : dataName + }); // highlight after select + // TODO higlight immediately may cause animation loss. + + dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId); + } + + function isUseHoverLayer(api) { + var list = api.getZr().storage.getDisplayList(); + var emphasisState; + var i = 0; + var len = list.length; + + while (i < len && !(emphasisState = list[i].states.emphasis)) { + i++; + } + + return emphasisState && emphasisState.hoverLayer; + } + + function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: 'highlight', + seriesName: seriesName, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } + } + + function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: 'downplay', + seriesName: seriesName, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function legendFilter(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; + }); + } + } + + 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 if (methodName === 'allSelect' || methodName === 'inverseSelect') { + legendModel[methodName](); + } else { + legendModel[methodName](payload.name); + isSelected = legendModel.isSelected(payload.name); + } + + var legendData = legendModel.getData(); + each(legendData, function (model) { + var name = model.get('name'); // Wrap element + + if (name === '\n' || name === '') { + return; + } + + var isItemSelected = legendModel.isSelected(name); + + if (selectedMap.hasOwnProperty(name)) { + // Unselected if any legend is unselected + selectedMap[name] = selectedMap[name] && isItemSelected; + } else { + selectedMap[name] = isItemSelected; + } + }); + }); // Return the event explicitly + + return methodName === 'allSelect' || methodName === 'inverseSelect' ? { + selected: selectedMap + } : { + name: payload.name, + selected: selectedMap + }; + } + + function installLegendAction(registers) { + /** + * @event legendToggleSelect + * @type {Object} + * @property {string} type 'legendToggleSelect' + * @property {string} [from] + * @property {string} name Series name or data item name + */ + registers.registerAction('legendToggleSelect', 'legendselectchanged', curry(legendSelectActionHandler, 'toggleSelected')); + registers.registerAction('legendAllSelect', 'legendselectall', curry(legendSelectActionHandler, 'allSelect')); + registers.registerAction('legendInverseSelect', 'legendinverseselect', curry(legendSelectActionHandler, 'inverseSelect')); + /** + * @event legendSelect + * @type {Object} + * @property {string} type 'legendSelect' + * @property {string} name Series name or data item name + */ + + registers.registerAction('legendSelect', 'legendselected', curry(legendSelectActionHandler, 'select')); + /** + * @event legendUnSelect + * @type {Object} + * @property {string} type 'legendUnSelect' + * @property {string} name Series name or data item name + */ + + registers.registerAction('legendUnSelect', 'legendunselected', curry(legendSelectActionHandler, 'unSelect')); + } + + function install$H(registers) { + registers.registerComponentModel(LegendModel); + registers.registerComponentView(LegendView); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter); + registers.registerSubTypeDefaulter('legend', function () { + return 'plain'; + }); + installLegendAction(registers); + } + + var ScrollableLegendModel = + /** @class */ + function (_super) { + __extends(ScrollableLegendModel, _super); + + function ScrollableLegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScrollableLegendModel.type; + return _this; + } + /** + * @param {number} scrollDataIndex + */ + + + ScrollableLegendModel.prototype.setScrollDataIndex = function (scrollDataIndex) { + this.option.scrollDataIndex = scrollDataIndex; + }; + + ScrollableLegendModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + + _super.prototype.init.call(this, option, parentModel, ecModel); + + mergeAndNormalizeLayoutParams$1(this, option, inputPositionParams); + }; + /** + * @override + */ + + + ScrollableLegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + + mergeAndNormalizeLayoutParams$1(this, this.option, option); + }; + + ScrollableLegendModel.type = 'legend.scroll'; + ScrollableLegendModel.defaultOption = inheritDefaultOption(LegendModel.defaultOption, { + scrollDataIndex: 0, + pageButtonItemGap: 5, + pageButtonGap: null, + pageButtonPosition: 'end', + pageFormatter: '{current}/{total}', + pageIcons: { + horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'], + vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z'] + }, + pageIconColor: '#2f4554', + pageIconInactiveColor: '#aaa', + pageIconSize: 15, + pageTextStyle: { + color: '#333' + }, + animationDurationUpdate: 800 + }); + return ScrollableLegendModel; + }(LegendModel); + + function mergeAndNormalizeLayoutParams$1(legendModel, target, raw) { + var orient = legendModel.getOrient(); + var ignoreSize = [1, 1]; + ignoreSize[orient.index] = 0; + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: !!ignoreSize + }); + } + + var Group$3 = Group; + var WH$1 = ['width', 'height']; + var XY$1 = ['x', 'y']; + + var ScrollableLegendView = + /** @class */ + function (_super) { + __extends(ScrollableLegendView, _super); + + function ScrollableLegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScrollableLegendView.type; + _this.newlineDisabled = true; + _this._currentIndex = 0; + return _this; + } + + ScrollableLegendView.prototype.init = function () { + _super.prototype.init.call(this); + + this.group.add(this._containerGroup = new Group$3()); + + this._containerGroup.add(this.getContentGroup()); + + this.group.add(this._controllerGroup = new Group$3()); + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.resetInner = function () { + _super.prototype.resetInner.call(this); + + this._controllerGroup.removeAll(); + + this._containerGroup.removeClipPath(); + + this._containerGroup.__rectSize = null; + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var self = this; // Render content items. + + _super.prototype.renderInner.call(this, itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); + + var controllerGroup = this._controllerGroup; // FIXME: support be 'auto' adapt to size number text length, + // e.g., '3/12345' should not overlap with the control arrow button. + + var pageIconSize = legendModel.get('pageIconSize', true); + var pageIconSizeArr = isArray(pageIconSize) ? pageIconSize : [pageIconSize, pageIconSize]; + createPageButton('pagePrev', 0); + var pageTextStyleModel = legendModel.getModel('pageTextStyle'); + controllerGroup.add(new ZRText({ + name: 'pageText', + style: { + // Placeholder to calculate a proper layout. + text: 'xx/xx', + fill: pageTextStyleModel.getTextColor(), + font: pageTextStyleModel.getFont(), + verticalAlign: 'middle', + align: 'center' + }, + silent: true + })); + createPageButton('pageNext', 1); + + function createPageButton(name, iconIdx) { + var pageDataIndexName = name + 'DataIndex'; + var icon = createIcon(legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], { + // Buttons will be created in each render, so we do not need + // to worry about avoiding using legendModel kept in scope. + onclick: bind(self._pageGo, self, pageDataIndexName, legendModel, api) + }, { + x: -pageIconSizeArr[0] / 2, + y: -pageIconSizeArr[1] / 2, + width: pageIconSizeArr[0], + height: pageIconSizeArr[1] + }); + icon.name = name; + controllerGroup.add(icon); + } + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var xy = XY$1[orientIdx]; + var hw = WH$1[1 - orientIdx]; + var yx = XY$1[1 - orientIdx]; + selector && box( // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var processMaxSize = clone(maxSize); + selector && (processMaxSize[wh] = maxSize[wh] - selectorRect[wh] - selectorButtonGap); + + var mainRect = this._layoutContentAndController(legendModel, isFirstRender, processMaxSize, orientIdx, wh, hw, yx, xy); + + if (selector) { + if (selectorPosition === 'end') { + selectorPos[orientIdx] += mainRect[wh] + selectorButtonGap; + } else { + var offset = selectorRect[wh] + selectorButtonGap; + selectorPos[orientIdx] -= offset; + mainRect[xy] -= offset; + } + + mainRect[wh] += selectorRect[wh] + selectorButtonGap; + selectorPos[1 - orientIdx] += mainRect[yx] + mainRect[hw] / 2 - selectorRect[hw] / 2; + mainRect[hw] = Math.max(mainRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(mainRect[yx], selectorRect[yx] + selectorPos[1 - orientIdx]); + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + selectorGroup.markRedraw(); + } + + return mainRect; + }; + + ScrollableLegendView.prototype._layoutContentAndController = function (legendModel, isFirstRender, maxSize, orientIdx, wh, hw, yx, xy) { + var contentGroup = this.getContentGroup(); + var containerGroup = this._containerGroup; + var controllerGroup = this._controllerGroup; // Place items in contentGroup. + + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height); + box( // Buttons in controller are layout always horizontally. + 'horizontal', controllerGroup, legendModel.get('pageButtonItemGap', true)); + var contentRect = contentGroup.getBoundingRect(); + var controllerRect = controllerGroup.getBoundingRect(); + var showController = this._showController = contentRect[wh] > maxSize[wh]; // In case that the inner elements of contentGroup layout do not based on [0, 0] + + var contentPos = [-contentRect.x, -contentRect.y]; // Remain contentPos when scroll animation perfroming. + // If first rendering, `contentGroup.position` is [0, 0], which + // does not make sense and may cause unexepcted animation if adopted. + + if (!isFirstRender) { + contentPos[orientIdx] = contentGroup[xy]; + } // Layout container group based on 0. + + + var containerPos = [0, 0]; + var controllerPos = [-controllerRect.x, -controllerRect.y]; + var pageButtonGap = retrieve2(legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true)); // Place containerGroup and controllerGroup and contentGroup. + + if (showController) { + var pageButtonPosition = legendModel.get('pageButtonPosition', true); // controller is on the right / bottom. + + if (pageButtonPosition === 'end') { + controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh]; + } // controller is on the left / top. + else { + containerPos[orientIdx] += controllerRect[wh] + pageButtonGap; + } + } // Always align controller to content as 'middle'. + + + controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2; + contentGroup.setPosition(contentPos); + containerGroup.setPosition(containerPos); + controllerGroup.setPosition(controllerPos); // Calculate `mainRect` and set `clipPath`. + // mainRect should not be calculated by `this.group.getBoundingRect()` + // for sake of the overflow. + + var mainRect = { + x: 0, + y: 0 + }; // Consider content may be overflow (should be clipped). + + mainRect[wh] = showController ? maxSize[wh] : contentRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]); // `containerRect[yx] + containerPos[1 - orientIdx]` is 0. + + mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]); + containerGroup.__rectSize = maxSize[wh]; + + if (showController) { + var clipShape = { + x: 0, + y: 0 + }; + clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0); + clipShape[hw] = mainRect[hw]; + containerGroup.setClipPath(new Rect({ + shape: clipShape + })); // Consider content may be larger than container, container rect + // can not be obtained from `containerGroup.getBoundingRect()`. + + containerGroup.__rectSize = clipShape[wh]; + } else { + // Do not remove or ignore controller. Keep them set as placeholders. + controllerGroup.eachChild(function (child) { + child.attr({ + invisible: true, + silent: true + }); + }); + } // Content translate animation. + + + var pageInfo = this._getPageInfo(legendModel); + + pageInfo.pageIndex != null && updateProps(contentGroup, { + x: pageInfo.contentPosition[0], + y: pageInfo.contentPosition[1] + }, // When switch from "show controller" to "not show controller", view should be + // updated immediately without animation, otherwise causes weird effect. + showController ? legendModel : null); + + this._updatePageInfoView(legendModel, pageInfo); + + return mainRect; + }; + + ScrollableLegendView.prototype._pageGo = function (to, legendModel, api) { + var scrollDataIndex = this._getPageInfo(legendModel)[to]; + + scrollDataIndex != null && api.dispatchAction({ + type: 'legendScroll', + scrollDataIndex: scrollDataIndex, + legendId: legendModel.id + }); + }; + + ScrollableLegendView.prototype._updatePageInfoView = function (legendModel, pageInfo) { + var controllerGroup = this._controllerGroup; + each(['pagePrev', 'pageNext'], function (name) { + var key = name + 'DataIndex'; + var canJump = pageInfo[key] != null; + var icon = controllerGroup.childOfName(name); + + if (icon) { + icon.setStyle('fill', canJump ? legendModel.get('pageIconColor', true) : legendModel.get('pageIconInactiveColor', true)); + icon.cursor = canJump ? 'pointer' : 'default'; + } + }); + var pageText = controllerGroup.childOfName('pageText'); + var pageFormatter = legendModel.get('pageFormatter'); + var pageIndex = pageInfo.pageIndex; + var current = pageIndex != null ? pageIndex + 1 : 0; + var total = pageInfo.pageCount; + pageText && pageFormatter && pageText.setStyle('text', isString(pageFormatter) ? pageFormatter.replace('{current}', current == null ? '' : current + '').replace('{total}', total == null ? '' : total + '') : pageFormatter({ + current: current, + total: total + })); + }; + /** + * contentPosition: Array., null when data item not found. + * pageIndex: number, null when data item not found. + * pageCount: number, always be a number, can be 0. + * pagePrevDataIndex: number, null when no previous page. + * pageNextDataIndex: number, null when no next page. + * } + */ + + + ScrollableLegendView.prototype._getPageInfo = function (legendModel) { + var scrollDataIndex = legendModel.get('scrollDataIndex', true); + var contentGroup = this.getContentGroup(); + var containerRectSize = this._containerGroup.__rectSize; + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var xy = XY$1[orientIdx]; + + var targetItemIndex = this._findTargetItemIndex(scrollDataIndex); + + var children = contentGroup.children(); + var targetItem = children[targetItemIndex]; + var itemCount = children.length; + var pCount = !itemCount ? 0 : 1; + var result = { + contentPosition: [contentGroup.x, contentGroup.y], + pageCount: pCount, + pageIndex: pCount - 1, + pagePrevDataIndex: null, + pageNextDataIndex: null + }; + + if (!targetItem) { + return result; + } + + var targetItemInfo = getItemInfo(targetItem); + result.contentPosition[orientIdx] = -targetItemInfo.s; // Strategy: + // (1) Always align based on the left/top most item. + // (2) It is user-friendly that the last item shown in the + // current window is shown at the begining of next window. + // Otherwise if half of the last item is cut by the window, + // it will have no chance to display entirely. + // (3) Consider that item size probably be different, we + // have calculate pageIndex by size rather than item index, + // and we can not get page index directly by division. + // (4) The window is to narrow to contain more than + // one item, we should make sure that the page can be fliped. + + for (var i = targetItemIndex + 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i <= itemCount; ++i) { + currItemInfo = getItemInfo(children[i]); + + if ( // Half of the last item is out of the window. + !currItemInfo && winEndItemInfo.e > winStartItemInfo.s + containerRectSize || // If the current item does not intersect with the window, the new page + // can be started at the current item or the last item. + currItemInfo && !intersect(currItemInfo, winStartItemInfo.s)) { + if (winEndItemInfo.i > winStartItemInfo.i) { + winStartItemInfo = winEndItemInfo; + } else { + // e.g., when page size is smaller than item size. + winStartItemInfo = currItemInfo; + } + + if (winStartItemInfo) { + if (result.pageNextDataIndex == null) { + result.pageNextDataIndex = winStartItemInfo.i; + } + + ++result.pageCount; + } + } + + winEndItemInfo = currItemInfo; + } + + for (var i = targetItemIndex - 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i >= -1; --i) { + currItemInfo = getItemInfo(children[i]); + + if ( // If the the end item does not intersect with the window started + // from the current item, a page can be settled. + (!currItemInfo || !intersect(winEndItemInfo, currItemInfo.s)) && // e.g., when page size is smaller than item size. + winStartItemInfo.i < winEndItemInfo.i) { + winEndItemInfo = winStartItemInfo; + + if (result.pagePrevDataIndex == null) { + result.pagePrevDataIndex = winStartItemInfo.i; + } + + ++result.pageCount; + ++result.pageIndex; + } + + winStartItemInfo = currItemInfo; + } + + return result; + + function getItemInfo(el) { + if (el) { + var itemRect = el.getBoundingRect(); + var start = itemRect[xy] + el[xy]; + return { + s: start, + e: start + itemRect[wh], + i: el.__legendDataIndex + }; + } + } + + function intersect(itemInfo, winStart) { + return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize; + } + }; + + ScrollableLegendView.prototype._findTargetItemIndex = function (targetDataIndex) { + if (!this._showController) { + return 0; + } + + var index; + var contentGroup = this.getContentGroup(); + var defaultIndex; + contentGroup.eachChild(function (child, idx) { + var legendDataIdx = child.__legendDataIndex; // FIXME + // If the given targetDataIndex (from model) is illegal, + // we use defaultIndex. But the index on the legend model and + // action payload is still illegal. That case will not be + // changed until some scenario requires. + + if (defaultIndex == null && legendDataIdx != null) { + defaultIndex = idx; + } + + if (legendDataIdx === targetDataIndex) { + index = idx; + } + }); + return index != null ? index : defaultIndex; + }; + + ScrollableLegendView.type = 'legend.scroll'; + return ScrollableLegendView; + }(LegendView); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function installScrollableLegendAction(registers) { + /** + * @event legendScroll + * @type {Object} + * @property {string} type 'legendScroll' + * @property {string} scrollDataIndex + */ + registers.registerAction('legendScroll', 'legendscroll', function (payload, ecModel) { + var scrollDataIndex = payload.scrollDataIndex; + scrollDataIndex != null && ecModel.eachComponent({ + mainType: 'legend', + subType: 'scroll', + query: payload + }, function (legendModel) { + legendModel.setScrollDataIndex(scrollDataIndex); + }); + }); + } + + function install$I(registers) { + use(install$H); + registers.registerComponentModel(ScrollableLegendModel); + registers.registerComponentView(ScrollableLegendView); + installScrollableLegendAction(registers); + } + + function install$J(registers) { + use(install$H); + use(install$I); + } + + var InsideZoomModel = + /** @class */ + function (_super) { + __extends(InsideZoomModel, _super); + + function InsideZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = InsideZoomModel.type; + return _this; + } + + InsideZoomModel.type = 'dataZoom.inside'; + InsideZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { + disabled: false, + zoomLock: false, + zoomOnMouseWheel: true, + moveOnMouseMove: true, + moveOnMouseWheel: false, + preventDefaultMouseMove: true + }); + return InsideZoomModel; + }(DataZoomModel); + + var inner$m = makeInner(); + function setViewInfoToCoordSysRecord(api, dataZoomModel, getRange) { + inner$m(api).coordSysRecordMap.each(function (coordSysRecord) { + var dzInfo = coordSysRecord.dataZoomInfoMap.get(dataZoomModel.uid); + + if (dzInfo) { + dzInfo.getRange = getRange; + } + }); + } + function disposeCoordSysRecordIfNeeded(api, dataZoomModel) { + var coordSysRecordMap = inner$m(api).coordSysRecordMap; + var coordSysKeyArr = coordSysRecordMap.keys(); + + for (var i = 0; i < coordSysKeyArr.length; i++) { + var coordSysKey = coordSysKeyArr[i]; + var coordSysRecord = coordSysRecordMap.get(coordSysKey); + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; + + if (dataZoomInfoMap) { + var dzUid = dataZoomModel.uid; + var dzInfo = dataZoomInfoMap.get(dzUid); + + if (dzInfo) { + dataZoomInfoMap.removeKey(dzUid); + + if (!dataZoomInfoMap.keys().length) { + disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); + } + } + } + } + } + + function disposeCoordSysRecord(coordSysRecordMap, coordSysRecord) { + if (coordSysRecord) { + coordSysRecordMap.removeKey(coordSysRecord.model.uid); + var controller = coordSysRecord.controller; + controller && controller.dispose(); + } + } + + function createCoordSysRecord(api, coordSysModel) { + // These init props will never change after record created. + var coordSysRecord = { + model: coordSysModel, + containsPoint: curry(containsPoint, coordSysModel), + dispatchAction: curry(dispatchAction$1, api), + dataZoomInfoMap: null, + controller: null + }; // Must not do anything depends on coordSysRecord outside the event handler here, + // because coordSysRecord not completed yet. + + var controller = coordSysRecord.controller = new RoamController(api.getZr()); + each(['pan', 'zoom', 'scrollMove'], function (eventName) { + controller.on(eventName, function (event) { + var batch = []; + coordSysRecord.dataZoomInfoMap.each(function (dzInfo) { + // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove, + // moveOnMouseWheel, ...) enabled. + if (!event.isAvailableBehavior(dzInfo.model.option)) { + return; + } + + var method = (dzInfo.getRange || {})[eventName]; + var range = method && method(dzInfo.dzReferCoordSysInfo, coordSysRecord.model.mainType, coordSysRecord.controller, event); + !dzInfo.model.get('disabled', true) && range && batch.push({ + dataZoomId: dzInfo.model.id, + start: range[0], + end: range[1] + }); + }); + batch.length && coordSysRecord.dispatchAction(batch); + }); + }); + return coordSysRecord; + } + /** + * This action will be throttled. + */ + + + function dispatchAction$1(api, batch) { + api.dispatchAction({ + type: 'dataZoom', + animation: { + easing: 'cubicOut', + duration: 100 + }, + batch: batch + }); + } + + function containsPoint(coordSysModel, e, x, y) { + return coordSysModel.coordinateSystem.containPoint([x, y]); + } + /** + * Merge roamController settings when multiple dataZooms share one roamController. + */ + + + function mergeControllerParams(dataZoomInfoMap) { + var controlType; // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated + // as string, it is probably revert to reserved word by compress tool. See #7411. + + var prefix = 'type_'; + var typePriority = { + 'type_true': 2, + 'type_move': 1, + 'type_false': 0, + 'type_undefined': -1 + }; + var preventDefaultMouseMove = true; + dataZoomInfoMap.each(function (dataZoomInfo) { + var dataZoomModel = dataZoomInfo.model; + var oneType = dataZoomModel.get('disabled', true) ? false : dataZoomModel.get('zoomLock', true) ? 'move' : true; + + if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) { + controlType = oneType; + } // Prevent default move event by default. If one false, do not prevent. Otherwise + // users may be confused why it does not work when multiple insideZooms exist. + + + preventDefaultMouseMove = preventDefaultMouseMove && dataZoomModel.get('preventDefaultMouseMove', true); + }); + return { + controlType: controlType, + opt: { + // RoamController will enable all of these functionalities, + // and the final behavior is determined by its event listener + // provided by each inside zoom. + zoomOnMouseWheel: true, + moveOnMouseMove: true, + moveOnMouseWheel: true, + preventDefaultMouseMove: !!preventDefaultMouseMove + } + }; + } + + function installDataZoomRoamProcessor(registers) { + registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, function (ecModel, api) { + var apiInner = inner$m(api); + var coordSysRecordMap = apiInner.coordSysRecordMap || (apiInner.coordSysRecordMap = createHashMap()); + coordSysRecordMap.each(function (coordSysRecord) { + // `coordSysRecordMap` always exists (becuase it hold the `roam controller`, which should + // better not re-create each time), but clear `dataZoomInfoMap` each round of the workflow. + coordSysRecord.dataZoomInfoMap = null; + }); + ecModel.eachComponent({ + mainType: 'dataZoom', + subType: 'inside' + }, function (dataZoomModel) { + var dzReferCoordSysWrap = collectReferCoordSysModelInfo(dataZoomModel); + each(dzReferCoordSysWrap.infoList, function (dzCoordSysInfo) { + var coordSysUid = dzCoordSysInfo.model.uid; + var coordSysRecord = coordSysRecordMap.get(coordSysUid) || coordSysRecordMap.set(coordSysUid, createCoordSysRecord(api, dzCoordSysInfo.model)); + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap || (coordSysRecord.dataZoomInfoMap = createHashMap()); // Notice these props might be changed each time for a single dataZoomModel. + + dataZoomInfoMap.set(dataZoomModel.uid, { + dzReferCoordSysInfo: dzCoordSysInfo, + model: dataZoomModel, + getRange: null + }); + }); + }); // (1) Merge dataZoom settings for each coord sys and set to the roam controller. + // (2) Clear coord sys if not refered by any dataZoom. + + coordSysRecordMap.each(function (coordSysRecord) { + var controller = coordSysRecord.controller; + var firstDzInfo; + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; + + if (dataZoomInfoMap) { + var firstDzKey = dataZoomInfoMap.keys()[0]; + + if (firstDzKey != null) { + firstDzInfo = dataZoomInfoMap.get(firstDzKey); + } + } + + if (!firstDzInfo) { + disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); + return; + } + + var controllerParams = mergeControllerParams(dataZoomInfoMap); + controller.enable(controllerParams.controlType, controllerParams.opt); + controller.setPointerChecker(coordSysRecord.containsPoint); + createOrUpdate(coordSysRecord, 'dispatchAction', firstDzInfo.model.get('throttle', true), 'fixRate'); + }); + }); + } + + var InsideZoomView = + /** @class */ + function (_super) { + __extends(InsideZoomView, _super); + + function InsideZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataZoom.inside'; + return _this; + } + + InsideZoomView.prototype.render = function (dataZoomModel, ecModel, api) { + _super.prototype.render.apply(this, arguments); + + if (dataZoomModel.noTarget()) { + this._clear(); + + return; + } // Hence the `throttle` util ensures to preserve command order, + // here simply updating range all the time will not cause missing + // any of the the roam change. + + + this.range = dataZoomModel.getPercentRange(); // Reset controllers. + + setViewInfoToCoordSysRecord(api, dataZoomModel, { + pan: bind(getRangeHandlers.pan, this), + zoom: bind(getRangeHandlers.zoom, this), + scrollMove: bind(getRangeHandlers.scrollMove, this) + }); + }; + + InsideZoomView.prototype.dispose = function () { + this._clear(); + + _super.prototype.dispose.apply(this, arguments); + }; + + InsideZoomView.prototype._clear = function () { + disposeCoordSysRecordIfNeeded(this.api, this.dataZoomModel); + this.range = null; + }; + + InsideZoomView.type = 'dataZoom.inside'; + return InsideZoomView; + }(DataZoomView); + + var getRangeHandlers = { + zoom: function (coordSysInfo, coordSysMainType, controller, e) { + var lastRange = this.range; + var range = lastRange.slice(); // Calculate transform by the first axis. + + var axisModel = coordSysInfo.axisModels[0]; + + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo[coordSysMainType](null, [e.originX, e.originY], axisModel, controller, coordSysInfo); + var percentPoint = (directionInfo.signal > 0 ? directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel : directionInfo.pixel - directionInfo.pixelStart) / directionInfo.pixelLength * (range[1] - range[0]) + range[0]; + var scale = Math.max(1 / e.scale, 0); + range[0] = (range[0] - percentPoint) * scale + percentPoint; + range[1] = (range[1] - percentPoint) * scale + percentPoint; // Restrict range. + + var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan); + this.range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }, + pan: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { + var directionInfo = getDirectionInfo[coordSysMainType]([e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordSysInfo); + return directionInfo.signal * (range[1] - range[0]) * directionInfo.pixel / directionInfo.pixelLength; + }), + scrollMove: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { + var directionInfo = getDirectionInfo[coordSysMainType]([0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordSysInfo); + return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta; + }) + }; + + function makeMover(getPercentDelta) { + return function (coordSysInfo, coordSysMainType, controller, e) { + var lastRange = this.range; + var range = lastRange.slice(); // Calculate transform by the first axis. + + var axisModel = coordSysInfo.axisModels[0]; + + if (!axisModel) { + return; + } + + var percentDelta = getPercentDelta(range, axisModel, coordSysInfo, coordSysMainType, controller, e); + sliderMove(percentDelta, range, [0, 100], 'all'); + this.range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }; + } + + var getDirectionInfo = { + grid: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var ret = {}; + var rect = coordSysInfo.model.coordinateSystem.getRect(); + oldPoint = oldPoint || [0, 0]; + + if (axis.dim === 'x') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } else { + // axis.dim === 'y' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + polar: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var ret = {}; + var polar = coordSysInfo.model.coordinateSystem; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var angleExtent = polar.getAngleAxis().getExtent(); + oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0]; + newPoint = polar.pointToCoord(newPoint); + + if (axisModel.mainType === 'radiusAxis') { + ret.pixel = newPoint[0] - oldPoint[0]; // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]); + // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]); + + ret.pixelLength = radiusExtent[1] - radiusExtent[0]; + ret.pixelStart = radiusExtent[0]; + ret.signal = axis.inverse ? 1 : -1; + } else { + // 'angleAxis' + ret.pixel = newPoint[1] - oldPoint[1]; // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]); + // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]); + + ret.pixelLength = angleExtent[1] - angleExtent[0]; + ret.pixelStart = angleExtent[0]; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + singleAxis: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var rect = coordSysInfo.model.coordinateSystem.getRect(); + var ret = {}; + oldPoint = oldPoint || [0, 0]; + + if (axis.orient === 'horizontal') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } else { + // 'vertical' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + } + }; + + function install$K(registers) { + installCommon(registers); + registers.registerComponentModel(InsideZoomModel); + registers.registerComponentView(InsideZoomView); + installDataZoomRoamProcessor(registers); + } + + var SliderZoomModel = + /** @class */ + function (_super) { + __extends(SliderZoomModel, _super); + + function SliderZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderZoomModel.type; + return _this; + } + + SliderZoomModel.type = 'dataZoom.slider'; + SliderZoomModel.layoutMode = 'box'; + SliderZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { + show: true, + // deault value can only be drived in view stage. + right: 'ph', + top: 'ph', + width: 'ph', + height: 'ph', + left: null, + bottom: null, + borderColor: '#d2dbee', + borderRadius: 3, + backgroundColor: 'rgba(47,69,84,0)', + // dataBackgroundColor: '#ddd', + dataBackground: { + lineStyle: { + color: '#d2dbee', + width: 0.5 + }, + areaStyle: { + color: '#d2dbee', + opacity: 0.2 + } + }, + selectedDataBackground: { + lineStyle: { + color: '#8fb0f7', + width: 0.5 + }, + areaStyle: { + color: '#8fb0f7', + opacity: 0.2 + } + }, + // Color of selected window. + fillerColor: 'rgba(135,175,274,0.2)', + handleIcon: 'path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z', + // Percent of the slider height + handleSize: '100%', + handleStyle: { + color: '#fff', + borderColor: '#ACB8D1' + }, + moveHandleSize: 7, + moveHandleIcon: 'path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z', + moveHandleStyle: { + color: '#D2DBEE', + opacity: 0.7 + }, + showDetail: true, + showDataShadow: 'auto', + realtime: true, + zoomLock: false, + textStyle: { + color: '#6E7079' + }, + brushSelect: true, + brushStyle: { + color: 'rgba(135,175,274,0.15)' + }, + emphasis: { + handleStyle: { + borderColor: '#8FB0F7' + }, + moveHandleStyle: { + color: '#8FB0F7' + } + } + }); + return SliderZoomModel; + }(DataZoomModel); + + var Rect$2 = Rect; // Constants + + var DEFAULT_LOCATION_EDGE_GAP = 7; + var DEFAULT_FRAME_BORDER_WIDTH = 1; + var DEFAULT_FILLER_SIZE = 30; + var DEFAULT_MOVE_HANDLE_SIZE = 7; + var HORIZONTAL = 'horizontal'; + var VERTICAL = 'vertical'; + var LABEL_GAP = 5; + var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter']; + var REALTIME_ANIMATION_CONFIG = { + easing: 'cubicOut', + duration: 100 + }; + + var SliderZoomView = + /** @class */ + function (_super) { + __extends(SliderZoomView, _super); + + function SliderZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderZoomView.type; + _this._displayables = {}; + return _this; + } + + SliderZoomView.prototype.init = function (ecModel, api) { + this.api = api; // A unique handler for each dataZoom component + + this._onBrush = bind(this._onBrush, this); + this._onBrushEnd = bind(this._onBrushEnd, this); + }; + + SliderZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) { + _super.prototype.render.apply(this, arguments); + + createOrUpdate(this, '_dispatchZoomAction', dataZoomModel.get('throttle'), 'fixRate'); + this._orient = dataZoomModel.getOrient(); + + if (dataZoomModel.get('show') === false) { + this.group.removeAll(); + return; + } + + if (dataZoomModel.noTarget()) { + this._clear(); + + 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(); + }; + + SliderZoomView.prototype.dispose = function () { + this._clear(); + + _super.prototype.dispose.apply(this, arguments); + }; + + SliderZoomView.prototype._clear = function () { + clear(this, '_dispatchZoomAction'); + var zr = this.api.getZr(); + zr.off('mousemove', this._onBrush); + zr.off('mouseup', this._onBrushEnd); + }; + + SliderZoomView.prototype._buildView = function () { + var thisGroup = this.group; + thisGroup.removeAll(); + this._brushing = false; + this._displayables.brushRect = null; + + this._resetLocation(); + + this._resetInterval(); + + var barGroup = this._displayables.sliderGroup = new Group(); + + this._renderBackground(); + + this._renderHandle(); + + this._renderDataShadow(); + + thisGroup.add(barGroup); + + this._positionGroup(); + }; + + SliderZoomView.prototype._resetLocation = function () { + var dataZoomModel = this.dataZoomModel; + var api = this.api; + var showMoveHandle = dataZoomModel.get('brushSelect'); + var moveHandleSize = showMoveHandle ? DEFAULT_MOVE_HANDLE_SIZE : 0; // 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 - moveHandleSize, + width: coordRect.width, + height: DEFAULT_FILLER_SIZE + } : { + 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 = getLayoutParams(dataZoomModel.option); // Replace the placeholder value. + + each(['right', 'top', 'width', 'height'], function (name) { + if (layoutParams[name] === 'ph') { + layoutParams[name] = positionInfo[name]; + } + }); + var layoutRect = getLayoutRect(layoutParams, ecSize); + this._location = { + x: layoutRect.x, + y: layoutRect.y + }; + this._size = [layoutRect.width, layoutRect.height]; + this._orient === VERTICAL && this._size.reverse(); + }; + + SliderZoomView.prototype._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 sliderGroup = this._displayables.sliderGroup; + var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; // Transform barGroup. + + sliderGroup.attr(orient === HORIZONTAL && !inverse ? { + scaleY: otherAxisInverse ? 1 : -1, + scaleX: 1 + } : orient === HORIZONTAL && inverse ? { + scaleY: otherAxisInverse ? 1 : -1, + scaleX: -1 + } : orient === VERTICAL && !inverse ? { + scaleY: otherAxisInverse ? -1 : 1, + scaleX: 1, + rotation: Math.PI / 2 + } // Dont use Math.PI, considering shadow direction. + : { + scaleY: otherAxisInverse ? -1 : 1, + scaleX: -1, + rotation: Math.PI / 2 + }); // Position barGroup + + var rect = thisGroup.getBoundingRect([sliderGroup]); + thisGroup.x = location.x - rect.x; + thisGroup.y = location.y - rect.y; + thisGroup.markRedraw(); + }; + + SliderZoomView.prototype._getViewExtent = function () { + return [0, this._size[0]]; + }; + + SliderZoomView.prototype._renderBackground = function () { + var dataZoomModel = this.dataZoomModel; + var size = this._size; + var barGroup = this._displayables.sliderGroup; + var brushSelect = dataZoomModel.get('brushSelect'); + barGroup.add(new Rect$2({ + silent: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + fill: dataZoomModel.get('backgroundColor') + }, + z2: -40 + })); // Click panel, over shadow, below handles. + + var clickPanel = new Rect$2({ + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + fill: 'transparent' + }, + z2: 0, + onclick: bind(this._onClickPanel, this) + }); + var zr = this.api.getZr(); + + if (brushSelect) { + clickPanel.on('mousedown', this._onBrushStart, this); + clickPanel.cursor = 'crosshair'; + zr.on('mousemove', this._onBrush); + zr.on('mouseup', this._onBrushEnd); + } else { + zr.off('mousemove', this._onBrush); + zr.off('mouseup', this._onBrushEnd); + } + + barGroup.add(clickPanel); + }; + + SliderZoomView.prototype._renderDataShadow = function () { + var info = this._dataShadowInfo = this._prepareDataShadowInfo(); + + this._displayables.dataShadowSegs = []; + + 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; + + if (otherDim == null) { + return; + } + + 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 areaPoints = [[size[0], 0], [0, 0]]; + var linePoints = []; + var step = thisShadowExtent[1] / (data.count() - 1); + var thisCoord = 0; // Optimize for large data shadow + + var stride = Math.round(data.count() / size[0]); + var lastIsEmpty; + data.each([otherDim], function (value, index) { + if (stride > 0 && index % stride) { + thisCoord += step; + return; + } // FIXME + // Should consider axis.min/axis.max when drawing dataShadow. + // FIXME + // 应该使用统一的空判断?还是在list里进行空判断? + + + var isEmpty = value == null || isNaN(value) || value === ''; // See #4235. + + var otherCoord = isEmpty ? 0 : linearMap(value, otherDataExtent, otherShadowExtent, true); // Attempt to draw data shadow precisely when there are empty value. + + if (isEmpty && !lastIsEmpty && index) { + areaPoints.push([areaPoints[areaPoints.length - 1][0], 0]); + linePoints.push([linePoints[linePoints.length - 1][0], 0]); + } else if (!isEmpty && lastIsEmpty) { + areaPoints.push([thisCoord, 0]); + linePoints.push([thisCoord, 0]); + } + + areaPoints.push([thisCoord, otherCoord]); + linePoints.push([thisCoord, otherCoord]); + thisCoord += step; + lastIsEmpty = isEmpty; + }); + var dataZoomModel = this.dataZoomModel; + + function createDataShadowGroup(isSelectedArea) { + var model = dataZoomModel.getModel(isSelectedArea ? 'selectedDataBackground' : 'dataBackground'); + var group = new Group(); + var polygon = new Polygon({ + shape: { + points: areaPoints + }, + segmentIgnoreThreshold: 1, + style: model.getModel('areaStyle').getAreaStyle(), + silent: true, + z2: -20 + }); + var polyline = new Polyline({ + shape: { + points: linePoints + }, + segmentIgnoreThreshold: 1, + style: model.getModel('lineStyle').getLineStyle(), + silent: true, + z2: -19 + }); + group.add(polygon); + group.add(polyline); + return group; + } // let dataBackgroundModel = dataZoomModel.getModel('dataBackground'); + + + for (var i = 0; i < 3; i++) { + var group = createDataShadowGroup(i === 1); + + this._displayables.sliderGroup.add(group); + + this._displayables.dataShadowSegs.push(group); + } + }; + + SliderZoomView.prototype._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 (axisDim, axisIndex) { + var seriesModels = dataZoomModel.getAxisProxy(axisDim, axisIndex).getTargetSeriesModels(); + each(seriesModels, function (seriesModel) { + if (result) { + return; + } + + if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) { + return; + } + + var thisAxis = ecModel.getComponent(getAxisMainType(axisDim), axisIndex).axis; + var otherDim = getOtherDim(axisDim); + var otherAxisInverse; + var coordSys = seriesModel.coordinateSystem; + + if (otherDim != null && coordSys.getOtherAxis) { + otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse; + } + + otherDim = seriesModel.getData().mapDimension(otherDim); + result = { + thisAxis: thisAxis, + series: seriesModel, + thisDim: axisDim, + otherDim: otherDim, + otherAxisInverse: otherAxisInverse + }; + }, this); + }, this); + return result; + }; + + SliderZoomView.prototype._renderHandle = function () { + var thisGroup = this.group; + var displayables = this._displayables; + var handles = displayables.handles = [null, null]; + var handleLabels = displayables.handleLabels = [null, null]; + var sliderGroup = this._displayables.sliderGroup; + var size = this._size; + var dataZoomModel = this.dataZoomModel; + var api = this.api; + var borderRadius = dataZoomModel.get('borderRadius') || 0; + var brushSelect = dataZoomModel.get('brushSelect'); + var filler = displayables.filler = new Rect$2({ + silent: brushSelect, + style: { + fill: dataZoomModel.get('fillerColor') + }, + textConfig: { + position: 'inside' + } + }); + sliderGroup.add(filler); // Frame border. + + sliderGroup.add(new Rect$2({ + silent: true, + subPixelOptimize: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1], + r: borderRadius + }, + style: { + stroke: dataZoomModel.get('dataBackgroundColor') // deprecated option + || dataZoomModel.get('borderColor'), + lineWidth: DEFAULT_FRAME_BORDER_WIDTH, + fill: 'rgba(0,0,0,0)' + } + })); // Left and right handle to resize + + each([0, 1], function (handleIndex) { + var iconStr = dataZoomModel.get('handleIcon'); + + if (!symbolBuildProxies[iconStr] && iconStr.indexOf('path://') < 0 && iconStr.indexOf('image://') < 0) { + // Compatitable with the old icon parsers. Which can use a path string without path:// + iconStr = 'path://' + iconStr; + + if ("development" !== 'production') { + deprecateLog('handleIcon now needs \'path://\' prefix when using a path string'); + } + } + + var path = createSymbol(iconStr, -1, 0, 2, 2, null, true); + path.attr({ + cursor: getCursor(this._orient), + 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), + z2: 5 + }); + var bRect = path.getBoundingRect(); + var handleSize = dataZoomModel.get('handleSize'); + this._handleHeight = parsePercent$1(handleSize, this._size[1]); + this._handleWidth = bRect.width / bRect.height * this._handleHeight; + path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle()); + path.style.strokeNoScale = true; + path.rectHover = true; + path.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'handleStyle']).getItemStyle(); + enableHoverEmphasis(path); + var handleColor = dataZoomModel.get('handleColor'); // deprecated option + // Compatitable with previous version + + if (handleColor != null) { + path.style.fill = handleColor; + } + + sliderGroup.add(handles[handleIndex] = path); + var textStyleModel = dataZoomModel.getModel('textStyle'); + thisGroup.add(handleLabels[handleIndex] = new ZRText({ + silent: true, + invisible: true, + style: { + x: 0, + y: 0, + text: '', + verticalAlign: 'middle', + align: 'center', + fill: textStyleModel.getTextColor(), + font: textStyleModel.getFont() + }, + z2: 10 + })); + }, this); // Handle to move. Only visible when brushSelect is set true. + + var actualMoveZone = filler; + + if (brushSelect) { + var moveHandleHeight = parsePercent$1(dataZoomModel.get('moveHandleSize'), size[1]); + var moveHandle_1 = displayables.moveHandle = new Rect({ + style: dataZoomModel.getModel('moveHandleStyle').getItemStyle(), + silent: true, + shape: { + r: [0, 0, 2, 2], + y: size[1] - 0.5, + height: moveHandleHeight + } + }); + var iconSize = moveHandleHeight * 0.8; + var moveHandleIcon = displayables.moveHandleIcon = createSymbol(dataZoomModel.get('moveHandleIcon'), -iconSize / 2, -iconSize / 2, iconSize, iconSize, '#fff', true); + moveHandleIcon.silent = true; + moveHandleIcon.y = size[1] + moveHandleHeight / 2 - 0.5; + moveHandle_1.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'moveHandleStyle']).getItemStyle(); + var moveZoneExpandSize = Math.min(size[1] / 2, Math.max(moveHandleHeight, 10)); + actualMoveZone = displayables.moveZone = new Rect({ + invisible: true, + shape: { + y: size[1] - moveZoneExpandSize, + height: moveHandleHeight + moveZoneExpandSize + } + }); + actualMoveZone.on('mouseover', function () { + api.enterEmphasis(moveHandle_1); + }).on('mouseout', function () { + api.leaveEmphasis(moveHandle_1); + }); + sliderGroup.add(moveHandle_1); + sliderGroup.add(moveHandleIcon); + sliderGroup.add(actualMoveZone); + } + + actualMoveZone.attr({ + draggable: true, + cursor: getCursor(this._orient), + drift: bind(this._onDragMove, this, 'all'), + ondragstart: bind(this._showDataInfo, this, true), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false) + }); + }; + + SliderZoomView.prototype._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)]; + }; + + SliderZoomView.prototype._updateInterval = function (handleIndex, delta) { + var dataZoomModel = this.dataZoomModel; + var handleEnds = this._handleEnds; + + var viewExtend = this._getViewExtent(); + + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + var percentExtent = [0, 100]; + sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null); + var lastRange = this._range; + var range = this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]); + return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1]; + }; + + SliderZoomView.prototype._updateView = function (nonRealtime) { + var displaybles = this._displayables; + var handleEnds = this._handleEnds; + var handleInterval = asc(handleEnds.slice()); + var size = this._size; + each([0, 1], function (handleIndex) { + // Handles + var handle = displaybles.handles[handleIndex]; + var handleHeight = this._handleHeight; + handle.attr({ + scaleX: handleHeight / 2, + scaleY: handleHeight / 2, + // This is a trick, by adding an extra tiny offset to let the default handle's end point align to the drag window. + // NOTE: It may affect some custom shapes a bit. But we prefer to have better result by default. + x: handleEnds[handleIndex] + (handleIndex ? -1 : 1), + y: size[1] / 2 - handleHeight / 2 + }); + }, this); // Filler + + displaybles.filler.setShape({ + x: handleInterval[0], + y: 0, + width: handleInterval[1] - handleInterval[0], + height: size[1] + }); + var viewExtent = { + x: handleInterval[0], + width: handleInterval[1] - handleInterval[0] + }; // Move handle + + if (displaybles.moveHandle) { + displaybles.moveHandle.setShape(viewExtent); + displaybles.moveZone.setShape(viewExtent); // Force update path on the invisible object + + displaybles.moveZone.getBoundingRect(); + displaybles.moveHandleIcon && displaybles.moveHandleIcon.attr('x', viewExtent.x + viewExtent.width / 2); + } // update clip path of shadow. + + + var dataShadowSegs = displaybles.dataShadowSegs; + var segIntervals = [0, handleInterval[0], handleInterval[1], size[0]]; + + for (var i = 0; i < dataShadowSegs.length; i++) { + var segGroup = dataShadowSegs[i]; + var clipPath = segGroup.getClipPath(); + + if (!clipPath) { + clipPath = new Rect(); + segGroup.setClipPath(clipPath); + } + + clipPath.setShape({ + x: segIntervals[i], + y: 0, + width: segIntervals[i + 1] - segIntervals[i], + height: size[1] + }); + } + + this._updateDataInfo(nonRealtime); + }; + + SliderZoomView.prototype._updateDataInfo = function (nonRealtime) { + 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 axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + + if (axisProxy) { + var axis = axisProxy.getAxisModel().axis; + var range = this._range; + var dataInterval = nonRealtime // See #4434, data and axis are not processed and reset yet in non-realtime mode. + ? axisProxy.calculateDataWindow({ + start: range[0], + end: range[1] + }).valueWindow : axisProxy.getDataValueWindow(); + 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. + // Ignore handlers transform + var barTransform = getTransform(displaybles.handles[handleIndex].parent, this.group); + var direction = transformDirection(handleIndex === 0 ? 'right' : 'left', barTransform); + var offset = this._handleWidth / 2 + LABEL_GAP; + var textPoint = applyTransform$1([orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), this._size[1] / 2], barTransform); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + verticalAlign: orient === HORIZONTAL ? 'middle' : direction, + align: orient === HORIZONTAL ? direction : 'center', + text: labelTexts[handleIndex] + }); + } + }; + + SliderZoomView.prototype._formatLabel = function (value, axis) { + var dataZoomModel = this.dataZoomModel; + var labelFormatter = dataZoomModel.get('labelFormatter'); + var labelPrecision = dataZoomModel.get('labelPrecision'); + + if (labelPrecision == null || labelPrecision === 'auto') { + labelPrecision = axis.getPixelPrecision(); + } + + var valueStr = value == null || isNaN(value) ? '' // FIXME Glue code + : axis.type === 'category' || axis.type === 'time' ? axis.scale.getLabel({ + value: Math.round(value) + }) // param of toFixed should less then 20. + : value.toFixed(Math.min(labelPrecision, 20)); + return isFunction(labelFormatter) ? labelFormatter(value, valueStr) : isString(labelFormatter) ? labelFormatter.replace('{value}', valueStr) : valueStr; + }; + /** + * @param showOrHide true: show, false: hide + */ + + + SliderZoomView.prototype._showDataInfo = function (showOrHide) { + // Always show when drgging. + showOrHide = this._dragging || showOrHide; + var displayables = this._displayables; + var handleLabels = displayables.handleLabels; + handleLabels[0].attr('invisible', !showOrHide); + handleLabels[1].attr('invisible', !showOrHide); // Highlight move handle + + displayables.moveHandle && this.api[showOrHide ? 'enterEmphasis' : 'leaveEmphasis'](displayables.moveHandle, 1); + }; + + SliderZoomView.prototype._onDragMove = function (handleIndex, dx, dy, event) { + this._dragging = true; // For mobile device, prevent screen slider on the button. + + stop(event.event); // Transform dx, dy to bar coordination. + + var barTransform = this._displayables.sliderGroup.getLocalTransform(); + + var vertex = applyTransform$1([dx, dy], barTransform, true); + + var changed = this._updateInterval(handleIndex, vertex[0]); + + var realtime = this.dataZoomModel.get('realtime'); + + this._updateView(!realtime); // Avoid dispatch dataZoom repeatly but range not changed, + // which cause bad visual effect when progressive enabled. + + + changed && realtime && this._dispatchZoomAction(true); + }; + + SliderZoomView.prototype._onDragEnd = function () { + this._dragging = false; + + this._showDataInfo(false); // While in realtime mode and stream mode, dispatch action when + // drag end will cause the whole view rerender, which is unnecessary. + + + var realtime = this.dataZoomModel.get('realtime'); + !realtime && this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onClickPanel = function (e) { + var size = this._size; + + var localPoint = this._displayables.sliderGroup.transformCoordToLocal(e.offsetX, e.offsetY); + + if (localPoint[0] < 0 || localPoint[0] > size[0] || localPoint[1] < 0 || localPoint[1] > size[1]) { + return; + } + + var handleEnds = this._handleEnds; + var center = (handleEnds[0] + handleEnds[1]) / 2; + + var changed = this._updateInterval('all', localPoint[0] - center); + + this._updateView(); + + changed && this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onBrushStart = function (e) { + var x = e.offsetX; + var y = e.offsetY; + this._brushStart = new Point(x, y); + this._brushing = true; + this._brushStartTime = +new Date(); // this._updateBrushRect(x, y); + }; + + SliderZoomView.prototype._onBrushEnd = function (e) { + if (!this._brushing) { + return; + } + + var brushRect = this._displayables.brushRect; + this._brushing = false; + + if (!brushRect) { + return; + } + + brushRect.attr('ignore', true); + var brushShape = brushRect.shape; + var brushEndTime = +new Date(); // console.log(brushEndTime - this._brushStartTime); + + if (brushEndTime - this._brushStartTime < 200 && Math.abs(brushShape.width) < 5) { + // Will treat it as a click + return; + } + + var viewExtend = this._getViewExtent(); + + var percentExtent = [0, 100]; + this._range = asc([linearMap(brushShape.x, viewExtend, percentExtent, true), linearMap(brushShape.x + brushShape.width, viewExtend, percentExtent, true)]); + this._handleEnds = [brushShape.x, brushShape.x + brushShape.width]; + + this._updateView(); + + this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onBrush = function (e) { + if (this._brushing) { + // For mobile device, prevent screen slider on the button. + stop(e.event); + + this._updateBrushRect(e.offsetX, e.offsetY); + } + }; + + SliderZoomView.prototype._updateBrushRect = function (mouseX, mouseY) { + var displayables = this._displayables; + var dataZoomModel = this.dataZoomModel; + var brushRect = displayables.brushRect; + + if (!brushRect) { + brushRect = displayables.brushRect = new Rect$2({ + silent: true, + style: dataZoomModel.getModel('brushStyle').getItemStyle() + }); + displayables.sliderGroup.add(brushRect); + } + + brushRect.attr('ignore', false); + var brushStart = this._brushStart; + var sliderGroup = this._displayables.sliderGroup; + var endPoint = sliderGroup.transformCoordToLocal(mouseX, mouseY); + var startPoint = sliderGroup.transformCoordToLocal(brushStart.x, brushStart.y); + var size = this._size; + endPoint[0] = Math.max(Math.min(size[0], endPoint[0]), 0); + brushRect.setShape({ + x: startPoint[0], + y: 0, + width: endPoint[0] - startPoint[0], + height: size[1] + }); + }; + /** + * This action will be throttled. + */ + + + SliderZoomView.prototype._dispatchZoomAction = function (realtime) { + var range = this._range; + this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + dataZoomId: this.dataZoomModel.id, + animation: realtime ? REALTIME_ANIMATION_CONFIG : null, + start: range[0], + end: range[1] + }); + }; + + SliderZoomView.prototype._findCoordRect = function () { + // Find the grid coresponding to the first axis referred by dataZoom. + var rect; + var coordSysInfoList = collectReferCoordSysModelInfo(this.dataZoomModel).infoList; + + if (!rect && coordSysInfoList.length) { + var coordSys = coordSysInfoList[0].model.coordinateSystem; + rect = coordSys.getRect && coordSys.getRect(); + } + + if (!rect) { + 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; + }; + + SliderZoomView.type = 'dataZoom.slider'; + return SliderZoomView; + }(DataZoomView); + + function getOtherDim(thisDim) { + // FIXME + // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好 + var map = { + x: 'y', + y: 'x', + radius: 'angle', + angle: 'radius' + }; + return map[thisDim]; + } + + function getCursor(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; + } + + function install$L(registers) { + registers.registerComponentModel(SliderZoomModel); + registers.registerComponentView(SliderZoomView); + installCommon(registers); + } + + function install$M(registers) { + use(install$K); + use(install$L); // Do not install './dataZoomSelect', + // since it only work for toolbox dataZoom. + } + + var visualDefault = { + /** + * @public + */ + get: function (visualType, key, isCategory) { + var value = clone((defaultOption$1[visualType] || {})[key]); + return isCategory ? isArray(value) ? value[value.length - 1] : value : value; + } + }; + var defaultOption$1 = { + 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] + }, + opacity: { + active: [0.3, 1], + inactive: [0, 0] + }, + symbol: { + active: ['circle', 'roundRect', 'diamond'], + inactive: ['none'] + }, + symbolSize: { + active: [10, 50], + inactive: [0, 0] + } + }; + + var mapVisual$1 = VisualMapping.mapVisual; + var eachVisual = VisualMapping.eachVisual; + var isArray$1 = isArray; + var each$f = each; + var asc$2 = asc; + var linearMap$1 = linearMap; + + var VisualMapModel = + /** @class */ + function (_super) { + __extends(VisualMapModel, _super); + + function VisualMapModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = VisualMapModel.type; + _this.stateList = ['inRange', 'outOfRange']; + _this.replacableOptionKeys = ['inRange', 'outOfRange', 'target', 'controller', 'color']; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + /** + * [lowerBound, upperBound] + */ + + _this.dataBound = [-Infinity, Infinity]; + _this.targetVisuals = {}; + _this.controllerVisuals = {}; + return _this; + } + + VisualMapModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + /** + * @protected + */ + + + VisualMapModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; // FIXME + // necessary? + // Disable realtime view update if canvas is not supported. + + if (!env.canvasSupported) { + thisOption.realtime = false; + } + + !isInit && replaceVisualOption(thisOption, newOption, this.replacableOptionKeys); + this.textStyleModel = this.getModel('textStyle'); + this.resetItemSize(); + this.completeVisualOption(); + }; + /** + * @protected + */ + + + VisualMapModel.prototype.resetVisual = function (supplementVisualOption) { + var stateList = this.stateList; + supplementVisualOption = bind(supplementVisualOption, this); + this.controllerVisuals = createVisualMappings(this.option.controller, stateList, supplementVisualOption); + this.targetVisuals = createVisualMappings(this.option.target, stateList, supplementVisualOption); + }; + /** + * @protected + * @return {Array.} An array of series indices. + */ + + + VisualMapModel.prototype.getTargetSeriesIndices = function () { + var optionSeriesIndex = this.option.seriesIndex; + var seriesIndices = []; + + if (optionSeriesIndex == null || optionSeriesIndex === 'all') { + this.ecModel.eachSeries(function (seriesModel, index) { + seriesIndices.push(index); + }); + } else { + seriesIndices = normalizeToArray(optionSeriesIndex); + } + + return seriesIndices; + }; + /** + * @public + */ + + + VisualMapModel.prototype.eachTargetSeries = function (callback, context) { + each(this.getTargetSeriesIndices(), function (seriesIndex) { + var seriesModel = this.ecModel.getSeriesByIndex(seriesIndex); + + if (seriesModel) { + callback.call(context, seriesModel); + } + }, this); + }; + /** + * @pubilc + */ + + + VisualMapModel.prototype.isTargetSeries = function (seriesModel) { + var is = false; + this.eachTargetSeries(function (model) { + model === seriesModel && (is = true); + }); + return is; + }; + /** + * @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 value Real value, or this.dataBound[0 or 1]. + * @param isCategory Only available when value is number. + * @param edgeSymbols Open-close symbol when value is interval. + * @protected + */ + + + VisualMapModel.prototype.formatValueText = function (value, isCategory, edgeSymbols) { + var option = this.option; + var precision = option.precision; + var dataBound = this.dataBound; + var formatter = option.formatter; + var isMinMax; + edgeSymbols = edgeSymbols || ['<', '>']; + + if (isArray(value)) { + value = value.slice(); + isMinMax = true; + } + + var textValue = isCategory ? value // Value is string when isCategory + : isMinMax ? [toFixed(value[0]), toFixed(value[1])] : toFixed(value); + + if (isString(formatter)) { + return formatter.replace('{value}', isMinMax ? textValue[0] : textValue).replace('{value2}', isMinMax ? textValue[1] : textValue); + } else if (isFunction(formatter)) { + return isMinMax ? formatter(value[0], value[1]) : formatter(value); + } + + if (isMinMax) { + if (value[0] === dataBound[0]) { + return edgeSymbols[0] + ' ' + textValue[1]; + } else if (value[1] === dataBound[1]) { + return edgeSymbols[1] + ' ' + 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(Math.min(precision, 20)); + } + }; + /** + * @protected + */ + + + VisualMapModel.prototype.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$2([thisOption.min, thisOption.max]); + this._dataExtent = extent; + }; + /** + * Return Concrete dimention. If return null/undefined, no dimension used. + */ + + + VisualMapModel.prototype.getDataDimension = function (list) { + var optDim = this.option.dimension; + var listDimensions = list.dimensions; + + if (optDim == null && !listDimensions.length) { + return; + } + + if (optDim != null) { + return list.getDimension(optDim); + } + + var dimNames = list.dimensions; + + for (var i = dimNames.length - 1; i >= 0; i--) { + var dimName = dimNames[i]; + var dimInfo = list.getDimensionInfo(dimName); + + if (!dimInfo.isCalculationCoord) { + return dimName; + } + } + }; + + VisualMapModel.prototype.getExtent = function () { + return this._dataExtent.slice(); + }; + + VisualMapModel.prototype.completeVisualOption = function () { + var ecModel = this.ecModel; + var thisOption = this.option; + var base = { + inRange: thisOption.inRange, + outOfRange: thisOption.outOfRange + }; + var target = thisOption.target || (thisOption.target = {}); + var controller = thisOption.controller || (thisOption.controller = {}); + merge(target, base); // Do not override + + 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$1(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() + }; + } // Compatible with previous logic, always give a defautl color, otherwise + // simple config with no inRange and outOfRange will not work. + // Originally we use visualMap.color as the default color, but setOption at + // the second time the default color will be erased. So we change to use + // constant DEFAULT_COLOR. + // If user do not want the default color, set inRange: {color: null}. + + + base.inRange = base.inRange || { + color: ecModel.get('gradientColor') + }; + } + + function completeInactive(base, stateExist, stateAbsent) { + var optExist = base[stateExist]; + var optAbsent = base[stateAbsent]; + + if (optExist && !optAbsent) { + optAbsent = base[stateAbsent] = {}; + each$f(optExist, function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var defa = visualDefault.get(visualType, 'inactive', isCategory); + + if (defa != null) { + optAbsent[visualType] = defa; // Compatibable with ec2: + // Only inactive color to rgba(0,0,0,0) can not + // make label transparent, so use opacity also. + + if (visualType === 'color' && !optAbsent.hasOwnProperty('opacity') && !optAbsent.hasOwnProperty('colorAlpha')) { + optAbsent.opacity = [0, 0]; + } + } + }); + } + } + + 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$f(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 == null) { + visuals.symbol = symbolExists && clone(symbolExists) || (isCategory ? 'roundRect' : ['roundRect']); + } + + if (visuals.symbolSize == null) { + visuals.symbolSize = symbolSizeExists && clone(symbolSizeExists) || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]); + } // Filter square and none. + + + visuals.symbol = mapVisual$1(visuals.symbol, function (symbol) { + return symbol === 'none' || symbol === 'square' ? 'roundRect' : symbol; + }); // Normalize symbolSize + + var symbolSize = visuals.symbolSize; + + if (symbolSize != null) { + var max_1 = -Infinity; // symbolSize can be object when categories defined. + + eachVisual(symbolSize, function (value) { + value > max_1 && (max_1 = value); + }); + visuals.symbolSize = mapVisual$1(symbolSize, function (value) { + return linearMap$1(value, [0, max_1], [0, itemSize[0]], true); + }); + } + }, this); + } + }; + + VisualMapModel.prototype.resetItemSize = function () { + this.itemSize = [parseFloat(this.get('itemWidth')), parseFloat(this.get('itemHeight'))]; + }; + + VisualMapModel.prototype.isCategory = function () { + return !!this.option.categories; + }; + /** + * @public + * @abstract + */ + + + VisualMapModel.prototype.setSelected = function (selected) {}; + + VisualMapModel.prototype.getSelected = function () { + return null; + }; + /** + * @public + * @abstract + */ + + + VisualMapModel.prototype.getValueState = function (value) { + return null; + }; + /** + * FIXME + * Do not publish to thirt-part-dev temporarily + * util the interface is stable. (Should it return + * a function but not visual meta?) + * + * @pubilc + * @abstract + * @param getColorVisual + * params: value, valueState + * return: color + * @return {Object} visualMeta + * should includes {stops, outerColors} + * outerColor means [colorBeyondMinValue, colorBeyondMaxValue] + */ + + + VisualMapModel.prototype.getVisualMeta = function (getColorVisual) { + return null; + }; + + VisualMapModel.type = 'visualMap'; + VisualMapModel.dependencies = ['series']; + VisualMapModel.defaultOption = { + show: true, + zlevel: 0, + z: 4, + seriesIndex: 'all', + min: 0, + max: 200, + left: 0, + right: null, + top: null, + bottom: 0, + itemWidth: null, + itemHeight: null, + inverse: false, + orient: 'vertical', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + contentColor: '#5793f3', + inactiveColor: '#aaa', + borderWidth: 0, + padding: 5, + // 接受数组分别设定上右下左边距,同css + textGap: 10, + precision: 0, + textStyle: { + color: '#333' // 值域文字颜色 + + } + }; + return VisualMapModel; + }(ComponentModel); + + var DEFAULT_BAR_BOUND = [20, 140]; + + var ContinuousModel = + /** @class */ + function (_super) { + __extends(ContinuousModel, _super); + + function ContinuousModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ContinuousModel.type; + return _this; + } + /** + * @override + */ + + + ContinuousModel.prototype.optionUpdated = function (newOption, isInit) { + _super.prototype.optionUpdated.apply(this, arguments); + + this.resetExtent(); + this.resetVisual(function (mappingOption) { + mappingOption.mappingMethod = 'linear'; + mappingOption.dataExtent = this.getExtent(); + }); + + this._resetRange(); + }; + /** + * @protected + * @override + */ + + + ContinuousModel.prototype.resetItemSize = function () { + _super.prototype.resetItemSize.apply(this, arguments); + + var itemSize = this.itemSize; + (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 + */ + + + ContinuousModel.prototype._resetRange = function () { + var dataExtent = this.getExtent(); + var range = this.option.range; + + if (!range || range.auto) { + // `range` should always be array (so we dont use other + // value like 'auto') for user-friend. (consider getOption). + dataExtent.auto = 1; + this.option.range = dataExtent; + } else if (isArray(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 + */ + + + ContinuousModel.prototype.completeVisualOption = function () { + _super.prototype.completeVisualOption.apply(this, arguments); + + each(this.stateList, function (state) { + var symbolSize = this.option.controller[state].symbolSize; + + if (symbolSize && symbolSize[0] !== symbolSize[1]) { + symbolSize[0] = symbolSize[1] / 3; // For good looking. + } + }, this); + }; + /** + * @override + */ + + + ContinuousModel.prototype.setSelected = function (selected) { + this.option.range = selected.slice(); + + this._resetRange(); + }; + /** + * @public + */ + + + ContinuousModel.prototype.getSelected = function () { + var dataExtent = this.getExtent(); + var dataInterval = 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; + }; + /** + * @override + */ + + + ContinuousModel.prototype.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'; + }; + + ContinuousModel.prototype.findTargetDataIndices = function (range) { + var result = []; + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + data.each(this.getDataDimension(data), function (value, dataIndex) { + range[0] <= value && value <= range[1] && dataIndices.push(dataIndex); + }, this); + result.push({ + seriesId: seriesModel.id, + dataIndex: dataIndices + }); + }, this); + return result; + }; + /** + * @implement + */ + + + ContinuousModel.prototype.getVisualMeta = function (getColorVisual) { + var oVals = getColorStopValues(this, 'outOfRange', this.getExtent()); + var iVals = getColorStopValues(this, 'inRange', this.option.range.slice()); + var stops = []; + + function setStop(value, valueState) { + stops.push({ + value: value, + color: getColorVisual(value, valueState) + }); + } // Format to: outOfRange -- inRange -- outOfRange. + + + var iIdx = 0; + var oIdx = 0; + var iLen = iVals.length; + var oLen = oVals.length; + + for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) { + // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored. + if (oVals[oIdx] < iVals[iIdx]) { + setStop(oVals[oIdx], 'outOfRange'); + } + } + + for (var first = 1; iIdx < iLen; iIdx++, first = 0) { + // If range is full, value beyond min, max will be clamped. + // make a singularity + first && stops.length && setStop(iVals[iIdx], 'outOfRange'); + setStop(iVals[iIdx], 'inRange'); + } + + for (var first = 1; oIdx < oLen; oIdx++) { + if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) { + // make a singularity + if (first) { + stops.length && setStop(stops[stops.length - 1].value, 'outOfRange'); + first = 0; + } + + setStop(oVals[oIdx], 'outOfRange'); + } + } + + var stopsLen = stops.length; + return { + stops: stops, + outerColors: [stopsLen ? stops[0].color : 'transparent', stopsLen ? stops[stopsLen - 1].color : 'transparent'] + }; + }; + + ContinuousModel.type = 'visualMap.continuous'; + ContinuousModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { + align: 'auto', + calculable: false, + hoverLink: true, + realtime: true, + handleIcon: 'path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z', + handleSize: '120%', + handleStyle: { + borderColor: '#fff', + borderWidth: 1 + }, + indicatorIcon: 'circle', + indicatorSize: '50%', + indicatorStyle: { + borderColor: '#fff', + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0,0,0,0.2)' + } // emphasis: { + // handleStyle: { + // shadowBlur: 3, + // shadowOffsetX: 1, + // shadowOffsetY: 1, + // shadowColor: 'rgba(0,0,0,0.2)' + // } + // } + + }); + return ContinuousModel; + }(VisualMapModel); + + function getColorStopValues(visualMapModel, valueState, dataExtent) { + if (dataExtent[0] === dataExtent[1]) { + return dataExtent.slice(); + } // When using colorHue mapping, it is not linear color any more. + // Moreover, canvas gradient seems not to be accurate linear. + // FIXME + // Should be arbitrary value 100? or based on pixel size? + + + var count = 200; + var step = (dataExtent[1] - dataExtent[0]) / count; + var value = dataExtent[0]; + var stopValues = []; + + for (var i = 0; i <= count && value < dataExtent[1]; i++) { + stopValues.push(value); + value += step; + } + + stopValues.push(dataExtent[1]); + return stopValues; + } + + var VisualMapView = + /** @class */ + function (_super) { + __extends(VisualMapView, _super); + + function VisualMapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = VisualMapView.type; + _this.autoPositionValues = { + left: 1, + right: 1, + top: 1, + bottom: 1 + }; + return _this; + } + + VisualMapView.prototype.init = function (ecModel, api) { + this.ecModel = ecModel; + this.api = api; + }; + /** + * @protected + */ + + + VisualMapView.prototype.render = function (visualMapModel, ecModel, api, payload // TODO: TYPE + ) { + this.visualMapModel = visualMapModel; + + if (visualMapModel.get('show') === false) { + this.group.removeAll(); + return; + } + + this.doRender(visualMapModel, ecModel, api, payload); + }; + /** + * @protected + */ + + + VisualMapView.prototype.renderBackground = function (group) { + var visualMapModel = this.visualMapModel; + var padding = normalizeCssArray$1(visualMapModel.get('padding') || 0); + var rect = group.getBoundingRect(); + group.add(new Rect({ + z2: -1, + 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 targetValue can be Infinity or -Infinity + * @param visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize' + * @param opts + * @param opts.forceState Specify state, instead of using getValueState method. + * @param opts.convertOpacityToAlpha For color gradient in controller widget. + * @return {*} Visual value. + */ + + + VisualMapView.prototype.getControllerVisual = function (targetValue, visualCluster, opts) { + opts = opts || {}; + var forceState = opts.forceState; + var visualMapModel = this.visualMapModel; + var visualObj = {}; // Default values. + + if (visualCluster === 'symbol') { + visualObj.symbol = visualMapModel.get('itemSymbol'); + } + + if (visualCluster === 'color') { + var defaultColor = visualMapModel.get('contentColor'); + visualObj.color = defaultColor; + } + + function getter(key) { + return visualObj[key]; + } + + function setter(key, value) { + visualObj[key] = value; + } + + var mappings = visualMapModel.controllerVisuals[forceState || visualMapModel.getValueState(targetValue)]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + each(visualTypes, function (type) { + var visualMapping = mappings[type]; + + if (opts.convertOpacityToAlpha && type === 'opacity') { + type = 'colorAlpha'; + visualMapping = mappings.__alphaForOpacity; + } + + if (VisualMapping.dependsOn(type, visualCluster)) { + visualMapping && visualMapping.applyVisual(targetValue, getter, setter); + } + }); + return visualObj[visualCluster]; + }; + + VisualMapView.prototype.positionGroup = function (group) { + var model = this.visualMapModel; + var api = this.api; + positionElement(group, model.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + }; + + VisualMapView.prototype.doRender = function (visualMapModel, ecModel, api, payload) {}; + + VisualMapView.type = 'visualMap'; + return VisualMapView; + }(ComponentView); + + var paramsSet = [['left', 'right', 'width'], ['top', 'bottom', 'height']]; + /** + * @param visualMapModel + * @param api + * @param itemSize always [short, long] + * @return {string} 'left' or 'right' or 'top' or 'bottom' + */ + + function getItemAlign(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 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 = 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]; + } + /** + * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and + * dataIndexInside means filtered index. + */ + // TODO: TYPE more specified payload types. + + function makeHighDownBatch(batch, visualMapModel) { + each(batch || [], function (batchItem) { + if (batchItem.dataIndex != null) { + batchItem.dataIndexInside = batchItem.dataIndex; + batchItem.dataIndex = null; + } + + batchItem.highlightKey = 'visualMap' + (visualMapModel ? visualMapModel.componentIndex : ''); + }); + return batch; + } + + var linearMap$2 = linearMap; + var each$g = each; + var mathMin$a = Math.min; + var mathMax$a = Math.max; // Arbitrary value + + var HOVER_LINK_SIZE = 12; + var HOVER_LINK_OUT = 6; // 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 ContinuousView = + /** @class */ + function (_super) { + __extends(ContinuousView, _super); + + function ContinuousView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ContinuousView.type; + _this._shapes = {}; + _this._dataInterval = []; + _this._handleEnds = []; + _this._hoverLinkDataIndices = []; + return _this; + } + + ContinuousView.prototype.doRender = function (visualMapModel, ecModel, api, payload) { + this._api = api; + + if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) { + this._buildView(); + } + }; + + ContinuousView.prototype._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._enableHoverLinkToSeries(); + + this._enableHoverLinkFromSeries(); + + this.positionGroup(thisGroup); + }; + + ContinuousView.prototype._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.mainGroup; + + 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 ZRText({ + style: { + x: position[0], + y: position[1], + verticalAlign: orient === 'horizontal' ? 'middle' : align, + align: orient === 'horizontal' ? align : 'center', + text: text, + font: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + } + })); + }; + + ContinuousView.prototype._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 = getItemAlign(visualMapModel, this.api, itemSize); + + var mainGroup = shapes.mainGroup = this._createBarGroup(itemAlign); + + var gradientBarGroup = new Group(); + mainGroup.add(gradientBarGroup); // Bar + + gradientBarGroup.add(shapes.outOfRange = createPolygon()); + gradientBarGroup.add(shapes.inRange = createPolygon(null, useHandle ? getCursor$1(this._orient) : null, bind(this._dragHandle, this, 'all', false), bind(this._dragHandle, this, 'all', true))); // A border radius clip. + + gradientBarGroup.setClipPath(new Rect({ + shape: { + x: 0, + y: 0, + width: itemSize[0], + height: itemSize[1], + r: 3 + } + })); + var textRect = visualMapModel.textStyleModel.getTextRect('国'); + var textSize = mathMax$a(textRect.width, textRect.height); // Handle + + if (useHandle) { + shapes.handleThumbs = []; + shapes.handleLabels = []; + shapes.handleLabelPoints = []; + + this._createHandle(visualMapModel, mainGroup, 0, itemSize, textSize, orient); + + this._createHandle(visualMapModel, mainGroup, 1, itemSize, textSize, orient); + } + + this._createIndicator(visualMapModel, mainGroup, itemSize, textSize, orient); + + targetGroup.add(mainGroup); + }; + + ContinuousView.prototype._createHandle = function (visualMapModel, mainGroup, handleIndex, itemSize, textSize, orient) { + var onDrift = bind(this._dragHandle, this, handleIndex, false); + var onDragEnd = bind(this._dragHandle, this, handleIndex, true); + var handleSize = parsePercent(visualMapModel.get('handleSize'), itemSize[0]); + var handleThumb = createSymbol(visualMapModel.get('handleIcon'), -handleSize / 2, -handleSize / 2, handleSize, handleSize, null, true); + var cursor = getCursor$1(this._orient); + handleThumb.attr({ + cursor: cursor, + draggable: true, + drift: onDrift, + ondragend: onDragEnd, + onmousemove: function (e) { + stop(e.event); + } + }); + handleThumb.x = itemSize[0] / 2; + handleThumb.useStyle(visualMapModel.getModel('handleStyle').getItemStyle()); + handleThumb.setStyle({ + strokeNoScale: true, + strokeFirst: true + }); + handleThumb.style.lineWidth *= 2; + handleThumb.ensureState('emphasis').style = visualMapModel.getModel(['emphasis', 'handleStyle']).getItemStyle(); + setAsHighDownDispatcher(handleThumb, true); + mainGroup.add(handleThumb); // Text is always horizontal layout but should not be effected by + // transform (orient/inverse). So label is built separately but not + // use zrender/graphic/helper/RectText, and is located based on view + // group (according to handleLabelPoint) but not barGroup. + + var textStyleModel = this.visualMapModel.textStyleModel; + var handleLabel = new ZRText({ + cursor: cursor, + draggable: true, + drift: onDrift, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd, + style: { + x: 0, + y: 0, + text: '', + font: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + } + }); + handleLabel.ensureState('blur').style = { + opacity: 0.1 + }; + handleLabel.stateTransition = { + duration: 200 + }; + this.group.add(handleLabel); + var handleLabelPoint = [handleSize, 0]; + var shapes = this._shapes; + shapes.handleThumbs[handleIndex] = handleThumb; + shapes.handleLabelPoints[handleIndex] = handleLabelPoint; + shapes.handleLabels[handleIndex] = handleLabel; + }; + + ContinuousView.prototype._createIndicator = function (visualMapModel, mainGroup, itemSize, textSize, orient) { + var scale = parsePercent(visualMapModel.get('indicatorSize'), itemSize[0]); + var indicator = createSymbol(visualMapModel.get('indicatorIcon'), -scale / 2, -scale / 2, scale, scale, null, true); + indicator.attr({ + cursor: 'move', + invisible: true, + silent: true, + x: itemSize[0] / 2 + }); + var indicatorStyle = visualMapModel.getModel('indicatorStyle').getItemStyle(); + + if (indicator instanceof ZRImage) { + var pathStyle = indicator.style; + indicator.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, indicatorStyle)); + } else { + indicator.useStyle(indicatorStyle); + } + + mainGroup.add(indicator); + var textStyleModel = this.visualMapModel.textStyleModel; + var indicatorLabel = new ZRText({ + silent: true, + invisible: true, + style: { + x: 0, + y: 0, + text: '', + font: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + } + }); + this.group.add(indicatorLabel); + var indicatorLabelPoint = [(orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT) + itemSize[0] / 2, 0]; + var shapes = this._shapes; + shapes.indicator = indicator; + shapes.indicatorLabel = indicatorLabel; + shapes.indicatorLabelPoint = indicatorLabelPoint; + this._firstShowIndicator = true; + }; + + ContinuousView.prototype._dragHandle = function (handleIndex, isEnd, // dx is event from ondragend if isEnd is true. It's not used + dx, dy) { + if (!this._useHandle) { + return; + } + + this._dragging = !isEnd; + + if (!isEnd) { + // Transform dx, dy to bar coordination. + var vertex = this._applyTransform([dx, dy], this._shapes.mainGroup, true); + + this._updateInterval(handleIndex, vertex[1]); + + this._hideIndicator(); // Considering realtime, update view should be executed + // before dispatch action. + + + this._updateView(); + } // dragEnd do not dispatch action when realtime. + + + if (isEnd === !this.visualMapModel.get('realtime')) { + // jshint ignore:line + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: this._dataInterval.slice() + }); + } + + if (isEnd) { + !this._hovering && this._clearHoverLinkToSeries(); + } else if (useHoverLinkOnHandle(this.visualMapModel)) { + this._doHoverLinkToSeries(this._handleEnds[handleIndex], false); + } + }; + + ContinuousView.prototype._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$2(dataInterval[0], dataExtent, sizeExtent, true), linearMap$2(dataInterval[1], dataExtent, sizeExtent, true)]; + }; + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} dx + * @param {number} dy + */ + + + ContinuousView.prototype._updateInterval = function (handleIndex, delta) { + delta = delta || 0; + var visualMapModel = this.visualMapModel; + var handleEnds = this._handleEnds; + var sizeExtent = [0, visualMapModel.itemSize[1]]; + sliderMove(delta, handleEnds, sizeExtent, handleIndex, // cross is forbiden + 0); + var dataExtent = visualMapModel.getExtent(); // Update data interval. + + this._dataInterval = [linearMap$2(handleEnds[0], sizeExtent, dataExtent, true), linearMap$2(handleEnds[1], sizeExtent, dataExtent, true)]; + }; + + ContinuousView.prototype._updateView = function (forSketch) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var shapes = this._shapes; + var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]]; + var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds; + + var visualInRange = this._createBarVisual(this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange'); + + var visualOutOfRange = this._createBarVisual(dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange'); + + shapes.inRange.setStyle({ + fill: visualInRange.barColor // opacity: visualInRange.opacity + + }).setShape('points', visualInRange.barPoints); + shapes.outOfRange.setStyle({ + fill: visualOutOfRange.barColor // opacity: visualOutOfRange.opacity + + }).setShape('points', visualOutOfRange.barPoints); + + this._updateHandle(inRangeHandleEnds, visualInRange); + }; + + ContinuousView.prototype._createBarVisual = function (dataInterval, dataExtent, handleEnds, forceState) { + var opts = { + forceState: forceState, + convertOpacityToAlpha: true + }; + + var colorStops = this._makeColorGradient(dataInterval, opts); + + var symbolSizes = [this.getControllerVisual(dataInterval[0], 'symbolSize', opts), this.getControllerVisual(dataInterval[1], 'symbolSize', opts)]; + + var barPoints = this._createBarPoints(handleEnds, symbolSizes); + + return { + barColor: new LinearGradient(0, 0, 0, 1, colorStops), + barPoints: barPoints, + handlesColor: [colorStops[0].color, colorStops[colorStops.length - 1].color] + }; + }; + + ContinuousView.prototype._makeColorGradient = function (dataInterval, opts) { + // Considering colorHue, which is not linear, so we have to sample + // to calculate gradient color stops, but not only caculate head + // and tail. + var sampleNumber = 100; // Arbitrary value. + + var colorStops = []; + var step = (dataInterval[1] - dataInterval[0]) / sampleNumber; + colorStops.push({ + color: this.getControllerVisual(dataInterval[0], 'color', opts), + offset: 0 + }); + + for (var i = 1; i < sampleNumber; i++) { + var currValue = dataInterval[0] + step * i; + + if (currValue > dataInterval[1]) { + break; + } + + colorStops.push({ + color: this.getControllerVisual(currValue, 'color', opts), + offset: i / sampleNumber + }); + } + + colorStops.push({ + color: this.getControllerVisual(dataInterval[1], 'color', opts), + offset: 1 + }); + return colorStops; + }; + + ContinuousView.prototype._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]]]; + }; + + ContinuousView.prototype._createBarGroup = function (itemAlign) { + var orient = this._orient; + var inverse = this.visualMapModel.get('inverse'); + return new Group(orient === 'horizontal' && !inverse ? { + scaleX: itemAlign === 'bottom' ? 1 : -1, + rotation: Math.PI / 2 + } : orient === 'horizontal' && inverse ? { + scaleX: itemAlign === 'bottom' ? -1 : 1, + rotation: -Math.PI / 2 + } : orient === 'vertical' && !inverse ? { + scaleX: itemAlign === 'left' ? 1 : -1, + scaleY: -1 + } : { + scaleX: itemAlign === 'left' ? 1 : -1 + }); + }; + + ContinuousView.prototype._updateHandle = function (handleEnds, visualInRange) { + if (!this._useHandle) { + return; + } + + var shapes = this._shapes; + var visualMapModel = this.visualMapModel; + var handleThumbs = shapes.handleThumbs; + var handleLabels = shapes.handleLabels; + var itemSize = visualMapModel.itemSize; + var dataExtent = visualMapModel.getExtent(); + each$g([0, 1], function (handleIndex) { + var handleThumb = handleThumbs[handleIndex]; + handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]); + handleThumb.y = handleEnds[handleIndex]; + var val = linearMap$2(handleEnds[handleIndex], [0, itemSize[1]], dataExtent, true); + var symbolSize = this.getControllerVisual(val, 'symbolSize'); + handleThumb.scaleX = handleThumb.scaleY = symbolSize / itemSize[0]; + handleThumb.x = itemSize[0] - symbolSize / 2; // Update handle label position. + + var textPoint = applyTransform$1(shapes.handleLabelPoints[handleIndex], getTransform(handleThumb, this.group)); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + text: visualMapModel.formatValueText(this._dataInterval[handleIndex]), + verticalAlign: 'middle', + align: this._orient === 'vertical' ? this._applyTransform('left', shapes.mainGroup) : 'center' + }); + }, this); + }; + + ContinuousView.prototype._showIndicator = function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var itemSize = visualMapModel.itemSize; + var sizeExtent = [0, itemSize[1]]; + var shapes = this._shapes; + var indicator = shapes.indicator; + + if (!indicator) { + return; + } + + indicator.attr('invisible', false); + var opts = { + convertOpacityToAlpha: true + }; + var color = this.getControllerVisual(cursorValue, 'color', opts); + var symbolSize = this.getControllerVisual(cursorValue, 'symbolSize'); + var y = linearMap$2(cursorValue, dataExtent, sizeExtent, true); + var x = itemSize[0] - symbolSize / 2; + var oldIndicatorPos = { + x: indicator.x, + y: indicator.y + }; // Update handle label position. + + indicator.y = y; + indicator.x = x; + var textPoint = applyTransform$1(shapes.indicatorLabelPoint, getTransform(indicator, this.group)); + var indicatorLabel = shapes.indicatorLabel; + indicatorLabel.attr('invisible', false); + + var align = this._applyTransform('left', shapes.mainGroup); + + var orient = this._orient; + var isHorizontal = orient === 'horizontal'; + indicatorLabel.setStyle({ + text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue), + verticalAlign: isHorizontal ? align : 'middle', + align: isHorizontal ? 'center' : align + }); + var indicatorNewProps = { + x: x, + y: y, + style: { + fill: color + } + }; + var labelNewProps = { + style: { + x: textPoint[0], + y: textPoint[1] + } + }; + + if (visualMapModel.ecModel.isAnimationEnabled() && !this._firstShowIndicator) { + var animationCfg = { + duration: 100, + easing: 'cubicInOut', + additive: true + }; + indicator.x = oldIndicatorPos.x; + indicator.y = oldIndicatorPos.y; + indicator.animateTo(indicatorNewProps, animationCfg); + indicatorLabel.animateTo(labelNewProps, animationCfg); + } else { + indicator.attr(indicatorNewProps); + indicatorLabel.attr(labelNewProps); + } + + this._firstShowIndicator = false; + var handleLabels = this._shapes.handleLabels; + + if (handleLabels) { + for (var i = 0; i < handleLabels.length; i++) { + // Fade out handle labels. + // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it. + this._api.enterBlur(handleLabels[i]); + } + } + }; + + ContinuousView.prototype._enableHoverLinkToSeries = function () { + var self = this; + + this._shapes.mainGroup.on('mousemove', function (e) { + self._hovering = true; + + if (!self._dragging) { + var itemSize = self.visualMapModel.itemSize; + + var pos = self._applyTransform([e.offsetX, e.offsetY], self._shapes.mainGroup, true, true); // For hover link show when hover handle, which might be + // below or upper than sizeExtent. + + + pos[1] = mathMin$a(mathMax$a(0, pos[1]), itemSize[1]); + + self._doHoverLinkToSeries(pos[1], 0 <= pos[0] && pos[0] <= itemSize[0]); + } + }).on('mouseout', function () { + // When mouse is out of handle, hoverLink still need + // to be displayed when realtime is set as false. + self._hovering = false; + !self._dragging && self._clearHoverLinkToSeries(); + }); + }; + + ContinuousView.prototype._enableHoverLinkFromSeries = function () { + var zr = this.api.getZr(); + + if (this.visualMapModel.option.hoverLink) { + zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this); + zr.on('mouseout', this._hideIndicator, this); + } else { + this._clearHoverLinkFromSeries(); + } + }; + + ContinuousView.prototype._doHoverLinkToSeries = function (cursorPos, hoverOnBar) { + var visualMapModel = this.visualMapModel; + var itemSize = visualMapModel.itemSize; + + if (!visualMapModel.option.hoverLink) { + return; + } + + var sizeExtent = [0, itemSize[1]]; + var dataExtent = visualMapModel.getExtent(); // For hover link show when hover handle, which might be below or upper than sizeExtent. + + cursorPos = mathMin$a(mathMax$a(sizeExtent[0], cursorPos), sizeExtent[1]); + var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent); + var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize]; + var cursorValue = linearMap$2(cursorPos, sizeExtent, dataExtent, true); + var valueRange = [linearMap$2(hoverRange[0], sizeExtent, dataExtent, true), linearMap$2(hoverRange[1], sizeExtent, dataExtent, true)]; // Consider data range is out of visualMap range, see test/visualMap-continuous.html, + // where china and india has very large population. + + hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity); + hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity); // Do not show indicator when mouse is over handle, + // otherwise labels overlap, especially when dragging. + + if (hoverOnBar) { + if (valueRange[0] === -Infinity) { + this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize); + } else if (valueRange[1] === Infinity) { + this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize); + } else { + this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize); + } + } // When realtime is set as false, handles, which are in barGroup, + // also trigger hoverLink, which help user to realize where they + // focus on when dragging. (see test/heatmap-large.html) + // When realtime is set as true, highlight will not show when hover + // handle, because the label on handle, which displays a exact value + // but not range, might mislead users. + + + var oldBatch = this._hoverLinkDataIndices; + var newBatch = []; + + if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) { + newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange); + } + + var resultBatches = compressBatches(oldBatch, newBatch); + + this._dispatchHighDown('downplay', makeHighDownBatch(resultBatches[0], visualMapModel)); + + this._dispatchHighDown('highlight', makeHighDownBatch(resultBatches[1], visualMapModel)); + }; + + ContinuousView.prototype._hoverLinkFromSeriesMouseOver = function (e) { + var el = e.target; + var visualMapModel = this.visualMapModel; + + if (!el || getECData(el).dataIndex == null) { + return; + } + + var ecData = getECData(el); + var dataModel = this.ecModel.getSeriesByIndex(ecData.seriesIndex); + + if (!visualMapModel.isTargetSeries(dataModel)) { + return; + } + + var data = dataModel.getData(ecData.dataType); + var value = data.get(visualMapModel.getDataDimension(data), ecData.dataIndex); + + if (!isNaN(value)) { + this._showIndicator(value, value); + } + }; + + ContinuousView.prototype._hideIndicator = function () { + var shapes = this._shapes; + shapes.indicator && shapes.indicator.attr('invisible', true); + shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true); + var handleLabels = this._shapes.handleLabels; + + if (handleLabels) { + for (var i = 0; i < handleLabels.length; i++) { + // Fade out handle labels. + // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it. + this._api.leaveBlur(handleLabels[i]); + } + } + }; + + ContinuousView.prototype._clearHoverLinkToSeries = function () { + this._hideIndicator(); + + var indices = this._hoverLinkDataIndices; + + this._dispatchHighDown('downplay', makeHighDownBatch(indices, this.visualMapModel)); + + indices.length = 0; + }; + + ContinuousView.prototype._clearHoverLinkFromSeries = function () { + this._hideIndicator(); + + var zr = this.api.getZr(); + zr.off('mouseover', this._hoverLinkFromSeriesMouseOver); + zr.off('mouseout', this._hideIndicator); + }; + + ContinuousView.prototype._applyTransform = function (vertex, element, inverse, global) { + var transform = getTransform(element, global ? null : this.group); + return isArray(vertex) ? applyTransform$1(vertex, transform, inverse) : transformDirection(vertex, transform, inverse); + }; // TODO: TYPE more specified payload types. + + + ContinuousView.prototype._dispatchHighDown = function (type, batch) { + batch && batch.length && this.api.dispatchAction({ + type: type, + batch: batch + }); + }; + /** + * @override + */ + + + ContinuousView.prototype.dispose = function () { + this._clearHoverLinkFromSeries(); + + this._clearHoverLinkToSeries(); + }; + /** + * @override + */ + + + ContinuousView.prototype.remove = function () { + this._clearHoverLinkFromSeries(); + + this._clearHoverLinkToSeries(); + }; + + ContinuousView.type = 'visualMap.continuous'; + return ContinuousView; + }(VisualMapView); + + function createPolygon(points, cursor, onDrift, onDragEnd) { + return new Polygon({ + shape: { + points: points + }, + draggable: !!onDrift, + cursor: cursor, + drift: onDrift, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd + }); + } + + function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) { + var halfHoverLinkSize = HOVER_LINK_SIZE / 2; + var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize'); + + if (hoverLinkDataSize) { + halfHoverLinkSize = linearMap$2(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2; + } + + return halfHoverLinkSize; + } + + function useHoverLinkOnHandle(visualMapModel) { + var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle'); + return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle); + } + + function getCursor$1(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var visualMapActionInfo = { + type: 'selectDataRange', + event: 'dataRangeSelected', + // FIXME use updateView appears wrong + update: 'update' + }; + var visualMapActionHander = function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'visualMap', + query: payload + }, function (model) { + model.setSelected(payload.selected); + }); + }; + + var visualMapEncodingHandlers = [{ + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var resetDefines = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + var pipelineContext = seriesModel.pipelineContext; + + if (!visualMapModel.isTargetSeries(seriesModel) || pipelineContext && pipelineContext.large) { + return; + } + + resetDefines.push(incrementalApplyVisual(visualMapModel.stateList, visualMapModel.targetVisuals, bind(visualMapModel.getValueState, visualMapModel), visualMapModel.getDataDimension(seriesModel.getData()))); + }); + return resetDefines; + } + }, // Only support color. + { + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var visualMetaList = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + if (visualMapModel.isTargetSeries(seriesModel)) { + var visualMeta = visualMapModel.getVisualMeta(bind(getColorVisual, null, seriesModel, visualMapModel)) || { + stops: [], + outerColors: [] + }; + var concreteDim = visualMapModel.getDataDimension(data); + var dimInfo = data.getDimensionInfo(concreteDim); + + if (dimInfo != null) { + // visualMeta.dimension should be dimension index, but not concrete dimension. + visualMeta.dimension = dimInfo.index; + visualMetaList.push(visualMeta); + } + } + }); // console.log(JSON.stringify(visualMetaList.map(a => a.stops))); + + seriesModel.getData().setVisual('visualMeta', visualMetaList); + } + }]; // FIXME + // performance and export for heatmap? + // value can be Infinity or -Infinity + + function getColorVisual(seriesModel, visualMapModel, value, valueState) { + var mappings = visualMapModel.targetVisuals[valueState]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + var resultVisual = { + color: getVisualFromData(seriesModel.getData(), 'color') // default color. + + }; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + var mapping = mappings[type === 'opacity' ? '__alphaForOpacity' : type]; + mapping && mapping.applyVisual(value, getVisual, setVisual); + } + + return resultVisual.color; + + function getVisual(key) { + return resultVisual[key]; + } + + function setVisual(key, value) { + resultVisual[key] = value; + } + } + + var each$h = each; + function visualMapPreprocessor(option) { + var visualMap = option && option.visualMap; + + if (!isArray(visualMap)) { + visualMap = visualMap ? [visualMap] : []; + } + + each$h(visualMap, function (opt) { + if (!opt) { + return; + } // rename splitList to pieces + + + if (has$1(opt, 'splitList') && !has$1(opt, 'pieces')) { + opt.pieces = opt.splitList; + delete opt.splitList; + } + + var pieces = opt.pieces; + + if (pieces && isArray(pieces)) { + each$h(pieces, function (piece) { + if (isObject(piece)) { + if (has$1(piece, 'start') && !has$1(piece, 'min')) { + piece.min = piece.start; + } + + if (has$1(piece, 'end') && !has$1(piece, 'max')) { + piece.max = piece.end; + } + } + }); + } + }); + } + + function has$1(obj, name) { + return obj && obj.hasOwnProperty && obj.hasOwnProperty(name); + } + + var installed$1 = false; + function installCommon$1(registers) { + if (installed$1) { + return; + } + + installed$1 = true; + registers.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'; + }); + registers.registerAction(visualMapActionInfo, visualMapActionHander); + each(visualMapEncodingHandlers, function (handler) { + registers.registerVisual(registers.PRIORITY.VISUAL.COMPONENT, handler); + }); + registers.registerPreprocessor(visualMapPreprocessor); + } + + function install$N(registers) { + registers.registerComponentModel(ContinuousModel); + registers.registerComponentView(ContinuousView); + installCommon$1(registers); + } + + var PiecewiseModel = + /** @class */ + function (_super) { + __extends(PiecewiseModel, _super); + + function PiecewiseModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PiecewiseModel.type; + /** + * The order is always [low, ..., high]. + * [{text: string, interval: Array.}, ...] + */ + + _this._pieceList = []; + return _this; + } + + PiecewiseModel.prototype.optionUpdated = function (newOption, isInit) { + _super.prototype.optionUpdated.apply(this, arguments); + + this.resetExtent(); + + var mode = this._mode = this._determineMode(); + + this._pieceList = []; + + resetMethods[this._mode].call(this, this._pieceList); + + this._resetSelected(newOption, isInit); + + var categories = this.option.categories; + this.resetVisual(function (mappingOption, state) { + if (mode === 'categories') { + mappingOption.mappingMethod = 'category'; + mappingOption.categories = clone(categories); + } else { + mappingOption.dataExtent = this.getExtent(); + mappingOption.mappingMethod = 'piecewise'; + mappingOption.pieceList = map(this._pieceList, function (piece) { + piece = clone(piece); + + if (state !== 'inRange') { + // FIXME + // outOfRange do not support special visual in pieces. + piece.visual = null; + } + + return piece; + }); + } + }); + }; + /** + * @protected + * @override + */ + + + PiecewiseModel.prototype.completeVisualOption = function () { + // Consider this case: + // visualMap: { + // pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}] + // } + // where no inRange/outOfRange set but only pieces. So we should make + // default inRange/outOfRange for this case, otherwise visuals that only + // appear in `pieces` will not be taken into account in visual encoding. + var option = this.option; + var visualTypesInPieces = {}; + var visualTypes = VisualMapping.listVisualTypes(); + var isCategory = this.isCategory(); + each(option.pieces, function (piece) { + each(visualTypes, function (visualType) { + if (piece.hasOwnProperty(visualType)) { + visualTypesInPieces[visualType] = 1; + } + }); + }); + each(visualTypesInPieces, function (v, visualType) { + var exists = false; + each(this.stateList, function (state) { + exists = exists || has(option, state, visualType) || has(option.target, state, visualType); + }, this); + !exists && each(this.stateList, function (state) { + (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === 'inRange' ? 'active' : 'inactive', isCategory); + }); + }, this); + + function has(obj, state, visualType) { + return obj && obj[state] && obj[state].hasOwnProperty(visualType); + } + + _super.prototype.completeVisualOption.apply(this, arguments); + }; + + PiecewiseModel.prototype._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. + + each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + + if (!selected.hasOwnProperty(key)) { + selected[key] = true; + } + }, this); + + if (thisOption.selectedMode === 'single') { + // Ensure there is only one selected. + var hasSel_1 = false; + each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + + if (selected[key]) { + hasSel_1 ? selected[key] = false : hasSel_1 = true; + } + }, this); + } // thisOption.selectedMode === 'multiple', default: all selected. + + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getSelectedMapKey = function (piece) { + return this._mode === 'categories' ? piece.value + '' : piece.index + ''; + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getPieceList = function () { + return this._pieceList; + }; + /** + * @return {string} + */ + + + PiecewiseModel.prototype._determineMode = function () { + var option = this.option; + return option.pieces && option.pieces.length > 0 ? 'pieces' : this.option.categories ? 'categories' : 'splitNumber'; + }; + /** + * @override + */ + + + PiecewiseModel.prototype.setSelected = function (selected) { + this.option.selected = clone(selected); + }; + /** + * @override + */ + + + PiecewiseModel.prototype.getValueState = function (value) { + var index = VisualMapping.findPieceIndex(value, this._pieceList); + return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? 'inRange' : 'outOfRange' : 'outOfRange'; + }; + /** + * @public + * @param pieceIndex piece index in visualMapModel.getPieceList() + */ + + + PiecewiseModel.prototype.findTargetDataIndices = function (pieceIndex) { + var result = []; + var pieceList = this._pieceList; + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + data.each(this.getDataDimension(data), function (value, dataIndex) { + // Should always base on model pieceList, because it is order sensitive. + var pIdx = VisualMapping.findPieceIndex(value, pieceList); + pIdx === pieceIndex && dataIndices.push(dataIndex); + }, this); + result.push({ + seriesId: seriesModel.id, + dataIndex: dataIndices + }); + }, this); + return result; + }; + /** + * @private + * @param piece piece.value or piece.interval is required. + * @return Can be Infinity or -Infinity + */ + + + PiecewiseModel.prototype.getRepresentValue = function (piece) { + var representValue; + + if (this.isCategory()) { + representValue = piece.value; + } else { + if (piece.value != null) { + representValue = piece.value; + } else { + var pieceInterval = piece.interval || []; + representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2; + } + } + + return representValue; + }; + + PiecewiseModel.prototype.getVisualMeta = function (getColorVisual) { + // Do not support category. (category axis is ordinal, numerical) + if (this.isCategory()) { + return; + } + + var stops = []; + var outerColors = ['', '']; + var visualMapModel = this; + + function setStop(interval, valueState) { + var representValue = visualMapModel.getRepresentValue({ + interval: interval + }); // Not category + + if (!valueState) { + valueState = visualMapModel.getValueState(representValue); + } + + var color = getColorVisual(representValue, valueState); + + if (interval[0] === -Infinity) { + outerColors[0] = color; + } else if (interval[1] === Infinity) { + outerColors[1] = color; + } else { + stops.push({ + value: interval[0], + color: color + }, { + value: interval[1], + color: color + }); + } + } // Suplement + + + var pieceList = this._pieceList.slice(); + + if (!pieceList.length) { + pieceList.push({ + interval: [-Infinity, Infinity] + }); + } else { + var edge = pieceList[0].interval[0]; + edge !== -Infinity && pieceList.unshift({ + interval: [-Infinity, edge] + }); + edge = pieceList[pieceList.length - 1].interval[1]; + edge !== Infinity && pieceList.push({ + interval: [edge, Infinity] + }); + } + + var curr = -Infinity; + each(pieceList, function (piece) { + var interval = piece.interval; + + if (interval) { + // Fulfill gap. + interval[0] > curr && setStop([curr, interval[0]], 'outOfRange'); + setStop(interval.slice()); + curr = interval[1]; + } + }, this); + return { + stops: stops, + outerColors: outerColors + }; + }; + + PiecewiseModel.type = 'visualMap.piecewise'; + PiecewiseModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { + selected: null, + minOpen: false, + maxOpen: false, + align: 'auto', + itemWidth: 20, + itemHeight: 14, + itemSymbol: 'roundRect', + pieces: null, + categories: null, + splitNumber: 5, + selectedMode: 'multiple', + itemGap: 10, + hoverLink: true // Enable hover highlight. + + }); + return PiecewiseModel; + }(VisualMapModel); + /** + * Key is this._mode + * @type {Object} + * @this {module:echarts/component/viusalMap/PiecewiseMode} + */ + + var resetMethods = { + splitNumber: function (outPieceList) { + var thisOption = this.option; + var precision = Math.min(thisOption.precision, 20); + 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); + + if (thisOption.minOpen) { + outPieceList.push({ + interval: [-Infinity, dataExtent[0]], + close: [0, 0] + }); + } + + for (var index = 0, curr = dataExtent[0]; index < splitNumber; curr += splitStep, index++) { + var max = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep; + outPieceList.push({ + interval: [curr, max], + close: [1, 1] + }); + } + + if (thisOption.maxOpen) { + outPieceList.push({ + interval: [dataExtent[1], Infinity], + close: [0, 0] + }); + } + + reformIntervals(outPieceList); + each(outPieceList, function (piece, index) { + piece.index = index; + piece.text = this.formatValueText(piece.interval); + }, this); + }, + categories: function (outPieceList) { + var thisOption = this.option; + each(thisOption.categories, function (cate) { + // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。 + // 是否改一致。 + outPieceList.push({ + text: this.formatValueText(cate, true), + value: cate + }); + }, this); // See "Order Rule". + + normalizeReverse(thisOption, outPieceList); + }, + pieces: function (outPieceList) { + var thisOption = this.option; + each(thisOption.pieces, function (pieceListItem, index) { + if (!isObject(pieceListItem)) { + pieceListItem = { + value: pieceListItem + }; + } + + var item = { + text: '', + index: index + }; + + if (pieceListItem.label != null) { + item.text = pieceListItem.label; + } + + if (pieceListItem.hasOwnProperty('value')) { + var value = item.value = pieceListItem.value; + item.interval = [value, value]; + item.close = [1, 1]; + } else { + // `min` `max` is legacy option. + // `lt` `gt` `lte` `gte` is recommanded. + var interval = item.interval = []; + var close_1 = item.close = [0, 0]; + var closeList = [1, 0, 1]; + var infinityList = [-Infinity, Infinity]; + var useMinMax = []; + + for (var lg = 0; lg < 2; lg++) { + var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg]; + + for (var i = 0; i < 3 && interval[lg] == null; i++) { + interval[lg] = pieceListItem[names[i]]; + close_1[lg] = closeList[i]; + useMinMax[lg] = i === 2; + } + + interval[lg] == null && (interval[lg] = infinityList[lg]); + } + + useMinMax[0] && interval[1] === Infinity && (close_1[0] = 0); + useMinMax[1] && interval[0] === -Infinity && (close_1[1] = 0); + + if ("development" !== 'production') { + if (interval[0] > interval[1]) { + console.warn('Piece ' + index + 'is illegal: ' + interval + ' lower bound should not greater then uppper bound.'); + } + } + + if (interval[0] === interval[1] && close_1[0] && close_1[1]) { + // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}], + // we use value to lift the priority when min === max + item.value = interval[0]; + } + } + + item.visual = VisualMapping.retrieveVisuals(pieceListItem); + outPieceList.push(item); + }, this); // See "Order Rule". + + normalizeReverse(thisOption, outPieceList); // Only pieces + + reformIntervals(outPieceList); + each(outPieceList, function (piece) { + var close = piece.close; + var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]]; + piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols); + }, this); + } + }; + + function normalizeReverse(thisOption, pieceList) { + var inverse = thisOption.inverse; + + if (thisOption.orient === 'vertical' ? !inverse : inverse) { + pieceList.reverse(); + } + } + + var PiecewiseVisualMapView = + /** @class */ + function (_super) { + __extends(PiecewiseVisualMapView, _super); + + function PiecewiseVisualMapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PiecewiseVisualMapView.type; + return _this; + } + + PiecewiseVisualMapView.prototype.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 endsText = viewData.endsText; + var showLabel = retrieve(visualMapModel.get('showLabel', true), !endsText); + endsText && this._renderEndsText(thisGroup, endsText[0], itemSize, showLabel, itemAlign); + each(viewData.viewPieceList, function (item) { + var piece = item.piece; + var itemGroup = new Group(); + itemGroup.onclick = bind(this._onItemClick, this, piece); + + this._enableHoverLink(itemGroup, item.indexInModelPieceList); // TODO Category + + + var representValue = visualMapModel.getRepresentValue(piece); + + this._createItemSymbol(itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]]); + + if (showLabel) { + var visualState = this.visualMapModel.getValueState(representValue); + itemGroup.add(new ZRText({ + style: { + x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap, + y: itemSize[1] / 2, + text: piece.text, + verticalAlign: 'middle', + align: itemAlign, + font: textFont, + fill: textFill, + opacity: visualState === 'outOfRange' ? 0.5 : 1 + } + })); + } + + thisGroup.add(itemGroup); + }, this); + endsText && this._renderEndsText(thisGroup, endsText[1], itemSize, showLabel, itemAlign); + box(visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap')); + this.renderBackground(thisGroup); + this.positionGroup(thisGroup); + }; + + PiecewiseVisualMapView.prototype._enableHoverLink = function (itemGroup, pieceIndex) { + var _this = this; + + itemGroup.on('mouseover', function () { + return onHoverLink('highlight'); + }).on('mouseout', function () { + return onHoverLink('downplay'); + }); + + var onHoverLink = function (method) { + var visualMapModel = _this.visualMapModel; // TODO: TYPE More detailed action types + + visualMapModel.option.hoverLink && _this.api.dispatchAction({ + type: method, + batch: makeHighDownBatch(visualMapModel.findTargetDataIndices(pieceIndex), visualMapModel) + }); + }; + }; + + PiecewiseVisualMapView.prototype._getItemAlign = function () { + var visualMapModel = this.visualMapModel; + var modelOption = visualMapModel.option; + + if (modelOption.orient === 'vertical') { + return 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; + } + }; + + PiecewiseVisualMapView.prototype._renderEndsText = function (group, text, itemSize, showLabel, itemAlign) { + if (!text) { + return; + } + + var itemGroup = new Group(); + var textStyleModel = this.visualMapModel.textStyleModel; + itemGroup.add(new ZRText({ + style: { + x: showLabel ? itemAlign === 'right' ? itemSize[0] : 0 : itemSize[0] / 2, + y: itemSize[1] / 2, + verticalAlign: 'middle', + align: showLabel ? itemAlign : 'center', + text: text, + font: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + } + })); + group.add(itemGroup); + }; + /** + * @private + * @return {Object} {peiceList, endsText} The order is the same as screen pixel order. + */ + + + PiecewiseVisualMapView.prototype._getViewData = function () { + var visualMapModel = this.visualMapModel; + var viewPieceList = map(visualMapModel.getPieceList(), function (piece, index) { + return { + piece: piece, + indexInModelPieceList: index + }; + }); + var endsText = visualMapModel.get('text'); // Consider orient and inverse. + + var orient = visualMapModel.get('orient'); + var inverse = visualMapModel.get('inverse'); // Order of model pieceList is always [low, ..., high] + + if (orient === 'horizontal' ? inverse : !inverse) { + viewPieceList.reverse(); + } // Origin order of endsText is [high, low] + else if (endsText) { + endsText = endsText.slice().reverse(); + } + + return { + viewPieceList: viewPieceList, + endsText: endsText + }; + }; + + PiecewiseVisualMapView.prototype._createItemSymbol = function (group, representValue, shapeParam) { + group.add(createSymbol( // symbol will be string + this.getControllerVisual(representValue, 'symbol'), shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3], // color will be string + this.getControllerVisual(representValue, 'color'))); + }; + + PiecewiseVisualMapView.prototype._onItemClick = function (piece) { + var visualMapModel = this.visualMapModel; + var option = visualMapModel.option; + var selected = clone(option.selected); + var newKey = visualMapModel.getSelectedMapKey(piece); + + if (option.selectedMode === 'single') { + selected[newKey] = true; + 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 + }); + }; + + PiecewiseVisualMapView.type = 'visualMap.piecewise'; + return PiecewiseVisualMapView; + }(VisualMapView); + + function install$O(registers) { + registers.registerComponentModel(PiecewiseModel); + registers.registerComponentView(PiecewiseVisualMapView); + installCommon$1(registers); + } + + function install$P(registers) { + use(install$N); + use(install$O); // Do not install './dataZoomSelect', + // since it only work for toolbox dataZoom. + } + + var DEFAULT_OPTION = { + label: { + enabled: true + }, + decal: { + show: false + } + }; + var inner$n = makeInner(); + var decalPaletteScope = {}; + function ariaVisual(ecModel, api) { + var ariaModel = ecModel.getModel('aria'); // See "area enabled" detection code in `GlobalModel.ts`. + + if (!ariaModel.get('enabled')) { + return; + } + + var defaultOption = clone(DEFAULT_OPTION); + merge(defaultOption.label, ecModel.getLocaleModel().get('aria'), false); + merge(ariaModel.option, defaultOption, false); + setDecal(); + setLabel(); + + function setDecal() { + var decalModel = ariaModel.getModel('decal'); + var useDecal = decalModel.get('show'); + + if (useDecal) { + // Each type of series use one scope. + // Pie and funnel are using diferrent scopes + var paletteScopeGroupByType_1 = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + if (!seriesModel.useColorPaletteOnData) { + return; + } + + var decalScope = paletteScopeGroupByType_1.get(seriesModel.type); + + if (!decalScope) { + decalScope = {}; + paletteScopeGroupByType_1.set(seriesModel.type, decalScope); + } + + inner$n(seriesModel).scope = decalScope; + }); + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + if (typeof seriesModel.enableAriaDecal === 'function') { + // Let series define how to use decal palette on data + seriesModel.enableAriaDecal(); + return; + } + + var data = seriesModel.getData(); + + if (seriesModel.useColorPaletteOnData) { + var dataAll_1 = seriesModel.getRawData(); + var idxMap_1 = {}; + var decalScope_1 = inner$n(seriesModel).scope; + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap_1[rawIdx] = idx; + }); + var dataCount_1 = dataAll_1.count(); + dataAll_1.each(function (rawIdx) { + var idx = idxMap_1[rawIdx]; + var name = dataAll_1.getName(rawIdx) || rawIdx + ''; + var paletteDecal = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1); + var specifiedDecal = data.getItemVisual(idx, 'decal'); + data.setItemVisual(idx, 'decal', mergeDecal(specifiedDecal, paletteDecal)); + }); + } else { + var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount()); + var specifiedDecal = data.getVisual('decal'); + data.setVisual('decal', mergeDecal(specifiedDecal, paletteDecal)); + } + + function mergeDecal(specifiedDecal, paletteDecal) { + // Merge decal from palette to decal from itemStyle. + // User do not need to specify all of the decal props. + var resultDecal = specifiedDecal ? extend(extend({}, paletteDecal), specifiedDecal) : paletteDecal; + resultDecal.dirty = true; + return resultDecal; + } + }); + } + } + + function setLabel() { + var labelLocale = ecModel.getLocaleModel().get('aria'); + var labelModel = ariaModel.getModel('label'); + labelModel.option = defaults(labelModel.option, labelLocale); + + if (!labelModel.get('enabled')) { + return; + } + + var dom = api.getZr().dom; + + if (labelModel.get('description')) { + dom.setAttribute('aria-label', labelModel.get('description')); + return; + } + + var seriesCnt = ecModel.getSeriesCount(); + var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10; + var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10; + var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt); + var ariaLabel; + + if (seriesCnt < 1) { + // No series, no aria label + return; + } else { + var title = getTitle(); + + if (title) { + var withTitle = labelModel.get(['general', 'withTitle']); + ariaLabel = replace(withTitle, { + title: title + }); + } else { + ariaLabel = labelModel.get(['general', 'withoutTitle']); + } + + var seriesLabels_1 = []; + var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']); + ariaLabel += replace(prefix, { + seriesCount: seriesCnt + }); + ecModel.eachSeries(function (seriesModel, idx) { + if (idx < displaySeriesCnt) { + var seriesLabel = void 0; + var seriesName = seriesModel.get('name'); + var withName = seriesName ? 'withName' : 'withoutName'; + seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]); + seriesLabel = replace(seriesLabel, { + seriesId: seriesModel.seriesIndex, + seriesName: seriesModel.get('name'), + seriesType: getSeriesTypeName(seriesModel.subType) + }); + var data = seriesModel.getData(); + + if (data.count() > maxDataCnt) { + // Show part of data + var partialLabel = labelModel.get(['data', 'partialData']); + seriesLabel += replace(partialLabel, { + displayCnt: maxDataCnt + }); + } else { + seriesLabel += labelModel.get(['data', 'allData']); + } + + var dataLabels = []; + + for (var i = 0; i < data.count(); i++) { + if (i < maxDataCnt) { + var name_1 = data.getName(i); + var value = retrieveRawValue(data, i); + var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']); + dataLabels.push(replace(dataLabel, { + name: name_1, + value: value + })); + } + } + + var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']); + var endSeparator_1 = labelModel.get(['data', 'separator', 'end']); + seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1; + seriesLabels_1.push(seriesLabel); + } + }); + var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']); + var middleSeparator = separatorModel.get('middle'); + var endSeparator = separatorModel.get('end'); + ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator; + dom.setAttribute('aria-label', ariaLabel); + } + } + + function replace(str, keyValues) { + if (typeof str !== 'string') { + return str; + } + + var result = str; + each(keyValues, function (value, key) { + result = result.replace(new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), value); + }); + return result; + } + + function getTitle() { + var title = ecModel.get('title'); + + if (title && title.length) { + title = title[0]; + } + + return title && title.text; + } + + function getSeriesTypeName(type) { + return ecModel.getLocaleModel().get(['series', 'typeNames'])[type] || '自定义图'; + } + } + + function ariaPreprocessor(option) { + if (!option || !option.aria) { + return; + } + + var aria = option.aria; // aria.show is deprecated and should use aria.enabled instead + + if (aria.show != null) { + aria.enabled = aria.show; + } + + aria.label = aria.label || {}; // move description, general, series, data to be under aria.label + + each(['description', 'general', 'series', 'data'], function (name) { + if (aria[name] != null) { + aria.label[name] = aria[name]; + } + }); + } + + function install$Q(registers) { + registers.registerPreprocessor(ariaPreprocessor); + registers.registerVisual(registers.PRIORITY.VISUAL.ARIA, ariaVisual); + } + + var RELATIONAL_EXPRESSION_OP_ALIAS_MAP = { + value: 'eq', + // PENDING: not good for literal semantic? + '<': 'lt', + '<=': 'lte', + '>': 'gt', + '>=': 'gte', + '=': 'eq', + '!=': 'ne', + '<>': 'ne' // Might mileading for sake of the different between '==' and '===', + // So dont support them. + // '==': 'eq', + // '===': 'seq', + // '!==': 'sne' + // PENDING: Whether support some common alias "ge", "le", "neq"? + // ge: 'gte', + // le: 'lte', + // neq: 'ne', + + }; + + var RegExpEvaluator = + /** @class */ + function () { + function RegExpEvaluator(rVal) { + // Support condVal: RegExp | string + var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null; + + if (condValue == null) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('Illegal regexp', rVal, 'in'); + } + + throwError(errMsg); + } + } + + RegExpEvaluator.prototype.evaluate = function (lVal) { + var type = typeof lVal; + return type === 'string' ? this._condVal.test(lVal) : type === 'number' ? this._condVal.test(lVal + '') : false; + }; + + return RegExpEvaluator; + }(); + + var ConstConditionInternal = + /** @class */ + function () { + function ConstConditionInternal() {} + + ConstConditionInternal.prototype.evaluate = function () { + return this.value; + }; + + return ConstConditionInternal; + }(); + + var AndConditionInternal = + /** @class */ + function () { + function AndConditionInternal() {} + + AndConditionInternal.prototype.evaluate = function () { + var children = this.children; + + for (var i = 0; i < children.length; i++) { + if (!children[i].evaluate()) { + return false; + } + } + + return true; + }; + + return AndConditionInternal; + }(); + + var OrConditionInternal = + /** @class */ + function () { + function OrConditionInternal() {} + + OrConditionInternal.prototype.evaluate = function () { + var children = this.children; + + for (var i = 0; i < children.length; i++) { + if (children[i].evaluate()) { + return true; + } + } + + return false; + }; + + return OrConditionInternal; + }(); + + var NotConditionInternal = + /** @class */ + function () { + function NotConditionInternal() {} + + NotConditionInternal.prototype.evaluate = function () { + return !this.child.evaluate(); + }; + + return NotConditionInternal; + }(); + + var RelationalConditionInternal = + /** @class */ + function () { + function RelationalConditionInternal() {} + + RelationalConditionInternal.prototype.evaluate = function () { + var needParse = !!this.valueParser; // Call getValue with no `this`. + + var getValue = this.getValue; + var tarValRaw = getValue(this.valueGetterParam); + var tarValParsed = needParse ? this.valueParser(tarValRaw) : null; // Relational cond follow "and" logic internally. + + for (var i = 0; i < this.subCondList.length; i++) { + if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) { + return false; + } + } + + return true; + }; + + return RelationalConditionInternal; + }(); + + function parseOption(exprOption, getters) { + if (exprOption === true || exprOption === false) { + var cond = new ConstConditionInternal(); + cond.value = exprOption; + return cond; + } + + var errMsg = ''; + + if (!isObjectNotArray(exprOption)) { + if ("development" !== 'production') { + errMsg = makePrintable('Illegal config. Expect a plain object but actually', exprOption); + } + + throwError(errMsg); + } + + if (exprOption.and) { + return parseAndOrOption('and', exprOption, getters); + } else if (exprOption.or) { + return parseAndOrOption('or', exprOption, getters); + } else if (exprOption.not) { + return parseNotOption(exprOption, getters); + } + + return parseRelationalOption(exprOption, getters); + } + + function parseAndOrOption(op, exprOption, getters) { + var subOptionArr = exprOption[op]; + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('"and"/"or" condition should only be `' + op + ': [...]` and must not be empty array.', 'Illegal condition:', exprOption); + } + + if (!isArray(subOptionArr)) { + throwError(errMsg); + } + + if (!subOptionArr.length) { + throwError(errMsg); + } + + var cond = op === 'and' ? new AndConditionInternal() : new OrConditionInternal(); + cond.children = map(subOptionArr, function (subOption) { + return parseOption(subOption, getters); + }); + + if (!cond.children.length) { + throwError(errMsg); + } + + return cond; + } + + function parseNotOption(exprOption, getters) { + var subOption = exprOption.not; + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('"not" condition should only be `not: {}`.', 'Illegal condition:', exprOption); + } + + if (!isObjectNotArray(subOption)) { + throwError(errMsg); + } + + var cond = new NotConditionInternal(); + cond.child = parseOption(subOption, getters); + + if (!cond.child) { + throwError(errMsg); + } + + return cond; + } + + function parseRelationalOption(exprOption, getters) { + var errMsg = ''; + var valueGetterParam = getters.prepareGetValue(exprOption); + var subCondList = []; + var exprKeys = keys(exprOption); + var parserName = exprOption.parser; + var valueParser = parserName ? getRawValueParser(parserName) : null; + + for (var i = 0; i < exprKeys.length; i++) { + var keyRaw = exprKeys[i]; + + if (keyRaw === 'parser' || getters.valueGetterAttrMap.get(keyRaw)) { + continue; + } + + var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw; + var condValueRaw = exprOption[keyRaw]; + var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw; + var evaluator = createFilterComparator(op, condValueParsed) || op === 'reg' && new RegExpEvaluator(condValueParsed); + + if (!evaluator) { + if ("development" !== 'production') { + errMsg = makePrintable('Illegal relational operation: "' + keyRaw + '" in condition:', exprOption); + } + + throwError(errMsg); + } + + subCondList.push(evaluator); + } + + if (!subCondList.length) { + if ("development" !== 'production') { + errMsg = makePrintable('Relational condition must have at least one operator.', 'Illegal condition:', exprOption); + } // No relational operator always disabled in case of dangers result. + + + throwError(errMsg); + } + + var cond = new RelationalConditionInternal(); + cond.valueGetterParam = valueGetterParam; + cond.valueParser = valueParser; + cond.getValue = getters.getValue; + cond.subCondList = subCondList; + return cond; + } + + function isObjectNotArray(val) { + return isObject(val) && !isArrayLike(val); + } + + var ConditionalExpressionParsed = + /** @class */ + function () { + function ConditionalExpressionParsed(exprOption, getters) { + this._cond = parseOption(exprOption, getters); + } + + ConditionalExpressionParsed.prototype.evaluate = function () { + return this._cond.evaluate(); + }; + + return ConditionalExpressionParsed; + }(); + function parseConditionalExpression(exprOption, getters) { + return new ConditionalExpressionParsed(exprOption, getters); + } + + var filterTransform = { + type: 'echarts:filter', + // PEDING: enhance to filter by index rather than create new data + transform: function (params) { + // [Caveat] Fail-Fast: + // Do not return the whole dataset unless user config indicate it explicitly. + // For example, if no condition specified by mistake, return an empty result + // is better than return the entire raw soruce for user to find the mistake. + var upstream = params.upstream; + var rawItem; + var condition = parseConditionalExpression(params.config, { + valueGetterAttrMap: createHashMap({ + dimension: true + }), + prepareGetValue: function (exprOption) { + var errMsg = ''; + var dimLoose = exprOption.dimension; + + if (!hasOwn(exprOption, 'dimension')) { + if ("development" !== 'production') { + errMsg = makePrintable('Relation condition must has prop "dimension" specified.', 'Illegal condition:', exprOption); + } + + throwError(errMsg); + } + + var dimInfo = upstream.getDimensionInfo(dimLoose); + + if (!dimInfo) { + if ("development" !== 'production') { + errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal condition:', exprOption, '.\n'); + } + + throwError(errMsg); + } + + return { + dimIdx: dimInfo.index + }; + }, + getValue: function (param) { + return upstream.retrieveValueFromItem(rawItem, param.dimIdx); + } + }); + var resultData = []; + + for (var i = 0, len = upstream.count(); i < len; i++) { + rawItem = upstream.getRawDataItem(i); + + if (condition.evaluate()) { + resultData.push(rawItem); + } + } + + return { + data: resultData + }; + } + }; + + var sampleLog = ''; + + if ("development" !== 'production') { + sampleLog = ['Valid config is like:', '{ dimension: "age", order: "asc" }', 'or [{ dimension: "age", order: "asc"], { dimension: "date", order: "desc" }]'].join(' '); + } + + var sortTransform = { + type: 'echarts:sort', + transform: function (params) { + var upstream = params.upstream; + var config = params.config; + var errMsg = ''; // Normalize + // const orderExprList: OrderExpression[] = isArray(config[0]) + // ? config as OrderExpression[] + // : [config as OrderExpression]; + + var orderExprList = normalizeToArray(config); + + if (!orderExprList.length) { + if ("development" !== 'production') { + errMsg = 'Empty `config` in sort transform.'; + } + + throwError(errMsg); + } + + var orderDefList = []; + each(orderExprList, function (orderExpr) { + var dimLoose = orderExpr.dimension; + var order = orderExpr.order; + var parserName = orderExpr.parser; + var incomparable = orderExpr.incomparable; + + if (dimLoose == null) { + if ("development" !== 'production') { + errMsg = 'Sort transform config must has "dimension" specified.' + sampleLog; + } + + throwError(errMsg); + } + + if (order !== 'asc' && order !== 'desc') { + if ("development" !== 'production') { + errMsg = 'Sort transform config must has "order" specified.' + sampleLog; + } + + throwError(errMsg); + } + + if (incomparable && incomparable !== 'min' && incomparable !== 'max') { + var errMsg_1 = ''; + + if ("development" !== 'production') { + errMsg_1 = 'incomparable must be "min" or "max" rather than "' + incomparable + '".'; + } + + throwError(errMsg_1); + } + + if (order !== 'asc' && order !== 'desc') { + var errMsg_2 = ''; + + if ("development" !== 'production') { + errMsg_2 = 'order must be "asc" or "desc" rather than "' + order + '".'; + } + + throwError(errMsg_2); + } + + var dimInfo = upstream.getDimensionInfo(dimLoose); + + if (!dimInfo) { + if ("development" !== 'production') { + errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal config:', orderExpr, '.\n'); + } + + throwError(errMsg); + } + + var parser = parserName ? getRawValueParser(parserName) : null; + + if (parserName && !parser) { + if ("development" !== 'production') { + errMsg = makePrintable('Invalid parser name ' + parserName + '.\n', 'Illegal config:', orderExpr, '.\n'); + } + + throwError(errMsg); + } + + orderDefList.push({ + dimIdx: dimInfo.index, + parser: parser, + comparator: new SortOrderComparator(order, incomparable) + }); + }); // TODO: support it? + + var sourceFormat = upstream.sourceFormat; + + if (sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) { + if ("development" !== 'production') { + errMsg = 'sourceFormat "' + sourceFormat + '" is not supported yet'; + } + + throwError(errMsg); + } // Other upstream format are all array. + + + var resultData = []; + + for (var i = 0, len = upstream.count(); i < len; i++) { + resultData.push(upstream.getRawDataItem(i)); + } + + resultData.sort(function (item0, item1) { + for (var i = 0; i < orderDefList.length; i++) { + var orderDef = orderDefList[i]; + var val0 = upstream.retrieveValueFromItem(item0, orderDef.dimIdx); + var val1 = upstream.retrieveValueFromItem(item1, orderDef.dimIdx); + + if (orderDef.parser) { + val0 = orderDef.parser(val0); + val1 = orderDef.parser(val1); + } + + var result = orderDef.comparator.evaluate(val0, val1); + + if (result !== 0) { + return result; + } + } + + return 0; + }); + return { + data: resultData + }; + } + }; + + function install$R(registers) { + registers.registerTransform(filterTransform); + registers.registerTransform(sortTransform); + } + + var DatasetModel = + /** @class */ + function (_super) { + __extends(DatasetModel, _super); + + function DatasetModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataset'; + return _this; + } + + DatasetModel.prototype.init = function (option, parentModel, ecModel) { + _super.prototype.init.call(this, option, parentModel, ecModel); + + this._sourceManager = new SourceManager(this); + disableTransformOptionMerge(this); + }; + + DatasetModel.prototype.mergeOption = function (newOption, ecModel) { + _super.prototype.mergeOption.call(this, newOption, ecModel); + + disableTransformOptionMerge(this); + }; + + DatasetModel.prototype.optionUpdated = function () { + this._sourceManager.dirty(); + }; + + DatasetModel.prototype.getSourceManager = function () { + return this._sourceManager; + }; + + DatasetModel.type = 'dataset'; + DatasetModel.defaultOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN + }; + return DatasetModel; + }(ComponentModel); + + var DatasetView = + /** @class */ + function (_super) { + __extends(DatasetView, _super); + + function DatasetView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataset'; + return _this; + } + + DatasetView.type = 'dataset'; + return DatasetView; + }(ComponentView); + + function install$S(registers) { + registers.registerComponentModel(DatasetModel); + registers.registerComponentView(DatasetView); + } + + // Render engines + // ----------------- + // Render via Canvas. + // echarts.init(dom, null, { renderer: 'canvas' }) + + use([install$1]); // Render via SVG. + // echarts.init(dom, null, { renderer: 'svg' }) + + use([install]); // ---------------- + // Charts (series) + // ---------------- + // All of the series types, for example: + // chart.setOption({ + // series: [{ + // type: 'line' // or 'bar', 'pie', ... + // }] + // }); + + use([install$2, install$3, install$4, install$6, install$8, install$a, install$b, install$c, install$d, install$e, install$f, install$h, install$i, install$j, install$k, install$l, install$m, install$n, install$o, install$p, install$q, install$r]); // ------------------- + // Coordinate systems + // ------------------- + // All of the axis modules have been included in the + // coordinate system module below, do not need to + // make extra import. + // `cartesian` coordinate system. For some historical + // reasons, it is named as grid, for example: + // chart.setOption({ + // grid: {...}, + // xAxis: {...}, + // yAxis: {...}, + // series: [{...}] + // }); + + use(install$t); // `polar` coordinate system, for example: + // chart.setOption({ + // polar: {...}, + // radiusAxis: {...}, + // angleAxis: {...}, + // series: [{ + // coordinateSystem: 'polar' + // }] + // }); + + use(install$u); // `geo` coordinate system, for example: + // chart.setOption({ + // geo: {...}, + // series: [{ + // coordinateSystem: 'geo' + // }] + // }); + + use(install$9); // `singleAxis` coordinate system (notice, it is a coordinate system + // with only one axis, work for chart like theme river), for example: + // chart.setOption({ + // singleAxis: {...} + // series: [{type: 'themeRiver', ...}] + // }); + + use(install$v); // `parallel` coordinate system, only work for parallel series, for example: + // chart.setOption({ + // parallel: {...}, + // parallelAxis: [{...}, ...], + // series: [{ + // type: 'parallel' + // }] + // }); + + use(install$g); // `calendar` coordinate system. for example, + // chart.setOptionp({ + // calendar: {...}, + // series: [{ + // coordinateSystem: 'calendar' + // }] + // ); + + use(install$w); // ------------------ + // Other components + // ------------------ + // `graphic` component, for example: + // chart.setOption({ + // graphic: {...} + // }); + + use(install$x); // `toolbox` component, for example: + // chart.setOption({ + // toolbox: {...} + // }); + + use(install$z); // `tooltip` component, for example: + // chart.setOption({ + // tooltip: {...} + // }); + + use(install$A); // `axisPointer` component, for example: + // chart.setOption({ + // tooltip: {axisPointer: {...}, ...} + // }); + // Or + // chart.setOption({ + // axisPointer: {...} + // }); + + use(install$s); // `brush` component, for example: + // chart.setOption({ + // brush: {...} + // }); + // Or + // chart.setOption({ + // tooltip: {feature: {brush: {...}} + // }) + + use(install$B); // `title` component, for example: + // chart.setOption({ + // title: {...} + // }); + + use(install$C); // `timeline` component, for example: + // chart.setOption({ + // timeline: {...} + // }); + + use(install$D); // `markPoint` component, for example: + // chart.setOption({ + // series: [{markPoint: {...}}] + // }); + + use(install$E); // `markLine` component, for example: + // chart.setOption({ + // series: [{markLine: {...}}] + // }); + + use(install$F); // `markArea` component, for example: + // chart.setOption({ + // series: [{markArea: {...}}] + // }); + + use(install$G); // `legend` component not scrollable. for example: + // chart.setOption({ + // legend: {...} + // }); + + use(install$J); // `dataZoom` component including both `dataZoomInside` and `dataZoomSlider`. + + use(install$M); // `dataZoom` component providing drag, pinch, wheel behaviors + // inside coodinate system, for example: + // chart.setOption({ + // dataZoom: {type: 'inside'} + // }); + + use(install$K); // `dataZoom` component providing a slider bar, for example: + // chart.setOption({ + // dataZoom: {type: 'slider'} + // }); + + use(install$L); // `dataZoom` component including both `visualMapContinuous` and `visualMapPiecewise`. + + use(install$P); // `visualMap` component providing continuous bar, for example: + // chart.setOption({ + // visualMap: {type: 'continuous'} + // }); + + use(install$N); // `visualMap` component providing pieces bar, for example: + // chart.setOption({ + // visualMap: {type: 'piecewise'} + // }); + + use(install$O); // `aria` component providing aria, for example: + // chart.setOption({ + // aria: {...} + // }); + + use(install$Q); // dataset transform + // chart.setOption({ + // dataset: { + // transform: [] + // } + // }); + + use(install$R); + use(install$S); + + exports.Axis = Axis; + exports.ChartView = ChartView; + exports.ComponentModel = ComponentModel; + exports.ComponentView = ComponentView; + exports.List = List; + exports.Model = Model; + exports.PRIORITY = PRIORITY; + exports.SeriesModel = SeriesModel; + exports.color = color; + exports.connect = connect; + exports.dataTool = dataTool; + exports.dependencies = dependencies; + exports.disConnect = disConnect; + exports.disconnect = disconnect; + exports.dispose = dispose$1; + exports.env = env; + exports.extendChartView = extendChartView; + exports.extendComponentModel = extendComponentModel; + exports.extendComponentView = extendComponentView; + exports.extendSeriesModel = extendSeriesModel; + exports.format = format$1; + exports.getCoordinateSystemDimensions = getCoordinateSystemDimensions; + exports.getInstanceByDom = getInstanceByDom; + exports.getInstanceById = getInstanceById; + exports.getMap = getMap; + exports.graphic = graphic$1; + exports.helper = helper; + exports.init = init$1; + exports.innerDrawElementOnCanvas = brushSingle; + exports.matrix = matrix; + exports.number = number; + exports.parseGeoJSON = parseGeoJSON; + exports.parseGeoJson = parseGeoJSON; + exports.registerAction = registerAction; + exports.registerCoordinateSystem = registerCoordinateSystem; + exports.registerLayout = registerLayout; + exports.registerLoading = registerLoading; + exports.registerLocale = registerLocale; + exports.registerMap = registerMap; + exports.registerPostInit = registerPostInit; + exports.registerPostUpdate = registerPostUpdate; + exports.registerPreprocessor = registerPreprocessor; + exports.registerProcessor = registerProcessor; + exports.registerTheme = registerTheme; + exports.registerTransform = registerTransform; + exports.registerVisual = registerVisual; + exports.setCanvasCreator = setCanvasCreator; + exports.throttle = throttle; + exports.time = time; + exports.use = use; + exports.util = util$1; + exports.vector = vector; + exports.version = version$1; + exports.zrUtil = util; + exports.zrender = zrender; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +layui.define('echartsTheme', function(exports) { + echarts.registerTheme('walden', layui.echartsTheme); + exports('echarts', echarts); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/echartsTheme.js b/public/static/component/pear/module/echartsTheme.js new file mode 100644 index 0000000..f645204 --- /dev/null +++ b/public/static/component/pear/module/echartsTheme.js @@ -0,0 +1,492 @@ +layui.define(function(exports) { + exports('echartsTheme', + { + "color": [ + "#3fb1e3", + "#6be6c1", + "#626c91", + "#a0a7e6", + "#c4ebad", + "#96dee8" + ], + "backgroundColor": "rgba(252,252,252,0)", + "textStyle": {}, + "title": { + "textStyle": { + "color": "#666666" + }, + "subtextStyle": { + "color": "#999999" + } + }, + "line": { + "itemStyle": { + "normal": { + "borderWidth": "3" + } + }, + "lineStyle": { + "normal": { + "width": "4" + } + }, + "symbolSize": "10", + "symbol": "emptyCircle", + "smooth": true + }, + "radar": { + "itemStyle": { + "normal": { + "borderWidth": "3" + } + }, + "lineStyle": { + "normal": { + "width": "4" + } + }, + "symbolSize": "10", + "symbol": "emptyCircle", + "smooth": true + }, + "bar": { + "itemStyle": { + "normal": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + }, + "emphasis": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + } + } + }, + "pie": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "scatter": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "boxplot": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "parallel": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "sankey": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "funnel": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "gauge": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "candlestick": { + "itemStyle": { + "normal": { + "color": "#e6a0d2", + "color0": "transparent", + "borderColor": "#e6a0d2", + "borderColor0": "#3fb1e3", + "borderWidth": "2" + } + } + }, + "graph": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "lineStyle": { + "normal": { + "width": "1", + "color": "#cccccc" + } + }, + "symbolSize": "10", + "symbol": "emptyCircle", + "smooth": true, + "color": [ + "#3fb1e3", + "#6be6c1", + "#626c91", + "#a0a7e6", + "#c4ebad", + "#96dee8" + ], + "label": { + "normal": { + "textStyle": { + "color": "#ffffff" + } + } + } + }, + "map": { + "itemStyle": { + "normal": { + "areaColor": "#eeeeee", + "borderColor": "#aaaaaa", + "borderWidth": 0.5 + }, + "emphasis": { + "areaColor": "rgba(63,177,227,0.25)", + "borderColor": "#3fb1e3", + "borderWidth": 1 + } + }, + "label": { + "normal": { + "textStyle": { + "color": "#ffffff" + } + }, + "emphasis": { + "textStyle": { + "color": "rgb(63,177,227)" + } + } + } + }, + "geo": { + "itemStyle": { + "normal": { + "areaColor": "#eeeeee", + "borderColor": "#aaaaaa", + "borderWidth": 0.5 + }, + "emphasis": { + "areaColor": "rgba(63,177,227,0.25)", + "borderColor": "#3fb1e3", + "borderWidth": 1 + } + }, + "label": { + "normal": { + "textStyle": { + "color": "#ffffff" + } + }, + "emphasis": { + "textStyle": { + "color": "rgb(63,177,227)" + } + } + } + }, + "categoryAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#999999" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "valueAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#999999" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "logAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#999999" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "timeAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#999999" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "toolbox": { + "iconStyle": { + "normal": { + "borderColor": "#999999" + }, + "emphasis": { + "borderColor": "#666666" + } + } + }, + "legend": { + "textStyle": { + "color": "#999999" + } + }, + "tooltip": { + "axisPointer": { + "lineStyle": { + "color": "#cccccc", + "width": 1 + }, + "crossStyle": { + "color": "#cccccc", + "width": 1 + } + } + }, + "timeline": { + "lineStyle": { + "color": "#626c91", + "width": 1 + }, + "itemStyle": { + "normal": { + "color": "#626c91", + "borderWidth": 1 + }, + "emphasis": { + "color": "#626c91" + } + }, + "controlStyle": { + "normal": { + "color": "#626c91", + "borderColor": "#626c91", + "borderWidth": 0.5 + }, + "emphasis": { + "color": "#626c91", + "borderColor": "#626c91", + "borderWidth": 0.5 + } + }, + "checkpointStyle": { + "color": "#3fb1e3", + "borderColor": "rgba(63,177,227,0.15)" + }, + "label": { + "normal": { + "textStyle": { + "color": "#626c91" + } + }, + "emphasis": { + "textStyle": { + "color": "#626c91" + } + } + } + }, + "visualMap": { + "color": [ + "#2a99c9", + "#afe8ff" + ] + }, + "dataZoom": { + "backgroundColor": "rgba(255,255,255,0)", + "dataBackgroundColor": "rgba(222,222,222,1)", + "fillerColor": "rgba(114,230,212,0.25)", + "handleColor": "#cccccc", + "handleSize": "100%", + "textStyle": { + "color": "#999999" + } + }, + "markPoint": { + "label": { + "normal": { + "textStyle": { + "color": "#ffffff" + } + }, + "emphasis": { + "textStyle": { + "color": "#ffffff" + } + } + } + } + }); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/frame.js b/public/static/component/pear/module/frame.js new file mode 100644 index 0000000..712e1eb --- /dev/null +++ b/public/static/component/pear/module/frame.js @@ -0,0 +1,81 @@ +layui.define(['table', 'jquery', 'element'], function (exports) { + "use strict"; + + var MOD_NAME = 'frame', + $ = layui.jquery, + element = layui.element; + + var pearFrame = function (opt) { + this.option = opt; + }; + + pearFrame.prototype.render = function (opt) { + var option = { + elem:opt.elem, + url:opt.url, + title:opt.title, + width:opt.width, + height:opt.height, + done:opt.done ? opt.done: function(){ console.log("菜单渲染成功");} + } + createFrameHTML(option); + $("#"+option.elem).width(option.width); + $("#"+option.elem).height(option.height); + return new pearFrame(option); + } + + pearFrame.prototype.changePage = function(url,title,loading){ + if(loading){ + var loading = $("#"+this.option.elem).find(".pear-frame-loading"); + loading.css({display:'block'}); + } + $("#"+this.option.elem+" iframe").attr("src",url); + $("#"+this.option.elem+" .title").html(title); + if(loading){ + var loading = $("#"+this.option.elem).find(".pear-frame-loading"); + setTimeout(function(){ + loading.css({display:'none'}); + },800) + } + } + + pearFrame.prototype.changePageByElement = function(elem,url,title,loading){ + if(loading){ + var loading = $("#"+elem).find(".pear-frame-loading"); + loading.css({display:'block'}); + } + $("#"+elem+" iframe").attr("src",url); + $("#"+elem+" .title").html(title); + if(loading){ + var loading = $("#"+elem).find(".pear-frame-loading"); + setTimeout(function(){ + loading.css({display:'none'}); + },800) + } + } + + pearFrame.prototype.refresh = function (time) { + if(time!=false){ + var loading = $("#"+this.option.elem).find(".pear-frame-loading"); + loading.css({display:'block'}); + if(time!=0){ + setTimeout(function(){ + loading.css({display:'none'}); + },time) + } + } + $("#"+this.option.elem).find("iframe")[0].contentWindow.location.reload(true); + } + + function createFrameHTML(option){ + var header = "
                                  "+option.title+"
                                  " + var iframe = ""; + var loading = '
                                  '+ + '
                                  '+ + ''+ + '
                                  '+ + '
                                  '; + $("#"+option.elem).html("
                                  "+header+iframe+loading+"
                                  "); + } + exports(MOD_NAME,new pearFrame()); +}) \ No newline at end of file diff --git a/public/static/component/pear/module/hash.js b/public/static/component/pear/module/hash.js new file mode 100644 index 0000000..6b8d330 --- /dev/null +++ b/public/static/component/pear/module/hash.js @@ -0,0 +1,1775 @@ +/** + layui hash extend +**/ + +layui.define(function (exports) { + /** + * jshashes - https://github.com/h2non/jshashes + * Released under the "New BSD" license + * + * Algorithms specification: + * + * MD5 - http://www.ietf.org/rfc/rfc1321.txt + * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html + * SHA1 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf + * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf + * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf + * HMAC - http://www.ietf.org/rfc/rfc2104.txt + */ + var pearHash; + + function utf8Encode(str) { + var x, y, output = '', + i = -1, + l; + + if (str && str.length) { + l = str.length; + while ((i += 1) < l) { + /* Decode utf-16 surrogate pairs */ + x = str.charCodeAt(i); + y = i + 1 < l ? str.charCodeAt(i + 1) : 0; + if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) { + x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); + i += 1; + } + /* Encode output as utf-8 */ + if (x <= 0x7F) { + output += String.fromCharCode(x); + } else if (x <= 0x7FF) { + output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F), + 0x80 | (x & 0x3F)); + } else if (x <= 0xFFFF) { + output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), + 0x80 | ((x >>> 6) & 0x3F), + 0x80 | (x & 0x3F)); + } else if (x <= 0x1FFFFF) { + output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), + 0x80 | ((x >>> 12) & 0x3F), + 0x80 | ((x >>> 6) & 0x3F), + 0x80 | (x & 0x3F)); + } + } + } + return output; + } + + function utf8Decode(str) { + var i, ac, c1, c2, c3, arr = [], + l; + i = ac = c1 = c2 = c3 = 0; + + if (str && str.length) { + l = str.length; + str += ''; + + while (i < l) { + c1 = str.charCodeAt(i); + ac += 1; + if (c1 < 128) { + arr[ac] = String.fromCharCode(c1); + i += 1; + } else if (c1 > 191 && c1 < 224) { + c2 = str.charCodeAt(i + 1); + arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); + i += 2; + } else { + c2 = str.charCodeAt(i + 1); + c3 = str.charCodeAt(i + 2); + arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + } + } + return arr.join(''); + } + + /** + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ + + function safe_add(x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF), + msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); + } + + /** + * Bitwise rotate a 32-bit number to the left. + */ + + function bit_rol(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); + } + + /** + * Convert a raw string to a hex string + */ + + function rstr2hex(input, hexcase) { + var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef', + output = '', + x, i = 0, + l = input.length; + for (; i < l; i += 1) { + x = input.charCodeAt(i); + output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F); + } + return output; + } + + /** + * Encode a string as utf-16 + */ + + function str2rstr_utf16le(input) { + var i, l = input.length, + output = ''; + for (i = 0; i < l; i += 1) { + output += String.fromCharCode(input.charCodeAt(i) & 0xFF, (input.charCodeAt(i) >>> 8) & 0xFF); + } + return output; + } + + function str2rstr_utf16be(input) { + var i, l = input.length, + output = ''; + for (i = 0; i < l; i += 1) { + output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, input.charCodeAt(i) & 0xFF); + } + return output; + } + + /** + * Convert an array of big-endian words to a string + */ + + function binb2rstr(input) { + var i, l = input.length * 32, + output = ''; + for (i = 0; i < l; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF); + } + return output; + } + + /** + * Convert an array of little-endian words to a string + */ + + function binl2rstr(input) { + var i, l = input.length * 32, + output = ''; + for (i = 0; i < l; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); + } + return output; + } + + /** + * Convert a raw string to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ + + function rstr2binl(input) { + var i, l = input.length * 8, + output = Array(input.length >> 2), + lo = output.length; + for (i = 0; i < lo; i += 1) { + output[i] = 0; + } + for (i = 0; i < l; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32); + } + return output; + } + + /** + * Convert a raw string to an array of big-endian words + * Characters >255 have their high-byte silently ignored. + */ + + function rstr2binb(input) { + var i, l = input.length * 8, + output = Array(input.length >> 2), + lo = output.length; + for (i = 0; i < lo; i += 1) { + output[i] = 0; + } + for (i = 0; i < l; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32); + } + return output; + } + + /** + * Convert a raw string to an arbitrary string encoding + */ + + function rstr2any(input, encoding) { + var divisor = encoding.length, + remainders = Array(), + i, q, x, ld, quotient, dividend, output, full_length; + + /* Convert to an array of 16-bit big-endian values, forming the dividend */ + dividend = Array(Math.ceil(input.length / 2)); + ld = dividend.length; + for (i = 0; i < ld; i += 1) { + dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); + } + + /** + * Repeatedly perform a long division. The binary array forms the dividend, + * the length of the encoding is the divisor. Once computed, the quotient + * forms the dividend for the next step. We stop when the dividend is zerHashes. + * All remainders are stored for later use. + */ + while (dividend.length > 0) { + quotient = Array(); + x = 0; + for (i = 0; i < dividend.length; i += 1) { + x = (x << 16) + dividend[i]; + q = Math.floor(x / divisor); + x -= q * divisor; + if (quotient.length > 0 || q > 0) { + quotient[quotient.length] = q; + } + } + remainders[remainders.length] = x; + dividend = quotient; + } + + /* Convert the remainders to the output string */ + output = ''; + for (i = remainders.length - 1; i >= 0; i--) { + output += encoding.charAt(remainders[i]); + } + + /* Append leading zero equivalents */ + full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2))); + for (i = output.length; i < full_length; i += 1) { + output = encoding[0] + output; + } + return output; + } + + /** + * Convert a raw string to a base-64 string + */ + + function rstr2b64(input, b64pad) { + var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', + output = '', + len = input.length, + i, j, triplet; + b64pad = b64pad || '='; + for (i = 0; i < len; i += 3) { + triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0); + for (j = 0; j < 4; j += 1) { + if (i * 8 + j * 6 > input.length * 8) { + output += b64pad; + } else { + output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F); + } + } + } + return output; + } + + pearHash = { + /** + * @property {String} version + * @readonly + */ + VERSION: '1.0.6', + /** + * @member Hashes + * @class Base64 + * @constructor + */ + Base64: function () { + // private properties + var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', + pad = '=', // default pad according with the RFC standard + url = false, // URL encoding support @todo + utf8 = true; // by default enable UTF-8 support encoding + + // public method for encoding + this.encode = function (input) { + var i, j, triplet, + output = '', + len = input.length; + + pad = pad || '='; + input = (utf8) ? utf8Encode(input) : input; + + for (i = 0; i < len; i += 3) { + triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0); + for (j = 0; j < 4; j += 1) { + if (i * 8 + j * 6 > len * 8) { + output += pad; + } else { + output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F); + } + } + } + return output; + }; + + // public method for decoding + this.decode = function (input) { + // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var i, o1, o2, o3, h1, h2, h3, h4, bits, ac, + dec = '', + arr = []; + if (!input) { + return input; + } + + i = ac = 0; + input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '=' + //input += ''; + + do { // unpack four hexets into three octets using index points in b64 + h1 = tab.indexOf(input.charAt(i += 1)); + h2 = tab.indexOf(input.charAt(i += 1)); + h3 = tab.indexOf(input.charAt(i += 1)); + h4 = tab.indexOf(input.charAt(i += 1)); + + bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; + + o1 = bits >> 16 & 0xff; + o2 = bits >> 8 & 0xff; + o3 = bits & 0xff; + ac += 1; + + if (h3 === 64) { + arr[ac] = String.fromCharCode(o1); + } else if (h4 === 64) { + arr[ac] = String.fromCharCode(o1, o2); + } else { + arr[ac] = String.fromCharCode(o1, o2, o3); + } + } while (i < input.length); + + dec = arr.join(''); + dec = (utf8) ? utf8Decode(dec) : dec; + + return dec; + }; + + // set custom pad string + this.setPad = function (str) { + pad = str || pad; + return this; + }; + // set custom tab string characters + this.setTab = function (str) { + tab = str || tab; + return this; + }; + this.setUTF8 = function (bool) { + if (typeof bool === 'boolean') { + utf8 = bool; + } + return this; + }; + }, + + /** + * CRC-32 calculation + * @member Hashes + * @method CRC32 + * @static + * @param {String} str Input String + * @return {String} + */ + CRC32: function (str) { + var crc = 0, + x = 0, + y = 0, + table, i, iTop; + str = utf8Encode(str); + + table = [ + '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ', + '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ', + '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ', + '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ', + 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ', + '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ', + 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ', + '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ', + 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ', + '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ', + 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ', + '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ', + 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ', + '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ', + '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ', + '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ', + '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ', + 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ', + '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ', + 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ', + '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ', + 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ', + '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ', + 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ', + '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ', + 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D' + ].join(''); + + crc = crc ^ (-1); + for (i = 0, iTop = str.length; i < iTop; i += 1) { + y = (crc ^ str.charCodeAt(i)) & 0xFF; + x = '0x' + table.substr(y * 9, 8); + crc = (crc >>> 8) ^ x; + } + // always return a positive number (that's what >>> 0 does) + return (crc ^ (-1)) >>> 0; + }, + /** + * @member Hashes + * @class MD5 + * @constructor + * @param {Object} [config] + * + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * See for more infHashes. + */ + MD5: function (options) { + /** + * Private config properties. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase} + */ + var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase + b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance + utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding + + // privileged (public) methods + this.hex = function (s) { + return rstr2hex(rstr(s, utf8), hexcase); + }; + this.b64 = function (s) { + return rstr2b64(rstr(s), b64pad); + }; + this.any = function (s, e) { + return rstr2any(rstr(s, utf8), e); + }; + this.raw = function (s) { + return rstr(s, utf8); + }; + this.hex_hmac = function (k, d) { + return rstr2hex(rstr_hmac(k, d), hexcase); + }; + this.b64_hmac = function (k, d) { + return rstr2b64(rstr_hmac(k, d), b64pad); + }; + this.any_hmac = function (k, d, e) { + return rstr2any(rstr_hmac(k, d), e); + }; + /** + * Perform a simple self-test to see if the VM is working + * @return {String} Hexadecimal hash sample + */ + this.vm_test = function () { + return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; + }; + /** + * Enable/disable uppercase hexadecimal returned string + * @param {Boolean} + * @return {Object} this + */ + this.setUpperCase = function (a) { + if (typeof a === 'boolean') { + hexcase = a; + } + return this; + }; + /** + * Defines a base64 pad string + * @param {String} Pad + * @return {Object} this + */ + this.setPad = function (a) { + b64pad = a || b64pad; + return this; + }; + /** + * Defines a base64 pad string + * @param {Boolean} + * @return {Object} [this] + */ + this.setUTF8 = function (a) { + if (typeof a === 'boolean') { + utf8 = a; + } + return this; + }; + + // private methods + + /** + * Calculate the MD5 of a raw string + */ + + function rstr(s) { + s = (utf8) ? utf8Encode(s) : s; + return binl2rstr(binl(rstr2binl(s), s.length * 8)); + } + + /** + * Calculate the HMAC-MD5, of a key and some data (raw strings) + */ + + function rstr_hmac(key, data) { + var bkey, ipad, opad, hash, i; + + key = (utf8) ? utf8Encode(key) : key; + data = (utf8) ? utf8Encode(data) : data; + bkey = rstr2binl(key); + if (bkey.length > 16) { + bkey = binl(bkey, key.length * 8); + } + + ipad = Array(16), opad = Array(16); + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8); + return binl2rstr(binl(opad.concat(hash), 512 + 128)); + } + + /** + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ + + function binl(x, len) { + var i, olda, oldb, oldc, oldd, + a = 1732584193, + b = -271733879, + c = -1732584194, + d = 271733878; + + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + + a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); + d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); + d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); + } + + /** + * These functions implement the four basic operations the algorithm uses. + */ + + function md5_cmn(q, a, b, x, s, t) { + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); + } + + function md5_ff(a, b, c, d, x, s, t) { + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); + } + + function md5_gg(a, b, c, d, x, s, t) { + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); + } + + function md5_hh(a, b, c, d, x, s, t) { + return md5_cmn(b ^ c ^ d, a, b, x, s, t); + } + + function md5_ii(a, b, c, d, x, s, t) { + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); + } + }, + /** + * @member Hashes + * @class Hashes.SHA1 + * @param {Object} [config] + * @constructor + * + * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1 + * Version 2.2 Copyright Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * See http://pajhome.org.uk/crypt/md5 for details. + */ + SHA1: function (options) { + /** + * Private config properties. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase} + */ + var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase + b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance + utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding + + // public methods + this.hex = function (s) { + return rstr2hex(rstr(s, utf8), hexcase); + }; + this.b64 = function (s) { + return rstr2b64(rstr(s, utf8), b64pad); + }; + this.any = function (s, e) { + return rstr2any(rstr(s, utf8), e); + }; + this.raw = function (s) { + return rstr(s, utf8); + }; + this.hex_hmac = function (k, d) { + return rstr2hex(rstr_hmac(k, d)); + }; + this.b64_hmac = function (k, d) { + return rstr2b64(rstr_hmac(k, d), b64pad); + }; + this.any_hmac = function (k, d, e) { + return rstr2any(rstr_hmac(k, d), e); + }; + /** + * Perform a simple self-test to see if the VM is working + * @return {String} Hexadecimal hash sample + * @public + */ + this.vm_test = function () { + return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; + }; + /** + * @description Enable/disable uppercase hexadecimal returned string + * @param {boolean} + * @return {Object} this + * @public + */ + this.setUpperCase = function (a) { + if (typeof a === 'boolean') { + hexcase = a; + } + return this; + }; + /** + * @description Defines a base64 pad string + * @param {string} Pad + * @return {Object} this + * @public + */ + this.setPad = function (a) { + b64pad = a || b64pad; + return this; + }; + /** + * @description Defines a base64 pad string + * @param {boolean} + * @return {Object} this + * @public + */ + this.setUTF8 = function (a) { + if (typeof a === 'boolean') { + utf8 = a; + } + return this; + }; + + // private methods + + /** + * Calculate the SHA-512 of a raw string + */ + + function rstr(s) { + s = (utf8) ? utf8Encode(s) : s; + return binb2rstr(binb(rstr2binb(s), s.length * 8)); + } + + /** + * Calculate the HMAC-SHA1 of a key and some data (raw strings) + */ + + function rstr_hmac(key, data) { + var bkey, ipad, opad, i, hash; + key = (utf8) ? utf8Encode(key) : key; + data = (utf8) ? utf8Encode(data) : data; + bkey = rstr2binb(key); + + if (bkey.length > 16) { + bkey = binb(bkey, key.length * 8); + } + ipad = Array(16), opad = Array(16); + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8); + return binb2rstr(binb(opad.concat(hash), 512 + 160)); + } + + /** + * Calculate the SHA-1 of an array of big-endian words, and a bit length + */ + + function binb(x, len) { + var i, j, t, olda, oldb, oldc, oldd, olde, + w = Array(80), + a = 1732584193, + b = -271733879, + c = -1732584194, + d = 271733878, + e = -1009589776; + + /* append padding */ + x[len >> 5] |= 0x80 << (24 - len % 32); + x[((len + 64 >> 9) << 4) + 15] = len; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + olde = e; + + for (j = 0; j < 80; j += 1) { + if (j < 16) { + w[j] = x[i + j]; + } else { + w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1); + } + t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)), + safe_add(safe_add(e, w[j]), sha1_kt(j))); + e = d; + d = c; + c = bit_rol(b, 30); + b = a; + a = t; + } + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + e = safe_add(e, olde); + } + return Array(a, b, c, d, e); + } + + /** + * Perform the appropriate triplet combination function for the current + * iteration + */ + + function sha1_ft(t, b, c, d) { + if (t < 20) { + return (b & c) | ((~b) & d); + } + if (t < 40) { + return b ^ c ^ d; + } + if (t < 60) { + return (b & c) | (b & d) | (c & d); + } + return b ^ c ^ d; + } + + /** + * Determine the appropriate additive constant for the current iteration + */ + + function sha1_kt(t) { + return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : + (t < 60) ? -1894007588 : -899497514; + } + }, + /** + * @class Hashes.SHA256 + * @param {config} + * + * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2 + * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * See http://pajhome.org.uk/crypt/md5 for details. + * Also http://anmar.eu.org/projects/jssha2/ + */ + SHA256: function (options) { + /** + * Private properties configuration variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + * @see this.setUpperCase() method + * @see this.setPad() method + */ + var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase */ + b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', + /* base-64 pad character. Default '=' for strict RFC compliance */ + utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, + /* enable/disable utf8 encoding */ + sha256_K; + + /* privileged (public) methods */ + this.hex = function (s) { + return rstr2hex(rstr(s, utf8)); + }; + this.b64 = function (s) { + return rstr2b64(rstr(s, utf8), b64pad); + }; + this.any = function (s, e) { + return rstr2any(rstr(s, utf8), e); + }; + this.raw = function (s) { + return rstr(s, utf8); + }; + this.hex_hmac = function (k, d) { + return rstr2hex(rstr_hmac(k, d)); + }; + this.b64_hmac = function (k, d) { + return rstr2b64(rstr_hmac(k, d), b64pad); + }; + this.any_hmac = function (k, d, e) { + return rstr2any(rstr_hmac(k, d), e); + }; + /** + * Perform a simple self-test to see if the VM is working + * @return {String} Hexadecimal hash sample + * @public + */ + this.vm_test = function () { + return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; + }; + /** + * Enable/disable uppercase hexadecimal returned string + * @param {boolean} + * @return {Object} this + * @public + */ + this.setUpperCase = function (a) { + if (typeof a === 'boolean') { + hexcase = a; + } + return this; + }; + /** + * @description Defines a base64 pad string + * @param {string} Pad + * @return {Object} this + * @public + */ + this.setPad = function (a) { + b64pad = a || b64pad; + return this; + }; + /** + * Defines a base64 pad string + * @param {boolean} + * @return {Object} this + * @public + */ + this.setUTF8 = function (a) { + if (typeof a === 'boolean') { + utf8 = a; + } + return this; + }; + + // private methods + + /** + * Calculate the SHA-512 of a raw string + */ + + function rstr(s, utf8) { + s = (utf8) ? utf8Encode(s) : s; + return binb2rstr(binb(rstr2binb(s), s.length * 8)); + } + + /** + * Calculate the HMAC-sha256 of a key and some data (raw strings) + */ + + function rstr_hmac(key, data) { + key = (utf8) ? utf8Encode(key) : key; + data = (utf8) ? utf8Encode(data) : data; + var hash, i = 0, + bkey = rstr2binb(key), + ipad = Array(16), + opad = Array(16); + + if (bkey.length > 16) { + bkey = binb(bkey, key.length * 8); + } + + for (; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8); + return binb2rstr(binb(opad.concat(hash), 512 + 256)); + } + + /* + * Main sha256 function, with its support functions + */ + + function sha256_S(X, n) { + return (X >>> n) | (X << (32 - n)); + } + + function sha256_R(X, n) { + return (X >>> n); + } + + function sha256_Ch(x, y, z) { + return ((x & y) ^ ((~x) & z)); + } + + function sha256_Maj(x, y, z) { + return ((x & y) ^ (x & z) ^ (y & z)); + } + + function sha256_Sigma0256(x) { + return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22)); + } + + function sha256_Sigma1256(x) { + return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25)); + } + + function sha256_Gamma0256(x) { + return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3)); + } + + function sha256_Gamma1256(x) { + return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10)); + } + + function sha256_Sigma0512(x) { + return (sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39)); + } + + function sha256_Sigma1512(x) { + return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41)); + } + + function sha256_Gamma0512(x) { + return (sha256_S(x, 1) ^ sha256_S(x, 8) ^ sha256_R(x, 7)); + } + + function sha256_Gamma1512(x) { + return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6)); + } + + sha256_K = [ + 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, + 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, + 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, + 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, + 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, + 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, + 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998 + ]; + + function binb(m, l) { + var HASH = [1779033703, -1150833019, 1013904242, -1521486534, + 1359893119, -1694144372, 528734635, 1541459225 + ]; + var W = new Array(64); + var a, b, c, d, e, f, g, h; + var i, j, T1, T2; + + /* append padding */ + m[l >> 5] |= 0x80 << (24 - l % 32); + m[((l + 64 >> 9) << 4) + 15] = l; + + for (i = 0; i < m.length; i += 16) { + a = HASH[0]; + b = HASH[1]; + c = HASH[2]; + d = HASH[3]; + e = HASH[4]; + f = HASH[5]; + g = HASH[6]; + h = HASH[7]; + + for (j = 0; j < 64; j += 1) { + if (j < 16) { + W[j] = m[j + i]; + } else { + W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]), + sha256_Gamma0256(W[j - 15])), W[j - 16]); + } + + T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)), + sha256_K[j]), W[j]); + T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c)); + h = g; + g = f; + f = e; + e = safe_add(d, T1); + d = c; + c = b; + b = a; + a = safe_add(T1, T2); + } + + HASH[0] = safe_add(a, HASH[0]); + HASH[1] = safe_add(b, HASH[1]); + HASH[2] = safe_add(c, HASH[2]); + HASH[3] = safe_add(d, HASH[3]); + HASH[4] = safe_add(e, HASH[4]); + HASH[5] = safe_add(f, HASH[5]); + HASH[6] = safe_add(g, HASH[6]); + HASH[7] = safe_add(h, HASH[7]); + } + return HASH; + } + + }, + + /** + * @class Hashes.SHA512 + * @param {config} + * + * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2 + * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * See http://pajhome.org.uk/crypt/md5 for details. + */ + SHA512: function (options) { + /** + * Private properties configuration variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + * @see this.setUpperCase() method + * @see this.setPad() method + */ + var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, + /* hexadecimal output case format. false - lowercase; true - uppercase */ + b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', + /* base-64 pad character. Default '=' for strict RFC compliance */ + utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, + /* enable/disable utf8 encoding */ + sha512_k; + + /* privileged (public) methods */ + this.hex = function (s) { + return rstr2hex(rstr(s)); + }; + this.b64 = function (s) { + return rstr2b64(rstr(s), b64pad); + }; + this.any = function (s, e) { + return rstr2any(rstr(s), e); + }; + this.raw = function (s) { + return rstr(s, utf8); + }; + this.hex_hmac = function (k, d) { + return rstr2hex(rstr_hmac(k, d)); + }; + this.b64_hmac = function (k, d) { + return rstr2b64(rstr_hmac(k, d), b64pad); + }; + this.any_hmac = function (k, d, e) { + return rstr2any(rstr_hmac(k, d), e); + }; + /** + * Perform a simple self-test to see if the VM is working + * @return {String} Hexadecimal hash sample + * @public + */ + this.vm_test = function () { + return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; + }; + /** + * @description Enable/disable uppercase hexadecimal returned string + * @param {boolean} + * @return {Object} this + * @public + */ + this.setUpperCase = function (a) { + if (typeof a === 'boolean') { + hexcase = a; + } + return this; + }; + /** + * @description Defines a base64 pad string + * @param {string} Pad + * @return {Object} this + * @public + */ + this.setPad = function (a) { + b64pad = a || b64pad; + return this; + }; + /** + * @description Defines a base64 pad string + * @param {boolean} + * @return {Object} this + * @public + */ + this.setUTF8 = function (a) { + if (typeof a === 'boolean') { + utf8 = a; + } + return this; + }; + + /* private methods */ + + /** + * Calculate the SHA-512 of a raw string + */ + + function rstr(s) { + s = (utf8) ? utf8Encode(s) : s; + return binb2rstr(binb(rstr2binb(s), s.length * 8)); + } + /* + * Calculate the HMAC-SHA-512 of a key and some data (raw strings) + */ + + function rstr_hmac(key, data) { + key = (utf8) ? utf8Encode(key) : key; + data = (utf8) ? utf8Encode(data) : data; + + var hash, i = 0, + bkey = rstr2binb(key), + ipad = Array(32), + opad = Array(32); + + if (bkey.length > 32) { + bkey = binb(bkey, key.length * 8); + } + + for (; i < 32; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8); + return binb2rstr(binb(opad.concat(hash), 1024 + 512)); + } + + /** + * Calculate the SHA-512 of an array of big-endian dwords, and a bit length + */ + + function binb(x, len) { + var j, i, l, + W = new Array(80), + hash = new Array(16), + //Initial hash values + H = [ + new int64(0x6a09e667, -205731576), + new int64(-1150833019, -2067093701), + new int64(0x3c6ef372, -23791573), + new int64(-1521486534, 0x5f1d36f1), + new int64(0x510e527f, -1377402159), + new int64(-1694144372, 0x2b3e6c1f), + new int64(0x1f83d9ab, -79577749), + new int64(0x5be0cd19, 0x137e2179) + ], + T1 = new int64(0, 0), + T2 = new int64(0, 0), + a = new int64(0, 0), + b = new int64(0, 0), + c = new int64(0, 0), + d = new int64(0, 0), + e = new int64(0, 0), + f = new int64(0, 0), + g = new int64(0, 0), + h = new int64(0, 0), + //Temporary variables not specified by the document + s0 = new int64(0, 0), + s1 = new int64(0, 0), + Ch = new int64(0, 0), + Maj = new int64(0, 0), + r1 = new int64(0, 0), + r2 = new int64(0, 0), + r3 = new int64(0, 0); + + if (sha512_k === undefined) { + //SHA512 constants + sha512_k = [ + new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd), + new int64(-1245643825, -330482897), new int64(-373957723, -2121671748), + new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031), + new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736), + new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe), + new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302), + new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1), + new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428), + new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3), + new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65), + new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483), + new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459), + new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210), + new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340), + new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395), + new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70), + new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926), + new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473), + new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8), + new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b), + new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023), + new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30), + new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910), + new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8), + new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53), + new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016), + new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893), + new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397), + new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60), + new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec), + new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047), + new int64(-1090935817, -1295615723), new int64(-965641998, -479046869), + new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207), + new int64(-354779690, -840897762), new int64(-176337025, -294727304), + new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026), + new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b), + new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493), + new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620), + new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430), + new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817) + ]; + } + + for (i = 0; i < 80; i += 1) { + W[i] = new int64(0, 0); + } + + // append padding to the source string. The format is described in the FIPS. + x[len >> 5] |= 0x80 << (24 - (len & 0x1f)); + x[((len + 128 >> 10) << 5) + 31] = len; + l = x.length; + for (i = 0; i < l; i += 32) { //32 dwords is the block size + int64copy(a, H[0]); + int64copy(b, H[1]); + int64copy(c, H[2]); + int64copy(d, H[3]); + int64copy(e, H[4]); + int64copy(f, H[5]); + int64copy(g, H[6]); + int64copy(h, H[7]); + + for (j = 0; j < 16; j += 1) { + W[j].h = x[i + 2 * j]; + W[j].l = x[i + 2 * j + 1]; + } + + for (j = 16; j < 80; j += 1) { + //sigma1 + int64rrot(r1, W[j - 2], 19); + int64revrrot(r2, W[j - 2], 29); + int64shr(r3, W[j - 2], 6); + s1.l = r1.l ^ r2.l ^ r3.l; + s1.h = r1.h ^ r2.h ^ r3.h; + //sigma0 + int64rrot(r1, W[j - 15], 1); + int64rrot(r2, W[j - 15], 8); + int64shr(r3, W[j - 15], 7); + s0.l = r1.l ^ r2.l ^ r3.l; + s0.h = r1.h ^ r2.h ^ r3.h; + + int64add4(W[j], s1, W[j - 7], s0, W[j - 16]); + } + + for (j = 0; j < 80; j += 1) { + //Ch + Ch.l = (e.l & f.l) ^ (~e.l & g.l); + Ch.h = (e.h & f.h) ^ (~e.h & g.h); + + //Sigma1 + int64rrot(r1, e, 14); + int64rrot(r2, e, 18); + int64revrrot(r3, e, 9); + s1.l = r1.l ^ r2.l ^ r3.l; + s1.h = r1.h ^ r2.h ^ r3.h; + + //Sigma0 + int64rrot(r1, a, 28); + int64revrrot(r2, a, 2); + int64revrrot(r3, a, 7); + s0.l = r1.l ^ r2.l ^ r3.l; + s0.h = r1.h ^ r2.h ^ r3.h; + + //Maj + Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l); + Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h); + + int64add5(T1, h, s1, Ch, sha512_k[j], W[j]); + int64add(T2, s0, Maj); + + int64copy(h, g); + int64copy(g, f); + int64copy(f, e); + int64add(e, d, T1); + int64copy(d, c); + int64copy(c, b); + int64copy(b, a); + int64add(a, T1, T2); + } + int64add(H[0], H[0], a); + int64add(H[1], H[1], b); + int64add(H[2], H[2], c); + int64add(H[3], H[3], d); + int64add(H[4], H[4], e); + int64add(H[5], H[5], f); + int64add(H[6], H[6], g); + int64add(H[7], H[7], h); + } + + //represent the hash as an array of 32-bit dwords + for (i = 0; i < 8; i += 1) { + hash[2 * i] = H[i].h; + hash[2 * i + 1] = H[i].l; + } + return hash; + } + + //A constructor for 64-bit numbers + + function int64(h, l) { + this.h = h; + this.l = l; + //this.toString = int64toString; + } + + //Copies src into dst, assuming both are 64-bit numbers + + function int64copy(dst, src) { + dst.h = src.h; + dst.l = src.l; + } + + //Right-rotates a 64-bit number by shift + //Won't handle cases of shift>=32 + //The function revrrot() is for that + + function int64rrot(dst, x, shift) { + dst.l = (x.l >>> shift) | (x.h << (32 - shift)); + dst.h = (x.h >>> shift) | (x.l << (32 - shift)); + } + + //Reverses the dwords of the source and then rotates right by shift. + //This is equivalent to rotation by 32+shift + + function int64revrrot(dst, x, shift) { + dst.l = (x.h >>> shift) | (x.l << (32 - shift)); + dst.h = (x.l >>> shift) | (x.h << (32 - shift)); + } + + //Bitwise-shifts right a 64-bit number by shift + //Won't handle shift>=32, but it's never needed in SHA512 + + function int64shr(dst, x, shift) { + dst.l = (x.l >>> shift) | (x.h << (32 - shift)); + dst.h = (x.h >>> shift); + } + + //Adds two 64-bit numbers + //Like the original implementation, does not rely on 32-bit operations + + function int64add(dst, x, y) { + var w0 = (x.l & 0xffff) + (y.l & 0xffff); + var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16); + var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16); + var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16); + dst.l = (w0 & 0xffff) | (w1 << 16); + dst.h = (w2 & 0xffff) | (w3 << 16); + } + + //Same, except with 4 addends. Works faster than adding them one by one. + + function int64add4(dst, a, b, c, d) { + var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff); + var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16); + var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16); + var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16); + dst.l = (w0 & 0xffff) | (w1 << 16); + dst.h = (w2 & 0xffff) | (w3 << 16); + } + + //Same, except with 5 addends + + function int64add5(dst, a, b, c, d, e) { + var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff), + w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16), + w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16), + w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16); + dst.l = (w0 & 0xffff) | (w1 << 16); + dst.h = (w2 & 0xffff) | (w3 << 16); + } + }, + /** + * @class Hashes.RMD160 + * @constructor + * @param {Object} [config] + * + * A JavaScript implementation of the RIPEMD-160 Algorithm + * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * See http://pajhome.org.uk/crypt/md5 for details. + * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/ + */ + RMD160: function (options) { + /** + * Private properties configuration variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + * @see this.setUpperCase() method + * @see this.setPad() method + */ + var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, + /* hexadecimal output case format. false - lowercase; true - uppercase */ + b64pad = (options && typeof options.pad === 'string') ? options.pa : '=', + /* base-64 pad character. Default '=' for strict RFC compliance */ + utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, + /* enable/disable utf8 encoding */ + rmd160_r1 = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 + ], + rmd160_r2 = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 + ], + rmd160_s1 = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 + ], + rmd160_s2 = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 + ]; + + /* privileged (public) methods */ + this.hex = function (s) { + return rstr2hex(rstr(s, utf8)); + }; + this.b64 = function (s) { + return rstr2b64(rstr(s, utf8), b64pad); + }; + this.any = function (s, e) { + return rstr2any(rstr(s, utf8), e); + }; + this.raw = function (s) { + return rstr(s, utf8); + }; + this.hex_hmac = function (k, d) { + return rstr2hex(rstr_hmac(k, d)); + }; + this.b64_hmac = function (k, d) { + return rstr2b64(rstr_hmac(k, d), b64pad); + }; + this.any_hmac = function (k, d, e) { + return rstr2any(rstr_hmac(k, d), e); + }; + /** + * Perform a simple self-test to see if the VM is working + * @return {String} Hexadecimal hash sample + * @public + */ + this.vm_test = function () { + return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; + }; + /** + * @description Enable/disable uppercase hexadecimal returned string + * @param {boolean} + * @return {Object} this + * @public + */ + this.setUpperCase = function (a) { + if (typeof a === 'boolean') { + hexcase = a; + } + return this; + }; + /** + * @description Defines a base64 pad string + * @param {string} Pad + * @return {Object} this + * @public + */ + this.setPad = function (a) { + if (typeof a !== 'undefined') { + b64pad = a; + } + return this; + }; + /** + * @description Defines a base64 pad string + * @param {boolean} + * @return {Object} this + * @public + */ + this.setUTF8 = function (a) { + if (typeof a === 'boolean') { + utf8 = a; + } + return this; + }; + + /* private methods */ + + /** + * Calculate the rmd160 of a raw string + */ + + function rstr(s) { + s = (utf8) ? utf8Encode(s) : s; + return binl2rstr(binl(rstr2binl(s), s.length * 8)); + } + + /** + * Calculate the HMAC-rmd160 of a key and some data (raw strings) + */ + + function rstr_hmac(key, data) { + key = (utf8) ? utf8Encode(key) : key; + data = (utf8) ? utf8Encode(data) : data; + var i, hash, + bkey = rstr2binl(key), + ipad = Array(16), + opad = Array(16); + + if (bkey.length > 16) { + bkey = binl(bkey, key.length * 8); + } + + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8); + return binl2rstr(binl(opad.concat(hash), 512 + 160)); + } + + /** + * Convert an array of little-endian words to a string + */ + + function binl2rstr(input) { + var i, output = '', + l = input.length * 32; + for (i = 0; i < l; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); + } + return output; + } + + /** + * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length. + */ + + function binl(x, len) { + var T, j, i, l, + h0 = 0x67452301, + h1 = 0xefcdab89, + h2 = 0x98badcfe, + h3 = 0x10325476, + h4 = 0xc3d2e1f0, + A1, B1, C1, D1, E1, + A2, B2, C2, D2, E2; + + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + l = x.length; + + for (i = 0; i < l; i += 16) { + A1 = A2 = h0; + B1 = B2 = h1; + C1 = C2 = h2; + D1 = D2 = h3; + E1 = E2 = h4; + for (j = 0; j <= 79; j += 1) { + T = safe_add(A1, rmd160_f(j, B1, C1, D1)); + T = safe_add(T, x[i + rmd160_r1[j]]); + T = safe_add(T, rmd160_K1(j)); + T = safe_add(bit_rol(T, rmd160_s1[j]), E1); + A1 = E1; + E1 = D1; + D1 = bit_rol(C1, 10); + C1 = B1; + B1 = T; + T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2)); + T = safe_add(T, x[i + rmd160_r2[j]]); + T = safe_add(T, rmd160_K2(j)); + T = safe_add(bit_rol(T, rmd160_s2[j]), E2); + A2 = E2; + E2 = D2; + D2 = bit_rol(C2, 10); + C2 = B2; + B2 = T; + } + + T = safe_add(h1, safe_add(C1, D2)); + h1 = safe_add(h2, safe_add(D1, E2)); + h2 = safe_add(h3, safe_add(E1, A2)); + h3 = safe_add(h4, safe_add(A1, B2)); + h4 = safe_add(h0, safe_add(B1, C2)); + h0 = T; + } + return [h0, h1, h2, h3, h4]; + } + + // specific algorithm methods + + function rmd160_f(j, x, y, z) { + return (0 <= j && j <= 15) ? (x ^ y ^ z) : + (16 <= j && j <= 31) ? (x & y) | (~x & z) : + (32 <= j && j <= 47) ? (x | ~y) ^ z : + (48 <= j && j <= 63) ? (x & z) | (y & ~z) : + (64 <= j && j <= 79) ? x ^ (y | ~z) : + 'rmd160_f: j out of range'; + } + + function rmd160_K1(j) { + return (0 <= j && j <= 15) ? 0x00000000 : + (16 <= j && j <= 31) ? 0x5a827999 : + (32 <= j && j <= 47) ? 0x6ed9eba1 : + (48 <= j && j <= 63) ? 0x8f1bbcdc : + (64 <= j && j <= 79) ? 0xa953fd4e : + 'rmd160_K1: j out of range'; + } + + function rmd160_K2(j) { + return (0 <= j && j <= 15) ? 0x50a28be6 : + (16 <= j && j <= 31) ? 0x5c4dd124 : + (32 <= j && j <= 47) ? 0x6d703ef3 : + (48 <= j && j <= 63) ? 0x7a6d76e9 : + (64 <= j && j <= 79) ? 0x00000000 : + 'rmd160_K2: j out of range'; + } + } + }; + + // new MD5 instance + var MD5 = new pearHash.MD5 + // new SHA1 instance + var SHA1 = new pearHash.SHA1 + // new SHA256 instance + var SHA256 = new pearHash.SHA256 + // new SHA512 instace + var SHA512 = new pearHash.SHA512 + // new RIPEMD-160 instace + var RMD160 = new pearHash.RMD160 + var Base64 = new pearHash.Base64 + + pearHash.md5 = function (str) { + return MD5.hex(str); + } + pearHash.sha1 = function (str) { + return SHA1.hex(str); + } + pearHash.sha256 = function (str) { + return SHA256.hex(str); + } + pearHash.sha512 = function (str) { + return SHA512.hex(str); + } + pearHash.crc32 = pearHash.CRC32; + pearHash.rmd160 = function (str) { + return RMD160.hex(str); + } + pearHash.Base64Encode = function (str) { + return Base64.encode(str); + } + pearHash.Base64Decode = function (str) { + return Base64.decode(str); + } + exports('hash', pearHash); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/http.js b/public/static/component/pear/module/http.js new file mode 100644 index 0000000..0779728 --- /dev/null +++ b/public/static/component/pear/module/http.js @@ -0,0 +1,180 @@ +layui.define(['jquery', 'layer'], function (exports) { + "use strict"; + + var $ = layui.jquery; + var layer = layui.layer; + + var http = {}; + http.ajax = function (userOptions) { + userOptions = userOptions || {}; + + var options = $.extend(true, {}, http.ajax.defaultOpts, userOptions); + var oldBeforeSendOption = options.beforeSend; + options.beforeSend = function (xhr) { + if (oldBeforeSendOption) { + oldBeforeSendOption(xhr); + } + + xhr.setRequestHeader("Pragma", "no-cache"); + xhr.setRequestHeader("Cache-Control", "no-cache"); + xhr.setRequestHeader("Expires", "Sat, 01 Jan 2000 00:00:00 GMT"); + }; + + options.success = undefined; + options.error = undefined; + + return $.Deferred(function ($dfd) { + $.ajax(options) + .done(function (data, textStatus, jqXHR) { + $dfd.resolve(data); + userOptions.success && userOptions.success(data); + }) + .fail(function (jqXHR) { + http.ajax.handleErrorResponse(jqXHR, userOptions, $dfd); + }); + }); + } + + $.extend(http.ajax, { + defaultOpts: { + dataType: 'json', + type: 'POST', + contentType: 'application/json', + headers: { + 'X-Requested-With': 'XMLHttpRequest' + } + }, + + defaultError: { + message: 'An error has occurred!', + details: 'Error detail not sent by server.' + }, + + defaultError401: { + message: 'You are not authenticated!', + details: 'You should be authenticated (sign in) in order to perform this operation.' + }, + + defaultError403: { + message: 'You are not authorized!', + details: 'You are not allowed to perform this operation.' + }, + + defaultError404: { + message: 'Resource not found!', + details: 'The resource requested could not found on the server.' + }, + + logError: function (error) { + console.log(error); + }, + + showError: function (error) { + if (error.details) { + return layer.alert(error.details, { + title: error.message, + icon: 2, + closeBtn: 0 + }); + } else { + return layer.alert(http.ajax.defaultError.details, { + title: error.message || http.ajax.defaultError.message, + icon: 2, + closeBtn: 0 + }); + } + }, + + showErrorAndRedirectUrl: function (error, targetUrl) { + if (error.details) { + return layer.alert(error.details, { + title: error.message, + icon: 2, + closeBtn: 0, + end: http.ajax.handleTargetUrl(targetUrl) + }); + } else { + return layer.alert(http.ajax.defaultError.details, { + title: error.message || http.ajax.defaultError.message, + icon: 2, + closeBtn: 0, + end: http.ajax.handleTargetUrl(targetUrl) + }); + } + }, + + handleTargetUrl: function (targetUrl) { + if (!targetUrl) { + location.href = http.appPath; + } else { + location.href = targetUrl; + } + }, + + handleErrorResponse: function (jqXHR, userOptions, $dfd) { + if (userOptions.customHandleError !== false) { + switch (jqXHR.status) { + case 401: + http.ajax.showErrorAndRedirectUrl(http.ajax.defaultError401, http.appPath); + break; + case 403: + http.ajax.showError(http.ajax.defaultError403); + break; + case 404: + http.ajax.showError(http.ajax.defaultError404); + break; + default: + http.ajax.showError(http.ajax.defaultError); + break; + } + } + + $dfd.reject.apply(this, arguments); + userOptions.error && userOptions.error.apply(this, arguments); + }, + + ajaxSendHandler: function (event, request, settings) { + var token = http.ajax.getToken(); + if (!token) { + return; + } + + if (!settings.headers || settings.headers[http.ajax.tokenHeaderName] === undefined) { + request.setRequestHeader(http.ajax.tokenHeaderName, token); + } + }, + + getToken: function () { + return http.ajax.getCookieValue(http.ajax.tokenCookieName); + }, + + tokenCookieName: 'XSRF-TOKEN', + tokenHeaderName: 'X-XSRF-TOKEN', + + getCookieValue: function (key) { + var equalities = document.cookie.split('; '); + for (var i = 0; i < equalities.length; i++) { + if (!equalities[i]) { + continue; + } + + var splitted = equalities[i].split('='); + if (splitted.length != 2) { + continue; + } + + if (decodeURIComponent(splitted[0]) === key) { + return decodeURIComponent(splitted[1] || ''); + } + } + + return null; + } + }); + + $(document).ajaxSend(function (event, request, settings) { + return http.ajax.ajaxSendHandler(event, request, settings); + }); + + exports('http', http); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/iconPicker.js b/public/static/component/pear/module/iconPicker.js new file mode 100644 index 0000000..fb7a2ed --- /dev/null +++ b/public/static/component/pear/module/iconPicker.js @@ -0,0 +1,388 @@ +layui.define(['laypage', 'form'], function (exports) { + "use strict"; + + var IconPicker =function () { + this.v = '1.1'; + }, _MOD = 'iconPicker', + _this = this, + $ = layui.jquery, + laypage = layui.laypage, + form = layui.form, + BODY = 'body', + TIPS = '请选择图标'; + + IconPicker.prototype.render = function(options){ + var opts = options, + // DOM选择器 + elem = opts.elem, + // 数据类型:fontClass/unicode + type = opts.type == null ? 'fontClass' : opts.type, + // 是否分页:true/false + page = opts.page == null ? true : opts.page, + // 每页显示数量 + limit = opts.limit == null ? 12 : opts.limit, + // 是否开启搜索:true/false + search = opts.search == null ? true : opts.search, + // 每个图标格子的宽度:'43px'或'20%' + cellWidth = opts.cellWidth, + // 点击回调 + click = opts.click, + // 渲染成功后的回调 + success = opts.success, + // json数据 + data = {}, + // 唯一标识 + tmp = new Date().getTime(), + // 是否使用的class数据 + isFontClass = opts.type === 'fontClass', + // 初始化时input的值 + ORIGINAL_ELEM_VALUE = $(elem).val(), + TITLE = 'layui-select-title', + TITLE_ID = 'layui-select-title-' + tmp, + ICON_BODY = 'layui-iconpicker-' + tmp, + PICKER_BODY = 'layui-iconpicker-body-' + tmp, + PAGE_ID = 'layui-iconpicker-page-' + tmp, + LIST_BOX = 'layui-iconpicker-list-box', + selected = 'layui-form-selected', + unselect = 'layui-unselect'; + + var a = { + init: function () { + data = common.getData[type](); + + a.hideElem().createSelect().createBody().toggleSelect(); + a.preventEvent().inputListen(); + common.loadCss(); + + if (success) { + success(this.successHandle()); + } + + return a; + }, + successHandle: function(){ + var d = { + options: opts, + data: data, + id: tmp, + elem: $('#' + ICON_BODY) + }; + return d; + }, + /** + * 隐藏elem + */ + hideElem: function () { + $(elem).hide(); + return a; + }, + /** + * 绘制select下拉选择框 + */ + createSelect: function () { + var oriIcon = ''; + + // 默认图标 + if(ORIGINAL_ELEM_VALUE === '') { + if(isFontClass) { + ORIGINAL_ELEM_VALUE = 'layui-icon-circle-dot'; + } else { + ORIGINAL_ELEM_VALUE = ''; + } + } + + if (isFontClass) { + oriIcon = ''; + } else { + oriIcon += ORIGINAL_ELEM_VALUE; + } + oriIcon += ''; + + var selectHtml = '
                                  ' + + '
                                  ' + + '
                                  '+ + '' + + oriIcon + + ''+ + '' + + '
                                  '+ + '
                                  ' + + '
                                  ' + + '123' + + '
                                  '; + $(elem).after(selectHtml); + return a; + }, + /** + * 展开/折叠下拉框 + */ + toggleSelect: function () { + var item = '#' + TITLE_ID + ' .layui-iconpicker-item,#' + TITLE_ID + ' .layui-iconpicker-item .layui-edge'; + a.event('click', item, function (e) { + var $icon = $('#' + ICON_BODY); + if ($icon.hasClass(selected)) { + $icon.removeClass(selected).addClass(unselect); + } else { + // 隐藏其他picker + $('.layui-form-select').removeClass(selected); + // 显示当前picker + $icon.addClass(selected).removeClass(unselect); + } + e.stopPropagation(); + }); + return a; + }, + /** + * 绘制主体部分 + */ + createBody: function () { + // 获取数据 + var searchHtml = ''; + + if (search) { + searchHtml = ''; + } + + // 组合dom + var bodyHtml = '
                                  ' + + searchHtml + + '
                                  '+ + '
                                  '; + $('#' + ICON_BODY).find('.layui-anim').eq(0).html(bodyHtml); + a.search().createList().check().page(); + + return a; + }, + /** + * 绘制图标列表 + * @param text 模糊查询关键字 + * @returns {string} + */ + createList: function (text) { + var d = data, + l = d.length, + pageHtml = '', + listHtml = $('
                                  ')//'
                                  '; + + // 计算分页数据 + var _limit = limit, // 每页显示数量 + _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1), // 总计多少页 + _id = PAGE_ID; + + // 图标列表 + var icons = []; + + for (var i = 0; i < l; i++) { + var obj = d[i]; + + // 判断是否模糊查询 + if (text && obj.indexOf(text) === -1) { + continue; + } + + // 是否自定义格子宽度 + var style = ''; + if (cellWidth !== null) { + style += ' style="width:' + cellWidth + '"'; + } + + // 每个图标dom + var icon = '
                                  '; + if (isFontClass){ + icon += ''; + } else { + icon += ''+ obj.replace('amp;', '') +''; + } + icon += '
                                  '; + + icons.push(icon); + } + + // 查询出图标后再分页 + l = icons.length; + _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1); + for (var i = 0; i < _pages; i++) { + // 按limit分块 + var lm = $('
                                  '); + + for (var j = i * _limit; j < (i+1) * _limit && j < l; j++) { + lm.append(icons[j]); + } + + listHtml.append(lm); + } + + // 无数据 + if (l === 0) { + listHtml.append('

                                  无数据

                                  '); + } + + // 判断是否分页 + if (page){ + $('#' + PICKER_BODY).addClass('layui-iconpicker-body-page'); + pageHtml = '
                                  ' + + '
                                  ' + + '1/' + + ''+ _pages +'' + + ' ('+ l +')' + + '
                                  ' + + '
                                  ' + + ' ' + + ' ' + + '
                                  ' + + '
                                  '; + } + + $('#' + ICON_BODY).find('.layui-anim').find('.' + LIST_BOX).html('').append(listHtml).append(pageHtml); + return a; + }, + preventEvent: function() { + var item = '#' + ICON_BODY + ' .layui-anim'; + a.event('click', item, function (e) { + e.stopPropagation(); + }); + return a; + }, + page: function () { + var icon = '#' + PAGE_ID + ' .layui-iconpicker-page-operate .layui-icon'; + + $(icon).unbind('click'); + a.event('click', icon, function (e) { + var elem = e.currentTarget, + total = parseInt($('#' +PAGE_ID + '-pages').html()), + isPrev = $(elem).attr('prev') !== undefined, + // 按钮上标的页码 + index = parseInt($(elem).attr('data-index')), + $cur = $('#' +PAGE_ID + '-current'), + // 点击时正在显示的页码 + current = parseInt($cur.html()); + + // 分页数据 + if (isPrev && current > 1) { + current=current-1; + $(icon + '[prev]').attr('data-index', current); + } else if (!isPrev && current < total){ + current=current+1; + $(icon + '[next]').attr('data-index', current); + } + $cur.html(current); + + // 图标数据 + $('#'+ ICON_BODY + ' .layui-iconpicker-icon-limit').hide(); + $('#layui-iconpicker-icon-limit-' + tmp + current).show(); + e.stopPropagation(); + }); + return a; + }, + /** + * 搜索 + */ + search: function () { + var item = '#' + PICKER_BODY + ' .layui-iconpicker-search .layui-input'; + a.event('input propertychange', item, function (e) { + var elem = e.target, + t = $(elem).val(); + a.createList(t); + }); + return a; + }, + /** + * 点击选中图标 + */ + check: function () { + var item = '#' + PICKER_BODY + ' .layui-iconpicker-icon-item'; + a.event('click', item, function (e) { + var el = $(e.currentTarget).find('.layui-icon'), + icon = ''; + if (isFontClass) { + var clsArr = el.attr('class').split(/[\s\n]/), + cls = clsArr[1], + icon = cls; + $('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html('').attr('class', clsArr.join(' ')); + } else { + var cls = el.html(), + icon = cls; + $('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html(icon); + } + + $('#' + ICON_BODY).removeClass(selected).addClass(unselect); + $(elem).val(icon).attr('value', icon); + // 回调 + if (click) { + click({ + icon: icon + }); + } + + }); + return a; + }, + // 监听原始input数值改变 + inputListen: function(){ + var el = $(elem); + a.event('change', elem, function(){ + var value = el.val(); + }) + // el.change(function(){ + + // }); + return a; + }, + event: function (evt, el, fn) { + $(BODY).on(evt, el, fn); + } + }; + + var common = { + /** + * 加载样式表 + */ + loadCss: function () { + var css = '.layui-iconpicker {max-width: 280px;}.layui-iconpicker .layui-anim{display:none;width:280px;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-iconpicker-item{border:1px solid #e6e6e6;width:90px;height:38px;border-radius:4px;cursor:pointer;position:relative;}.layui-iconpicker-icon{border-right:1px solid #e6e6e6;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;width:60px;height:100%;float:left;text-align:center;background:#fff;transition:all .3s;}.layui-iconpicker-icon i{line-height:38px;font-size:18px;}.layui-iconpicker-item > .layui-edge{left:70px;}.layui-iconpicker-item:hover{border-color:#D2D2D2!important;}.layui-iconpicker-item:hover .layui-iconpicker-icon{border-color:#D2D2D2!important;}.layui-iconpicker.layui-form-selected .layui-anim{display:block;}.layui-iconpicker-body{padding:6px;}.layui-iconpicker .layui-iconpicker-list{background-color:#fff;border:1px solid #ccc;border-radius:4px;}.layui-iconpicker .layui-iconpicker-icon-item{display:inline-block;width:21.1%;line-height:36px;text-align:center;cursor:pointer;vertical-align:top;height:36px;margin:4px;border:1px solid #ddd;border-radius:2px;transition:300ms;}.layui-iconpicker .layui-iconpicker-icon-item i.layui-icon{font-size:17px;}.layui-iconpicker .layui-iconpicker-icon-item:hover{background-color:#eee;border-color:#ccc;-webkit-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;-moz-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;box-shadow:0 0 2px #aaa,0 0 2px #fff inset;text-shadow:0 0 1px #fff;}.layui-iconpicker-search{position:relative;margin:0 0 6px 0;border:1px solid #e6e6e6;border-radius:2px;transition:300ms;}.layui-iconpicker-search:hover{border-color:#D2D2D2!important;}.layui-iconpicker-search .layui-input{cursor:text;display:inline-block;width:86%;border:none;padding-right:0;margin-top:1px;}.layui-iconpicker-search .layui-icon{position:absolute;top:11px;right:4%;}.layui-iconpicker-tips{text-align:center;padding:8px 0;cursor:not-allowed;}.layui-iconpicker-page{margin-top:6px;margin-bottom:-6px;font-size:12px;padding:0 2px;}.layui-iconpicker-page-count{display:inline-block;}.layui-iconpicker-page-operate{display:inline-block;float:right;cursor:default;}.layui-iconpicker-page-operate .layui-icon{font-size:12px;cursor:pointer;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit{display:none;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit:first-child{display:block;}'; + var $style = $('head').find('style[iconpicker]'); + if ($style.length === 0) { + $('head').append(''); + } + }, + /** + * 获取数据 + */ + getData: { + fontClass: function () { + var arr = ["layui-icon-rate-half","layui-icon-rate","layui-icon-rate-solid","layui-icon-cellphone","layui-icon-vercode","layui-icon-login-wechat","layui-icon-login-qq","layui-icon-login-weibo","layui-icon-password","layui-icon-username","layui-icon-refresh-3","layui-icon-auz","layui-icon-spread-left","layui-icon-shrink-right","layui-icon-snowflake","layui-icon-tips","layui-icon-note","layui-icon-home","layui-icon-senior","layui-icon-refresh","layui-icon-refresh-1","layui-icon-flag","layui-icon-theme","layui-icon-notice","layui-icon-website","layui-icon-console","layui-icon-face-surprised","layui-icon-set","layui-icon-template-1","layui-icon-app","layui-icon-template","layui-icon-praise","layui-icon-tread","layui-icon-male","layui-icon-female","layui-icon-camera","layui-icon-camera-fill","layui-icon-more","layui-icon-more-vertical","layui-icon-rmb","layui-icon-dollar","layui-icon-diamond","layui-icon-fire","layui-icon-return","layui-icon-location","layui-icon-read","layui-icon-survey","layui-icon-face-smile","layui-icon-face-cry","layui-icon-cart-simple","layui-icon-cart","layui-icon-next","layui-icon-prev","layui-icon-upload-drag","layui-icon-upload","layui-icon-download-circle","layui-icon-component","layui-icon-file-b","layui-icon-user","layui-icon-find-fill","layui-icon-loading","layui-icon-loading-1","layui-icon-add-1","layui-icon-play","layui-icon-pause","layui-icon-headset","layui-icon-video","layui-icon-voice","layui-icon-speaker","layui-icon-fonts-del","layui-icon-fonts-code","layui-icon-fonts-html","layui-icon-fonts-strong","layui-icon-unlink","layui-icon-picture","layui-icon-link","layui-icon-face-smile-b","layui-icon-align-left","layui-icon-align-right","layui-icon-align-center","layui-icon-fonts-u","layui-icon-fonts-i","layui-icon-tabs","layui-icon-radio","layui-icon-circle","layui-icon-edit","layui-icon-share","layui-icon-delete","layui-icon-form","layui-icon-cellphone-fine","layui-icon-dialogue","layui-icon-fonts-clear","layui-icon-layer","layui-icon-date","layui-icon-water","layui-icon-code-circle","layui-icon-carousel","layui-icon-prev-circle","layui-icon-layouts","layui-icon-util","layui-icon-templeate-1","layui-icon-upload-circle","layui-icon-tree","layui-icon-table","layui-icon-chart","layui-icon-chart-screen","layui-icon-engine","layui-icon-triangle-d","layui-icon-triangle-r","layui-icon-file","layui-icon-set-sm","layui-icon-add-circle","layui-icon-404","layui-icon-about","layui-icon-up","layui-icon-down","layui-icon-left","layui-icon-right","layui-icon-circle-dot","layui-icon-search","layui-icon-set-fill","layui-icon-group","layui-icon-friends","layui-icon-reply-fill","layui-icon-menu-fill","layui-icon-log","layui-icon-picture-fine","layui-icon-face-smile-fine","layui-icon-list","layui-icon-release","layui-icon-ok","layui-icon-help","layui-icon-chat","layui-icon-top","layui-icon-star","layui-icon-star-fill","layui-icon-close-fill","layui-icon-close","layui-icon-ok-circle","layui-icon-add-circle-fine"]; + return arr; + }, + unicode: function () { + return ["&#xe6c9;","&#xe67b;","&#xe67a;","&#xe678;","&#xe679;","&#xe677;","&#xe676;","&#xe675;","&#xe673;","&#xe66f;","&#xe9aa;","&#xe672;","&#xe66b;","&#xe668;","&#xe6b1;","&#xe702;","&#xe66e;","&#xe68e;","&#xe674;","&#xe669;","&#xe666;","&#xe66c;","&#xe66a;","&#xe667;","&#xe7ae;","&#xe665;","&#xe664;","&#xe716;","&#xe656;","&#xe653;","&#xe663;","&#xe6c6;","&#xe6c5;","&#xe662;","&#xe661;","&#xe660;","&#xe65d;","&#xe65f;","&#xe671;","&#xe65e;","&#xe659;","&#xe735;","&#xe756;","&#xe65c;","&#xe715;","&#xe705;","&#xe6b2;","&#xe6af;","&#xe69c;","&#xe698;","&#xe657;","&#xe65b;","&#xe65a;","&#xe681;","&#xe67c;","&#xe601;","&#xe857;","&#xe655;","&#xe770;","&#xe670;","&#xe63d;","&#xe63e;","&#xe654;","&#xe652;","&#xe651;","&#xe6fc;","&#xe6ed;","&#xe688;","&#xe645;","&#xe64f;","&#xe64e;","&#xe64b;","&#xe62b;","&#xe64d;","&#xe64a;","&#xe64c;","&#xe650;","&#xe649;","&#xe648;","&#xe647;","&#xe646;","&#xe644;","&#xe62a;","&#xe643;","&#xe63f;","&#xe642;","&#xe641;","&#xe640;","&#xe63c;","&#xe63b;","&#xe63a;","&#xe639;","&#xe638;","&#xe637;","&#xe636;","&#xe635;","&#xe634;","&#xe633;","&#xe632;","&#xe631;","&#xe630;","&#xe62f;","&#xe62e;","&#xe62d;","&#xe62c;","&#xe629;","&#xe628;","&#xe625;","&#xe623;","&#xe621;","&#xe620;","&#xe61f;","&#xe61c;","&#xe60b;","&#xe619;","&#xe61a;","&#xe603;","&#xe602;","&#xe617;","&#xe615;","&#xe614;","&#xe613;","&#xe612;","&#xe611;","&#xe60f;","&#xe60e;","&#xe60d;","&#xe60c;","&#xe60a;","&#xe609;","&#xe605;","&#xe607;","&#xe606;","&#xe604;","&#xe600;","&#xe658;","&#x1007;","&#x1006;","&#x1005;","&#xe608;"]; + } + } + }; + + a.init(); + return new IconPicker(); + }; + + /** + * 选中图标 + * @param filter lay-filter + * @param iconName 图标名称,自动识别fontClass/unicode + */ + IconPicker.prototype.checkIcon = function (filter, iconName){ + var el = $('*[lay-filter='+ filter +']'), + p = el.next().find('.layui-iconpicker-item .layui-icon'), + c = iconName; + + if (c.indexOf('#xe') > 0){ + p.html(c); + } else { + p.html('').attr('class', 'layui-icon ' + c); + } + el.attr('value', c).val(c); + }; + + var iconPicker = new IconPicker(); + exports(_MOD, iconPicker); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/loading.js b/public/static/component/pear/module/loading.js new file mode 100644 index 0000000..e9f6f1a --- /dev/null +++ b/public/static/component/pear/module/loading.js @@ -0,0 +1,2097 @@ +layui.define(['table', 'jquery', 'element'], function (exports) { + "use strict"; + + var MOD_NAME = 'loading', + $ = layui.jquery, + element = layui.element; + + var pearOper = new function () { + + this.blockRemove = function(dom,time){ + Notiflix.Block.Remove(dom, time); + } + + this.block = function(option){ + + if(option.type==1){ + Notiflix.Block.Standard( + option.elem + ,option.msg); + } + else if(option.type==2){ + Notiflix.Block.Hourglass( + option.elem + ,option.msg); + } + else if(option.type==3){ + Notiflix.Block.Circle( + option.elem + ,option.msg); + } + else if(option.type==4){ + + Notiflix.Block.Arrows( + option.elem + ,option.msg); + } + else if(option.type==5){ + Notiflix.Block.Dots( + option.elem + ,option.msg); + } + else if(option.type==6){ + Notiflix.Block.Pulse( + option.elem + ,option.msg); + } + } + + this.report = function(option){ + if(option.type=="success"){ + Notiflix.Report.Success( + option.title, + option.message,'确认'); + }else if(option.type=="failure"){ + Notiflix.Report.Failure( + option.title, + option.message,'确认'); + }else if(option.type=="warning"){ + Notiflix.Report.Warning( + option.title, + option.message,'确认'); + }else if(option.type=="info"){ + Notiflix.Report.Info( + option.title, + option.message,'确认'); + } + } + + this.notice = function(option){ + Notiflix.Notify.Init({ + position:option.position?"right-top":option.position, + }); + if(option.type=="success"){ + + Notiflix.Notify.Success(option.title); + }else if(option.type=="failure"){ + + Notiflix.Notify.Failure(option.title); + }else if(option.type=="warning"){ + + Notiflix.Notify.Warning(option.title); + }else if(option.type=="info"){ + + Notiflix.Notify.Info(option.title); + } + } + + this.confirm = function(option){ + Notiflix.Confirm.Show( + option.title, + option.message, + '确认', + '取消', + option.success, + option.cancle + ); + } + + this.drawer = function(position,dom,distance){ + var _right = new mSlider({ + dom: dom, + direction: position, + distance:distance + }); + _right.open(); + } + + this.loadRemove = function(time){ + Notiflix.Loading.Remove(time); + } + + this.Load = function(type,message){ + if(type==1){ + Notiflix.Loading.Standard(message); + }else if(type==2){ + Notiflix.Loading.Hourglass(message); + }else if(type==3){ + Notiflix.Loading.Circle(message); + }else if(type==4){ + Notiflix.Loading.Dots(message); + }else if(type==5){ + Notiflix.Loading.Pulse(message); + } + } + + this.msg = function(option){ + if(option.type=="success"){ + + layer.msg(option.title,{icon:1,time:option.time},option.callback); + + }else if(option.type=="failure"){ + + layer.msg(option.title,{icon:2,time:option.time},option.callback); + + }else if(option.type=="warning"){ + + layer.msg(option.title,{icon:3,time:option.time},option.callback); + + }else if(option.type=="info"){ + + layer.msg(option.title,{icon:4,time:option.time},option.callback); + } + } + }; + + // Notiflix: Notify Default Settings on + var notifySettings = { + wrapID: 'NotiflixNotifyWrap', // can not customizable + width: '280px', + position: 'right-top', // 'right-top' - 'right-bottom' - 'left-top' - 'left-bottom' + distance: '10px', + opacity: 1, + borderRadius: '5px', + rtl: false, + timeout: 3000, + messageMaxLength: 110, + backOverlay: false, + backOverlayColor: 'rgba(0,0,0,0.5)', + plainText: true, + showOnlyTheLastOne: false, + clickToClose: false, + + ID: 'NotiflixNotify', + className: 'notiflix-notify', + zindex: 4001, + useGoogleFont: true, + fontFamily: 'Quicksand', + fontSize: '13px', + cssAnimation: true, + cssAnimationDuration: 400, + cssAnimationStyle: 'fade', // 'fade' - 'zoom' - 'from-right' - 'from-top' - 'from-bottom' - 'from-left' + closeButton: false, + useIcon: true, + useFontAwesome: false, + fontAwesomeIconStyle: 'basic', // 'basic' - 'shadow' + fontAwesomeIconSize: '34px', + + success: { + background: '#32c682', + textColor: '#fff', + childClassName: 'success', + notiflixIconColor: 'rgba(0,0,0,0.2)', + fontAwesomeClassName: 'fas fa-check-circle', + fontAwesomeIconColor: 'rgba(0,0,0,0.2)', + }, + + failure: { + background: '#ff5549', + textColor: '#fff', + childClassName: 'failure', + notiflixIconColor: 'rgba(0,0,0,0.2)', + fontAwesomeClassName: 'fas fa-times-circle', + fontAwesomeIconColor: 'rgba(0,0,0,0.2)', + }, + + warning: { + background: '#eebf31', + textColor: '#fff', + childClassName: 'warning', + notiflixIconColor: 'rgba(0,0,0,0.2)', + fontAwesomeClassName: 'fas fa-exclamation-circle', + fontAwesomeIconColor: 'rgba(0,0,0,0.2)', + }, + + info: { + background: '#26c0d3', + textColor: '#fff', + childClassName: 'info', + notiflixIconColor: 'rgba(0,0,0,0.2)', + fontAwesomeClassName: 'fas fa-info-circle', + fontAwesomeIconColor: 'rgba(0,0,0,0.2)', + }, + }; + // Notiflix: Notify Default Settings off + + // Notiflix: Report Default Settings on + var reportSettings = { + ID: 'NotiflixReportWrap', // can not customizable + className: 'notiflix-report', + width: '320px', + backgroundColor: '#f8f8f8', + borderRadius: '25px', + rtl: false, + zindex: 4002, + backOverlay: true, + backOverlayColor: 'rgba(0, 0, 0, 0.5)', + useGoogleFont: true, + fontFamily: 'Quicksand', + svgSize: '110px', + plainText: true, + titleFontSize: '16px', + titleMaxLength: 34, + messageFontSize: '13px', + messageMaxLength: 400, + buttonFontSize: '14px', + buttonMaxLength: 34, + cssAnimation: true, + cssAnimationDuration: 360, + cssAnimationStyle: 'fade', // 'fade' - 'zoom' + + success: { + svgColor: '#32c682', + titleColor: '#1e1e1e', + messageColor: '#242424', + buttonBackground: '#32c682', + buttonColor: '#fff', + }, + + failure: { + svgColor: '#ff5549', + titleColor: '#1e1e1e', + messageColor: '#242424', + buttonBackground: '#ff5549', + buttonColor: '#fff', + }, + + warning: { + svgColor: '#eebf31', + titleColor: '#1e1e1e', + messageColor: '#242424', + buttonBackground: '#eebf31', + buttonColor: '#fff', + }, + + info: { + svgColor: '#26c0d3', + titleColor: '#1e1e1e', + messageColor: '#242424', + buttonBackground: '#26c0d3', + buttonColor: '#fff', + }, + }; + // Notiflix: Report Default Settings off + + // Notiflix: Confirm Default Settings on + var confirmSettings = { + ID: 'NotiflixConfirmWrap', // can not customizable + className: 'notiflix-confirm', + width: '300px', + zindex: 4003, + position: 'center', // 'center' - 'center-top' - 'right-top' - 'right-bottom' - 'left-top' - 'left-bottom' + distance: '10px', + backgroundColor: '#f8f8f8', + borderRadius: '25px', + backOverlay: true, + backOverlayColor: 'rgba(0,0,0,0.5)', + rtl: false, + useGoogleFont: true, + fontFamily: 'Quicksand', + cssAnimation: true, + cssAnimationStyle: 'fade', // 'zoom' - 'fade' + cssAnimationDuration: 300, + plainText: true, + + titleColor: '#32c682', + titleFontSize: '16px', + titleMaxLength: 34, + + messageColor: '#1e1e1e', + messageFontSize: '14px', + messageMaxLength: 110, + + buttonsFontSize: '15px', + buttonsMaxLength: 34, + okButtonColor: '#f8f8f8', + okButtonBackground: '#32c682', + cancelButtonColor: '#f8f8f8', + cancelButtonBackground: '#a9a9a9', + }; + // Notiflix: Confirm Default Settings off + + // Notiflix: Loading Default Settings on + var loadingSettings = { + ID: 'NotiflixLoadingWrap', // can not customizable + className: 'notiflix-loading', + zindex: 4000, + backgroundColor: 'rgba(0,0,0,0.8)', + rtl: false, + useGoogleFont: true, + fontFamily: 'Quicksand', + cssAnimation: true, + cssAnimationDuration: 400, + clickToClose: false, + customSvgUrl: null, + svgSize: '80px', + svgColor: '#32c682', + messageID: 'NotiflixLoadingMessage', + messageFontSize: '15px', + messageMaxLength: 34, + messageColor: '#dcdcdc', + }; + // Notiflix: Loading Default Settings off + + // Notiflix: Block Default Settings on + var blockSettings = { + ID: 'NotiflixBlockWrap', // can not customizable + querySelectorLimit: 200, + className: 'notiflix-block', + position: 'absolute', + zindex: 1000, + backgroundColor: 'rgba(255,255,255,0.9)', + rtl: false, + useGoogleFont: true, + fontFamily: 'Quicksand', + cssAnimation: true, + cssAnimationDuration: 300, + svgSize: '45px', + svgColor: '#383838', + messageFontSize: '14px', + messageMaxLength: 34, + messageColor: '#383838', + }; + // Notiflix: Block Default Settings off + + // Notiflix: Extend on + var extendNotiflix = function () { + // variables + var extended = {}; + var deep = false; + var i = 0; + // check if a deep merge + if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') { + deep = arguments[0]; + i++; + } + // merge the object into the extended object + var merge = function (obj) { + for (var prop in obj) { + if (Object.prototype.hasOwnProperty.call(obj, prop)) { + // if property is an object, merge properties + if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') { + extended[prop] = extendNotiflix(extended[prop], obj[prop]); + } else { + extended[prop] = obj[prop]; + } + } + } + }; + // loop through each object and conduct a merge + for (; i < arguments.length; i++) { + merge(arguments[i]); + } + return extended; + }; + // Notiflix: Extend off + + // Notiflix: Plaintext on + var notiflixPlaintext = function (html) { + var htmlPool = document.createElement('div'); + htmlPool.innerHTML = html; + return htmlPool.textContent || htmlPool.innerText || ''; + }; + // Notiflix: Plaintext off + + // Notiflix: GoogleFont on + var notiflixGoogleFont = function (use, family) { + if (!document.getElementById('NotiflixQuicksand') && use && (family && typeof family === 'string' && family.toLowerCase() === 'quicksand')) { + // google fonts dns prefetch on + var dns = ''; + var dnsRange = document.createRange(); + dnsRange.selectNode(document.head); + var dnsFragment = dnsRange.createContextualFragment(dns); + document.head.appendChild(dnsFragment); + // google fonts dns prefetch off + + // google fonts style on + var font = ''; + var fontRange = document.createRange(); + fontRange.selectNode(document.head); + var fontFragment = fontRange.createContextualFragment(font); + document.head.appendChild(fontFragment); + // google fonts style off + } + }; + // Notiflix: GoogleFont off + + // Notiflix: Console Error on + var notiflixConsoleError = function (title, message) { + return console.error('%c ' + title + ' ', 'padding:2px;border-radius:20px;color:#fff;background:#ff5549', '\n' + message + '\nVisit documentation page to learn more: https://www.notiflix.com/documentation'); + }; + // Notiflix: Console Error off + + // Notiflix: Console Log on + var notiflixConsoleLog = function (title, message) { + return console.log('%c ' + title + ' ', 'padding:2px;border-radius:20px;color:#fff;background:#26c0d3', '\n' + message + '\nVisit documentation page to learn more: https://www.notiflix.com/documentation'); + }; + // Notiflix: Console Log off + + // Notiflix: Main on + var newNotifySettings; + var newReportSettings; + var newConfirmSettings; + var newLoadingSettings; + var newBlockSettings; + var Notiflix = { + // Notify on + Notify: { + + // Init + Init: function (userNotifyOpt) { + // extend options + newNotifySettings = extendNotiflix(true, notifySettings, userNotifyOpt); + // use GoogleFonts if "Quicksand" + notiflixGoogleFont(newNotifySettings.useGoogleFont, newNotifySettings.fontFamily); + }, + + // Merge First Init + Merge: function (userNotifyExtend) { + // if initialized already + if (newNotifySettings) { + newNotifySettings = extendNotiflix(true, newNotifySettings, userNotifyExtend); + } + // initialize first + else { + notiflixConsoleError('Notiflix Error', 'You have to initialize the Notify module before call Merge function.'); + return false; + } + }, + + // Display Notification: Success + Success: function (message, callback) { + // if not initialized pretend like init + if (!newNotifySettings) { + Notiflix.Notify.Init({}); + } + var theType = newNotifySettings.success; + NotiflixNotify(message, callback, theType, 'Success'); + }, + + // Display Notification: Failure + Failure: function (message, callback) { + // if not initialized pretend like init + if (!newNotifySettings) { + Notiflix.Notify.Init({}); + } + var theType = newNotifySettings.failure; + NotiflixNotify(message, callback, theType, 'Failure'); + }, + + // Display Notification: Warning + Warning: function (message, callback) { + // if not initialized pretend like init + if (!newNotifySettings) { + Notiflix.Notify.Init({}); + } + var theType = newNotifySettings.warning; + NotiflixNotify(message, callback, theType, 'Warning'); + }, + + // Display Notification: Info + Info: function (message, callback) { + // if not initialized pretend like init + if (!newNotifySettings) { + Notiflix.Notify.Init({}); + } + var theType = newNotifySettings.info; + NotiflixNotify(message, callback, theType, 'Info'); + }, + }, + // Notify off + + // Report on + Report: { + + // Init + Init: function (userReportOpt) { + // extend options + newReportSettings = extendNotiflix(true, reportSettings, userReportOpt); + // use GoogleFonts if "Quicksand" + notiflixGoogleFont(newReportSettings.useGoogleFont, newReportSettings.fontFamily); + }, + + // Merge First Init + Merge: function (userReportExtend) { + // if initialized already + if (newReportSettings) { + newReportSettings = extendNotiflix(true, newReportSettings, userReportExtend); + } + // initialize first + else { + notiflixConsoleError('Notiflix Error', 'You have to initialize the Report module before call Merge function.'); + return false; + } + }, + + // Display Report: Success + Success: function (title, message, buttonText, buttonCallback) { + // if not initialized pretend like init + if (!newReportSettings) { + Notiflix.Report.Init({}); + } + var theType = newReportSettings.success; + NotiflixReport(title, message, buttonText, buttonCallback, theType, 'Success'); + }, + + // Display Report: Failure + Failure: function (title, message, buttonText, buttonCallback) { + // if not initialized pretend like init + if (!newReportSettings) { + Notiflix.Report.Init({}); + } + var theType = newReportSettings.failure; + NotiflixReport(title, message, buttonText, buttonCallback, theType, 'Failure'); + }, + + // Display Report: Warning + Warning: function (title, message, buttonText, buttonCallback) { + // if not initialized pretend like init + if (!newReportSettings) { + Notiflix.Report.Init({}); + } + var theType = newReportSettings.warning; + NotiflixReport(title, message, buttonText, buttonCallback, theType, 'Warning'); + }, + + // Display Report: Info + Info: function (title, message, buttonText, buttonCallback) { + // if not initialized pretend like init + if (!newReportSettings) { + Notiflix.Report.Init({}); + } + var theType = newReportSettings.info; + NotiflixReport(title, message, buttonText, buttonCallback, theType, 'Info'); + }, + }, + // Report off + + // Confirm on + Confirm: { + + // Init + Init: function (userConfirmOpt) { + // extend options + newConfirmSettings = extendNotiflix(true, confirmSettings, userConfirmOpt); + // use GoogleFonts if "Quicksand" + notiflixGoogleFont(newConfirmSettings.useGoogleFont, newConfirmSettings.fontFamily); + }, + + // Merge First Init + Merge: function (userConfirmExtend) { + // if initialized already + if (newConfirmSettings) { + newConfirmSettings = extendNotiflix(true, newConfirmSettings, userConfirmExtend); + } + // initialize first + else { + notiflixConsoleError('Notiflix Error', 'You have to initialize the Confirm module before call Merge function.'); + return false; + } + }, + + // Display Confirm: Show + Show: function (title, message, okText, cancelText, okCallback, cancelCallback) { + if (!title) { title = 'Notiflix Confirm'; } + if (!message) { message = 'Do you agree with me?'; } + if (!okText) { okText = 'Yes'; } + if (!cancelText) { cancelText = 'No'; } + if (!okCallback) { okCallback = undefined; } + if (!cancelCallback) { cancelCallback = undefined; } + NotiflixConfirm(title, message, okText, cancelText, okCallback, cancelCallback); + }, + }, + // Confirm off + + // Loading on + Loading: { + + // Init + Init: function (userLoadingOpt) { + // extend options + newLoadingSettings = extendNotiflix(true, loadingSettings, userLoadingOpt); + // use GoogleFonts if "Quicksand" + notiflixGoogleFont(newLoadingSettings.useGoogleFont, newLoadingSettings.fontFamily); + }, + + // Merge First Init + Merge: function (userLoadingExtend) { + // if initialized already + if (newLoadingSettings) { + newLoadingSettings = extendNotiflix(true, newLoadingSettings, userLoadingExtend); + } + // initialize first + else { + notiflixConsoleError('Notiflix Error', 'You have to initialize the Loading module before call Merge function.'); + return false; + } + }, + + // Display Loading: Standard + Standard: function (message) { + NotiflixLoading(message, 'standard', true, 0); // true => display || 0 => delay + }, + + // Display Loading: Hourglass + Hourglass: function (message) { + NotiflixLoading(message, 'hourglass', true, 0); // true => display || 0 => delay + }, + + // Display Loading: Circle + Circle: function (message) { + NotiflixLoading(message, 'circle', true, 0); // true => display || 0 => delay + }, + + // Display Loading: Arrows + Arrows: function (message) { + NotiflixLoading(message, 'arrows', true, 0); // true => display || 0 => delay + }, + + // Display Loading: Dots + Dots: function (message) { + NotiflixLoading(message, 'dots', true, 0); // true => display || 0 => delay + }, + + // Display Loading: Pulse + Pulse: function (message) { + NotiflixLoading(message, 'pulse', true, 0); // true => display || 0 => delay + }, + + // Display Loading: Custom + Custom: function (message) { + NotiflixLoading(message, 'custom', true, 0); // true => display || 0 => delay + }, + + // Display Loading: Notiflix + Notiflix: function (message) { + NotiflixLoading(message, 'notiflix', true, 0); // true => display || 0 => delay + }, + + // Remove Loading + Remove: function (theDelay) { + if (!theDelay) { theDelay = 0; } + NotiflixLoading(false, false, false, theDelay); // false = Remove + }, + + // Change The Message + Change: function (newMessage) { + NotiflixLoadingChange(newMessage); + }, + }, + // Loading off + + // Block on + Block: { + + // Initialize + Init: function (userBlockOpt) { + // extend options + newBlockSettings = extendNotiflix(true, blockSettings, userBlockOpt); + // use GoogleFonts if "Quicksand" + notiflixGoogleFont(newBlockSettings.useGoogleFont, newBlockSettings.fontFamily); + }, + + // Merge First Initialize + Merge: function (userBlockExtend) { + // if initialized already + if (newBlockSettings) { + newBlockSettings = extendNotiflix(true, newBlockSettings, userBlockExtend); + } + // initialize first + else { + notiflixConsoleError('Notiflix Error', 'You have to initialize the "Notiflix.Block" module before call Merge function.'); + return false; + } + }, + + // Display Block: Standard + Standard: function (selector, message) { + var block = true; + var theIcon = 'standard'; + NotiflixBlockUnblockElement(block, selector, theIcon, message); + }, + + // Display Block: Hourglass + Hourglass: function (selector, message) { + var block = true; + var theIcon = 'hourglass'; + NotiflixBlockUnblockElement(block, selector, theIcon, message); + }, + + // Display Block: Circle + Circle: function (selector, message) { + var block = true; + var theIcon = 'circle'; + NotiflixBlockUnblockElement(block, selector, theIcon, message); + }, + + // Display Block: Arrows + Arrows: function (selector, message) { + var block = true; + var theIcon = 'arrows'; + NotiflixBlockUnblockElement(block, selector, theIcon, message); + }, + + // Display Block: Dots + Dots: function (selector, message) { + var block = true; + var theIcon = 'dots'; + NotiflixBlockUnblockElement(block, selector, theIcon, message); + }, + + // Display Block: Pulse + Pulse: function (selector, message) { + var block = true; + var theIcon = 'pulse'; + NotiflixBlockUnblockElement(block, selector, theIcon, message); + }, + + // Remove Block + Remove: function (selector, delay) { + var block = false; + var theIcon = null; + var message = null; + NotiflixBlockUnblockElement(block, selector, theIcon, message, delay); + }, + }, + // Block off + }; + // Notiflix: Main off + + + // Notiflix: Notify Single on + var notiflixNotifyCount = 0; + var NotiflixNotify = function (message, callback, theType, staticType) { + if (arguments && arguments.length === 4) { + + // notify counter on + notiflixNotifyCount++; + // notify counter off + + // if no message on + if (!message) { + message = 'Notiflix ' + staticType; + } + // if no message off + + // if plainText true = HTML tags not allowed on + if (newNotifySettings.plainText) { + message = notiflixPlaintext(message); // message plain text + } + // if plainText true = HTML tags not allowed off + + // if plainText false but the message length more than messageMaxLength = HTML tags error on + if (!newNotifySettings.plainText && message.length > newNotifySettings.messageMaxLength) { + Notiflix.Notify.Merge({ closeButton: true, plainText: false, }); + message = 'HTML Tags Error: Your content length is more than "messageMaxLength" option.'; // message html error + } + // if plainText false but the message length more than messageMaxLength = HTML tags error off + + // message max length substring on + if (message.length > newNotifySettings.messageMaxLength) { + message = message.substring(0, newNotifySettings.messageMaxLength) + '...'; + } + // message max length substring off + + // font awesome icon style on + if (newNotifySettings.fontAwesomeIconStyle === 'shadow') { + theType.fontAwesomeIconColor = theType.background; + } + // font awesome icon style off + + // if cssAnimaion false -> duration on + if (!newNotifySettings.cssAnimation) { + newNotifySettings.cssAnimationDuration = 0; + } + // if cssAnimaion false -> duration off + + // notify wrap on + var docBody = document.body; + var ntflxNotifyWrap = document.createElement('div'); + ntflxNotifyWrap.id = notifySettings.wrapID; + ntflxNotifyWrap.style.width = newNotifySettings.width; + ntflxNotifyWrap.style.zIndex = newNotifySettings.zindex; + ntflxNotifyWrap.style.opacity = newNotifySettings.opacity; + + // wrap position on + if (newNotifySettings.position === 'right-bottom') { + ntflxNotifyWrap.style.right = newNotifySettings.distance; + ntflxNotifyWrap.style.bottom = newNotifySettings.distance; + ntflxNotifyWrap.style.top = 'auto'; + ntflxNotifyWrap.style.left = 'auto'; + } else if (newNotifySettings.position === 'left-top') { + ntflxNotifyWrap.style.left = newNotifySettings.distance; + ntflxNotifyWrap.style.top = newNotifySettings.distance; + ntflxNotifyWrap.style.right = 'auto'; + ntflxNotifyWrap.style.bottom = 'auto'; + } else if (newNotifySettings.position === 'left-bottom') { + ntflxNotifyWrap.style.left = newNotifySettings.distance; + ntflxNotifyWrap.style.bottom = newNotifySettings.distance; + ntflxNotifyWrap.style.top = 'auto'; + ntflxNotifyWrap.style.right = 'auto'; + } else { // 'right-top' or else + ntflxNotifyWrap.style.right = newNotifySettings.distance; + ntflxNotifyWrap.style.top = newNotifySettings.distance; + ntflxNotifyWrap.style.left = 'auto'; + ntflxNotifyWrap.style.bottom = 'auto'; + } + // wrap position off + + // if background overlay true on + var notifyOverlay; + if (newNotifySettings.backOverlay) { + notifyOverlay = document.createElement('div'); + notifyOverlay.id = newNotifySettings.ID + 'Overlay'; + notifyOverlay.style.width = '100%'; + notifyOverlay.style.height = '100%'; + notifyOverlay.style.position = 'fixed'; + notifyOverlay.style.zIndex = newNotifySettings.zindex; + notifyOverlay.style.left = 0; + notifyOverlay.style.top = 0; + notifyOverlay.style.right = 0; + notifyOverlay.style.bottom = 0; + notifyOverlay.style.background = newNotifySettings.backOverlayColor; + notifyOverlay.className = (newNotifySettings.cssAnimation ? 'with-animation' : ''); + notifyOverlay.style.animationDuration = (newNotifySettings.cssAnimation) ? newNotifySettings.cssAnimationDuration + 'ms' : ''; + if (!document.getElementById(notifyOverlay.id)) { + docBody.appendChild(notifyOverlay); + } + } + // if background overlay true off + + if (!document.getElementById(ntflxNotifyWrap.id)) { + docBody.appendChild(ntflxNotifyWrap); + } + // notify wrap off + + // notify content on + var ntflxNotify = document.createElement('div'); + ntflxNotify.id = newNotifySettings.ID + '-' + notiflixNotifyCount; + ntflxNotify.className = newNotifySettings.className + ' ' + theType.childClassName + ' ' + (newNotifySettings.cssAnimation ? 'with-animation' : '') + ' ' + (newNotifySettings.useIcon ? 'with-icon' : '') + ' nx-' + newNotifySettings.cssAnimationStyle + ' ' + (newNotifySettings.closeButton && !callback ? 'with-close-button' : '') + ' ' + (callback && typeof callback === 'function' ? 'with-callback' : '') + ' ' + (newNotifySettings.clickToClose ? 'click-to-close' : ''); + ntflxNotify.style.fontSize = newNotifySettings.fontSize; + ntflxNotify.style.color = theType.textColor; + ntflxNotify.style.background = theType.background; + ntflxNotify.style.borderRadius = newNotifySettings.borderRadius; + + // rtl on + if (newNotifySettings.rtl) { + ntflxNotify.setAttribute('dir', 'rtl'); + ntflxNotify.classList.add('rtl-on'); + } + // rtl off + + // font-family on + ntflxNotify.style.fontFamily = '"' + newNotifySettings.fontFamily + '"' + ', sans-serif'; + // font-family off + + // use css animation on + if (newNotifySettings.cssAnimation) { + ntflxNotify.style.animationDuration = newNotifySettings.cssAnimationDuration + 'ms'; + } + // use css animation off + + // close button element on + var closeButtonHTML = ''; + if (newNotifySettings.closeButton && !callback) { + closeButtonHTML = ''; + } + // close buttpon element off + + // use icon on + if (newNotifySettings.useIcon) { + // use font awesome + if (newNotifySettings.useFontAwesome) { + ntflxNotify.innerHTML = '' + message + '' + (newNotifySettings.closeButton ? closeButtonHTML : ''); + } + // use notiflix icon + else { + var svgIcon; + if (staticType === 'Success') { // success + svgIcon = ''; + } else if (staticType === 'Failure') { // failure + svgIcon = ''; + } else if (staticType === 'Warning') { // warning + svgIcon = ''; + } else if (staticType === 'Info') { // info + svgIcon = ''; + } else { + svgIcon = ''; + } + ntflxNotify.innerHTML = svgIcon + '' + message + '' + (newNotifySettings.closeButton ? closeButtonHTML : ''); + } + } + // without icon + else { + ntflxNotify.innerHTML = '' + message + '' + (newNotifySettings.closeButton ? closeButtonHTML : ''); + } + // use icon off + // notify content off + + // notify append or prepend on + if (newNotifySettings.position === 'left-bottom' || newNotifySettings.position === 'right-bottom') { // the new one will be first + var notifyWrap = document.getElementById(ntflxNotifyWrap.id); + notifyWrap.insertBefore(ntflxNotify, notifyWrap.firstChild); + } else { + document.getElementById(ntflxNotifyWrap.id).appendChild(ntflxNotify); + } + + if (newNotifySettings.useIcon) { // if useIcon, dynamically vertical align the contents + var messageIcon = document.getElementById(ntflxNotify.id).querySelectorAll('.nmi')[0]; + var messageIconH = 40; + // if font awesome + if (newNotifySettings.useFontAwesome) { + messageIconH = Math.round(parseInt(messageIcon.offsetHeight)); + } + // if notiflix SVG + else { + var SvgBBox = messageIcon.getBBox(); + messageIconH = Math.round(parseInt(SvgBBox.width)); + } + var messageText = document.getElementById(ntflxNotify.id).querySelectorAll('span')[0]; + var messageTextH = Math.round(messageText.offsetHeight); + if (messageTextH <= messageIconH) { + messageText.style.paddingTop = (messageIconH - messageTextH) / 2 + 'px'; + messageText.style.paddingBottom = (messageIconH - messageTextH) / 2 + 'px'; + } + } + // notify append or prepend off + + // remove by timeout or click on + if (document.getElementById(ntflxNotify.id)) { + // set elements on + var removeDiv = document.getElementById(ntflxNotify.id); + var removeWrap = document.getElementById(ntflxNotifyWrap.id); + var removeOverlay; + if (newNotifySettings.backOverlay) { + removeOverlay = document.getElementById(notifyOverlay.id); + } + // set elements on + + // timeout vars on + var timeoutHide; + var timeoutRemove; + // timeout vars off + + // hide notify elm and hide overlay on + var hideNotifyElementsAndOverlay = function () { + removeDiv.classList.add('remove'); + if (newNotifySettings.backOverlay && removeWrap.childElementCount <= 0) { + removeOverlay.classList.add('remove'); + } + clearTimeout(timeoutHide); + }; + // hide notify elm and hide overlay off + + // remove notify elm and wrapper on + var removeNotifyElmentsAndWrapper = function () { + var notifyExist = document.getElementById(ntflxNotify.id); + if (notifyExist && removeDiv.parentNode !== null) { + removeDiv.parentNode.removeChild(removeDiv); + } + if (removeWrap.childElementCount <= 0 && removeWrap.parentNode !== null) { // if childs count === 0 remove wrap + removeWrap.parentNode.removeChild(removeWrap); + if (newNotifySettings.backOverlay && removeOverlay.parentNode !== null) { + removeOverlay.parentNode.removeChild(removeOverlay); + } + } + clearTimeout(timeoutRemove); + }; + // remove notify elm and wrapper off + + // if close button and callback undefined on + if (newNotifySettings.closeButton && !callback) { + var closeButtonElm = document.getElementById(ntflxNotify.id).querySelectorAll('span.notify-close-button')[0]; + closeButtonElm.addEventListener('click', function () { + hideNotifyElementsAndOverlay(); + var clickToCloseTimeout = setTimeout(function () { + removeNotifyElmentsAndWrapper(); + clearTimeout(clickToCloseTimeout); + }, newNotifySettings.cssAnimationDuration); + }); + } + // if close button and callback undefined off + + // if callback or click to close on + if ((callback && typeof callback === 'function') || newNotifySettings.clickToClose) { + removeDiv.addEventListener('click', function (e) { + if (callback && typeof callback === 'function') { + callback(); + } + hideNotifyElementsAndOverlay(); + var callbackTimeout = setTimeout(function () { + removeNotifyElmentsAndWrapper(); + clearTimeout(callbackTimeout); + }, newNotifySettings.cssAnimationDuration); + }); + } + // if callback or click to close off + + // else auto remove on + if (!newNotifySettings.closeButton && !callback) { + timeoutHide = setTimeout(function () { + hideNotifyElementsAndOverlay(); + }, newNotifySettings.timeout); + timeoutRemove = setTimeout(function () { + removeNotifyElmentsAndWrapper(); + }, newNotifySettings.timeout + newNotifySettings.cssAnimationDuration); + } + // else auto remove off + } + // remove by timeout or click off + + // notify - show only the last one on + if (newNotifySettings.showOnlyTheLastOne && notiflixNotifyCount > 0) { + var allNotifyElmNotTheLastOne = document.querySelectorAll('[id^=' + newNotifySettings.ID + '-]:not([id=' + newNotifySettings.ID + '-' + notiflixNotifyCount + '])'); + for (var i = 0; i < allNotifyElmNotTheLastOne.length; i++) { + var eachNotifyElmNotLastOne = allNotifyElmNotTheLastOne[i]; + if (eachNotifyElmNotLastOne.parentNode !== null) { + eachNotifyElmNotLastOne.parentNode.removeChild(eachNotifyElmNotLastOne); + } + } + } + // notify - show only the last one off + + } else { + notiflixConsoleError('Notiflix Error', 'Where is the arguments?'); + } + }; + // Notiflix: Notify Single off + + + // Notiflix: Report Single on + var NotiflixReport = function (title, message, buttonText, buttonCallback, theType, staticType) { + + // check the arguments on + if (!title) { title = 'Notiflix ' + staticType; } + if (!message) { + if (staticType === 'Success') { + message = '"Do not try to become a person of success but try to become a person of value."

                                  - Albert Einstein'; + } + else if (staticType === 'Failure') { + message = '"Failure is simply the opportunity to begin again, this time more intelligently."

                                  - Henry Ford'; + } + else if (staticType === 'Warning') { + message = '"The peoples who want to live comfortably without producing and fatigue; they are doomed to lose their dignity, then liberty, and then independence and destiny."

                                  - Mustafa Kemal Ataturk'; + } + else if (staticType === 'Info') { + message = '"Knowledge rests not upon truth alone, but upon error also."

                                  - Carl Gustav Jung'; + } + } + if (!buttonText) { buttonText = 'Okay'; } + if (!buttonCallback) { buttonCallback = undefined; } + // check the arguments off + + // if plainText true = HTML tags not allowed on + if (newReportSettings.plainText) { + title = notiflixPlaintext(title); + message = notiflixPlaintext(message); + buttonText = notiflixPlaintext(buttonText); + } + // if plainText true = HTML tags not allowed off + + // if plainText false but the contents length more than *MaxLength = HTML tags error on + if (!newReportSettings.plainText) { + if (title.length > newReportSettings.titleMaxLength) { + title = 'HTML Tags Error'; // title html error + message = 'Your Title content length is more than "titleMaxLength" option.'; // message html error + buttonText = 'Okay'; // button html error + } + if (message.length > newReportSettings.messageMaxLength) { + title = 'HTML Tags Error'; // title html error + message = 'Your Message content length is more than "messageMaxLength" option.'; // message html error + buttonText = 'Okay'; // button html error + } + if (buttonText.length > newReportSettings.buttonMaxLength) { + title = 'HTML Tags Error'; // title html error + message = 'Your Button content length is more than "buttonMaxLength" option.'; // message html error + buttonText = 'Okay'; // button html error + } + } + // if plainText false but the contents length more than *MaxLength = HTML tags error off + + // max length on + if (title.length > newReportSettings.titleMaxLength) { + title = title.substring(0, newReportSettings.titleMaxLength) + '...'; + } + if (message.length > newReportSettings.messageMaxLength) { + message = message.substring(0, newReportSettings.messageMaxLength) + '...'; + } + if (buttonText.length > newReportSettings.buttonMaxLength) { + buttonText = buttonText.substring(0, newReportSettings.buttonMaxLength) + '...'; + } + // max length off + + // if cssAnimaion false -> duration on + if (!newReportSettings.cssAnimation) { + newReportSettings.cssAnimationDuration = 0; + } + // if cssAnimaion false -> duration off + + // report wrap on + var docBody = document.body; + var ntflxReportWrap = document.createElement('div'); + ntflxReportWrap.id = reportSettings.ID; + ntflxReportWrap.className = newReportSettings.className; + ntflxReportWrap.style.width = newReportSettings.width; + ntflxReportWrap.style.zIndex = newReportSettings.zindex; + ntflxReportWrap.style.borderRadius = newReportSettings.borderRadius; + ntflxReportWrap.style.fontFamily = '"' + newReportSettings.fontFamily + '"' + ', sans-serif'; + + // rtl on + if (newReportSettings.rtl) { + ntflxReportWrap.setAttribute('dir', 'rtl'); + ntflxReportWrap.classList.add('rtl-on'); + } + // rtl off + + // overlay on + var reportOverlay = ''; + if (newReportSettings.backOverlay) { + reportOverlay = '
                                  '; + } + // overlay off + + // svg icon on + var svgIcon = ''; + if (staticType === 'Success') { + svgIcon = notiflixReportSvgSuccess(newReportSettings.svgSize, theType.svgColor); + } else if (staticType === 'Failure') { + svgIcon = notiflixReportSvgFailure(newReportSettings.svgSize, theType.svgColor); + } else if (staticType === 'Warning') { + svgIcon = notiflixReportSvgWarning(newReportSettings.svgSize, theType.svgColor); + } else if (staticType === 'Info') { + svgIcon = notiflixReportSvgInfo(newReportSettings.svgSize, theType.svgColor); + } + // svg icon off + + ntflxReportWrap.innerHTML = reportOverlay + '
                                  ' + + '
                                  ' + svgIcon + '
                                  ' + + '
                                  ' + title + '
                                  ' + + '

                                  ' + message + '

                                  ' + + '' + buttonText + '' + + '
                                  '; + + // if there is no report element + if (!document.getElementById(ntflxReportWrap.id)) { + // append + docBody.appendChild(ntflxReportWrap); + + // vertical align on + var windowH = Math.round(window.innerHeight); + var reportH = Math.round(document.getElementById(ntflxReportWrap.id).offsetHeight); + ntflxReportWrap.style.top = (windowH - reportH) / 2 + 'px'; + // vertical align off + + // callback on + var getReportWrap = document.getElementById(ntflxReportWrap.id); + var reportButton = document.getElementById('NXReportButton'); + reportButton.addEventListener('click', function () { + // if callback on + if (buttonCallback && typeof buttonCallback === 'function') { + buttonCallback(); + } + // if callback off + + // remove element on + getReportWrap.classList.add('remove'); + var timeout = setTimeout(function () { + if (getReportWrap.parentNode !== null) { + getReportWrap.parentNode.removeChild(getReportWrap); + } + clearTimeout(timeout); + }, newReportSettings.cssAnimationDuration); + // remove element off + }); + // callback off + + } + // report wrap off + + }; + // Notiflix: Report Single off + + + // Notiflix: Confirm Single on + var NotiflixConfirm = function (title, message, okButtonText, cancelButtonText, okButtonCallback, cancelButtonCallback) { + // if not initialized pretend like init + if (!newConfirmSettings) { + Notiflix.Confirm.Init({}); + } + + // if plainText true => HTML tags not allowed on + if (newConfirmSettings.plainText) { + title = notiflixPlaintext(title); + message = notiflixPlaintext(message); + okButtonText = notiflixPlaintext(okButtonText); + cancelButtonText = notiflixPlaintext(cancelButtonText); + } + // if plainText true => HTML tags not allowed off + + // if plainText false but the contents length more than *MaxLength = HTML tags error on + if (!newConfirmSettings.plainText) { + if (title.length > newConfirmSettings.titleMaxLength) { + title = 'HTML Tags Error'; // title html error + message = 'Your Title content length is more than "titleMaxLength" option.'; // message html error + okButtonText = 'Okay'; // button html error + cancelButtonText = '...'; // button html error + } + if (message.length > newConfirmSettings.messageMaxLength) { + title = 'HTML Tags Error'; // title html error + message = 'Your Message content length is more than "messageMaxLength" option.'; // message html error + okButtonText = 'Okay'; // button html error + cancelButtonText = '...'; // button html error + } + if ((okButtonText.length || cancelButtonText.length) > newConfirmSettings.buttonsMaxLength) { + title = 'HTML Tags Error'; // title html error + message = 'Your Buttons contents length is more than "buttonsMaxLength" option.'; // message html error + okButtonText = 'Okay'; // button html error + cancelButtonText = '...'; // button html error + } + } + // if plainText false but the contents length more than *MaxLength = HTML tags error off + + // max length on + if (title.length > newConfirmSettings.titleMaxLength) { + title = title.substring(0, newConfirmSettings.titleMaxLength) + '...'; + } + if (message.length > newConfirmSettings.messageMaxLength) { + message = message.substring(0, newConfirmSettings.messageMaxLength) + '...'; + } + if (okButtonText.length > newConfirmSettings.buttonsMaxLength) { + okButtonText = okButtonText.substring(0, newConfirmSettings.buttonsMaxLength) + '...'; + } + if (cancelButtonText.length > newConfirmSettings.buttonsMaxLength) { + cancelButtonText = cancelButtonText.substring(0, newConfirmSettings.buttonsMaxLength) + '...'; + } + // max length off + + // if cssAnimaion false -> duration on + if (!newConfirmSettings.cssAnimation) { + newConfirmSettings.cssAnimationDuration = 0; + } + // if cssAnimaion false -> duration off + + // confirm wrap on + var docBody = document.body; + var ntflxConfirmWrap = document.createElement('div'); + ntflxConfirmWrap.id = confirmSettings.ID; + ntflxConfirmWrap.className = newConfirmSettings.className + (newConfirmSettings.cssAnimation ? ' with-animation nx-' + newConfirmSettings.cssAnimationStyle : ''); + ntflxConfirmWrap.style.width = newConfirmSettings.width; + ntflxConfirmWrap.style.zIndex = newConfirmSettings.zindex; + + // rtl on + if (newConfirmSettings.rtl) { + ntflxConfirmWrap.setAttribute('dir', 'rtl'); + ntflxConfirmWrap.classList.add('rtl-on'); + } + // rtl off + + // font-family on + ntflxConfirmWrap.style.fontFamily = '"' + newConfirmSettings.fontFamily + '"' + ', sans-serif'; + // font-family off + + // if background overlay true on + var confirmOverlay = ''; + if (newConfirmSettings.backOverlay) { + confirmOverlay = '
                                  '; + } + // if background overlay true off + + // if have a callback => add cancel button on + var cancelButtonHTML = ''; + if (okButtonCallback) { + cancelButtonHTML = '' + cancelButtonText + ''; + } + // if have a callback => add cancel button off + + ntflxConfirmWrap.innerHTML = confirmOverlay + + '
                                  ' + + '
                                  ' + + '
                                  ' + title + '
                                  ' + + '

                                  ' + message + '

                                  ' + + '
                                  ' + + '
                                  ' + + '' + okButtonText + '' + + cancelButtonHTML + + '
                                  ' + + '
                                  '; + // confirm wrap off + + // if there is no confirm box on + if (!document.getElementById(ntflxConfirmWrap.id)) { + docBody.appendChild(ntflxConfirmWrap); + + // position on + if (newConfirmSettings.position === 'center') { // if center-center + var windowH = Math.round(window.innerHeight); + var confirmH = Math.round(document.getElementById(ntflxConfirmWrap.id).offsetHeight); + ntflxConfirmWrap.style.top = (windowH - confirmH) / 2 + 'px'; + ntflxConfirmWrap.style.left = newConfirmSettings.distance; + ntflxConfirmWrap.style.right = newConfirmSettings.distance; + ntflxConfirmWrap.style.bottom = 'auto'; + ntflxConfirmWrap.style.margin = 'auto'; + } else if (newConfirmSettings.position === 'right-top') { // if right-top + ntflxConfirmWrap.style.right = newConfirmSettings.distance; + ntflxConfirmWrap.style.top = newConfirmSettings.distance; + ntflxConfirmWrap.style.bottom = 'auto'; + ntflxConfirmWrap.style.left = 'auto'; + ntflxConfirmWrap.style.margin = 'auto'; + } else if (newConfirmSettings.position === 'right-bottom') { // if right-bottom + ntflxConfirmWrap.style.right = newConfirmSettings.distance; + ntflxConfirmWrap.style.bottom = newConfirmSettings.distance; + ntflxConfirmWrap.style.top = 'auto'; + ntflxConfirmWrap.style.left = 'auto'; + ntflxConfirmWrap.style.margin = 'auto'; + } else if (newConfirmSettings.position === 'left-top') { // if left-top + ntflxConfirmWrap.style.left = newConfirmSettings.distance; + ntflxConfirmWrap.style.top = newConfirmSettings.distance; + ntflxConfirmWrap.style.right = 'auto'; + ntflxConfirmWrap.style.bottom = 'auto'; + ntflxConfirmWrap.style.margin = 'auto'; + } else if (newConfirmSettings.position === 'left-bottom') { // if left-bottom + ntflxConfirmWrap.style.left = newConfirmSettings.distance; + ntflxConfirmWrap.style.bottom = newConfirmSettings.distance; + ntflxConfirmWrap.style.top = 'auto'; + ntflxConfirmWrap.style.right = 'auto'; + ntflxConfirmWrap.style.margin = 'auto'; + } else { // if center-top + ntflxConfirmWrap.style.top = newConfirmSettings.distance; + ntflxConfirmWrap.style.left = 0; + ntflxConfirmWrap.style.right = 0; + ntflxConfirmWrap.style.bottom = 'auto'; + ntflxConfirmWrap.style.margin = 'auto'; + } + // position off + + // buttons listener on + var confirmCloseWrap = document.getElementById(ntflxConfirmWrap.id); + var okButton = document.getElementById('NXConfirmButtonOk'); + + // ok button listener on + okButton.addEventListener('click', function () { + // if ok callback && if ok callback is a function + if (okButtonCallback && typeof okButtonCallback === 'function') { + okButtonCallback(); + } + confirmCloseWrap.classList.add('remove'); + + var timeout = setTimeout(function () { + if (confirmCloseWrap.parentNode !== null) { + confirmCloseWrap.parentNode.removeChild(confirmCloseWrap); + clearTimeout(timeout); + } + }, newConfirmSettings.cssAnimationDuration); + }); + // ok button listener off + + // if ok callback && if ok callback a function => add Cancel Button listener on + if (okButtonCallback && typeof okButtonCallback === 'function') { + // cancel button listener on + var cancelButton = document.getElementById('NXConfirmButtonCancel'); + cancelButton.addEventListener('click', function () { + // if cancel callback && if cancel callback a function + if (cancelButtonCallback && typeof cancelButtonCallback === 'function') { + cancelButtonCallback(); + } + confirmCloseWrap.classList.add('remove'); + + var timeout = setTimeout(function () { + if (confirmCloseWrap.parentNode !== null) { + confirmCloseWrap.parentNode.removeChild(confirmCloseWrap); + clearTimeout(timeout); + } + }, newConfirmSettings.cssAnimationDuration); + }); + // cancel button listener off + } + // if ok callback && if ok callback a function => add Cancel Button listener off + // buttons listener off + } + // if there is no confirm box off + }; + // Notiflix: Confirm Single off + + + // Notiflix: Loading Single on + var NotiflixLoading = function (message, iconType, display, theDelay) { + // if not initialized pretend like init + if (!newLoadingSettings) { + Notiflix.Loading.Init({}); + } + // check the message + if (!message) { + message = ''; + } + // show loading + if (display) { + + // if message settings on + if (message.toString().length > newLoadingSettings.messageMaxLength) { + message = notiflixPlaintext(message).toString().substring(0, newLoadingSettings.messageMaxLength) + '...'; + } else { + message = notiflixPlaintext(message).toString(); + } + var intSvgSize = parseInt(newLoadingSettings.svgSize); + var messageHTML = ''; + if (message.length > 0) { + var messagePosTop = Math.round(intSvgSize - (intSvgSize / 4)).toString() + 'px'; + var messageHeight = (parseInt(newLoadingSettings.messageFontSize) * 1.4).toString() + 'px'; + messageHTML = '

                                  ' + message + '

                                  '; + } + // if message settings off + + // if cssAnimaion false -> duration on + if (!newLoadingSettings.cssAnimation) { + newLoadingSettings.cssAnimationDuration = 0; + } + // if cssAnimaion false -> duration off + + // svgIcon on + var svgIcon = ''; + if (iconType === 'standard') { + svgIcon = notiflixIndicatorSvgStandard(newLoadingSettings.svgSize, newLoadingSettings.svgColor); + } else if (iconType === 'hourglass') { + svgIcon = notiflixIndicatorSvgHourglass(newLoadingSettings.svgSize, newLoadingSettings.svgColor); + } else if (iconType === 'circle') { + svgIcon = notiflixIndicatorSvgCircle(newLoadingSettings.svgSize, newLoadingSettings.svgColor); + } else if (iconType === 'arrows') { + svgIcon = notiflixIndicatorSvgArrows(newLoadingSettings.svgSize, newLoadingSettings.svgColor); + } else if (iconType === 'dots') { + svgIcon = notiflixIndicatorSvgDots(newLoadingSettings.svgSize, newLoadingSettings.svgColor); + } else if (iconType === 'pulse') { + svgIcon = notiflixIndicatorSvgPulse(newLoadingSettings.svgSize, newLoadingSettings.svgColor); + } else if (iconType === 'custom' && newLoadingSettings.customSvgUrl !== null) { + svgIcon = 'Notiflix'; + } else if (iconType === 'custom' && newLoadingSettings.customSvgUrl == null) { + notiflixConsoleError('Notiflix Error', 'You have to set a static SVG url to "customSvgUrl" option to use Loading Custom.'); + return false; + } else if (iconType === 'notiflix') { + svgIcon = notiflixIndicatorSvgNotiflix(newLoadingSettings.svgSize, '#f8f8f8', '#32c682'); + } + var svgPosTop = 0; + if (message.length > 0) { + svgPosTop = '-' + Math.round(intSvgSize - (intSvgSize / 4)).toString() + 'px'; + } + var svgIconHTML = '
                                  ' + svgIcon + '
                                  '; + // svgIcon off + + // loading wrap on + var docBody = document.body; + var ntflxLoadingWrap = document.createElement('div'); + ntflxLoadingWrap.id = loadingSettings.ID; + ntflxLoadingWrap.className = newLoadingSettings.className + (newLoadingSettings.cssAnimation ? ' with-animation' : '') + (newLoadingSettings.clickToClose ? ' click-to-close' : ''); + ntflxLoadingWrap.style.zIndex = newLoadingSettings.zindex; + ntflxLoadingWrap.style.background = newLoadingSettings.backgroundColor; + ntflxLoadingWrap.style.animationDuration = newLoadingSettings.cssAnimationDuration + 'ms'; + ntflxLoadingWrap.style.fontFamily = '"' + newLoadingSettings.fontFamily + '"' + ', sans-serif'; + + // rtl on + if (newLoadingSettings.rtl) { + ntflxLoadingWrap.setAttribute('dir', 'rtl'); + ntflxLoadingWrap.classList.add('rtl-on'); + } + // rtl off + + // append on + ntflxLoadingWrap.innerHTML = svgIconHTML + messageHTML; + + // if there is no loading element + if (!document.getElementById(ntflxLoadingWrap.id)) { + // append + docBody.appendChild(ntflxLoadingWrap); + + // if click to close + if (newLoadingSettings.clickToClose) { + var loadingWrapElm = document.getElementById(ntflxLoadingWrap.id); + loadingWrapElm.addEventListener('click', function () { + ntflxLoadingWrap.classList.add('remove'); + var timeout = setTimeout(function () { + if (ntflxLoadingWrap.parentNode !== null) { + ntflxLoadingWrap.parentNode.removeChild(ntflxLoadingWrap); + clearTimeout(timeout); + } + }, newLoadingSettings.cssAnimationDuration); + }); + } + } + // append off + + } + // remove loading + else { + // if there is a loading element + if (document.getElementById(loadingSettings.ID)) { + var loadingElm = document.getElementById(loadingSettings.ID); + var timeout = setTimeout(function () { + loadingElm.classList.add('remove'); + var timeout2 = setTimeout(function () { + if (loadingElm.parentNode !== null) { + loadingElm.parentNode.removeChild(loadingElm); + clearTimeout(timeout2); + } + }, newLoadingSettings.cssAnimationDuration); + clearTimeout(timeout); + }, theDelay); + } + } + }; + // Notiflix: Loading Single off + + // Notiflix: Loading Change Message on + var NotiflixLoadingChange = function (newMessage) { + // check the new message + if (!newMessage) { + newMessage = ''; + } + // if has any loading + if (document.getElementById(loadingSettings.ID)) { + // if there is a new message + if (newMessage.length > 0) { + // max length on + if (newMessage.length > newLoadingSettings.messageMaxLength) { + newMessage = notiflixPlaintext(newMessage).toString().substring(0, newLoadingSettings.messageMaxLength) + '...'; + } else { + newMessage = notiflixPlaintext(newMessage).toString(); + } + // max length off + + // there is a message element + var oldMessageElm = document.getElementById(loadingSettings.ID).getElementsByTagName('p')[0]; + if (oldMessageElm) { + oldMessageElm.innerHTML = newMessage; // change the message + } + // there is no message element + else { + // create a new message element on + var newMessageHTML = document.createElement('p'); + newMessageHTML.id = newLoadingSettings.messageID; + newMessageHTML.className = 'loading-message new'; + newMessageHTML.style.color = newLoadingSettings.messageColor; + newMessageHTML.style.fontSize = newLoadingSettings.messageFontSize; + var intSvgSize = parseInt(newLoadingSettings.svgSize); + var messagePosTop = Math.round(intSvgSize - (intSvgSize / 4)).toString() + 'px'; + newMessageHTML.style.top = messagePosTop; + var messageHeight = (parseInt(newLoadingSettings.messageFontSize) * 1.4).toString() + 'px'; + newMessageHTML.style.height = messageHeight; + newMessageHTML.innerHTML = newMessage; + var messageWrap = document.getElementById(loadingSettings.ID); + messageWrap.appendChild(newMessageHTML); + // create a new message element off + + // vertical align svg on + var svgDivElm = document.getElementById(loadingSettings.ID).getElementsByTagName('div')[0]; + var svgNewPosTop = '-' + Math.round(intSvgSize - (intSvgSize / 4)).toString() + 'px'; + svgDivElm.style.top = svgNewPosTop; + // vertical align svg off + } + } + // if no message + else { + notiflixConsoleError('Notiflix Error', 'Where is the new message?'); + } + } + }; + // Notiflix: Loading Change Message off + + + // Notiflix: Block or Unblock Element on + var notiflixBlockElementCounter = 0; + var NotiflixBlockUnblockElement = function (block, selector, iconType, message, theDelay) { + + // check typeof selector on + if (typeof selector !== 'string') { + notiflixConsoleError('Notiflix Error', 'The selector must be a String.'); + return false; + } + // check typeof selector off + + // check the delay on + if (typeof theDelay !== 'number') { + theDelay = 0; + } + // check the delay off + + // check the selector on + var getSelector = document.querySelectorAll(selector); + if (getSelector.length > 0) { + + // if not initialized pretend like init on + if (!newBlockSettings) { + Notiflix.Block.Init({}); + } + // if not initialized pretend like init off + + // check the message on + if (!message || (message && typeof message !== 'string')) { + message = undefined; + } + // check the message off + + } else { + notiflixConsoleError('Notiflix Error', 'You called the "Notiflix.Block..." function with "' + selector + '" selector, but there is no such element(s) on the document.'); + return false; + } + // check the selector off + + // if cssAnimaion false => duration on + if (!newBlockSettings.cssAnimation) { + newBlockSettings.cssAnimationDuration = 0; + } + // if cssAnimaion false => duration off + + // check the class name on + var blockClassName = 'notiflix-block'; + if (newBlockSettings.className && typeof newBlockSettings.className === 'string') { + blockClassName = newBlockSettings.className.trim(); + } + // check the class name off + + // check query limit on + var getQueryLimit = (typeof newBlockSettings.querySelectorLimit === 'number' ? newBlockSettings.querySelectorLimit : 200); + var checkQueryLimit = (getSelector.length >= getQueryLimit ? getQueryLimit : getSelector.length); + // check query limit off + + // block + if (block) { + + // add element(s) and style on + for (var i = 0; i < checkQueryLimit; i++) { + var eachSelector = getSelector[i]; + + // check block element exist on + var eachBlockElement = eachSelector.querySelectorAll('[id^=' + blockSettings.ID + ']'); + if (eachBlockElement.length < 1) { + + // check the icon on + var icon = ''; + if (iconType) { + if (iconType === 'hourglass') { + icon = notiflixIndicatorSvgHourglass(newBlockSettings.svgSize, newBlockSettings.svgColor); + } else if (iconType === 'circle') { + icon = notiflixIndicatorSvgCircle(newBlockSettings.svgSize, newBlockSettings.svgColor); + } else if (iconType === 'arrows') { + icon = notiflixIndicatorSvgArrows(newBlockSettings.svgSize, newBlockSettings.svgColor); + } else if (iconType === 'dots') { + icon = notiflixIndicatorSvgDots(newBlockSettings.svgSize, newBlockSettings.svgColor); + } else if (iconType === 'pulse') { + icon = notiflixIndicatorSvgPulse(newBlockSettings.svgSize, newBlockSettings.svgColor); + } else { + icon = notiflixIndicatorSvgStandard(newBlockSettings.svgSize, newBlockSettings.svgColor); + } + } + var intSvgSize = parseInt(newBlockSettings.svgSize); + var posRatio = Math.round(intSvgSize - (intSvgSize / 5)).toString() + 'px'; + var svgPosTop = (message && message.length > 0 ? '-' + posRatio : 0); + var iconElement = '' + icon + ''; + // check the icon off + + // check the message on + var messageElement = ''; + var messageHeight = 0; + if (message) { + if (message.length > newBlockSettings.messageMaxLength) { + message = notiflixPlaintext(message).toString().substring(0, newBlockSettings.messageMaxLength) + '...'; + } else { + message = notiflixPlaintext(message).toString(); + } + messageHeight = Math.round(parseInt(newBlockSettings.messageFontSize) * 1.4).toString() + 'px'; + messageElement = '' + message + ''; + } + // check the message off + + // block element on + notiflixBlockElementCounter++; + var notiflixBlockWrap = document.createElement('div'); + notiflixBlockWrap.id = blockSettings.ID + '-' + notiflixBlockElementCounter; + notiflixBlockWrap.className = blockClassName + '-wrap' + (newBlockSettings.cssAnimation ? ' with-animation' : ''); + notiflixBlockWrap.style.position = newBlockSettings.position; + notiflixBlockWrap.style.zIndex = newBlockSettings.zindex; + notiflixBlockWrap.style.background = newBlockSettings.backgroundColor; + notiflixBlockWrap.style.animationDuration = newBlockSettings.cssAnimationDuration + 'ms'; + notiflixBlockWrap.style.fontFamily = '"' + newBlockSettings.fontFamily + '"' + ', sans-serif'; + // block element off + + // block element rtl on + if (newBlockSettings.rtl) { + notiflixBlockWrap.setAttribute('dir', 'rtl'); + notiflixBlockWrap.classList.add('rtl-on'); + } + // block element rtl off + + // block element data on + notiflixBlockWrap.innerHTML = iconElement + messageElement; + // block element data off + + // append block element on + var eachSelectorPos = getComputedStyle(eachSelector).getPropertyValue('position'); + eachSelectorPos = eachSelectorPos && typeof eachSelectorPos === 'string' ? eachSelectorPos.toLowerCase() : 'relative'; + + // selector internal style on + var eachSelectorIdOrClass = ''; + if (eachSelector.getAttribute('id')) { + eachSelectorIdOrClass = '#' + eachSelector.getAttribute('id'); + } else if (eachSelector.classList[0]) { + eachSelectorIdOrClass = '.' + eachSelector.classList[0]; + } + + var positions = ['absolute', 'relative', 'fixed', 'sticky']; + if (positions.indexOf(eachSelectorPos) <= -1) { + var minHeight = Math.round((parseInt(messageHeight) + intSvgSize) * 1.5).toString() + 'px'; + var style = ''; + var styleRange = document.createRange(); + styleRange.selectNode(document.head); + var styleFragment = styleRange.createContextualFragment(style); + document.head.appendChild(styleFragment); + eachSelector.classList.add(blockClassName + '-position'); + } + // selector internal style off + + // append + eachSelector.appendChild(notiflixBlockWrap); + // append block element off + } + // check block element exist off + } + // add element(s) and style off + } + // unblock/remove + else { + + // Step 3 => Remove each block element on + var removeBlockElements = function (eachOne) { + var timeout = setTimeout(function () { + // remove element + eachOne.remove(); + + // remove this selector internal style + var eachOneId = eachOne.getAttribute('id'); + var eachOneStyle = document.getElementById('Style-' + eachOneId); + if (eachOneStyle) { + eachOneStyle.remove(); + } + + // clear timeout + clearTimeout(timeout); + }, newBlockSettings.cssAnimationDuration); + } + // Step 3 => Remove each block element off + + // Step 2A => Remove each block element on + var removeClassBlockElements = function (eachBlockElement) { + // if elements exist + if (eachBlockElement && eachBlockElement.length > 0) { + for (var i = 0; i < eachBlockElement.length; i++) { + var eachOne = eachBlockElement[i]; + if (eachOne) { + // add remove class + eachOne.classList.add('remove'); + // remove block elements + removeBlockElements(eachOne); + } + } + } + // not exist + else { + notiflixConsoleLog('Notiflix Info', '"Notiflix.Block.Remove();" function called with "' + selector + '" selector, but this selector does not have a "Notiflix.Block..." element to remove.'); + } + } + // Step 2A => Remove each block element on + + // Step 2B => Remove each selector class name on + var removeEachSelectorClassName = function (eachSelector) { + var timeout = setTimeout(function () { + // remove class name + var positionClass = blockClassName + '-position'; + eachSelector.classList.remove(positionClass); + + // clear timeout + clearTimeout(timeout); + }, newBlockSettings.cssAnimationDuration + 300); + } + // Step 2B => Remove each selector class name off + + // Step 1 => Remove selector class name on + var selectorTimeout = setTimeout(function () { + for (var i = 0; i < checkQueryLimit; i++) { + var eachSelector = getSelector[i]; + + // remove each selector class name + removeEachSelectorClassName(eachSelector); + + // remove each block element + eachBlockElement = eachSelector.querySelectorAll('[id^=' + blockSettings.ID + ']'); + removeClassBlockElements(eachBlockElement); + } + // clear timeout + clearTimeout(selectorTimeout); + }, theDelay); + // Step 1 => Remove selector class name off + } + }; + // Notiflix: Block or Unblock Element off + + + // Notiflix: Report SVG Success on + var notiflixReportSvgSuccess = function (width, color) { + if (!width) { width = '110px'; } + if (!color) { color = '#32c682'; } + var reportSvgSuccess = ''; + return reportSvgSuccess; + }; + // Notiflix: Report SVG Success off + + // Notiflix: Report SVG Failure on + var notiflixReportSvgFailure = function (width, color) { + if (!width) { width = '110px'; } + if (!color) { color = '#ff5549'; } + var reportSvgFailure = ''; + return reportSvgFailure; + }; + // Notiflix: Report SVG Failure off + + // Notiflix: Report SVG Warning on + var notiflixReportSvgWarning = function (width, color) { + if (!width) { width = '110px'; } + if (!color) { color = '#eebf31'; } + var reportSvgWarning = ''; + return reportSvgWarning; + }; + // Notiflix: Report SVG Warning off + + // Notiflix: Report SVG Info on + var notiflixReportSvgInfo = function (width, color) { + if (!width) { width = '110px'; } + if (!color) { color = '#26c0d3'; } + var reportSvgInfo = ''; + return reportSvgInfo; + }; + // Notiflix: Report SVG Info off + + + // Notiflix: Indicator SVG standard on + var notiflixIndicatorSvgStandard = function (width, color) { + if (!width) { width = '60px'; } + if (!color) { color = '#32c682'; } + var standard = ''; + return standard; + }; + // Notiflix: Indicator SVG standard off + + // Notiflix: Indicator SVG hourglass on + var notiflixIndicatorSvgHourglass = function (width, color) { + if (!width) { width = '60px'; } + if (!color) { color = '#32c682'; } + var hourglass = ' '; + return hourglass; + }; + // Notiflix: Indicator SVG hourglass off + + // Notiflix: Indicator SVG circle on + var notiflixIndicatorSvgCircle = function (width, color) { + if (!width) { width = '60px'; } + if (!color) { color = '#32c682'; } + var circle = ''; + return circle; + }; + // Notiflix: Indicator SVG circle off + + // Notiflix: Indicator SVG arrows on + var notiflixIndicatorSvgArrows = function (width, color) { + if (!width) { width = '60px'; } + if (!color) { color = '#32c682'; } + var arrows = ''; + return arrows; + }; + // Notiflix: Indicator SVG arrows off + + // Notiflix: Indicator SVG dots on + var notiflixIndicatorSvgDots = function (width, color) { + if (!width) { width = '60px'; } + if (!color) { color = '#32c682'; } + var dots = ' '; + return dots; + }; + // Notiflix: Indicator SVG dots off + + // Notiflix: Indicator SVG pulse on + var notiflixIndicatorSvgPulse = function (width, color) { + if (!width) { width = '60px'; } + if (!color) { color = '#32c682'; } + var pulse = ''; + return pulse; + }; + // Notiflix: Indicator SVG pulse off + + // Notiflix: Indicator SVG notiflix on + var notiflixIndicatorSvgNotiflix = function (width, white, green) { + if (!width) { width = '60px'; } + if (!white) { white = '#f8f8f8'; } + if (!green) { green = '#32c682'; } + var notiflixIcon = ''; + return notiflixIcon; + }; + // Notiflix: Indicator SVG notiflix off + + + /* + * 侧边滑出弹层插件 mSlider.js + * DH (https://denghao.me) + * 2018-07 + */ + (function(b, c) { + function a(d) { + this.opts = { + "direction": d.direction || "left", + "distance": d.distance || "60%", + "dom": this.Q(d.dom), + "time": d.time || "", + "maskClose": (d.maskClose + "").toString() !== "false" ? true : false, + "callback": d.callback || "" + }; + this.rnd = this.rnd(); + this.dom = this.opts.dom[0]; + this.wrap = ""; + this.inner = ""; + this.mask = ""; + this.init() + } + a.prototype = { + Q: function(d) { + return document.querySelectorAll(d) + }, + isMobile: function() { + return navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i) ? true : false + }, + addEvent: function(f, e, d) { + if (f.attachEvent) { + f.attachEvent("on" + e, d) + } else { + f.addEventListener(e, d, false) + } + }, + rnd: function() { + return Math.random().toString(36).substr(2, 6) + }, + init: function() { + var g = this; + if (!g.dom) { + console.log("未正确绑定弹窗容器"); + return + } + var d = document.createElement("div"); + var e = document.createElement("div"); + var f = document.createElement("div"); + d.setAttribute("class", "mSlider-main ms-" + g.rnd); + e.setAttribute("class", "mSlider-inner"); + f.setAttribute("class", "mSlider-mask"); + g.Q("body")[0].appendChild(d); + g.Q(".ms-" + g.rnd)[0].appendChild(e); + g.Q(".ms-" + g.rnd)[0].appendChild(f); + g.wrap = g.Q(".ms-" + g.rnd)[0]; + g.inner = g.Q(".ms-" + g.rnd + " .mSlider-inner")[0]; + g.mask = g.Q(".ms-" + g.rnd + " .mSlider-mask")[0]; + g.inner.appendChild(g.dom); + switch (g.opts.direction) { + case "top": + g.top = "0"; + g.left = "0"; + g.width = "100%"; + g.height = g.opts.distance; + g.translate = "0,-100%,0"; + break; + case "bottom": + g.bottom = "0"; + g.left = "0"; + g.width = "100%"; + g.height = g.opts.distance; + g.translate = "0,100%,0"; + break; + case "right": + g.top = "0"; + g.right = "0"; + g.width = g.opts.distance; + g.height = document.documentElement.clientHeight + "px"; + g.translate = "100%,0,0"; + break; + default: + g.top = "0"; + g.left = "0"; + g.width = g.opts.distance; + g.height = document.documentElement.clientHeight + "px"; + g.translate = "-100%,0,0" + } + g.wrap.style.display = "none"; + g.wrap.style.position = "fixed"; + g.wrap.style.top = "0"; + g.wrap.style.left = "0"; + g.wrap.style.width = "100%"; + g.wrap.style.height = "100%"; + g.wrap.style.zIndex = 99; + g.inner.style.position = "absolute"; + g.inner.style.top = g.top; + g.inner.style.bottom = g.bottom; + g.inner.style.left = g.left; + g.inner.style.right = g.right; + g.inner.style.width = g.width; + g.inner.style.height = g.height; + g.inner.style.backgroundColor = "#fff"; + g.inner.style.transform = "translate3d(" + g.translate + ")"; + g.inner.style.webkitTransition = "all .2s ease-out"; + g.inner.style.transition = "all .2s ease-out"; + g.inner.style.zIndex = 100; + g.mask.style.width = "100%"; + g.mask.style.height = "100%"; + g.mask.style.opacity = "0"; + g.mask.style.backgroundColor = "black"; + g.mask.style.zIndex = "98"; + g.mask.style.webkitTransition = "all .2s ease-out"; + g.mask.style.transition = "all .2s ease-out"; + g.mask.style.webkitBackfaceVisibility = "hidden"; + g.events() + }, + open: function() { + var d = this; + d.wrap.style.display = "block"; + + setTimeout(function() { + d.inner.style.transform = "translate3d(0,0,0)"; + d.inner.style.webkitTransform = "translate3d(0,0,0)"; + d.mask.style.opacity = 0.5 + }, 30); + if (d.opts.time) { + d.timer = setTimeout(function() { + d.close() + }, d.opts.time) + } + }, + close: function() { + var d = this; + d.timer && clearTimeout(d.timer); + d.inner.style.webkitTransform = "translate3d(" + d.translate + ")"; + d.inner.style.transform = "translate3d(" + d.translate + ")"; + d.mask.style.opacity = 0; + setTimeout(function() { + d.wrap.style.display = "none"; + d.timer = null; + d.opts.callback && d.opts.callback() + }, 300) + }, + events: function() { + var d = this; + d.addEvent(d.mask, "touchmove", function(f) { + f.preventDefault() + }); + d.addEvent(d.mask, (d.isMobile() ? "touchend" : "click"), function(f) { + if (d.opts.maskClose) { + d.close() + } + }) + } + }; + b.mSlider = a + })(window); + + exports(MOD_NAME,pearOper); +}) + diff --git a/public/static/component/pear/module/menu.js b/public/static/component/pear/module/menu.js new file mode 100644 index 0000000..8fdb233 --- /dev/null +++ b/public/static/component/pear/module/menu.js @@ -0,0 +1,471 @@ +layui.define(['table', 'jquery', 'element'], function(exports) { + "use strict"; + + var MOD_NAME = 'menu', + $ = layui.jquery, + element = layui.element; + + var pearMenu = function(opt) { + this.option = opt; + }; + + pearMenu.prototype.render = function(opt) { + + var option = { + elem: opt.elem, + async: opt.async, + parseData: opt.parseData, + url: opt.url, + method: opt.method ? opt.method : "GET", + defaultOpen: opt.defaultOpen, + defaultSelect: opt.defaultSelect, + control: opt.control, + controlWidth: opt.controlWidth ? opt.controlWidth: 500, + defaultMenu: opt.defaultMenu, + accordion: opt.accordion, + height: opt.height, + theme: opt.theme, + data: opt.data ? opt.data : [], + change: opt.change ? opt.change : function() {}, + done: opt.done ? opt.done : function() {} + } + if (option.async) { + if (option.method === "GET") { + getData(option.url).then(function(data) { + option.data = data; + renderMenu(option); + }); + } else { + postData(option.url).then(function(data) { + option.data = data; + renderMenu(option); + }); + } + } else { + //renderMenu中需要调用done事件,done事件中需要menu对象,但是此时还未返回menu对象,做个延时提前返回对象 + window.setTimeout(function() { renderMenu(option);}, 500); + } + + // 处理高度 + $("#"+opt.elem).height(option.height) + + setTimeout(function(){ + $("#"+opt.control+" .control").on("mousewheel DOMMouseScroll", function(event) { + + var delta = (event.originalEvent.wheelDelta && (event.originalEvent.wheelDelta > 0 ? 1 : -1)) || // chrome & ie + (event.originalEvent.detail && (event.originalEvent.detail > 0 ? -1 : 1)); // firefox + + if (delta > 0) { + for (var num = 1; num < 20; num++) { + setTimeout(function() { + if ($("#"+opt.control+" .control ul").css('left').replace("px", "") < 0) { + $("#"+opt.control+" .control ul").css("left", "+=2px"); + } + }, 10) + } + } else if (delta < 0) { + if(( (Number)($("#"+opt.control+" .control ul").css("left").replace("px","")) + ($("#"+opt.control+" .control ul").width() - $("#"+opt.control+" .control").width())) > 0){ + for (var num = 1; num < 20; num++) { + setTimeout(function() { + $("#"+opt.control+" .control ul").css("left", "-=2px"); + }, 10) + } + } + } + }); + },1000) + + return new pearMenu(opt); + } + + pearMenu.prototype.click = function(clickEvent) { + var _this = this; + $("body").on("click", "#" + _this.option.elem + " .site-demo-active", function() { + var dom = $(this); + var data = { + menuId: dom.attr("menu-id"), + menuTitle: dom.attr("menu-title"), + menuPath: dom.attr("menu-title"), + menuIcon: dom.attr("menu-icon"), + menuUrl: dom.attr("menu-url"), + openType: dom.attr("open-type") + }; + var doms = hash(dom); + if (doms != null) { + if (doms.text() != '') { + data['menuPath'] = doms.find("span").text() + " / " + data['menuPath']; + } + } + if (doms != null) { + var domss = hash(doms); + if(domss!=null){ + if (domss.text() != '') { + data['menuPath'] = domss.find("span").text() + " / " + data['menuPath']; + }} + } + if (domss != null) { + + var domsss = hash(domss); + if(domsss!=null){ + if (domsss.text() != '') { + data['menuPath'] = domsss.find("span").text() + " / " + data['menuPath']; + }} + } + if ($("#" + _this.option.elem).is(".pear-nav-mini")) { + if (_this.option.accordion) { + activeMenus = $(this).parent().parent().parent().children("a"); + } else { + activeMenus.push($(this).parent().parent().parent().children("a")); + } + } + clickEvent(dom, data); + }) + } + + function hash(dom) { + var d = dom.parent().parent().prev(); + if (d.prop("tagName") === "UL") { + return null; + } + return d; + } + + pearMenu.prototype.skin = function(skin) { + var menu = $(".pear-nav-tree[lay-filter='" + this.option.elem + "']").parent(); + menu.removeClass("dark-theme"); + menu.removeClass("light-theme"); + menu.addClass(skin); + } + + pearMenu.prototype.selectItem = function(pearId) { + if (this.option.control != false) { + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents(".layui-side-scroll ").find("ul").css({ + display: "none" + }); + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents(".layui-side-scroll ").find(".layui-this").removeClass( + "layui-this"); + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents("ul").css({ + display: "block" + }); + var controlId = $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents("ul").attr("pear-id"); + if (controlId != undefined) { + $("#" + this.option.control).find(".layui-this").removeClass("layui-this"); + $("#" + this.option.control).find("[pear-id='" + controlId + "']").addClass("layui-this"); + } + } + if (this.option.accordion == true) { + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents(".pear-nav-tree").find(".layui-nav-itemed").removeClass( + "layui-nav-itemed"); + } + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents(".pear-nav-tree").find(".layui-this").removeClass( + "layui-this"); + if (!$("#" + this.option.elem).is(".pear-nav-mini")) { + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents(".layui-nav-item").addClass("layui-nav-itemed"); + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents("dd").addClass("layui-nav-itemed"); + } + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parent().addClass("layui-this"); + } + + var activeMenus; + pearMenu.prototype.collaspe = function(time) { + var elem = this.option.elem; + var config = this.option; + if ($("#" + this.option.elem).is(".pear-nav-mini")) { + $.each(activeMenus, function(i, item) { + $("#" + elem + " a[menu-id='" + $(this).attr("menu-id") + "']").parent().addClass("layui-nav-itemed"); + }) + $("#" + this.option.elem).removeClass("pear-nav-mini"); + $("#" + this.option.elem).animate({ + width: "220px" + }, 150); + isHoverMenu(false, config); + } else { + activeMenus = $("#" + this.option.elem).find(".layui-nav-itemed>a"); + $("#" + this.option.elem).find(".layui-nav-itemed").removeClass("layui-nav-itemed"); + $("#" + this.option.elem).addClass("pear-nav-mini"); + $("#" + this.option.elem).animate({ + width: "60px" + }, 400); + isHoverMenu(true, config); + } + } + + function getData(url) { + var defer = $.Deferred(); + $.get(url + "?fresh=" + Math.random(), function(result) { + defer.resolve(result) + }); + return defer.promise(); + } + + function postData(url) { + var defer = $.Deferred(); + $.post(url + "?fresh=" + Math.random(), function(result) { + defer.resolve(result) + }); + return defer.promise(); + } + + function renderMenu(option) { + if (option.parseData != false) { + option.parseData(option.data); + } + if (option.data.length > 0) { + if (option.control != false) { + createMenuAndControl(option); + } else { + createMenu(option); + } + } + element.init(); + downShow(option); + option.done(); + } + + function createMenu(option) { + var menuHtml = '
                                    ' + $.each(option.data, function(i, item) { + var content = '
                                  • '; + if (i == option.defaultOpen) { + content = '
                                  • '; + } + var href = "javascript:;"; + var target = ""; + var className = "site-demo-active" + if (item.openType == "_blank" && item.type == 1) { + href = item.href; + target = "target='_blank'"; + className = ""; + } + if (item.type == 0) { + // 创 建 目 录 结 构 + content += '' + item.title + + ''; + } else if (item.type == 1) { + content += '' + item.title + ''; + } + // 调 用 递 归 方 法 加 载 无 限 层 级 的 子 菜 单 + content += loadchild(item); + // 结 束 一 个 根 菜 单 项 + content += '
                                  • '; + menuHtml += content; + }); + // 结 束 菜 单 结 构 的 初 始 化 + menuHtml += "
                                  "; + // 将 菜 单 拼 接 到 初 始 化 容 器 中 + $("#" + option.elem).html(menuHtml); + } + + function createMenuAndControl(option) { + var control = '
                                    '; + var controlPe = '
                                      '; + // 声 明 头 部 + var menu = '
                                      ' + // 开 启 同 步 操 作 + var index = 0; + var controlItemPe = '
                                      '; + $.each(option.data, function(i, item) { + var menuItem = ''; + var controlItem = ''; + if (i === option.defaultMenu) { + controlItem = '
                                    • ' + item.title + '
                                    • '; + menuItem = '
                                        '; + // 兼容移动端 + controlPe += '
                                      • ' + item.title + ''; + controlItemPe += '
                                        ' + item.title + '
                                        '; + } else { + controlItem = '
                                      • ' + item.title + '
                                      • '; + menuItem = ''; + control += controlItem; + }) + controlItemPe += "
                                    " + controlPe += controlItemPe; + $("#" + option.control).html(control+"
                                  "); + $("#" + option.control).append(controlPe); + $("#" + option.elem).html(menu); + $("#" + option.control + " .pear-nav-control").on("click", "[pear-id]", function() { + $("#" + option.elem).find(".pear-nav-tree").css({ + display: 'none' + }); + $("#" + option.elem).find(".pear-nav-tree[pear-id='" + $(this).attr("pear-id") + "']").css({ + display: 'block' + }); + $("#" + option.control).find(".pe-title").html($(this).attr("pear-title")); + $("#" + option.control).find("") + option.change($(this).attr("pear-id"), $(this).attr("pear-title"), $(this).attr("pear-href")) + }) + } + + /** 加载子菜单 (递归)*/ + function loadchild(obj) { + // 判 单 是 否 是 菜 单, 如 果 是 菜 单 直 接 返 回 + if (obj.type == 1) { + return ""; + } + // 创 建 子 菜 单 结 构 + var content = '
                                  '; + // 如 果 嵌 套 不 等 于 空 + if (obj.children != null && obj.children.length > 0) { + // 遍 历 子 项 目 + $.each(obj.children, function(i, note) { + // 创 建 子 项 结 构 + content += '
                                  '; + var href = "javascript:;"; + var target = ""; + var className = "site-demo-active"; + if (note.openType == "_blank" && note.type == 1) { + href = note.href; + target = "target='_blank'"; + className = ""; + } + // 判 断 子 项 类 型 + if (note.type == 0) { + // 创 建 目 录 结 构 + content += '' + note.title + ''; + } else if (note.type == 1) { + // 创 建 菜 单 结 构 + content += '' + note.title + ''; + } + // 加 载 子 项 目 录 + content += loadchild(note); + // 结 束 当 前 子 菜 单 + content += '
                                  '; + }); + // 封 装 + } else { + content += '
                                  目录为空
                                  '; + } + content += '
                                  '; + return content; + } + + function downShow(option) { + $("body #" + option.elem).on("click", "a[menu-type='0']", function() { + if (!$("#" + option.elem).is(".pear-nav-mini")) { + var superEle = $(this).parent(); + var ele = $(this).next('.layui-nav-child'); + var heights = ele.children("dd").length * 48; + + if ($(this).parent().is(".layui-nav-itemed")) { + if (option.accordion) { + $(this).parent().parent().find(".layui-nav-itemed").removeClass("layui-nav-itemed"); + $(this).parent().addClass("layui-nav-itemed"); + } + ele.height(0); + ele.animate({ + height: heights + "px" + }, 200, function() { + ele.css({ + height: "auto" + }); + }); + } else { + $(this).parent().addClass("layui-nav-itemed"); + ele.animate({ + height: "0px" + }, 200, function() { + ele.css({ + height: "auto" + }); + $(this).parent().removeClass("layui-nav-itemed"); + }); + } + } + }) + } + + /** 二 级 悬 浮 菜 单*/ + function isHoverMenu(b, option) { + if (b) { + $("#" + option.elem + ".pear-nav-mini .layui-nav-item,#" + option.elem + ".pear-nav-mini dd").hover(function(e) { + e.stopPropagation(); + var _this = $(this); + _this.siblings().find(".layui-nav-child") + .removeClass("layui-nav-hover").css({ + left: 0, + top: 0 + }); + _this.children(".layui-nav-child").addClass("layui-nav-hover"); + _this.closest('.layui-nav-item').data('time') && clearTimeout(_this.closest('.layui-nav-item').data('time')); + var height = $(window).height(); + var topLength = _this.offset().top; + var thisHeight = _this.children(".layui-nav-child").height(); + if ((thisHeight + topLength) > height) { + topLength = height - thisHeight - 10; + } + var left = _this.offset().left + 60; + if (!_this.hasClass("layui-nav-item")) { + left = _this.offset().left + _this.width(); + } + _this.children(".layui-nav-child").offset({ + top: topLength, + left: left + 3 + }); + }, function(e) { + e.stopPropagation(); + var _this = $(this); + _this.closest('.layui-nav-item').data('time', setTimeout(function() { + _this.closest('.layui-nav-item') + .find(".layui-nav-child") + .removeClass("layui-nav-hover") + .css({ + left: 0, + top: 0 + }); + }, 50)); + }) + } else { + $("#" + option.elem + " .layui-nav-item").off('mouseenter').unbind('mouseleave'); + $("#" + option.elem + " dd").off('mouseenter').unbind('mouseleave'); + } + } + exports(MOD_NAME, new pearMenu()); +}) diff --git a/public/static/component/pear/module/message.js b/public/static/component/pear/module/message.js new file mode 100644 index 0000000..958a874 --- /dev/null +++ b/public/static/component/pear/module/message.js @@ -0,0 +1,96 @@ +layui.define(['table', 'jquery', 'element'], function(exports) { + "use strict"; + + var MOD_NAME = 'message', + $ = layui.jquery, + element = layui.element; + + var message = function(opt) { + this.option = opt; + }; + + message.prototype.render = function(opt) { + //默认配置值 + var option = { + elem: opt.elem, + url: opt.url ? opt.url : false, + height: opt.height, + data: opt.data + } + if (option.url != false) { + option.data = getData(option.url); + var notice = createHtml(option); + $(option.elem).html(notice); + } + setTimeout(function(){ + element.init(); + $(opt.elem+" li").click(function(e){ + $(this).siblings().removeClass('pear-this'); + $(this).addClass('pear-this'); + }) + },300); + return new message(option); + } + + message.prototype.click = function(callback){ + $("*[notice-id]").click(function(event) { + event.preventDefault(); + var id = $(this).attr("notice-id"); + var title = $(this).attr("notice-title"); + var context = $(this).attr("notice-context"); + var form = $(this).attr("notice-form"); + callback(id, title, context, form); + }) + } + + /** 同 步 请 求 获 取 数 据 */ + function getData(url) { + $.ajaxSettings.async = false; + var data = null; + $.get(url, function(result) { + data = result; + }); + $.ajaxSettings.async = true; + return data; + } + + function createHtml(option) { + + var notice = '
                                • ' + + '' + + '
                                  '; + + var noticeTitle = '
                                    '; + var noticeContent = '
                                    '; + + // 根据 data 便利数据 + $.each(option.data, function(i, item) { + if (i === 0) { + noticeTitle += '
                                  • ' + item.title + '
                                  • '; + noticeContent += '
                                    '; + } else { + noticeTitle += '
                                  • ' + item.title + '
                                  • '; + noticeContent += '
                                    '; + } + + $.each(item.children, function(i, note) { + noticeContent += '
                                    ' + + '' + + '' + note.title + '' + + '' + note.time + '' + + '
                                    '; + }) + noticeContent += '
                                    '; + }) + + noticeTitle += '
                                  '; + noticeContent += '
                                  '; + notice += noticeTitle; + notice += noticeContent; + notice += '
                                • '; + return notice; + } + + exports(MOD_NAME, new message()); +}) diff --git a/public/static/component/pear/module/notice.js b/public/static/component/pear/module/notice.js new file mode 100644 index 0000000..4ea67ec --- /dev/null +++ b/public/static/component/pear/module/notice.js @@ -0,0 +1,489 @@ + +(function(define) { + define(['jquery'], function($) { + return (function() { + var $container; + var listener; + var toastId = 0; + var toastType = { + error: 'error', + info: 'info', + success: 'success', + warning: 'warning' + }; + + var cssStyle = $( + '' + ); + $("body").append(cssStyle); + + var toastr = { + clear: clear, + remove: remove, + error: error, + getContainer: getContainer, + info: info, + options: {}, + subscribe: subscribe, + success: success, + version: '2.1.4', + warning: warning + }; + + var previousToast; + + return toastr; + + function error(message, title, optionsOverride) { + return notify({ + type: toastType.error, + iconClass: getOptions().iconClasses.error, + message: message, + optionsOverride: optionsOverride, + title: title + }); + } + + function getContainer(options, create) { + if (!options) { + options = getOptions(); + } + $container = $('#' + options.containerId); + if ($container.length) { + return $container; + } + if (create) { + $container = createContainer(options); + } + return $container; + } + + function info(message, title, optionsOverride) { + return notify({ + type: toastType.info, + iconClass: getOptions().iconClasses.info, + message: message, + optionsOverride: optionsOverride, + title: title + }); + } + + function subscribe(callback) { + listener = callback; + } + + function success(message, title, optionsOverride) { + return notify({ + type: toastType.success, + iconClass: getOptions().iconClasses.success, + message: message, + optionsOverride: optionsOverride, + title: title + }); + } + + function warning(message, title, optionsOverride) { + return notify({ + type: toastType.warning, + iconClass: getOptions().iconClasses.warning, + message: message, + optionsOverride: optionsOverride, + title: title + }); + } + + function clear($toastElement, clearOptions) { + var options = getOptions(); + if (!$container) { + getContainer(options); + } + if (!clearToast($toastElement, options, clearOptions)) { + clearContainer(options); + } + } + + function remove($toastElement) { + var options = getOptions(); + if (!$container) { + getContainer(options); + } + if ($toastElement && $(':focus', $toastElement).length === 0) { + removeToast($toastElement); + return; + } + if ($container.children().length) { + $container.remove(); + } + } + + // internal functions + + function clearContainer(options) { + var toastsToClear = $container.children(); + for (var i = toastsToClear.length - 1; i >= 0; i--) { + clearToast($(toastsToClear[i]), options); + } + } + + function clearToast($toastElement, options, clearOptions) { + var force = clearOptions && clearOptions.force ? clearOptions.force : false; + if ($toastElement && (force || $(':focus', $toastElement).length === 0)) { + $toastElement[options.hideMethod]({ + duration: options.hideDuration, + easing: options.hideEasing, + complete: function() { + removeToast($toastElement); + } + }); + return true; + } + return false; + } + + function createContainer(options) { + $container = $('
                                  ') + .attr('id', options.containerId) + .addClass(options.positionClass); + + $container.appendTo($(options.target)); + return $container; + } + + function getDefaults() { + return { + tapToDismiss: true, + toastClass: 'toast', + containerId: 'toast-container', + debug: false, + + showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery + showDuration: 300, + showEasing: 'swing', //swing and linear are built into jQuery + onShown: undefined, + hideMethod: 'fadeOut', + hideDuration: 1000, + hideEasing: 'swing', + onHidden: undefined, + closeMethod: false, + closeDuration: false, + closeEasing: false, + closeOnHover: true, + + extendedTimeOut: 1000, + iconClasses: { + error: 'toast-error', + info: 'toast-info', + success: 'toast-success', + warning: 'toast-warning' + }, + iconClass: 'toast-info', + positionClass: 'toast-top-right', + timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky + titleClass: 'toast-title', + messageClass: 'toast-message', + escapeHtml: false, + target: 'body', + closeHtml: '', + closeClass: 'toast-close-button', + newestOnTop: true, + preventDuplicates: false, + progressBar: false, + progressClass: 'toast-progress', + rtl: false + }; + } + + function publish(args) { + if (!listener) { + return; + } + listener(args); + } + + function notify(map) { + var options = getOptions(); + var iconClass = map.iconClass || options.iconClass; + + if (typeof(map.optionsOverride) !== 'undefined') { + options = $.extend(options, map.optionsOverride); + iconClass = map.optionsOverride.iconClass || iconClass; + } + + if (shouldExit(options, map)) { + return; + } + + toastId++; + + $container = getContainer(options, true); + + var intervalId = null; + var $toastElement = $('
                                  '); + var $titleElement = $('
                                  '); + var $messageElement = $('
                                  '); + var $progressElement = $('
                                  '); + var $closeElement = $(options.closeHtml); + var progressBar = { + intervalId: null, + hideEta: null, + maxHideTime: null + }; + var response = { + toastId: toastId, + state: 'visible', + startTime: new Date(), + options: options, + map: map + }; + + personalizeToast(); + + displayToast(); + + handleEvents(); + + publish(response); + + if (options.debug && console) { + console.log(response); + } + + return $toastElement; + + function escapeHtml(source) { + if (source == null) { + source = ''; + } + + return source + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'/g, ''') + .replace(//g, '>'); + } + + function personalizeToast() { + setIcon(); + setTitle(); + setMessage(); + setCloseButton(); + setProgressBar(); + setRTL(); + setSequence(); + setAria(); + } + + function setAria() { + var ariaValue = ''; + switch (map.iconClass) { + case 'toast-success': + case 'toast-info': + ariaValue = 'polite'; + break; + default: + ariaValue = 'assertive'; + } + $toastElement.attr('aria-live', ariaValue); + } + + function handleEvents() { + if (options.closeOnHover) { + $toastElement.hover(stickAround, delayedHideToast); + } + + if (!options.onclick && options.tapToDismiss) { + $toastElement.click(hideToast); + } + + if (options.closeButton && $closeElement) { + $closeElement.click(function(event) { + if (event.stopPropagation) { + event.stopPropagation(); + } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) { + event.cancelBubble = true; + } + + if (options.onCloseClick) { + options.onCloseClick(event); + } + + hideToast(true); + }); + } + + if (options.onclick) { + $toastElement.click(function(event) { + options.onclick(event); + hideToast(); + }); + } + } + + function displayToast() { + $toastElement.hide(); + + $toastElement[options.showMethod]({ + duration: options.showDuration, + easing: options.showEasing, + complete: options.onShown + }); + + if (options.timeOut > 0) { + intervalId = setTimeout(hideToast, options.timeOut); + progressBar.maxHideTime = parseFloat(options.timeOut); + progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime; + if (options.progressBar) { + progressBar.intervalId = setInterval(updateProgress, 10); + } + } + } + + function setIcon() { + if (map.iconClass) { + $toastElement.addClass(options.toastClass).addClass(iconClass); + } + } + + function setSequence() { + if (options.newestOnTop) { + $container.prepend($toastElement); + } else { + $container.append($toastElement); + } + } + + function setTitle() { + if (map.title) { + var suffix = map.title; + if (options.escapeHtml) { + suffix = escapeHtml(map.title); + } + $titleElement.append(suffix).addClass(options.titleClass); + $toastElement.append($titleElement); + } + } + + function setMessage() { + if (map.message) { + var suffix = map.message; + if (options.escapeHtml) { + suffix = escapeHtml(map.message); + } + $messageElement.append(suffix).addClass(options.messageClass); + $toastElement.append($messageElement); + } + } + + function setCloseButton() { + if (options.closeButton) { + $closeElement.addClass(options.closeClass).attr('role', 'button'); + $toastElement.prepend($closeElement); + } + } + + function setProgressBar() { + if (options.progressBar) { + $progressElement.addClass(options.progressClass); + $toastElement.prepend($progressElement); + } + } + + function setRTL() { + if (options.rtl) { + $toastElement.addClass('rtl'); + } + } + + function shouldExit(options, map) { + if (options.preventDuplicates) { + if (map.message === previousToast) { + return true; + } else { + previousToast = map.message; + } + } + return false; + } + + function hideToast(override) { + var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod; + var duration = override && options.closeDuration !== false ? + options.closeDuration : options.hideDuration; + var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing; + if ($(':focus', $toastElement).length && !override) { + return; + } + clearTimeout(progressBar.intervalId); + return $toastElement[method]({ + duration: duration, + easing: easing, + complete: function() { + removeToast($toastElement); + clearTimeout(intervalId); + if (options.onHidden && response.state !== 'hidden') { + options.onHidden(); + } + response.state = 'hidden'; + response.endTime = new Date(); + publish(response); + } + }); + } + + function delayedHideToast() { + if (options.timeOut > 0 || options.extendedTimeOut > 0) { + intervalId = setTimeout(hideToast, options.extendedTimeOut); + progressBar.maxHideTime = parseFloat(options.extendedTimeOut); + progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime; + } + } + + function stickAround() { + clearTimeout(intervalId); + progressBar.hideEta = 0; + $toastElement.stop(true, true)[options.showMethod]({ + duration: options.showDuration, + easing: options.showEasing + }); + } + + function updateProgress() { + var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100; + $progressElement.width(percentage + '%'); + } + } + + function getOptions() { + return $.extend({}, getDefaults(), toastr.options); + } + + function removeToast($toastElement) { + if (!$container) { + $container = getContainer(); + } + if ($toastElement.is(':visible')) { + return; + } + $toastElement.remove(); + $toastElement = null; + if ($container.children().length === 0) { + $container.remove(); + previousToast = undefined; + } + } + + })(); + }); +}(typeof define === 'function' && define.amd ? define : function(deps, factory) { + if (typeof module !== 'undefined' && module.exports) { //Node + module.exports = factory(require('jquery')); + } else if (window.layui && layui.define) { + layui.define('jquery', function(exports) { //layui加载 + exports('toastr', factory(layui.jquery)); + exports('notice', factory(layui.jquery)); + }); + } else { + window.toastr = factory(window.jQuery); + } +})); diff --git a/public/static/component/pear/module/popup.js b/public/static/component/pear/module/popup.js new file mode 100644 index 0000000..9503407 --- /dev/null +++ b/public/static/component/pear/module/popup.js @@ -0,0 +1,49 @@ +layui.define(['layer', 'jquery', 'element'], function(exports) { + "use strict"; + + var MOD_NAME = 'popup', + $ = layui.jquery, + layer = layui.layer, + element = layui.element; + + var popup = new function() { + + this.success = function(msg) { + layer.msg(msg, { + icon: 1, + time: 1000 + }) + }, + this.failure = function(msg) { + layer.msg(msg, { + icon: 2, + time: 1000 + }) + }, + this.warming = function(msg) { + layer.msg(msg, { + icon: 3, + time: 1000 + }) + }, + this.success = function(msg, callback) { + layer.msg(msg, { + icon: 1, + time: 1000 + }, callback); + }, + this.failure = function(msg, callback) { + layer.msg(msg, { + icon: 2, + time: 1000 + }, callback); + }, + this.warning = function(msg, callback) { + layer.msg(msg, { + icon: 3, + time: 1000 + }, callback); + } + }; + exports(MOD_NAME, popup); +}) diff --git a/public/static/component/pear/module/select.js b/public/static/component/pear/module/select.js new file mode 100644 index 0000000..3b095f7 --- /dev/null +++ b/public/static/component/pear/module/select.js @@ -0,0 +1,1740 @@ +/** + * name: formSelects + * 基于Layui Select多选 + * version: 4.0.0.0910 + * http://sun.faysunshine.com/layui/formSelects-v4/dist/formSelects-v4.js + */ +(function(layui, window, factory) { + if(typeof exports === 'object') { // 支持 CommonJS + module.exports = factory(); + } else if(typeof define === 'function' && define.amd) { // 支持 AMD + define(factory); + } else if(window.layui && layui.define) { //layui加载 + layui.define(['jquery'], function(exports) { + exports('select', factory()); + }); + } else { + window.formSelects = factory(); + } +})(typeof layui == 'undefined' ? null : layui, window, function() { + let v = '4.0.0.0910', + NAME = 'xm-select', + PNAME = 'xm-select-parent', + INPUT = 'xm-select-input', + TDIV = 'xm-select--suffix', + THIS = 'xm-select-this', + LABEL = 'xm-select-label', + SEARCH = 'xm-select-search', + SEARCH_TYPE = 'xm-select-search-type', + SHOW_COUNT = 'xm-select-show-count', + CREATE = 'xm-select-create', + CREATE_LONG = 'xm-select-create-long', + MAX = 'xm-select-max', + SKIN = 'xm-select-skin', + DIRECTION = "xm-select-direction", + HEIGHT = 'xm-select-height', + DISABLED = 'xm-dis-disabled', + DIS = 'xm-select-dis', + TEMP = 'xm-select-temp', + RADIO = 'xm-select-radio', + LINKAGE= 'xm-select-linkage', + DL = 'xm-select-dl', + DD_HIDE = 'xm-select-hide', + HIDE_INPUT = 'xm-hide-input', + SANJIAO = 'xm-select-sj', + ICON_CLOSE = 'xm-icon-close', + FORM_TITLE = 'xm-select-title', + FORM_SELECT = 'xm-form-select', + FORM_SELECTED = 'xm-form-selected', + FORM_NONE = 'xm-select-none', + FORM_EMPTY = 'xm-select-empty', + FORM_INPUT = 'xm-input', + FORM_DL_INPUT = 'xm-dl-input', + FORM_SELECT_TIPS = 'xm-select-tips', + CHECKBOX_YES = 'xm-iconfont', + FORM_TEAM_PID = 'XM_PID_VALUE', + CZ = 'xm-cz', + CZ_GROUP = 'xm-cz-group', + TIPS = '请选择', + data = {}, + events = { + on: {}, + endOn: {}, + filter: {}, + maxTips: {}, + opened: {}, + closed: {} + }, + ajax = { + type: 'get', + header: { + + }, + first: true, + data: {}, + searchUrl: '', + searchName: 'keyword', + searchVal: null, + keyName: 'name', + keyVal: 'value', + keySel: 'selected', + keyDis: 'disabled', + keyChildren: 'children', + dataType: '', + delay: 500, + beforeSuccess: null, + success: null, + error: null, + beforeSearch: null, + response: { + statusCode: 0, + statusName: 'code', + msgName: 'msg', + dataName: 'data' + }, + tree: { + nextClick: function(id, item, callback){ + callback([]); + }, + folderChoose: true, + lazy: true + } + }, + quickBtns = [ + {icon: 'xm-iconfont icon-quanxuan', name: '全选', click: function(id, cm){ + cm.selectAll(id, true, true); + }}, + {icon: 'xm-iconfont icon-qingkong', name: '清空', click: function(id, cm){ + cm.removeAll(id, true, true); + }}, + {icon: 'xm-iconfont icon-fanxuan', name: '反选', click: function(id, cm){ + cm.reverse(id, true, true); + }}, + {icon: 'xm-iconfont icon-pifu', name: '换肤', click: function(id, cm){ + cm.skin(id); + }} + ], + $ = window.$ || (window.layui && window.layui.jquery), + $win = $(window), + ajaxs = {}, + fsConfig = {}, + fsConfigs = {}, + FormSelects = function(options) { + this.config = { + name: null, //xm-select="xxx" + max: null, + maxTips: (id, vals, val, max) => { + let ipt = $(`[xid="${this.config.name}"]`).prev().find(`.${NAME}`); + if(ipt.parents('.layui-form-item[pane]').length) { + ipt = ipt.parents('.layui-form-item[pane]'); + } + ipt.attr('style', 'border-color: red !important'); + setTimeout(() => { + ipt.removeAttr('style'); + }, 300); + }, + init: null, //初始化的选择值, + on: null, //select值发生变化 + opened: null, + closed: null, + filter: (id, inputVal, val, isDisabled) => { + return val.name.indexOf(inputVal) == -1; + }, + clearid: -1, + direction: 'auto', + height: null, + isEmpty: false, + btns: [quickBtns[0], quickBtns[1], quickBtns[2]], + searchType: 0, + create: (id, name) => { + return Date.now(); + }, + template: (id, item) => { + return item.name; + }, + showCount: 0, + isCreate: false, + placeholder: TIPS, + clearInput: false, + }; + this.select = null; + this.values = []; + $.extend(this.config, options, { + searchUrl: options.isSearch ? options.searchUrl : null, + placeholder: options.optionsFirst ? ( + options.optionsFirst.value ? TIPS : (options.optionsFirst.innerHTML || TIPS) + ) : TIPS, + btns: options.radio ? [quickBtns[1]] : [quickBtns[0], quickBtns[1], quickBtns[2]], + }, fsConfigs[options.name] || fsConfig); + if(isNaN(this.config.showCount) || this.config.showCount <= 0) { + this.config.showCount = 19921012; + } + }; + + //一些简单的处理方法 + let Common = function(){ + this.appender(); + this.on(); + this.onreset(); + }; + + Common.prototype.appender = function(){//针对IE做的一些拓展 + //拓展Array map方法 + if(!Array.prototype.map){Array.prototype.map=function(i,h){var b,a,c,e=Object(this),f=e.length>>>0;if(h){b=h}a=new Array(f);c=0;while(c>>0;if(typeof g!=="function"){throw new TypeError(g+" is not a function")}if(arguments.length>1){d=b}c=0;while(c>>0;if(typeof b!=="function"){throw new TypeError()}var e=[];var d=arguments[1];for(var c=0;c { + let othis = $(select), + id = othis.attr(NAME), + hasLayuiRender = othis.next(`.layui-form-select`), + hasRender = othis.next(`.${PNAME}`), + options = { + name: id, + disabled: select.disabled, + max: othis.attr(MAX) - 0, + isSearch: othis.attr(SEARCH) != undefined, + searchUrl: othis.attr(SEARCH), + isCreate: othis.attr(CREATE) != undefined, + radio: othis.attr(RADIO) != undefined, + skin: othis.attr(SKIN), + direction: othis.attr(DIRECTION), + optionsFirst: select.options[0], + height: othis.attr(HEIGHT), + formname: othis.attr('name') || othis.attr('_name'), + layverify: othis.attr('lay-verify') || othis.attr('_lay-verify'), + layverType: othis.attr('lay-verType'), + searchType: othis.attr(SEARCH_TYPE) == 'dl' ? 1 : 0, + showCount: othis.attr(SHOW_COUNT) - 0, + }, + value = othis.find('option[selected]').toArray().map((option) => {//获取已选中的数据 + return { + name: option.innerHTML, + value: option.value, + } + }), + fs = new FormSelects(options); + + fs.values = value; + + if(fs.config.init) { + fs.values = fs.config.init.map(item => { + if(typeof item == 'object') { + return item; + } + return { + name: othis.find(`option[value="${item}"]`).text(), + value: item + } + }).filter(item => { + return item.name; + }); + fs.config.init = fs.values.concat([]); + }else{ + fs.config.init = value.concat([]); + } + + !fs.values && (fs.values = []); + + data[id] = fs; + + //先取消layui对select的渲染 + hasLayuiRender[0] && hasLayuiRender.remove(); + hasRender[0] && hasRender.remove(); + + //构造渲染div + let dinfo = this.renderSelect(id, fs.config.placeholder, select); + let heightStyle = !fs.config.height || fs.config.height == 'auto' ? '' : `xm-hg style="height: 34px;"`; + let inputHtml = [ + `
                                  `, + ``, + `
                                  ` + ]; + let reElem = + $(`
                                  + +
                                  +
                                  + ${inputHtml.join('')} + +
                                  +
                                  + +
                                  +
                                  +
                                  +
                                  ${dinfo}
                                  +
                                  `); + + var $parent = $(`
                                  `); + $parent.append(reElem) + othis.after($parent); + othis.attr('lay-ignore', ''); + othis.removeAttr('name') && othis.attr('_name', fs.config.formname); + othis.removeAttr('lay-verify') && othis.attr('_lay-verify', fs.config.layverify); + + //如果可搜索, 加上事件 + if(fs.config.isSearch){ + ajaxs[id] = $.extend({}, ajax, {searchUrl: fs.config.searchUrl}, ajaxs[id]); + $(document).on('input', `div.${PNAME}[FS_ID="${id}"] .${INPUT}`, (e) => { + this.search(id, e, fs.config.searchUrl); + }); + if(fs.config.searchUrl){//触发第一次请求事件 + this.triggerSearch(reElem, true); + } + }else{//隐藏第二个dl + reElem.find(`dl dd.${FORM_DL_INPUT}`).css('display', 'none'); + } + }); + } + + Common.prototype.search = function(id, e, searchUrl, call){ + let input; + if(call){ + input = call; + }else{ + input = e.target; + let keyCode = e.keyCode; + if(keyCode === 9 || keyCode === 13 || keyCode === 37 || keyCode === 38 || keyCode === 39 || keyCode === 40) { + return false; + } + } + let inputValue = $.trim(input.value); + //过滤一下tips + this.changePlaceHolder($(input)); + + let ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax; + searchUrl = ajaxConfig.searchUrl || searchUrl; + let fs = data[id], + isCreate = fs.config.isCreate, + reElem = $(`dl[xid="${id}"]`).parents(`.${FORM_SELECT}`); + //如果开启了远程搜索 + if(searchUrl){ + if(ajaxConfig.searchVal){ + inputValue = ajaxConfig.searchVal; + ajaxConfig.searchVal = ''; + } + if(!ajaxConfig.beforeSearch || (ajaxConfig.beforeSearch && ajaxConfig.beforeSearch instanceof Function && ajaxConfig.beforeSearch(id, searchUrl, inputValue))){ + let delay = ajaxConfig.delay; + if(ajaxConfig.first){ + ajaxConfig.first = false; + delay = 10; + } + clearTimeout(fs.clearid); + fs.clearid = setTimeout(() => { + reElem.find(`dl > *:not(.${FORM_SELECT_TIPS})`).remove(); + reElem.find(`dd.${FORM_NONE}`).addClass(FORM_EMPTY).text('请求中'); + this.ajax(id, searchUrl, inputValue, false, null, true); + }, delay); + } + }else{ + reElem.find(`dl .${DD_HIDE}`).removeClass(DD_HIDE); + //遍历选项, 选择可以显示的值 + reElem.find(`dl dd:not(.${FORM_SELECT_TIPS})`).each((idx, item) => { + let _item = $(item); + let searchFun = events.filter[id] || data[id].config.filter; + if(searchFun && searchFun(id, inputValue, this.getItem(id, _item), _item.hasClass(DISABLED)) == true){ + _item.addClass(DD_HIDE); + } + }); + //控制分组名称 + reElem.find('dl dt').each((index, item) => { + if(!$(item).nextUntil('dt', `:not(.${DD_HIDE})`).length) { + $(item).addClass(DD_HIDE); + } + }); + //动态创建 + this.create(id, isCreate, inputValue); + let shows = reElem.find(`dl dd:not(.${FORM_SELECT_TIPS}):not(.${DD_HIDE})`); + if(!shows.length){ + reElem.find(`dd.${FORM_NONE}`).addClass(FORM_EMPTY).text('无匹配项'); + }else{ + reElem.find(`dd.${FORM_NONE}`).removeClass(FORM_EMPTY); + } + } + } + + Common.prototype.isArray = function(obj){ + return Object.prototype.toString.call(obj) == "[object Array]"; + } + + Common.prototype.triggerSearch = function(div, isCall){ + (div ? [div] : $(`.${FORM_SELECT}`).toArray()).forEach((reElem, index) => { + reElem = $(reElem); + let id = reElem.find('dl').attr('xid') + if((id && data[id] && data[id].config.isEmpty) || isCall){ + this.search(id, null, null, data[id].config.searchType == 0 ? reElem.find(`.${LABEL} .${INPUT}`) : reElem.find(`dl .${FORM_DL_INPUT} .${INPUT}`)); + } + }); + } + + Common.prototype.clearInput = function(id){ + let div = $(`.${PNAME}[fs_id="${id}"]`); + let input = data[id].config.searchType == 0 ? div.find(`.${LABEL} .${INPUT}`) : div.find(`dl .${FORM_DL_INPUT} .${INPUT}`); + input.val(''); + } + + Common.prototype.ajax = function(id, searchUrl, inputValue, isLinkage, linkageWidth, isSearch, successCallback, isReplace){ + let reElem = $(`.${PNAME} dl[xid="${id}"]`).parents(`.${FORM_SELECT}`); + if(!reElem[0] || !searchUrl){ + return ; + } + let ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax; + let ajaxData = $.extend(true, {}, ajaxConfig.data); + ajaxData[ajaxConfig.searchName] = inputValue; + //是否需要对ajax添加随机时间 + //ajaxData['_'] = Date.now(); + $.ajax({ + type: ajaxConfig.type, + headers: ajaxConfig.header, + url: searchUrl, + data: ajaxConfig.dataType == 'json' ? JSON.stringify(ajaxData) : ajaxData, + success: (res) => { + if(typeof res == 'string'){ + res = JSON.parse(res); + } + ajaxConfig.beforeSuccess && ajaxConfig.beforeSuccess instanceof Function && (res = ajaxConfig.beforeSuccess(id, searchUrl, inputValue, res)); + if(this.isArray(res)){ + let newRes = {}; + newRes[ajaxConfig.response.statusName] = ajaxConfig.response.statusCode; + newRes[ajaxConfig.response.msgName] = ""; + newRes[ajaxConfig.response.dataName] = res; + res = newRes; + } + if(res[ajaxConfig.response.statusName] != ajaxConfig.response.statusCode) { + reElem.find(`dd.${FORM_NONE}`).addClass(FORM_EMPTY).text(res[ajaxConfig.response.msgName]); + }else{ + reElem.find(`dd.${FORM_NONE}`).removeClass(FORM_EMPTY); + this.renderData(id, res[ajaxConfig.response.dataName], isLinkage, linkageWidth, isSearch, isReplace); + data[id].config.isEmpty = res[ajaxConfig.response.dataName].length == 0; + } + successCallback && successCallback(id); + ajaxConfig.success && ajaxConfig.success instanceof Function && ajaxConfig.success(id, searchUrl, inputValue, res); + }, + error: (err) => { + reElem.find(`dd[lay-value]:not(.${FORM_SELECT_TIPS})`).remove(); + reElem.find(`dd.${FORM_NONE}`).addClass(FORM_EMPTY).text('服务异常'); + ajaxConfig.error && ajaxConfig.error instanceof Function && ajaxConfig.error(id, searchUrl, inputValue, err); + } + }); + } + + Common.prototype.renderData = function(id, dataArr, linkage, linkageWidth, isSearch, isReplace){ + if(linkage){//渲染多级联动 + this.renderLinkage(id, dataArr, linkageWidth); + return; + } + if(isReplace){ + this.renderReplace(id, dataArr); + return; + } + + let reElem = $(`.${PNAME} dl[xid="${id}"]`).parents(`.${FORM_SELECT}`); + let ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax; + let pcInput = reElem.find(`.${TDIV} input`); + + dataArr = this.exchangeData(id, dataArr); + let values = []; + reElem.find('dl').html(this.renderSelect(id, pcInput.attr('placeholder') || pcInput.attr('back'), dataArr.map((item) => { + let itemVal = $.extend({}, item, { + innerHTML: item[ajaxConfig.keyName], + value: item[ajaxConfig.keyVal], + sel: item[ajaxConfig.keySel], + disabled: item[ajaxConfig.keyDis], + type: item.type, + name: item[ajaxConfig.keyName] + }); + if(itemVal.sel){ + values.push(itemVal); + } + return itemVal; + }))); + + let label = reElem.find(`.${LABEL}`); + let dl = reElem.find('dl[xid]'); + if(isSearch){//如果是远程搜索, 这里需要判重 + let oldVal = data[id].values; + oldVal.forEach((item, index) => { + dl.find(`dd[lay-value="${item.value}"]`).addClass(THIS); + }); + values.forEach((item, index) => { + if(this.indexOf(oldVal, item) == -1){ + this.addLabel(id, label, item); + dl.find(`dd[lay-value="${item.value}"]`).addClass(THIS); + oldVal.push(item); + } + }); + }else{ + values.forEach((item, index) => { + this.addLabel(id, label, item); + dl.find(`dd[lay-value="${item.value}"]`).addClass(THIS); + }); + data[id].values = values; + } + this.commonHandler(id, label); + } + + Common.prototype.renderLinkage = function(id, dataArr, linkageWidth){ + let result = [], + index = 0, + temp = {"0": dataArr}, + ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax; + db[id] = {}; + do{ + let group = result[index ++] = [], + _temp = temp; + temp = {}; + $.each(_temp, (pid, arr) => { + $.each(arr, (idx, item) => { + let val = { + pid: pid, + name: item[ajaxConfig.keyName], + value: item[ajaxConfig.keyVal], + }; + db[id][val.value] = $.extend(item, val); + group.push(val); + let children = item[ajaxConfig.keyChildren]; + if(children && children.length){ + temp[val.value] = children; + } + }); + }); + }while(Object.getOwnPropertyNames(temp).length); + + let reElem = $(`.${PNAME} dl[xid="${id}"]`).parents(`.${FORM_SELECT}`); + let html = ['
                                  ']; + + $.each(result, (idx, arr) => { + let groupDiv = [`
                                  `]; + $.each(arr, (idx2, item) => { + let span = `
                                • ${item.name}
                                • `; + groupDiv.push(span); + }); + groupDiv.push(`
                                  `); + html = html.concat(groupDiv); + }); + html.push('
                                  '); + html.push('
                                  '); + reElem.find('dl').html(html.join('')); + reElem.find(`.${INPUT}`).css('display', 'none');//联动暂时不支持搜索 + } + + Common.prototype.renderReplace = function(id, dataArr){ + let dl = $(`.${PNAME} dl[xid="${id}"]`); + let ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax; + + dataArr = this.exchangeData(id, dataArr); + db[id] = dataArr; + + let html = dataArr.map((item) => { + let itemVal = $.extend({}, item, { + innerHTML: item[ajaxConfig.keyName], + value: item[ajaxConfig.keyVal], + sel: item[ajaxConfig.keySel], + disabled: item[ajaxConfig.keyDis], + type: item.type, + name: item[ajaxConfig.keyName] + }); + return this.createDD(id, itemVal); + }).join(''); + + dl.find(`dd:not(.${FORM_SELECT_TIPS}),dt:not([style])`).remove(); + dl.find(`dt[style]`).after($(html)); + } + + Common.prototype.exchangeData = function(id, arr){//这里处理树形结构 + let ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax; + let childrenName = ajaxConfig['keyChildren']; + let disabledName = ajaxConfig['keyDis']; + db[id] = {}; + let result = this.getChildrenList(arr, childrenName, disabledName, [], false); + return result; + } + + Common.prototype.getChildrenList = function(arr, childrenName, disabledName, pid, disabled){ + let result = [], offset = 0; + for(let a = 0; a < arr.length; a ++){ + let item = arr[a]; + if(item.type && item.type == 'optgroup'){ + result.push(item); + continue; + }else{ + offset ++; + } + let parentIds = pid.concat([]); + parentIds.push(`${offset - 1}_E`); + item[FORM_TEAM_PID] = JSON.stringify(parentIds); + item[disabledName] = item[disabledName] || disabled; + result.push(item); + let child = item[childrenName]; + if(child && common.isArray(child) && child.length){ + item['XM_TREE_FOLDER'] = true; + let pidArr = parentIds.concat([]); + let childResult = this.getChildrenList(child, childrenName, disabledName, pidArr, item[disabledName]); + result = result.concat(childResult); + } + } + return result; + } + + Common.prototype.create = function(id, isCreate, inputValue){ + if(isCreate && inputValue){ + let fs = data[id], + dl = $(`[xid="${id}"]`), + tips= dl.find(`dd.${FORM_SELECT_TIPS}.${FORM_DL_INPUT}`), + tdd = null, + temp = dl.find(`dd.${TEMP}`); + dl.find(`dd:not(.${FORM_SELECT_TIPS}):not(.${TEMP})`).each((index, item) => { + if(inputValue == $(item).find('span').attr('name')){ + tdd = item; + } + }); + if(!tdd){//如果不存在, 则创建 + let val = fs.config.create(id, inputValue); + if(temp[0]){ + temp.attr('lay-value', val); + temp.find('span').text(inputValue); + temp.find('span').attr("name", inputValue); + temp.removeClass(DD_HIDE); + }else{ + tips.after($(this.createDD(id, { + name: inputValue, + innerHTML: inputValue, + value: val + }, `${TEMP} ${CREATE_LONG}`))); + } + } + }else{ + $(`[xid=${id}] dd.${TEMP}`).remove(); + } + } + + Common.prototype.createDD = function(id, item, clz){ + let ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax; + let name = $.trim(item.innerHTML); + db[id][item.value] = $(item).is('option') ? (item = function(){ + let resultItem = {}; + resultItem[ajaxConfig.keyName] = name; + resultItem[ajaxConfig.keyVal] = item.value; + resultItem[ajaxConfig.keyDis] = item.disabled; + return resultItem; + }()) : item; + let template = data[id].config.template(id, item); + let pid = item[FORM_TEAM_PID]; + pid ? (pid = JSON.parse(pid)) : (pid = [-1]); + let attr = pid[0] == -1 ? '' : `tree-id="${pid.join('-')}" tree-folder="${!!item['XM_TREE_FOLDER']}"`; + return `
                                  +
                                  + + ${template} +
                                  +
                                  `; + } + + Common.prototype.createQuickBtn = function(obj, right){ + return `
                                  ${obj.name}
                                  ` + } + + Common.prototype.renderBtns = function(id, show, right){ + let quickBtn = []; + let dl = $(`dl[xid="${id}"]`); + quickBtn.push(`
                                  `); + $.each(data[id].config.btns, (index, item) => { + quickBtn.push(this.createQuickBtn(item, right)); + }); + quickBtn.push(`
                                  `); + quickBtn.push(this.createQuickBtn({icon: 'xm-iconfont icon-caidan', name: ''})); + return quickBtn.join(''); + } + + Common.prototype.renderSelect = function(id, tips, select){ + db[id] = {}; + let arr = []; + if(data[id].config.btns.length){ + setTimeout(() => { + let dl = $(`dl[xid="${id}"]`); + dl.parents(`.${FORM_SELECT}`).attr(SEARCH_TYPE, data[id].config.searchType); + dl.find(`.${CZ_GROUP}`).css('max-width', `${dl.prev().width() - 54}px`); + }, 10) + arr.push([ + `
                                  `, + this.renderBtns(id, null, '30px'), + `
                                  `, + `
                                  `, + ``, + ``, + `
                                  ` + ].join('')); + }else{ + arr.push(`
                                  ${tips}
                                  `); + } + if(this.isArray(select)){ + $(select).each((index, item) => { + if(item){ + if(item.type && item.type === 'optgroup') { + arr.push(`
                                  ${item.name}
                                  `); + } else { + arr.push(this.createDD(id, item)); + } + } + }); + }else{ + $(select).find('*').each((index, item) => { + if(item.tagName.toLowerCase() == 'option' && index == 0 && !item.value){ + return ; + } + if(item.tagName.toLowerCase() === 'optgroup') { + arr.push(`
                                  ${item.label}
                                  `); + } else { + arr.push(this.createDD(id, item)); + } + }); + } + arr.push('
                                  '); + arr.push(`
                                  没有选项
                                  `); + return arr.join(''); + } + + Common.prototype.on = function(){//事件绑定 + this.one(); + + $(document).on('click', (e) => { + if(!$(e.target).parents(`.${FORM_TITLE}`)[0]){//清空input中的值 + $(`.${PNAME} dl .${DD_HIDE}`).removeClass(DD_HIDE); + $(`.${PNAME} dl dd.${FORM_EMPTY}`).removeClass(FORM_EMPTY); + $(`.${PNAME} dl dd.${TEMP}`).remove(); + $.each(data, (key, fs) => { + this.clearInput(key); + if(!fs.values.length){ + this.changePlaceHolder($(`div[FS_ID="${key}"] .${LABEL}`)); + } + }); + } + $(`.${PNAME} .${FORM_SELECTED}`).each((index, item) => { + this.changeShow($(item).find(`.${FORM_TITLE}`), false); + }) ; + }); + } + + Common.prototype.calcLabelLeft = function(label, w, call){ + let pos = this.getPosition(label[0]); + pos.y = pos.x + label[0].clientWidth; + let left = label[0].offsetLeft; + if(!label.find('span').length){ + left = 0; + }else if(call){//校正归位 + let span = label.find('span:last'); + span.css('display') == 'none' ? (span = span.prev()[0]) : (span = span[0]); + let spos = this.getPosition(span); + spos.y = spos.x + span.clientWidth; + + if(spos.y > pos.y){ + left = left - (spos.y - pos.y) - 5; + }else{ + left = 0; + } + }else{ + if(w < 0){ + let span = label.find(':last'); + span.css('display') == 'none' ? (span = span.prev()[0]) : (span = span[0]); + let spos = this.getPosition(span); + spos.y = spos.x + span.clientWidth; + if(spos.y > pos.y){ + left -= 10; + } + }else{ + if(left < 0){ + left += 10; + } + if(left > 0){ + left = 0; + } + } + } + label.css('left', left + 'px'); + } + + Common.prototype.one = function(target){//一次性事件绑定 + $(target ? target : document).off('click', `.${FORM_TITLE}`).on('click', `.${FORM_TITLE}`, (e) => { + let othis = $(e.target), + title = othis.is(FORM_TITLE) ? othis : othis.parents(`.${FORM_TITLE}`), + dl = title.next(), + id = dl.attr('xid'); + + //清空非本select的input val + $(`dl[xid]`).not(dl).each((index, item) => { + this.clearInput($(item).attr('xid')); + }); + $(`dl[xid]`).not(dl).find(`dd.${DD_HIDE}`).removeClass(DD_HIDE); + + //如果是disabled select + if(title.hasClass(DIS)){ + return false; + } + //如果点击的是右边的三角或者只读的input + if(othis.is(`.${SANJIAO}`) || othis.is(`.${INPUT}[readonly]`)){ + this.changeShow(title, !title.parents(`.${FORM_SELECT}`).hasClass(FORM_SELECTED)); + return false; + } + //如果点击的是input的右边, focus一下 + if(title.find(`.${INPUT}:not(readonly)`)[0]){ + let input = title.find(`.${INPUT}`), + epos = {x: e.pageX, y: e.pageY}, + pos = this.getPosition(title[0]), + width = title.width(); + while(epos.x > pos.x){ + if($(document.elementFromPoint(epos.x, epos.y)).is(input)){ + input.focus(); + this.changeShow(title, true); + return false; + } + epos.x -= 50; + } + } + + //如果点击的是可搜索的input + if(othis.is(`.${INPUT}`)){ + this.changeShow(title, true); + return false; + } + //如果点击的是x按钮 + if(othis.is(`i[fsw="${NAME}"]`)){ + let val = this.getItem(id, othis), + dd = dl.find(`dd[lay-value='${val.value}']`); + if(dd.hasClass(DISABLED)){//如果是disabled状态, 不可选, 不可删 + return false; + } + this.handlerLabel(id, dd, false, val); + return false; + } + + this.changeShow(title, !title.parents(`.${FORM_SELECT}`).hasClass(FORM_SELECTED)); + return false; + }); + $(target ? target : document).off('click', `dl.${DL}`).on('click', `dl.${DL}`, (e) => { + let othis = $(e.target); + if(othis.is(`.${LINKAGE}`) || othis.parents(`.${LINKAGE}`)[0]){//linkage的处理 + othis = othis.is('li') ? othis : othis.parents('li[xm-value]'); + let group = othis.parents('.xm-select-linkage-group'), + id = othis.parents('dl').attr('xid'); + if(!id){ + return false; + } + //激活li + group.find('.xm-select-active').removeClass('xm-select-active'); + othis.addClass('xm-select-active'); + //激活下一个group, 激活前显示对应数据 + group.nextAll('.xm-select-linkage-group').addClass('xm-select-linkage-hide'); + let nextGroup = group.next('.xm-select-linkage-group'); + nextGroup.find('li').addClass('xm-select-linkage-hide'); + nextGroup.find(`li[pid="${othis.attr('xm-value')}"]`).removeClass('xm-select-linkage-hide'); + //如果没有下一个group, 或没有对应的值 + if(!nextGroup[0] || nextGroup.find(`li:not(.xm-select-linkage-hide)`).length == 0){ + let vals = [], + index = 0, + isAdd = !othis.hasClass('xm-select-this'); + if(data[id].config.radio){ + othis.parents('.xm-select-linkage').find('.xm-select-this').removeClass('xm-select-this'); + } + do{ + vals[index ++] = { + name: othis.find('span').text(), + value: othis.attr('xm-value') + } + othis = othis.parents('.xm-select-linkage-group').prev().find(`li[xm-value="${othis.attr('pid')}"]`); + }while(othis.length); + vals.reverse(); + let val = { + name: vals.map((item) => { + return item.name; + }).join('/'), + value: vals.map((item) => { + return item.value; + }).join('/'), + } + this.handlerLabel(id, null, isAdd, val); + }else{ + nextGroup.removeClass('xm-select-linkage-hide'); + } + return false; + } + + if(othis.is('dl')){ + return false; + } + + if(othis.is('dt')){ + othis.nextUntil(`dt`).each((index, item) => { + item = $(item); + if(item.hasClass(DISABLED) || item.hasClass(THIS)){ + + }else{ + item.find('i:not(.icon-expand)').click(); + } + }); + return false; + } + let dd = othis.is('dd') ? othis : othis.parents('dd'); + let id = dd.parent('dl').attr('xid'); + + if(dd.hasClass(DISABLED)){//被禁用选项的处理 + return false; + } + + //菜单功效 + if(othis.is('i.icon-caidan')){ + let opens = [], closes = []; + othis.parents('dl').find('dd[tree-folder="true"]').each((index, item) => { + $(item).attr('xm-tree-hidn') == undefined ? opens.push(item) : closes.push(item); + }); + let arr = closes.length ? closes : opens; + arr.forEach(item => item.click()); + return false; + } + //树状结构的选择 + let treeId = dd.attr('tree-id'); + if(treeId){ + //忽略右边的图标 + if(othis.is('i:not(.icon-expand)')){ + this.handlerLabel(id, dd, !dd.hasClass(THIS)); + return false; + } + let ajaxConfig = ajaxs[id] || ajax; + let treeConfig = ajaxConfig.tree; + let childrens = dd.nextAll(`dd[tree-id^="${treeId}"]`); + if(childrens && childrens.length){ + let len = childrens[0].clientHeight; + len ? ( + this.addTreeHeight(dd, len), + len = 0 + ) : ( + len = dd.attr('xm-tree-hidn') || 36, + dd.removeAttr('xm-tree-hidn'), + dd.find('>i').remove(), + (childrens = childrens.filter((index, item) => $(item).attr('tree-id').split('-').length - 1 == treeId.split('-').length)) + ); + childrens.animate({ + height: len + }, 150) + return false; + }else{ + if(treeConfig.nextClick && treeConfig.nextClick instanceof Function){ + treeConfig.nextClick(id, this.getItem(id, dd), (res) => { + if(!res || !res.length){ + this.handlerLabel(id, dd, !dd.hasClass(THIS)); + }else{ + dd.attr('tree-folder', 'true'); + let ddChilds = []; + res.forEach((item, idx) => { + item.innerHTML = item[ajaxConfig.keyName]; + item[FORM_TEAM_PID] = JSON.stringify(treeId.split('-').concat([idx])); + ddChilds.push(this.createDD(id, item)); + db[id][item[ajaxConfig.keyVal]] = item; + }); + dd.after(ddChilds.join('')); + } + }); + return false; + } + } + } + + if(dd.hasClass(FORM_SELECT_TIPS)){//tips的处理 + let btn = othis.is(`.${CZ}`) ? othis : othis.parents(`.${CZ}`); + if(!btn[0]){ + return false; + } + let method = btn.attr('method'); + let obj = data[id].config.btns.filter(bean => bean.name == method)[0]; + obj && obj.click && obj.click instanceof Function && obj.click(id, this); + return false; + } + this.handlerLabel(id, dd, !dd.hasClass(THIS)); + return false; + }); + } + + Common.prototype.addTreeHeight = function(dd, len){ + let treeId = dd.attr('tree-id'); + let childrens = dd.nextAll(`dd[tree-id^="${treeId}"]`); + if(childrens.length){ + dd.append(''); + dd.attr('xm-tree-hidn', len); + childrens.each((index, item) => { + let that = $(item); + this.addTreeHeight(that, len); + }) + } + } + + let db = {}; + Common.prototype.getItem = function(id, value){ + if(value instanceof $){ + if(value.is(`i[fsw="${NAME}"]`)){ + let span = value.parent(); + return db[id][value] || { + name: span.find('font').text(), + value: span.attr('value') + } + } + let val = value.attr('lay-value'); + return !db[id][val] ? (db[id][val] = { + name: value.find('span[name]').attr('name'), + value: val + }) : db[id][val]; + }else if(typeof(value) == 'string' && value.indexOf('/') != -1){ + return db[id][value] || { + name: this.valToName(id, value), + value: value + } + } + return db[id][value]; + } + + Common.prototype.linkageAdd = function(id, val){ + let dl = $(`dl[xid="${id}"]`); + dl.find('.xm-select-active').removeClass('xm-select-active'); + let vs = val.value.split('/'); + let pid, li, index = 0; + let lis = []; + do{ + pid = vs[index]; + li = dl.find(`.xm-select-linkage-group${index + 1} li[xm-value="${pid}"]`); + li[0] && lis.push(li); + index ++; + }while(li.length && pid != undefined); + if(lis.length == vs.length){ + $.each(lis, (idx, item) => { + item.addClass('xm-select-this'); + }); + } + } + + Common.prototype.linkageDel = function(id, val){ + let dl = $(`dl[xid="${id}"]`); + let vs = val.value.split('/'); + let pid, li, index = vs.length - 1; + do{ + pid = vs[index]; + li = dl.find(`.xm-select-linkage-group${index + 1} li[xm-value="${pid}"]`); + if(!li.parent().next().find(`li[pid=${pid}].xm-select-this`).length){ + li.removeClass('xm-select-this'); + } + index --; + }while(li.length && pid != undefined); + } + + Common.prototype.valToName = function(id, val){ + let dl = $(`dl[xid="${id}"]`); + let vs = (val + "").split('/'); + if(!vs.length){ + return null; + } + let names = []; + $.each(vs, (idx, item) => { + let name = dl.find(`.xm-select-linkage-group${idx + 1} li[xm-value="${item}"] span`).text(); + names.push(name); + }); + return names.length == vs.length ? names.join('/') : null; + } + + Common.prototype.commonHandler = function(key, label){ + if(!label || !label[0]){ + return ; + } + this.checkHideSpan(key, label); + //计算input的提示语 + this.changePlaceHolder(label); + //计算高度 + this.retop(label.parents(`.${FORM_SELECT}`)); + this.calcLabelLeft(label, 0, true); + //表单默认值 + this.setHidnVal(key, label); + //title值 + label.parents(`.${FORM_TITLE} .${NAME}`).attr('title', data[key].values.map((val) => { + return val.name; + }).join(',')); + } + + Common.prototype.initVal = function(id){ + let target = {}; + if(id){ + target[id] = data[id]; + }else{ + target = data; + } + $.each(target, (key, val) => { + let values = val.values, + div = $(`dl[xid="${key}"]`).parent(), + label = div.find(`.${LABEL}`), + dl = div.find('dl'); + dl.find(`dd.${THIS}`).removeClass(THIS); + + let _vals = values.concat([]); + _vals.concat([]).forEach((item, index) => { + this.addLabel(key, label, item); + dl.find(`dd[lay-value="${item.value}"]`).addClass(THIS); + }); + if(val.config.radio){ + _vals.length && values.push(_vals[_vals.length - 1]); + } + this.commonHandler(key, label); + }); + } + + Common.prototype.setHidnVal = function(key, label) { + if(!label || !label[0]) { + return; + } + label.parents(`.${PNAME}`).find(`.${HIDE_INPUT}`).val(data[key].values.map((val) => { + return val.value; + }).join(',')); + } + + Common.prototype.handlerLabel = function(id, dd, isAdd, oval, notOn){ + let div = $(`[xid="${id}"]`).prev().find(`.${LABEL}`), + val = dd && this.getItem(id, dd), + vals = data[id].values, + on = data[id].config.on || events.on[id], + endOn = data[id].config.endOn || events.endOn[id]; + if(oval){ + val = oval; + } + let fs = data[id]; + if(isAdd && fs.config.max && fs.values.length >= fs.config.max){ + let maxTipsFun = events.maxTips[id] || data[id].config.maxTips; + maxTipsFun && maxTipsFun(id, vals.concat([]), val, fs.config.max); + return ; + } + if(!notOn){ + if(on && on instanceof Function && on(id, vals.concat([]), val, isAdd, dd && dd.hasClass(DISABLED)) == false) { + return ; + } + } + let dl = $(`dl[xid="${id}"]`); + isAdd ? ( + (dd && dd[0] ? ( + dd.addClass(THIS), + dd.removeClass(TEMP) + ) : ( + dl.find('.xm-select-linkage')[0] && this.linkageAdd(id, val) + )), + this.addLabel(id, div, val), + vals.push(val) + ) : ( + (dd && dd[0] ? ( + dd.removeClass(THIS) + ) : ( + dl.find('.xm-select-linkage')[0] && this.linkageDel(id, val) + )), + this.delLabel(id, div, val), + this.remove(vals, val) + ); + if(!div[0]) return ; + //单选选完后直接关闭选择域 + if(fs.config.radio){ + this.changeShow(div, false); + } + //移除表单验证的红色边框 + div.parents(`.${FORM_TITLE}`).prev().removeClass('layui-form-danger'); + + //清空搜索值 + fs.config.clearInput && this.clearInput(id); + + this.commonHandler(id, div); + + !notOn && endOn && endOn instanceof Function && endOn(id, vals.concat([]), val, isAdd, dd && dd.hasClass(DISABLED)); + } + + Common.prototype.addLabel = function(id, div, val){ + if(!val) return ; + let tips = `fsw="${NAME}"`; + let [$label, $close] = [ + $(`${val.name}`), + $(``) + ]; + $label.append($close); + //如果是radio模式 + let fs = data[id]; + if(fs.config.radio){ + fs.values.length = 0; + $(`dl[xid="${id}"]`).find(`dd.${THIS}:not([lay-value="${val.value}"])`).removeClass(THIS); + div.find('span').remove(); + } + //如果是固定高度 + div.find('input').css('width', '50px'); + div.find('input').before($label); + } + + Common.prototype.delLabel = function(id, div, val){ + if(!val) return ; + div.find(`span[value="${val.value}"]:first`).remove(); + } + + Common.prototype.checkHideSpan = function(id, div){ + let parentHeight = div.parents(`.${NAME}`)[0].offsetHeight + 5; + div.find('span.xm-span-hide').removeClass('xm-span-hide'); + div.find('span[style]').remove(); + + let count = data[id].config.showCount; + div.find('span').each((index, item) => { + if(index >= count){ + $(item).addClass('xm-span-hide'); + } + }); + + let prefix = div.find(`span:eq(${count})`); + prefix[0] && prefix.before($(` + ${div.find('span').length - count}`)) + } + + Common.prototype.retop = function(div){//计算dl显示的位置 + let dl = div.find('dl'), + top = div.offset().top + div.outerHeight() + 5 - $win.scrollTop(), + dlHeight = dl.outerHeight(); + let up = div.hasClass('layui-form-selectup') || dl.css('top').indexOf('-') != -1 || (top + dlHeight > $win.height() && top >= dlHeight); + div = div.find(`.${NAME}`); + + let fs = data[dl.attr('xid')]; + let base = dl.parents('.layui-form-pane')[0] && dl.prev()[0].clientHeight > 38 ? 14 : 10; + if((fs && fs.config.direction == 'up') || up){ + up = true; + if((fs && fs.config.direction == 'down')){ + up = false; + } + } + let reHeight = div[0].offsetTop + div.height() + base; + if(up) { + dl.css({ + top: 'auto', + bottom: reHeight + 3 + 'px', + }); + } else { + dl.css({ + top: reHeight + 'px', + bottom: 'auto' + }); + } + } + + Common.prototype.changeShow = function(children, isShow){//显示于隐藏 + $('.layui-form-selected').removeClass('layui-form-selected'); + let top = children.parents(`.${FORM_SELECT}`), + realShow = top.hasClass(FORM_SELECTED), + id = top.find('dl').attr('xid'); + $(`.${PNAME} .${FORM_SELECT}`).not(top).removeClass(FORM_SELECTED); + if(isShow){ + this.retop(top); + top.addClass(FORM_SELECTED); + top.find(`.${INPUT}`).focus(); + if(!top.find(`dl dd[lay-value]:not(.${FORM_SELECT_TIPS})`).length){ + top.find(`dl .${FORM_NONE}`).addClass(FORM_EMPTY); + } + }else{ + top.removeClass(FORM_SELECTED); + this.clearInput(id); + top.find(`dl .${FORM_EMPTY}`).removeClass(FORM_EMPTY); + top.find(`dl dd.${DD_HIDE}`).removeClass(DD_HIDE); + top.find(`dl dd.${TEMP}`).remove(); + //计算ajax数据是否为空, 然后重新请求数据 + if(id && data[id] && data[id].config.isEmpty){ + this.triggerSearch(top); + } + this.changePlaceHolder(top.find(`.${LABEL}`)); + } + if(isShow != realShow){ + let openFun = data[id].config.opened || events.opened[id]; + isShow && openFun && openFun instanceof Function && openFun(id); + let closeFun = data[id].config.closed || events.closed[id]; + !isShow && closeFun && closeFun instanceof Function && closeFun(id); + } + } + + Common.prototype.changePlaceHolder = function(div){//显示于隐藏提示语 + //调整pane模式下的高度 + let title = div.parents(`.${FORM_TITLE}`); + title[0] || (title = div.parents(`dl`).prev()); + if(!title[0]){ + return ; + } + + let id = div.parents(`.${PNAME}`).find(`dl[xid]`).attr('xid'); + if(data[id] && data[id].config.height){//既然固定高度了, 那就看着办吧 + + }else{ + let height = title.find(`.${NAME}`)[0].clientHeight; + title.css('height' , (height > 36 ? height + 4 : height) + 'px'); + //如果是layui pane模式, 处理label的高度 + let label = title.parents(`.${PNAME}`).parent().prev(); + if(label.is('.layui-form-label') && title.parents('.layui-form-pane')[0]){ + height = height > 36 ? height + 4 : height; + title.css('height' , height + 'px'); + label.css({ + height: height + 2 + 'px', + lineHeight: (height - 18) + 'px' + }) + } + } + + let input = title.find(`.${TDIV} input`), + isShow = !div.find('span:last')[0] && !title.find(`.${INPUT}`).val(); + if(isShow){ + let ph = input.attr('back'); + input.removeAttr('back'); + input.attr('placeholder', ph); + }else{ + let ph = input.attr('placeholder'); + input.removeAttr('placeholder'); + input.attr('back', ph) + } + } + + Common.prototype.indexOf = function(arr, val){ + for(let i = 0; i < arr.length; i++) { + if(arr[i].value == val || arr[i].value == (val ? val.value : val) || arr[i] == val || JSON.stringify(arr[i]) == JSON.stringify(val)) { + return i; + } + } + return -1; + } + + Common.prototype.remove = function(arr, val){ + let idx = this.indexOf(arr, val ? val.value : val); + if(idx > -1) { + arr.splice(idx, 1); + return true; + } + return false; + } + + Common.prototype.selectAll = function(id, isOn, skipDis){ + let dl = $(`[xid="${id}"]`); + if(!dl[0]){ + return ; + } + if(dl.find('.xm-select-linkage')[0]){ + return ; + } + dl.find(`dd[lay-value]:not(.${FORM_SELECT_TIPS}):not(.${THIS})${skipDis ? ':not(.'+DISABLED+')' :''}`).each((index, item) => { + item = $(item); + let val = this.getItem(id, item); + this.handlerLabel(id, dl.find(`dd[lay-value="${val.value}"]`), true, val, !isOn); + }); + } + + Common.prototype.removeAll = function(id, isOn, skipDis){ + let dl = $(`[xid="${id}"]`); + if(!dl[0]){ + return ; + } + if(dl.find('.xm-select-linkage')[0]){//针对多级联动的处理 + data[id].values.concat([]).forEach((item, idx) => { + let vs = item.value.split('/'); + let pid, li, index = 0; + do{ + pid = vs[index ++]; + li = dl.find(`.xm-select-linkage-group${index}:not(.xm-select-linkage-hide) li[xm-value="${pid}"]`); + li.click(); + }while(li.length && pid != undefined); + }); + return ; + } + data[id].values.concat([]).forEach((item, index) => { + if(skipDis && dl.find(`dd[lay-value="${item.value}"]`).hasClass(DISABLED)){ + + }else{ + this.handlerLabel(id, dl.find(`dd[lay-value="${item.value}"]`), false, item, !isOn); + } + }); + } + + Common.prototype.reverse = function(id, isOn, skipDis){ + let dl = $(`[xid="${id}"]`); + if(!dl[0]){ + return ; + } + if(dl.find('.xm-select-linkage')[0]){ + return ; + } + dl.find(`dd[lay-value]:not(.${FORM_SELECT_TIPS})${skipDis ? ':not(.'+DISABLED+')' :''}`).each((index, item) => { + item = $(item); + let val = this.getItem(id, item); + this.handlerLabel(id, dl.find(`dd[lay-value="${val.value}"]`), !item.hasClass(THIS), val, !isOn); + }); + } + + Common.prototype.skin = function(id){ + let skins = ['default' ,'primary', 'normal', 'warm', 'danger']; + let skin = skins[Math.floor(Math.random() * skins.length)]; + $(`dl[xid="${id}"]`).parents(`.${PNAME}`).find(`.${FORM_SELECT}`).attr('xm-select-skin', skin); + this.check(id) && this.commonHandler(id, $(`dl[xid="${id}"]`).parents(`.${PNAME}`).find(`.${LABEL}`)); + } + + Common.prototype.getPosition = function(e){ + let x = 0, y = 0; + while (e != null) { + x += e.offsetLeft; + y += e.offsetTop; + e = e.offsetParent; + } + return { x: x, y: y }; + }; + + Common.prototype.onreset = function(){//监听reset按钮, 然后重置多选 + $(document).on('click', '[type=reset]', (e) => { + $(e.target).parents('form').find(`.${PNAME} dl[xid]`).each((index, item) => { + let id = item.getAttribute('xid'), + dl = $(item), + dd, + temp = {}; + common.removeAll(id); + data[id].config.init.forEach((val, idx) => { + if(val && (!temp[val] || data[id].config.repeat) && (dd = dl.find(`dd[lay-value="${val.value}"]`))[0]){ + common.handlerLabel(id, dd, true); + temp[val] = 1; + } + }); + }) + }); + } + + Common.prototype.bindEvent = function(name, id, fun){ + if(id && id instanceof Function){ + fun = id; + id = null; + } + if(fun && fun instanceof Function){ + if(!id){ + $.each(data, (id, val) => { + data[id] ? (data[id].config[name] = fun) : (events[name][id] = fun) + }) + }else{ + data[id] ? (data[id].config[name] = fun, delete events[name][id]) : (events[name][id] = fun) + } + } + } + + Common.prototype.check = function(id, notAutoRender){ + if($(`dl[xid="${id}"]`).length) { + return true; + }else if($(`select[xm-select="${id}"]`).length){ + if(!notAutoRender){ + this.render(id, $(`select[xm-select="${id}"]`)); + return true; + } + }else{ + delete data[id]; + return false; + } + } + + Common.prototype.render = function(id, select){ + common.init(select); + common.one($(`dl[xid="${id}"]`).parents(`.${PNAME}`)); + common.initVal(id); + } + + Common.prototype.log = function(obj){ + console.log(obj); + } + + let Select4 = function(){ + this.v = v; + this.render(); + }; + let common = new Common(); + + Select4.prototype.value = function(id, type, isAppend){ + if(typeof id != 'string'){ + return []; + } + let fs = data[id]; + if(!common.check(id)){ + return []; + } + if(typeof type == 'string' || type == undefined){ + let arr = fs.values.concat([]) || []; + if(type == 'val') { + return arr.map((val) => { + return val.value; + }); + } + if(type == 'valStr') { + return arr.map((val) => { + return val.value; + }).join(','); + } + if(type == 'name') { + return arr.map((val) => { + return val.name; + }); + } + if(type == 'nameStr') { + return arr.map((val) => { + return val.name; + }).join(','); + } + return arr; + } + if(common.isArray(type)) { + let dl = $(`[xid="${id}"]`), + temp = {}, + dd, + isAdd = true; + if(isAppend == false){//删除传入的数组 + isAdd = false; + }else if(isAppend == true){//追加模式 + isAdd = true; + }else{//删除原有的数据 + common.removeAll(id); + } + if(isAdd){ + fs.values.forEach((val, index) => { + temp[val.value] = 1; + }); + } + type.forEach((val, index) => { + if(val && (!temp[val] || fs.config.repeat)){ + if((dd = dl.find(`dd[lay-value="${val}"]`))[0]){ + common.handlerLabel(id, dd, isAdd, null, true); + temp[val] = 1; + }else{ + let name = common.valToName(id, val); + if(name){ + common.handlerLabel(id, dd, isAdd, common.getItem(id, val), true); + temp[val] = 1; + } + } + } + }); + } + } + + Select4.prototype.on = function(id, fun, isEnd) { + common.bindEvent(isEnd ? 'endOn' : 'on', id, fun); + return this; + } + + Select4.prototype.filter = function(id, fun){ + common.bindEvent('filter', id, fun); + return this; + } + + Select4.prototype.maxTips = function(id, fun){ + common.bindEvent('maxTips', id, fun); + return this; + } + + Select4.prototype.opened = function(id, fun){ + common.bindEvent('opened', id, fun); + return this; + } + + Select4.prototype.closed = function(id, fun){ + common.bindEvent('closed', id, fun); + return this; + } + + Select4.prototype.config = function(id, config, isJson){ + if(id && typeof id == 'object'){ + isJson = config == true; + config = id; + id = null; + } + if(config && typeof config== 'object'){ + if(isJson){ + config.header || (config.header = {}); + config.header['Content-Type'] = 'application/json; charset=UTF-8'; + config.dataType = 'json'; + } + id ? ( + ajaxs[id] = $.extend(true, {}, ajaxs[id] || ajax, config), !common.check(id) && this.render(id), + data[id] && config.direction && (data[id].config.direction = config.direction), + data[id] && config.clearInput && (data[id].config.clearInput = true), + config.searchUrl && data[id] && common.triggerSearch($(`.${PNAME} dl[xid="${id}"]`).parents(`.${FORM_SELECT}`), true) + ) : ( + $.extend(true, ajax, config), + $.each(ajaxs, (key, item) => { + $.extend(true, item, config) + }) + ); + } + return this; + } + + Select4.prototype.render = function(id, options){ + if(id && typeof id == 'object'){ + options = id; + id = null; + } + let config = options ? { + init: options.init, + disabled: options.disabled, + max: options.max, + isSearch: options.isSearch, + searchUrl: options.searchUrl, + isCreate: options.isCreate, + radio: options.radio, + skin: options.skin, + direction: options.direction, + height: options.height, + formname: options.formname, + layverify: options.layverify, + layverType: options.layverType, + showCount: options.showCount, + placeholder: options.placeholder, + create: options.create, + filter: options.filter, + maxTips: options.maxTips, + on: options.on, + on: options.on, + opened: options.opened, + closed: options.closed, + template: options.template, + clearInput: options.clearInput, + } : {}; + + options && options.searchType != undefined && (config.searchType = options.searchType == 'dl' ? 1 : 0); + + if(id){ + fsConfigs[id] = {}; + $.extend(fsConfigs[id], data[id] ? data[id].config : {}, config); + }else{ + $.extend(fsConfig, config); + } + + ($(`select[${NAME}="${id}"]`)[0] ? $(`select[${NAME}="${id}"]`) : $(`select[${NAME}]`)).each((index, select) => { + let sid = select.getAttribute(NAME); + common.render(sid, select); + setTimeout(() => common.setHidnVal(sid, $(`select[xm-select="${sid}"] + div.${PNAME} .${LABEL}`)), 10); + }); + return this; + } + + Select4.prototype.disabled = function(id){ + let target = {}; + id ? (common.check(id) && (target[id] = data[id])) : (target = data); + + $.each(target, (key, val) => { + $(`dl[xid="${key}"]`).prev().addClass(DIS); + }); + return this; + } + + Select4.prototype.undisabled = function(id){ + let target = {}; + id ? (common.check(id) && (target[id] = data[id])) : (target = data); + + $.each(target, (key, val) => { + $(`dl[xid="${key}"]`).prev().removeClass(DIS); + }); + return this; + } + + Select4.prototype.data = function(id, type, config){ + if(!id || !type || !config){ + common.log(`id: ${id} param error !!!`) + return this; + } + if(!common.check(id)){ + common.log(`id: ${id} not render !!!`) + return this; + } + this.value(id, []); + this.config(id, config); + if(type == 'local'){ + common.renderData(id, config.arr, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100'); + }else if(type == 'server'){ + common.ajax(id, config.url, config.keyword, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100'); + } + return this; + } + + Select4.prototype.btns = function(id, btns, config){ + if(id && common.isArray(id)){ + btns = id; + id = null; + } + if(!btns || !common.isArray(btns)) { + return this; + }; + let target = {}; + id ? (common.check(id) && (target[id] = data[id])) : (target = data); + + btns = btns.map((obj) => { + if(typeof obj == 'string'){ + if(obj == 'select'){ + return quickBtns[0]; + } + if(obj == 'remove'){ + return quickBtns[1]; + } + if(obj == 'reverse'){ + return quickBtns[2]; + } + if(obj == 'skin'){ + return quickBtns[3]; + } + } + return obj; + }); + + $.each(target, (key, val) => { + val.config.btns = btns; + let dd = $(`dl[xid="${key}"]`).find(`.${FORM_SELECT_TIPS}:first`); + if(btns.length){ + let show = config && config.show && (config.show == 'name' || config.show == 'icon') ? config.show : ''; + let html = common.renderBtns(key, show, config && config.space ? config.space : '30px'); + dd.html(html); + }else{ + let pcInput = dd.parents(`.${FORM_SELECT}`).find(`.${TDIV} input`); + let html = pcInput.attr('placeholder') || pcInput.attr('back'); + dd.html(html); + dd.removeAttr('style'); + } + }); + + return this; + } + + Select4.prototype.search = function(id, val){ + if(id && common.check(id)){ + ajaxs[id] = $.extend(true, {}, ajaxs[id] || ajax, { + first: true, + searchVal: val + }); + common.triggerSearch($(`dl[xid="${id}"]`).parents(`.${FORM_SELECT}`), true); + } + return this; + } + + Select4.prototype.replace = function(id, type, config){ + if(!id || !type || !config){ + common.log(`id: ${id} param error !!!`) + return this; + } + if(!common.check(id, true)){ + common.log(`id: ${id} not render !!!`) + return this; + } + let oldVals = this.value(id, 'val'); + this.value(id, []); + this.config(id, config); + if(type == 'local'){ + common.renderData(id, config.arr, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100', false, true); + this.value(id, oldVals, true); + }else if(type == 'server'){ + common.ajax(id, config.url, config.keyword, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100', false, (id) => { + this.value(id, oldVals, true); + }, true); + } + } + + return new Select4(); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/step.js b/public/static/component/pear/module/step.js new file mode 100644 index 0000000..4c96d17 --- /dev/null +++ b/public/static/component/pear/module/step.js @@ -0,0 +1,80 @@ +layui.define(['layer', 'carousel'], function (exports) { + var $ = layui.jquery; + var layer = layui.layer; + var carousel = layui.carousel; + + var renderDom = function (elem, stepItems, postion) { + var stepDiv = '
                                  '; + for (var i = 0; i < stepItems.length; i++) { + stepDiv += '
                                  '; + if (i < (stepItems.length - 1)) { + if (i < postion) { + stepDiv += '
                                  '; + } else { + stepDiv += '
                                  '; + } + } + var number = stepItems[i].number; + if (!number) { + number = i + 1; + } + if (i == postion) { + stepDiv += '
                                  ' + number + '
                                  '; + } else if (i < postion) { + stepDiv += '
                                  '; + } else { + stepDiv += '
                                  ' + number + '
                                  '; + } + var title = stepItems[i].title; + var desc = stepItems[i].desc; + var time = stepItems[i].time; + if (title || desc || time) { + stepDiv += '
                                  '; + if (title) { + stepDiv += '
                                  ' + title + '
                                  '; + } + if (desc) { + stepDiv += '
                                  ' + desc + '
                                  '; + } + if (time) { + stepDiv += '
                                  ' + time + '
                                  '; + } + stepDiv += '
                                  '; + } + stepDiv += '
                                  '; + } + stepDiv += '
                                  '; + $(elem).prepend(stepDiv); + var bfb = 100 / stepItems.length; + $('.step-item').css('width', bfb + '%'); + }; + + var pearStep = { + render: function (param) { + param.indicator = 'none'; // 不显示指示器 + param.arrow = 'always'; // 始终显示箭头 + param.autoplay = false; // 关闭自动播放 + if (!param.stepWidth) { + param.stepWidth = '400px'; + } + carousel.render(param); + var stepItems = param.stepItems; + renderDom(param.elem, stepItems, 0); + $('.lay-step').css('width', param.stepWidth); + carousel.on('change(' + param.filter + ')', function (obj) { + $(param.elem).find('.lay-step').remove(); + renderDom(param.elem, stepItems, obj.index); + $('.lay-step').css('width', param.stepWidth); + }); + $(param.elem).find('.layui-carousel-arrow').css('display', 'none'); + $(param.elem).css('background-color', 'transparent'); + }, + next: function (elem) { + $(elem).find('.layui-carousel-arrow[lay-type=add]').trigger('click'); + }, + pre: function (elem) { + $(elem).find('.layui-carousel-arrow[lay-type=sub]').trigger('click'); + } + }; + exports('step', pearStep); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/tab.js b/public/static/component/pear/module/tab.js new file mode 100644 index 0000000..27ffb60 --- /dev/null +++ b/public/static/component/pear/module/tab.js @@ -0,0 +1,607 @@ +layui.define(['jquery', 'element'], function(exports) { + "use strict"; + + var MOD_NAME = 'tab', + $ = layui.jquery, + element = layui.element; + + var pearTab = function(opt) { + this.option = opt; + }; + + var tabData = new Array(); + var tabDataCurrent = 0; + + pearTab.prototype.render = function(opt) { + //默认配置值 + var option = { + elem: opt.elem, + data: opt.data, + tool: opt.tool, + roll: opt.roll, + index: opt.index, + width: opt.width, + height: opt.height, + tabMax: opt.tabMax, + session: opt.session ? opt.session : false, + closeEvent: opt.closeEvent, + success: opt.success ? opt.success : function(id) {} + } + + // 初始化,检索 session 是否开启 + if (option.session) { + // 替换 opt.data 数据 + if (sessionStorage.getItem(option.elem + "-pear-tab-data") != null) { + tabData = JSON.parse(sessionStorage.getItem(option.elem + "-pear-tab-data")); + option.data = JSON.parse(sessionStorage.getItem(option.elem + "-pear-tab-data")); + tabDataCurrent = sessionStorage.getItem(option.elem + "-pear-tab-data-current"); + tabData.forEach(function(item, index) { + if (item.id == tabDataCurrent) { + option.index = index; + } + }) + } else { + tabData = opt.data; + } + } + + + var lastIndex; + var tab = createTab(option); + $("#" + option.elem).html(tab); + $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-prev").click(function() { + rollPage("left", option); + }) + $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-next").click(function() { + rollPage("right", option); + }) + element.init(); + toolEvent(option); + $("#" + option.elem).width(opt.width); + $("#" + option.elem).height(opt.height); + $("#" + option.elem).css({ + position: "relative" + }); + closeEvent(option); + + option.success(sessionStorage.getItem(option.elem + "-pear-tab-data-current")); + + $("body .layui-tab[lay-filter='" + option.elem + "']").on("contextmenu", "li", function(e) { + + // 获取当前元素位置 + var top = e.clientY; + var left = e.clientX; + + var currentId = $(this).attr("lay-id"); + + var menu = "
                                  • 关闭当前
                                  • 关闭其他
                                  • 关闭所有
                                  "; + + // 初始化 + layer.open({ + type: 1, + title: false, + shade: false, + skin: 'pear-tab-menu', + closeBtn: false, + area: ['100px', '108px'], + fixed: true, + offset: [top, left], + content: menu, //iframe的url, + success: function(layero, index) { + layer.close(lastIndex); + lastIndex = index; + menuEvent(option,index); + var timer; + $(layero).on('mouseout', function() { + timer = setTimeout(function() { + layer.close(index); + }, 30) + }); + + $(layero).on('mouseover', function() { + clearTimeout(timer); + }); + + // 清除 item 右击 + $(layero).on('contextmenu',function(){ + return false; + }) + + } + }); + return false; + }) + + return new pearTab(option); + } + + pearTab.prototype.click = function(callback) { + var elem = this.option.elem; + var option = this.option; + element.on('tab(' + this.option.elem + ')', function(data) { + var id = $("#" + elem + " .layui-tab-title .layui-this").attr("lay-id"); + sessionStorage.setItem(option.elem + "-pear-tab-data-current", id); + callback(id); + }); + } + + pearTab.prototype.positionTab = function() { + var $tabTitle = $('.layui-tab[lay-filter=' + this.option.elem + '] .layui-tab-title'); + var autoLeft = 0; + $tabTitle.children("li").each(function() { + if ($(this).hasClass('layui-this')) { + return false; + } else { + autoLeft += $(this).outerWidth(); + } + }); + $tabTitle.animate({ + scrollLeft: autoLeft - $tabTitle.width() / 3 + }, 200); + } + + pearTab.prototype.clear = function() { + sessionStorage.removeItem(this.option.elem + "-pear-tab-data"); + sessionStorage.removeItem(this.option.elem + "-pear-tab-data-current"); + } + + pearTab.prototype.addTab = function(opt) { + var title = ''; + if (opt.close) { + title += '' + opt.title + + ''; + } else { + title += '' + opt.title + + ''; + } + element.tabAdd(this.option.elem, { + title: title, + content: '', + id: opt.id + }); + tabData.push(opt); + sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData)); + sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id); + element.tabChange(this.option.elem, opt.id); + } + + var index = 0; + + // 根据过滤 filter 标识, 删除执行选项卡 + pearTab.prototype.delTabByElem = function(elem, id, callback) { + var currentTab = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title [lay-id='" + id + "']"); + if (currentTab.find("span").is(".able-close")) { + tabDelete(elem, id, callback); + } + } + + // 根据过滤 filter 标识, 删除当前选项卡 + pearTab.prototype.delCurrentTabByElem = function(elem, callback) { + var currentTab = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title .layui-this"); + if (currentTab.find("span").is(".able-close")) { + var currentId = currentTab.attr("lay-id"); + tabDelete(elem, currentId, callback); + } + } + + // 通过过滤 filter 标识, 新增标签页 + pearTab.prototype.addTabOnlyByElem = function(elem, opt, time) { + var title = ''; + if (opt.close) { + title += '' + opt.title + + '' + } else { + title += '' + opt.title + + '' + } + if ($(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li[lay-id]").length <= 0) { + + if (time != false && time != 0) { + + var load = '
                                  ' + + '
                                  ' + + '' + + '
                                  ' + + '
                                  ' + $("#" + elem).find(".pear-tab").append(load); + var pearLoad = $("#" + elem).find("#pear-tab-loading" + index); + pearLoad.css({ + display: "block" + }); + setTimeout(function() { + pearLoad.fadeOut(500); + }, time); + index++; + } + element.tabAdd(elem, { + title: title, + content: '', + id: opt.id + }); + tabData.push(opt); + sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData)); + } else { + var isData = false; + $.each($(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li[lay-id]"), function() { + if ($(this).attr("lay-id") == opt.id) { + isData = true; + } + }) + + if (isData == false) { + if (time != false && time != 0) { + var load = '
                                  ' + + '
                                  ' + + '' + + '
                                  ' + + '
                                  ' + + $("#" + elem).find(".pear-tab").append(load); + var pearLoad = $("#" + elem).find("#pear-tab-loading" + index); + pearLoad.css({ + display: "block" + }); + setTimeout(function() { + pearLoad.fadeOut(500); + }, time); + index++; + } + element.tabAdd(elem, { + title: title, + content: '', + id: opt.id + }); + tabData.push(opt); + sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData)); + + } + } + sessionStorage.setItem(elem + "-pear-tab-data-current", opt.id); + element.tabChange(elem, opt.id); + } + + /** 添 加 唯 一 选 项 卡 */ + pearTab.prototype.addTabOnly = function(opt, time) { + var title = ''; + if (opt.close) { + title += '' + opt.title + + ''; + } else { + title += '' + opt.title + + ''; + } + if ($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]").length <= 0) { + if (time != false && time != 0) { + var load = '
                                  ' + + '
                                  ' + + '' + + '
                                  ' + + '
                                  '; + $("#" + this.option.elem).find(".pear-tab").append(load); + var pearLoad = $("#" + this.option.elem).find("#pear-tab-loading" + index); + pearLoad.css({ + display: "block" + }); + setTimeout(function() { + pearLoad.fadeOut(500); + }, time); + index++; + } + element.tabAdd(this.option.elem, { + title: title, + content: '', + id: opt.id + }); + tabData.push(opt); + sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData)); + sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id); + } else { + var isData = false; + //查询当前选项卡数量 + if ($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]").length >= this.option.tabMax) { + layer.msg("最多打开" + this.option.tabMax + "个标签页", { + icon: 2, + time: 1000, + shift: 6 //抖动效果 + }); + return false; + } + $.each($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]"), function() { + if ($(this).attr("lay-id") == opt.id) { + isData = true; + } + }) + if (isData == false) { + if (time != false && time != 0) { + var load = '
                                  ' + + '
                                  ' + + '' + + '
                                  ' + + '
                                  ' + + $("#" + this.option.elem).find(".pear-tab").append(load); + var pearLoad = $("#" + this.option.elem).find("#pear-tab-loading" + index); + pearLoad.css({ + display: "block" + }); + setTimeout(function() { + pearLoad.fadeOut(500); + }, time); + index++; + } + element.tabAdd(this.option.elem, { + title: title, + content: '', + id: opt.id + }); + tabData.push(opt); + sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData)); + sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id); + } + } + element.tabChange(this.option.elem, opt.id); + sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id); + } + + // 刷 新 指 定 的 选 项 卡 + pearTab.prototype.refresh = function(time) { + // 刷 新 指 定 的 选 项 卡 + if (time != false && time != 0) { + var load = '
                                  ' + + '
                                  ' + + '' + + '
                                  ' + + '
                                  ' + + var elem = this.option.elem; + $("#" + this.option.elem).find(".pear-tab").append(load); + var pearLoad = $("#" + this.option.elem).find("#pear-tab-loading" + index); + pearLoad.css({ + display: "block" + }); + index++; + setTimeout(function() { + pearLoad.fadeOut(500, function() { + pearLoad.remove(); + }); + }, time); + $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-content .layui-show").find("iframe")[0].contentWindow + .location.reload(true); + } else { + $(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-content .layui-show").find("iframe")[0].contentWindow + .location.reload(true); + } + } + + + function tabDelete(elem, id, callback, option) { + + //根据 elem id 来删除指定的 layui title li + var tabTitle = $(".layui-tab[lay-filter='" + elem + "']").find(".layui-tab-title"); + + // 删除指定 id 的 title + var removeTab = tabTitle.find("li[lay-id='" + id + "']"); + var nextNode = removeTab.next("li"); + if (!removeTab.hasClass("layui-this")) { + removeTab.remove(); + var tabContent = $(".layui-tab[lay-filter='" + elem + "']").find("iframe[id='" + id + "']").parent(); + tabContent.remove(); + + tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-data")); + tabDataCurrent = sessionStorage.getItem(elem + "-pear-tab-data-current"); + tabData = tabData.filter(function(item) { + return item.id != id; + }) + sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData)); + return false; + } + + var currId; + if (nextNode.length) { + nextNode.addClass("layui-this"); + currId = nextNode.attr("lay-id"); + $("#" + elem + " [id='" + currId + "']").parent().addClass("layui-show"); + } else { + var prevNode = removeTab.prev("li"); + prevNode.addClass("layui-this"); + currId = prevNode.attr("lay-id"); + $("#" + elem + " [id='" + currId + "']").parent().addClass("layui-show"); + } + callback(currId); + tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-data")); + tabDataCurrent = sessionStorage.getItem(elem + "-pear-tab-data-current"); + tabData = tabData.filter(function(item) { + return item.id != id; + }) + sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData)); + sessionStorage.setItem(elem + "-pear-tab-data-current", currId); + + removeTab.remove(); + // 删除 content + var tabContent = $(".layui-tab[lay-filter='" + elem + "']").find("iframe[id='" + id + "']").parent(); + // 删除 + tabContent.remove(); + } + + function createTab(option) { + + var type = ""; + var types = option.type + " "; + if (option.roll == true) { + type = "layui-tab-roll"; + } + if (option.tool != false) { + type = "layui-tab-tool"; + } + if (option.roll == true && option.tool != false) { + type = "layui-tab-rollTool"; + } + var tab = '
                                  '; + var title = '
                                    '; + var content = '
                                    '; + var control = + '
                                    • '; + + // 处 理 选 项 卡 头 部 + var index = 0; + $.each(option.data, function(i, item) { + var TitleItem = ''; + if (option.index == index) { + TitleItem += '
                                    • '; + } else { + TitleItem += '
                                    • '; + } + + if (item.close) { + // 当 前 选 项 卡 可 以 关 闭 + TitleItem += '' + item.title + ''; + } else { + // 当 前 选 项 卡 不 允 许 关 闭 + TitleItem += '' + item.title + ''; + } + TitleItem += '
                                    • '; + title += TitleItem; + + if (option.index == index) { + + + + // 处 理 显 示 内 容 + content += '
                                      ' + } else { + // 处 理 显 示 内 容 + content += '
                                      ' + } + index++; + }); + + title += '
                                    '; + content += '
                                  • '; + control += '
                                    关 闭 当 前
                                    ' + control += '
                                    关 闭 其 他
                                    ' + control += '
                                    关 闭 全 部
                                    ' + control += '
                                  '; + + tab += title; + tab += control; + tab += content; + tab += '
                                  '; + tab += '' + return tab; + } + + function rollPage(d, option) { + var $tabTitle = $('#' + option.elem + ' .layui-tab-title'); + var left = $tabTitle.scrollLeft(); + if ('left' === d) { + $tabTitle.animate({ + scrollLeft: left - 450 + }, 200); + } else { + $tabTitle.animate({ + scrollLeft: left + 450 + }, 200); + } + } + + function closeEvent(option) { + $(".layui-tab[lay-filter='" + option.elem + "']").on("click", ".layui-tab-close", function() { + var layid = $(this).parent().attr("lay-id"); + tabDelete(option.elem, layid, option.closeEvent, option); + }) + } + + function menuEvent(option,index) { + + $("#" + option.elem + "closeThis").click(function() { + var currentTab = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this"); + + if (currentTab.find("span").is(".able-close")) { + var currentId = currentTab.attr("lay-id"); + tabDelete(option.elem, currentId, option.closeEvent, option); + } else { + layer.msg("当前页面不允许关闭", { + icon: 3, + time: 800 + }) + } + layer.close(index); + }) + + $("#" + option.elem + "closeOther").click(function() { + var currentId = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this").attr("lay-id"); + var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); + $.each(tabtitle, function(i) { + if ($(this).attr("lay-id") != currentId) { + if ($(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option); + } + } + }) + layer.close(index); + }) + + $("#" + option.elem + "closeAll").click(function() { + var currentId = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this").attr("lay-id"); + var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); + $.each(tabtitle, function(i) { + if ($(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option); + } + }) + layer.close(index); + }) + } + + + function toolEvent(option) { + + $("body .layui-tab[lay-filter='" + option.elem + "']").on("click", "#closeThis", function() { + var currentTab = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this"); + if (currentTab.find("span").is(".able-close")) { + var currentId = currentTab.attr("lay-id"); + tabDelete(option.elem, currentId, option.closeEvent, option); + } else { + layer.msg("当前页面不允许关闭", { + icon: 3, + time: 800 + }) + } + }) + + $("body .layui-tab[lay-filter='" + option.elem + "']").on("click", "#closeOther", function() { + var currentId = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this").attr("lay-id"); + var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); + $.each(tabtitle, function(i) { + if ($(this).attr("lay-id") != currentId) { + if ($(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option); + } + } + }) + }) + + $("body .layui-tab[lay-filter='" + option.elem + "']").on("click", "#closeAll", function() { + var currentId = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this").attr("lay-id"); + var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); + $.each(tabtitle, function(i) { + if ($(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option); + } + }) + }) + } + + exports(MOD_NAME, new pearTab()); +}) diff --git a/public/static/component/pear/module/tag.js b/public/static/component/pear/module/tag.js new file mode 100644 index 0000000..8937665 --- /dev/null +++ b/public/static/component/pear/module/tag.js @@ -0,0 +1,162 @@ +layui.define('jquery', function(exports){ + "use strict"; + + var $ = layui.$ + ,MOD_NAME = 'tag', + TAG_CLASS = '.tag', + BUTTON_NEW_TAG ='button-new-tag', + INPUT_NEW_TAG ='input-new-tag', + TAG_ITEM ='tag-item', + CLOSE = 'tag-close', + DEFAULT_SKIN ='layui-btn layui-btn-primary layui-btn-sm' + ,tag = function(){ + this.config = { + likeHref:'../../modules/tag.css', + skin: DEFAULT_SKIN, + tagText:'+ New Tag' + }; + this.configs = {} + }; + + //全局设置 + tag.prototype.set = function(options){ + var that = this; + $.extend(true, that.config, options); + tag.render(); + return that; + }; + + //表单事件监听 + tag.prototype.on = function(events, callback){ + return layui.onevent.call(this, MOD_NAME, events, callback); + }; + + //外部Tag新增 + tag.prototype.add = function(filter, options){ + var tagElem = $(TAG_CLASS + '[lay-filter='+ filter +']') + call.add(null, tagElem, options); + call.tagAuto(filter); + return this; + }; + + //外部Tag删除 + tag.prototype.delete = function(filter, layid){ + var tagElem = $(TAG_CLASS + '[lay-filter='+ filter +']') + ,tagItemElem = tagElem.find('>.' + TAG_ITEM + '[lay-id="'+ layid +'"]'); + call.delete(null, tagItemElem); + return this; + }; + + //基础事件体 + var call = { + //Tag点击 + tagClick: function(e, index, tagItemElem, options){ + options = options || {}; + var othis = tagItemElem || $(this) + ,index = index || othis.index(othis) + ,parents = othis.parents(TAG_CLASS).eq(0) + ,filter = parents.attr('lay-filter'); + layui.event.call(this, MOD_NAME, 'click('+ filter +')', { + elem: parents + ,index: index + }); + } + //Tag新增事件 + ,add: function(e, tagElem, options){ + var filter = tagElem.attr('lay-filter'), + buttonNewTag = tagElem.children('.' + BUTTON_NEW_TAG), + index = buttonNewTag.index() + ,newTag = ''; + var result = layui.event.call(this, MOD_NAME, 'add('+ filter +')', { + elem: tagElem + ,index: index + ,othis: newTag + }) + if(result === false) return; + buttonNewTag[0] ? buttonNewTag.before(newTag) : tagElem.append(newTag); + } + //Tag输入事件 + ,input: function(e, othis){ + var buttonNewTag = othis || $(this) + ,parents = buttonNewTag.parents(TAG_CLASS).eq(0) + ,filter = parents.attr('lay-filter') + var options = tag.configs[filter] = $.extend({}, tag.config, tag.configs[filter] || {}, options); + //标签输入框 + var inpatNewTag = $('
                                  '); + inpatNewTag.addClass(options.skin); + buttonNewTag.after(inpatNewTag).remove(); + inpatNewTag.children('.layui-input').on('blur', function () { + if(this.value){ + var options = { + text: this.value + } + call.add(null, parents, options); + } + inpatNewTag.remove(); + call.tagAuto(filter); + }).focus(); + } + //Tag删除 + ,delete: function(e, othis){ + var tagItem = othis || $(this).parent(), index = tagItem.index() + ,parents = tagItem.parents(TAG_CLASS).eq(0) + ,filter = parents.attr('lay-filter'); + + var result = layui.event.call(this, MOD_NAME, 'delete('+ filter +')', { + elem: parents + ,index: index + }) + if(result === false) return; + tagItem.remove() + } + //Tag 自适应 + ,tagAuto: function(filter){ + filter = filter || ''; + var options = filter ? tag.configs[filter] || tag.config : tag.config; + var elemFilter = function(){ + return filter ? ('[lay-filter="' + filter +'"]') : ''; + }(); + $(TAG_CLASS + elemFilter).each(function(){ + var othis = $(this),tagItem = othis.children('.' + TAG_ITEM), buttonNewTag = othis.children('.' + BUTTON_NEW_TAG); + tagItem.removeClass(DEFAULT_SKIN).addClass(options.skin); + //允许关闭 + if(othis.attr('lay-allowClose') && tagItem.length){ + tagItem.each(function(){ + var li = $(this); + if(!li.find('.'+CLOSE)[0]){ + var close = $(''); + close.on('click', call.delete); + li.append(close); + } + }); + } + //允许新增标签 + if(othis.attr('lay-newTag') && buttonNewTag.length === 0){ + buttonNewTag = $(''); + buttonNewTag.on('click', call.input); + othis.append(buttonNewTag); + } + buttonNewTag.html(options.tagText); + buttonNewTag.removeClass(DEFAULT_SKIN).addClass(options.skin); + }); + } + }; + + //初始化元素操作 + tag.prototype.init = function(filter, options){ + layui.addcss(tag.config.likeHref); + if(filter){ + tag.configs[filter] = $.extend({}, tag.config, tag.configs[filter] || {}, options); + } + return call.tagAuto.call(this, filter); + }; + + tag.prototype.render = tag.prototype.init; + + var tag = new tag(), dom = $(document); + tag.render(); + + dom.on('click', '.' + TAG_ITEM, call.tagClick); //tag 单击事件 + exports(MOD_NAME, tag); +}); + diff --git a/public/static/component/pear/module/theme.js b/public/static/component/pear/module/theme.js new file mode 100644 index 0000000..ab114b9 --- /dev/null +++ b/public/static/component/pear/module/theme.js @@ -0,0 +1,86 @@ +layui.define(["jquery","layer"], function (exports) { + var MOD_NAME = 'theme', + $ = layui.jquery; + + var theme = {}; + theme.autoHead = false; + + theme.changeTheme = function (target, autoHead) { + this.autoHead = autoHead; + const color = localStorage.getItem("theme-color-context"); + this.colorSet(color); + if (target.frames.length == 0) return; + for (var i = 0; i < target.frames.length; i++) { + try { + if(target.frames[i].layui == undefined) continue; + target.frames[i].layui.theme.changeTheme(target.frames[i], autoHead); + } + catch (error) { + console.log(error); + } + } + } + + theme.colorSet = function(color) { + + let style = ''; + style += '.light-theme .pear-nav-tree .layui-this a:hover,.light-theme .pear-nav-tree .layui-this,.light-theme .pear-nav-tree .layui-this a,.pear-nav-tree .layui-this a,.pear-nav-tree .layui-this{background-color: ' +color + '!important;}'; + style += '.pear-admin .layui-logo .title{color:' + color + '!important;}'; + style += '.pear-frame-title .dot,.pear-tab .layui-this .pear-tab-active{background-color: ' + color +'!important;}'; + style += '.bottom-nav li a:hover{background-color:' + color + '!important;}'; + style += '.pear-admin .layui-header .layui-nav .layui-nav-bar{background-color: ' + color + '!important;}' + style += '.ball-loader>span,.signal-loader>span {background-color: ' + color + '!important;}'; + style += '.layui-header .layui-nav-child .layui-this a{background-color:' + color +'!important;color:white!important;}'; + style += '#preloader{background-color:' + color + '!important;}'; + style += '.pearone-color .color-content li.layui-this:after, .pearone-color .color-content li:hover:after {border: ' +color + ' 3px solid!important;}'; + style += '.layui-nav .layui-nav-child dd.layui-this a, .layui-nav-child dd.layui-this{background-color:' + color + '!important}'; + style += '.pear-social-entrance {background-color:' + color + '!important}'; + style += '.pear-admin .pe-collaspe {background-color:' + color + '!important}'; + style += '.layui-fixbar li {background-color:' + color + '!important}'; + if(this.autoHead){ + style += '.pear-admin .layui-header{background-color:' + color + '!important;}.pear-admin .layui-header .layui-nav .layui-nav-item>a{color:white!important;}'; + } + style += '.pear-btn-primary {background-color:' + color + '!important}'; + style += '.layui-input:focus,.layui-textarea:focus {border-color: '+ color +'!important;}' + style += '.layui-form-checked[lay-skin=primary] i {border-color: '+ color +'!important;background-color: ' + color + ';}' + style += '.layui-form-onswitch { border-color: ' + color + '; background-color: '+color+';}' + style += '.layui-form-radio>i:hover, .layui-form-radioed>i {color: ' + color + ';}' + style += '.layui-laypage .layui-laypage-curr .layui-laypage-em{background-color:'+ color +'!important}' + style += '.layui-tab-brief>.layui-tab-more li.layui-this:after, .layui-tab-brief>.layui-tab-title .layui-this:after{border-bottom: 3px solid '+color+'!important}' + style += '.layui-tab-brief>.layui-tab-title .layui-this{color:'+color+'!important}' + style += '.layui-progress-bar{background-color:'+color+'}'; + style += '.layui-elem-quote{border-left: 5px solid '+ color +'}'; + style += '.layui-timeline-axis{color:' + color + '}'; + style += '.layui-laydate .layui-this{background-color:'+color+'!important}'; + style += '.pear-this,.pear-text{color:' + color + '!important}'; + style += '.pear-back{background-color:'+ color +'!important}'; + style += '.pear-collasped-pe{background-color:'+color+'!important}' + style += '.layui-form-select dl dd.layui-this{background-color:'+color+'}' + style += '.tag-item-normal{background:'+color+'!important}'; + style += '.step-item-head.step-item-head-active{background-color:'+color+'}' + style += '.step-item-head{border: 3px solid '+color+';}' + style += '.step-item-tail i{background-color:'+color+'}' + style += '.step-item-head{color:' + color + '}' + style += 'div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i {background-color:'+color+'!important}' + style += 'div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span{border: 1px solid '+color+'!important;background-color:'+color+'!important}' + style += 'div[xm-select-skin=normal] dl dd:not(.xm-dis-disabled) i{border-color:'+color+'!important}' + style += 'div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i{color:'+color+'!important}' + style += 'div[xm-select-skin=normal].xm-form-selected .xm-select, div[xm-select-skin=normal].xm-form-selected .xm-select:hover{border-color:'+color+'!important}' + style += '.layui-layer-btn a:first-child{border-color:'+color+';background-color:'+color+'!important}'; + style += '.layui-form-checkbox[lay-skin=primary]:hover i{border-color:'+color+'!important}' + style += '.pear-tab-menu .item:hover{background-color:'+color+'!important}' + style += '.layui-form-danger:focus {border-color:#FF5722 !important}' + style += '.pear-admin .user a:hover{color:'+color+'!important}' + style += '.pear-admin .user .layui-this a:hover{color:white!important}' + style += '.pear-notice .layui-this{color:'+color+'!important}' + style += '.layui-form-radio:hover *, .layui-form-radioed, .layui-form-radioed>i{color:' + color + ' !important}'; + var colorPane = $("#pear-admin-color"); + if(colorPane.length>0){ + colorPane.html(style); + }else{ + $("head").append("") + } + } + + exports(MOD_NAME, theme); +}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce.js b/public/static/component/pear/module/tinymce/tinymce.js new file mode 100644 index 0000000..b6ef220 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce.js @@ -0,0 +1,213 @@ +layui.define(['jquery'],function (exports) { + var $ = layui.$ + + var modFile = layui.cache.modules['tinymce']; + + var modPath = modFile.substr(0, modFile.lastIndexOf('.')) + + var setter = layui.setter || {} + + var response = setter.response || {} + + var plugin_filename = 'tinymce.min.js'//插件路径,不包含base_url部分 + + var settings = { + base_url: modPath + , images_upload_url: ''//图片上传接口,可在option传入,也可在这里修改,option的值优先 + , language: 'zh_CN'//语言,可在option传入,也可在这里修改,option的值优先 + , response: {//后台返回数据格式设置 + statusName: response.statusName || 'code'//返回状态字段 + , msgName: response.msgName || 'msg'//返回消息字段 + , dataName: response.dataName || 'data'//返回的数据 + , statusCode: response.statusCode || { + ok: 0//数据正常 + } + } + , success: function (res, succFun, failFun) {//图片上传完成回调 根据自己需要修改 + if (res[this.response.statusName] == this.response.statusCode.ok) { + succFun(res[this.response.dataName]); + } else { + failFun(res[this.response.msgName]); + } + } + }; + + // ---------------- 以下代码无需修改 ---------------- + + var t = {}; + + //初始化 + t.render = function (options,callback) { + + initTinymce(); + + var option = initOptions(options,callback) + + ,edit = t.get(option.elem); + + if (edit) { + edit.destroy(); + } + + tinymce.init(option); + + return t.get(option.elem); + }; + + t.init = t.render + + // 获取ID对应的编辑器对象 + t.get = function (elem) { + + initTinymce(); + + if (elem && /^#|\./.test(elem)) { + var id = elem.substr(1); + var edit = tinymce.editors[id]; + return edit + } else { + return false; + } + } + + //重载 + t.reload = function (elem, option, callback) { + + var options = {} + + if(typeof elem == 'string'){ + option.elem = elem + options = $.extend({}, option) + } else if (typeof elem == 'object' && typeof elem.elem == 'string'){ + options = $.extend({}, elem) + callback = option + } + + var optionCache = layui.sessionData('layui-tinymce')[options.elem] + + delete optionCache.init_instance_callback + + $.extend(optionCache,options) + + return t.render(optionCache,callback) + } + + function initOptions(option,callback) { + + var admin = layui.admin || {} + + var form = option.form || {} + + var file_field = form.name || 'edit' //文件字段名 + + var form_data = form.data || {} //其他表单数据 {key:value, ...} + + option.suffix= isset(option.suffix) ? option.suffix : (plugin_filename.indexOf('.min')>-1 ? '.min' : '') + + option.base_url = isset(option.base_url) ? option.base_url : settings.base_url + + option.language = isset(option.language) ? option.language : settings.language + + option.selector = isset(option.selector) ? option.selector : option.elem + + option.quickbars_selection_toolbar = isset(option.quickbars_selection_toolbar) ? option.quickbars_selection_toolbar : 'cut copy | bold italic underline strikethrough ' + + option.plugins = isset(option.plugins) ? option.plugins : 'code kityformula-editor quickbars print preview searchreplace autolink fullscreen image link media codesample table charmap hr advlist lists wordcount imagetools indent2em'; + + option.toolbar = isset(option.toolbar) ? option.toolbar : 'code undo redo | kityformula-editor forecolor backcolor bold italic underline strikethrough | indent2em alignleft aligncenter alignright alignjustify outdent indent | link bullist numlist image table codesample | formatselect fontselect fontsizeselect'; + + option.resize = isset(option.resize) ? option.resize : false; + + option.elementpath = isset(option.elementpath) ? option.elementpath : false; + + option.branding = isset(option.branding) ? option.branding : false; + + option.contextmenu_never_use_native = isset(option.contextmenu_never_use_native) ? option.contextmenu_never_use_native : true; + + option.menubar = isset(option.menubar) ? option.menubar : 'file edit insert format table'; + + option.menu = isset(option.menu) ? option.menu : { + file: {title: '文件', items: 'newdocument | print preview fullscreen | wordcount'}, + edit: {title: '编辑', items: 'undo redo | cut copy paste pastetext selectall | searchreplace'}, + format: { + title: '格式', + items: 'bold italic underline strikethrough superscript subscript | formats | forecolor backcolor | removeformat' + }, + table: {title: '表格', items: 'inserttable tableprops deletetable | cell row column'}, + }; + + option.init_instance_callback =isset(option.init_instance_callback) ? option.init_instance_callback : function(inst) { + if(typeof callback == 'function') callback(option,inst) + }; + + option.images_upload_url = isset(option.images_upload_url) ? option.images_upload_url : settings.images_upload_url; + + option.images_upload_handler = isset(option.images_upload_handler) ? option.images_upload_handler : function(blobInfo, succFun, failFun) { + if(isEmpty(option.images_upload_url)){ + failFun("上传接口未配置"); + return console.error('images_upload_url未配置'); + } + var formData = new FormData(); + formData.append(file_field, blobInfo.blob()); + if(typeof form_data == 'object'){ + for(var key in form_data){ + formData.append(key, form_data[key]); + } + } + var ajaxOpt = { + url: option.images_upload_url, + dataType: 'json', + type: 'POST', + data: formData, + processData: false, + contentType: false, + success: function (res) { + settings.success(res, succFun, failFun) + }, + error: function (res) { + failFun("网络错误:" + res.status); + } + }; + if (typeof admin.req == 'function') { + admin.req(ajaxOpt); + } else { + $.ajax(ajaxOpt); + } + } + + layui.sessionData('layui-tinymce',{ + key:option.selector, + value:option + }) + return option + } + + function initTinymce() { + if (typeof tinymce == 'undefined') { + $.ajax({//获取插件 + url: settings.base_url + '/' + plugin_filename, + dataType: 'script', + cache: true, + async: false, + }); + } + } + + function isset(value) { + return typeof value !== 'undefined' && value !== null + } + + function isEmpty(value) { + if(typeof value === 'undefined' || value === null|| value === ''){ + return true + } else if (value instanceof Array && value.length === 0){ + return true + } else if (typeof value === 'object' && Object.keys(value).length === 0){ + return true + } + return false + } + + exports('tinymce', t); + +}); diff --git a/public/static/component/pear/module/tinymce/tinymce/icons/default/icons.js b/public/static/component/pear/module/tinymce/tinymce/icons/default/icons.js new file mode 100644 index 0000000..d31c907 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/icons/default/icons.js @@ -0,0 +1,172 @@ +tinymce.IconManager.add('default', { + icons: { + 'accessibility-check': '', + 'action-next': '', + 'action-prev': '', + 'align-center': '', + 'align-justify': '', + 'align-left': '', + 'align-none': '', + 'align-right': '', + 'arrow-left': '', + 'arrow-right': '', + 'bold': '', + 'bookmark': '', + 'border-width': '', + 'brightness': '', + 'browse': '', + 'cancel': '', + 'change-case': '', + 'character-count': '', + 'checklist-rtl': '', + 'checklist': '', + 'checkmark': '', + 'chevron-down': '', + 'chevron-left': '', + 'chevron-right': '', + 'chevron-up': '', + 'close': '', + 'code-sample': '', + 'color-levels': '', + 'color-picker': '', + 'color-swatch-remove-color': '', + 'color-swatch': '', + 'comment-add': '', + 'comment': '', + 'contrast': '', + 'copy': '', + 'crop': '', + 'cut-column': '', + 'cut-row': '', + 'cut': '', + 'document-properties': '', + 'drag': '', + 'duplicate-column': '', + 'duplicate-row': '', + 'duplicate': '', + 'edit-block': '', + 'edit-image': '', + 'embed-page': '', + 'embed': '', + 'emoji': '', + 'export': '', + 'fill': '', + 'flip-horizontally': '', + 'flip-vertically': '', + 'format-painter': '', + 'format': '', + 'fullscreen': '', + 'gallery': '', + 'gamma': '', + 'help': '', + 'highlight-bg-color': '', + 'home': '', + 'horizontal-rule': '', + 'image-options': '', + 'image': '', + 'indent': '', + 'info': '', + 'insert-character': '', + 'insert-time': '', + 'invert': '', + 'italic': '', + 'line-height': '', + 'line': '', + 'link': '', + 'list-bull-circle': '', + 'list-bull-default': '', + 'list-bull-square': '', + 'list-num-default-rtl': '', + 'list-num-default': '', + 'list-num-lower-alpha-rtl': '', + 'list-num-lower-alpha': '', + 'list-num-lower-greek-rtl': '', + 'list-num-lower-greek': '', + 'list-num-lower-roman-rtl': '', + 'list-num-lower-roman': '', + 'list-num-upper-alpha-rtl': '', + 'list-num-upper-alpha': '', + 'list-num-upper-roman-rtl': '', + 'list-num-upper-roman': '', + 'lock': '', + 'ltr': '', + 'more-drawer': '', + 'new-document': '', + 'new-tab': '', + 'non-breaking': '', + 'notice': '', + 'ordered-list-rtl': '', + 'ordered-list': '', + 'orientation': '', + 'outdent': '', + 'page-break': '', + 'paragraph': '', + 'paste-column-after': '', + 'paste-column-before': '', + 'paste-row-after': '', + 'paste-row-before': '', + 'paste-text': '', + 'paste': '', + 'permanent-pen': '', + 'plus': '', + 'preferences': '', + 'preview': '', + 'print': '', + 'quote': '', + 'redo': '', + 'reload': '', + 'remove-formatting': '', + 'remove': '', + 'resize-handle': '', + 'resize': '', + 'restore-draft': '', + 'rotate-left': '', + 'rotate-right': '', + 'rtl': '', + 'save': '', + 'search': '', + 'select-all': '', + 'selected': '', + 'settings': '', + 'sharpen': '', + 'sourcecode': '', + 'spell-check': '', + 'strike-through': '', + 'subscript': '', + 'superscript': '', + 'table-cell-properties': '', + 'table-cell-select-all': '', + 'table-cell-select-inner': '', + 'table-delete-column': '', + 'table-delete-row': '', + 'table-delete-table': '', + 'table-insert-column-after': '', + 'table-insert-column-before': '', + 'table-insert-row-above': '', + 'table-insert-row-after': '', + 'table-left-header': '', + 'table-merge-cells': '', + 'table-row-properties': '', + 'table-split-cells': '', + 'table-top-header': '', + 'table': '', + 'template': '', + 'temporary-placeholder': '', + 'text-color': '', + 'toc': '', + 'translate': '', + 'underline': '', + 'undo': '', + 'unlink': '', + 'unlock': '', + 'unordered-list': '', + 'unselected': '', + 'upload': '', + 'user': '', + 'visualblocks': '', + 'visualchars': '', + 'warning': '', + 'zoom-in': '', + 'zoom-out': '', + } +}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/icons/default/icons.min.js b/public/static/component/pear/module/tinymce/tinymce/icons/default/icons.min.js new file mode 100644 index 0000000..086f297 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/icons/default/icons.min.js @@ -0,0 +1 @@ +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-width":'',brightness:'',browse:'',cancel:'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',"export":'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/langs/readme.md b/public/static/component/pear/module/tinymce/tinymce/langs/readme.md new file mode 100644 index 0000000..a52bf03 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/langs/readme.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/public/static/component/pear/module/tinymce/tinymce/langs/zh_CN.js b/public/static/component/pear/module/tinymce/tinymce/langs/zh_CN.js new file mode 100644 index 0000000..89b106c --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/langs/zh_CN.js @@ -0,0 +1,419 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u505a", +"Undo": "\u64a4\u9500", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", +"Div": "Div", +"Pre": "Pre", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u6587\u533a\u5757", +"Inline": "\u6587\u672c", +"Blocks": "\u57fa\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Fonts": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "\u7c7b\u578b", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor...": "\u951a\u70b9...", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character...": "\u7279\u6b8a\u5b57\u7b26...", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", +"Color Picker": "\u9009\u8272\u5668", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image...": "\u56fe\u7247...", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", +"Current window": "\u5f53\u524d\u7a97\u53e3", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link...": "\u94fe\u63a5...", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media...": "\u591a\u5a92\u4f53...", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print...": "\u6253\u5370...", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Previous": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Find whole words only": "\u5168\u5b57\u5339\u914d", +"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Show caption": "\u663e\u793a\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template...": "\u63d2\u5165\u6a21\u677f...", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Remove color": "\u79fb\u9664\u989c\u8272", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Word count": "\u5b57\u6570", +"Count": "\u8ba1\u6570", +"Document": "\u6587\u6863", +"Selection": "\u9009\u62e9", +"Words": "\u5355\u8bcd", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", +"Image title": "\u56fe\u7247\u6807\u9898", +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", +"Border style": "\u8fb9\u6846\u6837\u5f0f", +"Error": "\u9519\u8bef", +"Warn": "\u8b66\u544a", +"Valid": "\u6709\u6548", +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", +"System Font": "\u7cfb\u7edf\u5b57\u4f53", +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", +"example": "\u793a\u4f8b", +"Search": "\u641c\u7d22", +"All": "\u5168\u90e8", +"Currency": "\u8d27\u5e01", +"Text": "\u6587\u5b57", +"Quotations": "\u5f15\u7528", +"Mathematical": "\u6570\u5b66", +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", +"Symbols": "\u7b26\u53f7", +"Arrows": "\u7bad\u5934", +"User Defined": "\u81ea\u5b9a\u4e49", +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", +"currency sign": "\u8d27\u5e01\u7b26\u53f7", +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", +"colon sign": "\u5192\u53f7", +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", +"lira sign": "\u91cc\u62c9\u7b26\u53f7", +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", +"naira sign": "\u5948\u62c9\u7b26\u53f7", +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", +"won sign": "\u97e9\u5143\u7b26\u53f7", +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", +"austral sign": "\u6fb3\u5143\u7b26\u53f7", +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", +"cedi sign": "\u585e\u5730\u7b26\u53f7", +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", +"spesmilo sign": "spesmilo\u7b26\u53f7", +"tenge sign": "\u575a\u6208\u7b26\u53f7", +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", +"ruble sign": "\u5362\u5e03\u7b26\u53f7", +"yen character": "\u65e5\u5143\u5b57\u6837", +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", +"People": "\u4eba\u7c7b", +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", +"Activity": "\u6d3b\u52a8", +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", +"Objects": "\u7269\u4ef6", +"Flags": "\u65d7\u5e1c", +"Characters": "\u5b57\u7b26", +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"{0} characters": "{0} \u4e2a\u5b57\u7b26", +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", +"Update": "\u66f4\u65b0", +"Color swatch": "\u989c\u8272\u6837\u672c", +"Turquoise": "\u9752\u7eff\u8272", +"Green": "\u7eff\u8272", +"Blue": "\u84dd\u8272", +"Purple": "\u7d2b\u8272", +"Navy Blue": "\u6d77\u519b\u84dd", +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", +"Dark Green": "\u6df1\u7eff\u8272", +"Medium Blue": "\u4e2d\u84dd\u8272", +"Medium Purple": "\u4e2d\u7d2b\u8272", +"Midnight Blue": "\u6df1\u84dd\u8272", +"Yellow": "\u9ec4\u8272", +"Orange": "\u6a59\u8272", +"Red": "\u7ea2\u8272", +"Light Gray": "\u6d45\u7070\u8272", +"Gray": "\u7070\u8272", +"Dark Yellow": "\u6697\u9ec4\u8272", +"Dark Orange": "\u6df1\u6a59\u8272", +"Dark Red": "\u6df1\u7ea2\u8272", +"Medium Gray": "\u4e2d\u7070\u8272", +"Dark Gray": "\u6df1\u7070\u8272", +"Light Green": "\u6d45\u7eff\u8272", +"Light Yellow": "\u6d45\u9ec4\u8272", +"Light Red": "\u6d45\u7ea2\u8272", +"Light Purple": "\u6d45\u7d2b\u8272", +"Light Blue": "\u6d45\u84dd\u8272", +"Dark Purple": "\u6df1\u7d2b\u8272", +"Dark Blue": "\u6df1\u84dd\u8272", +"Black": "\u9ed1\u8272", +"White": "\u767d\u8272", +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", +"history": "\u5386\u53f2", +"styles": "\u6837\u5f0f", +"formatting": "\u683c\u5f0f\u5316", +"alignment": "\u5bf9\u9f50", +"indentation": "\u7f29\u8fdb", +"permanent pen": "\u8bb0\u53f7\u7b14", +"comments": "\u5907\u6ce8", +"Format Painter": "\u683c\u5f0f\u5237", +"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", +"Capitalization": "\u5927\u5199", +"lowercase": "\u5c0f\u5199", +"UPPERCASE": "\u5927\u5199", +"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", +"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", +"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", +"Font": "\u5b57\u4f53", +"Size": "\u5b57\u53f7", +"More...": "\u66f4\u591a...", +"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", +"Select...": "\u9009\u62e9...", +"Preferences": "\u9996\u9009\u9879", +"Yes": "\u662f", +"No": "\u5426", +"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", +"Version": "\u7248\u672c", +"Anchor": "\u951a\u70b9", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Image": "\u56fe\u7247", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"Link": "\u94fe\u63a5", +"Poster": "\u5c01\u9762", +"Media": "\u5a92\u4f53", +"Print": "\u6253\u5370", +"Prev": "\u4e0a\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Caption": "\u6807\u9898", +"Insert template": "\u63d2\u5165\u6a21\u677f" +}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/advlist/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/advlist/plugin.js new file mode 100644 index 0000000..0dd07b0 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/advlist/plugin.js @@ -0,0 +1,278 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var applyListFormat = function (editor, listName, styleValue) { + var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; + editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); + }; + + var register = function (editor) { + editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + applyListFormat(editor, 'UL', value['list-style-type']); + }); + editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + applyListFormat(editor, 'OL', value['list-style-type']); + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getNumberStyles = function (editor) { + var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); + return styles ? styles.split(/[ ,]/) : []; + }; + var getBulletStyles = function (editor) { + var styles = editor.getParam('advlist_bullet_styles', 'default,circle,square'); + return styles ? styles.split(/[ ,]/) : []; + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var isChildOfBody = function (editor, elm) { + return editor.$.contains(editor.getBody(), elm); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isListNode = function (editor) { + return function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); + }; + }; + var getSelectedStyleType = function (editor) { + var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + var style = editor.dom.getStyle(listElm, 'listStyleType'); + return Optional.from(style); + }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var styleValueToText = function (styleValue) { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + return chr.toUpperCase(); + }); + }; + var isWithinList = function (editor, e, nodeName) { + var tableCellIndex = findIndex(e.parents, isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$1.grep(parents, isListNode(editor)); + return lists.length > 0 && lists[0].nodeName === nodeName; + }; + var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.ui.registry.addSplitButton(id, { + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + presets: 'listpreview', + columns: 3, + fetch: function (callback) { + var items = global$1.map(styles, function (styleValue) { + var iconStyle = nodeName === 'OL' ? 'num' : 'bull'; + var iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue; + var itemValue = styleValue === 'default' ? '' : styleValue; + var displayText = styleValueToText(styleValue); + return { + type: 'choiceitem', + value: itemValue, + icon: 'list-' + iconStyle + '-' + iconName, + text: displayText + }; + }); + callback(items); + }, + onAction: function () { + return editor.execCommand(cmd); + }, + onItemAction: function (_splitButtonApi, value) { + applyListFormat(editor, nodeName, value); + }, + select: function (value) { + var listStyleType = getSelectedStyleType(editor); + return listStyleType.map(function (listStyle) { + return value === listStyle; + }).getOr(false); + }, + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + }; + var addButton = function (editor, id, tooltip, cmd, nodeName, _styles) { + editor.ui.registry.addToggleButton(id, { + active: false, + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }, + onAction: function () { + return editor.execCommand(cmd); + } + }); + }; + var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { + if (styles.length > 1) { + addSplitButton(editor, id, tooltip, cmd, nodeName, styles); + } else { + addButton(editor, id, tooltip, cmd, nodeName); + } + }; + var register$1 = function (editor) { + addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', getNumberStyles(editor)); + addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', getBulletStyles(editor)); + }; + + function Plugin () { + global.add('advlist', function (editor) { + if (editor.hasPlugin('lists')) { + register$1(editor); + register(editor); + } + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/advlist/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/advlist/plugin.min.js new file mode 100644 index 0000000..dfa80d9 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/advlist/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n,e,t,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(n,e,t){var r="UL"===e?"InsertUnorderedList":"InsertOrderedList";n.execCommand(r,!1,!1===t?null:{"list-style-type":t})},l=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(n){return function(){return n}},c=i(!1),s=i(!0),o=function(){return a},a=(n=function(n){return n.isNone()},{fold:function(n,e){return n()},is:c,isSome:c,isNone:s,getOr:t=function(n){return n},getOrThunk:e=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:t,orThunk:e,map:o,each:function(){},bind:o,exists:c,forall:s,filter:o,equals:n,equals_:n,toArray:function(){return[]},toString:i("none()")}),f=function(t){var n=i(t),e=function(){return o},r=function(n){return n(t)},o={fold:function(n,e){return e(t)},is:function(n){return t===n},isSome:s,isNone:c,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(n){return f(n(t))},each:function(n){n(t)},bind:r,exists:r,forall:r,filter:function(n){return n(t)?o:a},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(n){return n.is(t)},equals_:function(n,e){return n.fold(c,function(n){return e(t,n)})}};return o},d=function(n){return null===n||n===undefined?a:f(n)},g=function(n){return n&&/^(TH|TD)$/.test(n.nodeName)},m=function(r){return function(n){return n&&/^(OL|UL|DL)$/.test(n.nodeName)&&(t=n,(e=r).$.contains(e.getBody(),t));var e,t}},p=function(n,e,t){var r=function(n,e){for(var t=0;t len) { + index = len; + } + } + return index; + }; + var setStart = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setStart(container, scopeIndex(container, offset)); + } else { + rng.setStartBefore(container); + } + }; + var setEnd = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setEnd(container, scopeIndex(container, offset)); + } else { + rng.setEndAfter(container); + } + }; + var parseCurrentLine = function (editor, endOffset, delimiter) { + var end, endContainer, bookmark, text, prev, len, rngText; + var autoLinkPattern = getAutoLinkPattern(editor); + var defaultLinkTarget = getDefaultLinkTarget(editor); + if (editor.selection.getNode().tagName === 'A') { + return; + } + var rng = editor.selection.getRng().cloneRange(); + if (rng.startOffset < 5) { + prev = rng.endContainer.previousSibling; + if (!prev) { + if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) { + return; + } + prev = rng.endContainer.firstChild.nextSibling; + } + len = prev.length; + setStart(rng, prev, len); + setEnd(rng, prev, len); + if (rng.endOffset < 5) { + return; + } + end = rng.endOffset; + endContainer = prev; + } else { + endContainer = rng.endContainer; + if (endContainer.nodeType !== 3 && endContainer.firstChild) { + while (endContainer.nodeType !== 3 && endContainer.firstChild) { + endContainer = endContainer.firstChild; + } + if (endContainer.nodeType === 3) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, endContainer.nodeValue.length); + } + } + if (rng.endOffset === 1) { + end = 2; + } else { + end = rng.endOffset - 1 - endOffset; + } + } + var start = end; + do { + setStart(rng, endContainer, end >= 2 ? end - 2 : 0); + setEnd(rng, endContainer, end >= 1 ? end - 1 : 0); + end -= 1; + rngText = rng.toString(); + } while (rngText !== ' ' && rngText !== '' && rngText.charCodeAt(0) !== 160 && end - 2 >= 0 && rngText !== delimiter); + if (rangeEqualsDelimiterOrSpace(rng.toString(), delimiter)) { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + end += 1; + } else if (rng.startOffset === 0) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, start); + } else { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + } + text = rng.toString(); + if (text.charAt(text.length - 1) === '.') { + setEnd(rng, endContainer, start - 1); + } + text = rng.toString().trim(); + var matches = text.match(autoLinkPattern); + var protocol = getDefaultLinkProtocol(editor); + if (matches) { + if (matches[1] === 'www.') { + matches[1] = protocol + '://www.'; + } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) { + matches[1] = 'mailto:' + matches[1]; + } + bookmark = editor.selection.getBookmark(); + editor.selection.setRng(rng); + editor.execCommand('createlink', false, matches[1] + matches[2]); + if (defaultLinkTarget !== false) { + editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget); + } + editor.selection.moveToBookmark(bookmark); + editor.nodeChanged(); + } + }; + var setup = function (editor) { + var autoUrlDetectState; + editor.on('keydown', function (e) { + if (e.keyCode === 13) { + return handleEnter(editor); + } + }); + if (global$1.browser.isIE()) { + editor.on('focus', function () { + if (!autoUrlDetectState) { + autoUrlDetectState = true; + try { + editor.execCommand('AutoUrlDetect', false, true); + } catch (ex) { + } + } + }); + return; + } + editor.on('keypress', function (e) { + if (e.keyCode === 41) { + return handleEclipse(editor); + } + }); + editor.on('keyup', function (e) { + if (e.keyCode === 32) { + return handleSpacebar(editor); + } + }); + }; + + function Plugin () { + global.add('autolink', function (editor) { + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/autolink/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/autolink/plugin.min.js new file mode 100644 index 0000000..2440054 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/autolink/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=tinymce.util.Tools.resolve("tinymce.Env"),i=function(e,t){var n;return t<0&&(t=0),3!==e.nodeType||(n=e.data.length) getAutoResizeMinHeight(editor)) { + resizeHeight = contentHeight + chromeHeight; + } + var maxHeight = getAutoResizeMaxHeight(editor); + if (maxHeight && resizeHeight > maxHeight) { + resizeHeight = maxHeight; + toggleScrolling(editor, true); + } else { + toggleScrolling(editor, false); + } + if (resizeHeight !== oldSize.get()) { + var deltaSize = resizeHeight - oldSize.get(); + dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px'); + oldSize.set(resizeHeight); + fireResizeEditor(editor); + if (global$1.browser.isSafari() && global$1.mac) { + var win = editor.getWin(); + win.scrollTo(win.pageXOffset, win.pageYOffset); + } + if (editor.hasFocus()) { + editor.selection.scrollIntoView(editor.selection.getNode()); + } + if (global$1.webkit && deltaSize < 0) { + resize(editor, oldSize); + } + } + }; + var setup = function (editor, oldSize) { + editor.on('init', function () { + var overflowPadding = getAutoResizeOverflowPadding(editor); + var dom = editor.dom; + dom.setStyles(editor.getDoc().documentElement, { height: 'auto' }); + dom.setStyles(editor.getBody(), { + 'paddingLeft': overflowPadding, + 'paddingRight': overflowPadding, + 'min-height': 0 + }); + }); + editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function () { + resize(editor, oldSize); + }); + if (shouldAutoResizeOnInit(editor)) { + editor.on('init', function () { + wait(editor, oldSize, 20, 100, function () { + wait(editor, oldSize, 5, 1000); + }); + }); + } + }; + + var register = function (editor, oldSize) { + editor.addCommand('mceAutoResize', function () { + resize(editor, oldSize); + }); + }; + + function Plugin () { + global.add('autoresize', function (editor) { + if (!editor.settings.hasOwnProperty('resize')) { + editor.settings.resize = false; + } + if (!editor.inline) { + var oldSize = Cell(0); + register(editor, oldSize); + setup(editor, oldSize); + } + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/autoresize/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 0000000..01cb7d5 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),h=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),y=function(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")},a=function(e,t,n,i,o){r.setEditorTimeout(e,function(){b(e,t),n--?a(e,t,n,i,o):o&&o()},i)},p=function(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))},v=function(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o},b=function(e,t){var n,i,o,r,s,a,g,u,l,c,m,f=e.dom,d=e.getDoc();d&&((n=e).plugins.fullscreen&&n.plugins.fullscreen.isFullscreen()?p(e,!0):(i=d.documentElement,o=e.getParam("autoresize_bottom_margin",50,"number"),r=y(e),s=v(f,i,"margin-top",!0),a=v(f,i,"margin-bottom",!0),(g=i.offsetHeight+s+a+o)<0&&(g=0),g+(u=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight)>y(e)&&(r=g+u),(l=e.getParam("max_height",0,"number"))&&l getAutoSaveRetention(editor)) { + removeDraft(editor, false); + return false; + } + return true; + }; + var removeDraft = function (editor, fire) { + var prefix = getAutoSavePrefix(editor); + global$2.removeItem(prefix + 'draft'); + global$2.removeItem(prefix + 'time'); + if (fire !== false) { + fireRemoveDraft(editor); + } + }; + var storeDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (!isEmpty(editor) && editor.isDirty()) { + global$2.setItem(prefix + 'draft', editor.getContent({ + format: 'raw', + no_events: true + })); + global$2.setItem(prefix + 'time', new Date().getTime().toString()); + fireStoreDraft(editor); + } + }; + var restoreDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (hasDraft(editor)) { + editor.setContent(global$2.getItem(prefix + 'draft'), { format: 'raw' }); + fireRestoreDraft(editor); + } + }; + var startStoreDraft = function (editor) { + var interval = getAutoSaveInterval(editor); + global$1.setEditorInterval(editor, function () { + storeDraft(editor); + }, interval); + }; + var restoreLastDraft = function (editor) { + editor.undoManager.transact(function () { + restoreDraft(editor); + removeDraft(editor); + }); + editor.focus(); + }; + + var get = function (editor) { + return { + hasDraft: function () { + return hasDraft(editor); + }, + storeDraft: function () { + return storeDraft(editor); + }, + restoreDraft: function () { + return restoreDraft(editor); + }, + removeDraft: function (fire) { + return removeDraft(editor, fire); + }, + isEmpty: function (html) { + return isEmpty(editor, html); + } + }; + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var setup = function (editor) { + editor.editorManager.on('BeforeUnload', function (e) { + var msg; + global$3.each(global$4.get(), function (editor) { + if (editor.plugins.autosave) { + editor.plugins.autosave.storeDraft(); + } + if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) { + msg = editor.translate('You have unsaved changes are you sure you want to navigate away?'); + } + }); + if (msg) { + e.preventDefault(); + e.returnValue = msg; + } + }); + }; + + var makeSetupHandler = function (editor) { + return function (api) { + api.setDisabled(!hasDraft(editor)); + var editorEventCallback = function () { + return api.setDisabled(!hasDraft(editor)); + }; + editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + return function () { + return editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + }; + }; + }; + var register = function (editor) { + startStoreDraft(editor); + editor.ui.registry.addButton('restoredraft', { + tooltip: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + editor.ui.registry.addMenuItem('restoredraft', { + text: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + }; + + function Plugin () { + global.add('autosave', function (editor) { + setup(editor); + register(editor); + editor.on('init', function () { + if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { + restoreDraft(editor); + } + }); + return get(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/autosave/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/autosave/plugin.min.js new file mode 100644 index 0000000..cd25294 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/autosave/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=(e=undefined,function(t){return e===t}),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),n=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),o=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(t,e){var r=t||e,n=/^(\d+)([ms]?)$/.exec(""+r);return(n[2]?{s:1e3,m:6e4}[n[2]]:1)*parseInt(r,10)},u=function(t){var e=document.location;return t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},s=function(t,e){if(a(e))return t.dom.isEmpty(t.getBody());var r=o.trim(e);if(""===r)return!0;var n=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(n)},f=function(t){var e=parseInt(n.getItem(u(t)+"time"),10)||0;return!((new Date).getTime()-e>i(t.getParam("autosave_retention"),"20m"))||(c(t,!1),!1)},c=function(t,e){var r=u(t);n.removeItem(r+"draft"),n.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},m=function(t){var e=u(t);!s(t)&&t.isDirty()&&(n.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),n.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))},l=function(t){var e=u(t);f(t)&&(t.setContent(n.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))},v=function(t){var e=i(t.getParam("autosave_interval"),"30s");r.setEditorInterval(t,function(){m(t)},e)},d=function(t){t.undoManager.transact(function(){l(t),c(t)}),t.focus()},g=tinymce.util.Tools.resolve("tinymce.EditorManager"),y=function(r){return function(t){t.setDisabled(!f(r));var e=function(){return t.setDisabled(!f(r))};return r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}};t.add("autosave",function(t){var e,r;return t.editorManager.on("BeforeUnload",function(t){var e;o.each(g.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),v(e=t),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){d(e)},onSetup:y(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){d(e)},onSetup:y(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&l(t)}),r=t,{hasDraft:function(){return f(r)},storeDraft:function(){return m(r)},restoreDraft:function(){return l(r)},removeDraft:function(t){return c(r,t)},isEmpty:function(t){return s(r,t)}}})}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/bbcode/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/bbcode/plugin.js new file mode 100644 index 0000000..5b7ac22 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/bbcode/plugin.js @@ -0,0 +1,99 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var html2bbcode = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/(.*?)<\/a>/gi, '[url=$1]$2[/url]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/span>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/font>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/span>/gi, '[size=$1]$2[/size]'); + rep(/(.*?)<\/font>/gi, '$1'); + rep(//gi, '[img]$1[/img]'); + rep(/(.*?)<\/span>/gi, '[code]$1[/code]'); + rep(/(.*?)<\/span>/gi, '[quote]$1[/quote]'); + rep(/(.*?)<\/strong>/gi, '[code][b]$1[/b][/code]'); + rep(/(.*?)<\/strong>/gi, '[quote][b]$1[/b][/quote]'); + rep(/(.*?)<\/em>/gi, '[code][i]$1[/i][/code]'); + rep(/(.*?)<\/em>/gi, '[quote][i]$1[/i][/quote]'); + rep(/(.*?)<\/u>/gi, '[code][u]$1[/u][/code]'); + rep(/(.*?)<\/u>/gi, '[quote][u]$1[/u][/quote]'); + rep(/<\/(strong|b)>/gi, '[/b]'); + rep(/<(strong|b)>/gi, '[b]'); + rep(/<\/(em|i)>/gi, '[/i]'); + rep(/<(em|i)>/gi, '[i]'); + rep(/<\/u>/gi, '[/u]'); + rep(/(.*?)<\/span>/gi, '[u]$1[/u]'); + rep(//gi, '[u]'); + rep(/]*>/gi, '[quote]'); + rep(/<\/blockquote>/gi, '[/quote]'); + rep(/
                                  /gi, '\n'); + rep(//gi, '\n'); + rep(/
                                  /gi, '\n'); + rep(/

                                  /gi, ''); + rep(/<\/p>/gi, '\n'); + rep(/ |\u00a0/gi, ' '); + rep(/"/gi, '"'); + rep(/</gi, '<'); + rep(/>/gi, '>'); + rep(/&/gi, '&'); + return s; + }; + var bbcode2html = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/\n/gi, '
                                  '); + rep(/\[b\]/gi, ''); + rep(/\[\/b\]/gi, ''); + rep(/\[i\]/gi, ''); + rep(/\[\/i\]/gi, ''); + rep(/\[u\]/gi, ''); + rep(/\[\/u\]/gi, ''); + rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, '$2'); + rep(/\[url\](.*?)\[\/url\]/gi, '$1'); + rep(/\[img\](.*?)\[\/img\]/gi, ''); + rep(/\[color=(.*?)\](.*?)\[\/color\]/gi, '$2'); + rep(/\[code\](.*?)\[\/code\]/gi, '$1 '); + rep(/\[quote.*?\](.*?)\[\/quote\]/gi, '$1 '); + return s; + }; + + function Plugin () { + global.add('bbcode', function (editor) { + editor.on('BeforeSetContent', function (e) { + e.content = bbcode2html(e.content); + }); + editor.on('PostProcess', function (e) { + if (e.set) { + e.content = bbcode2html(e.content); + } + if (e.get) { + e.content = html2bbcode(e.content); + } + }); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/bbcode/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 0000000..a0471d4 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/\n/gi,"
                                  "),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t};o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=t(o.content)}),o.on("PostProcess",function(o){o.set&&(o.content=t(o.content)),o.get&&(o.content=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),o(/(.*?)<\/font>/gi,"$1"),o(//gi,"[img]$1[/img]"),o(/(.*?)<\/span>/gi,"[code]$1[/code]"),o(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),o(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),o(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),o(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),o(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),o(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),o(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),o(/<\/(strong|b)>/gi,"[/b]"),o(/<(strong|b)>/gi,"[b]"),o(/<\/(em|i)>/gi,"[/i]"),o(/<(em|i)>/gi,"[i]"),o(/<\/u>/gi,"[/u]"),o(/(.*?)<\/span>/gi,"[u]$1[/u]"),o(//gi,"[u]"),o(/]*>/gi,"[quote]"),o(/<\/blockquote>/gi,"[/quote]"),o(/
                                  /gi,"\n"),o(//gi,"\n"),o(/
                                  /gi,"\n"),o(/

                                  /gi,""),o(/<\/p>/gi,"\n"),o(/ |\u00a0/gi," "),o(/"/gi,'"'),o(/</gi,"<"),o(/>/gi,">"),o(/&/gi,"&"),t}(o.content))})})}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/charmap/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/charmap/plugin.js new file mode 100644 index 0000000..cceb2ec --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/charmap/plugin.js @@ -0,0 +1,1706 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var fireInsertCustomChar = function (editor, chr) { + return editor.fire('insertCustomChar', { chr: chr }); + }; + + var insertChar = function (editor, chr) { + var evtChr = fireInsertCustomChar(editor, chr).chr; + editor.execCommand('mceInsertContent', false, evtChr); + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isArray = isType('array'); + + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var findUntil = function (xs, pred, until) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Optional.some(x); + } else if (until(x, i)) { + break; + } + } + return Optional.none(); + }; + var find = function (xs, pred) { + return findUntil(xs, pred, never); + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getCharMap = function (editor) { + return editor.getParam('charmap'); + }; + var getCharMapAppend = function (editor) { + return editor.getParam('charmap_append'); + }; + + var isArray$1 = global$1.isArray; + var UserDefined = 'User Defined'; + var getDefaultCharMap = function () { + return [ + { + name: 'Currency', + characters: [ + [ + 36, + 'dollar sign' + ], + [ + 162, + 'cent sign' + ], + [ + 8364, + 'euro sign' + ], + [ + 163, + 'pound sign' + ], + [ + 165, + 'yen sign' + ], + [ + 164, + 'currency sign' + ], + [ + 8352, + 'euro-currency sign' + ], + [ + 8353, + 'colon sign' + ], + [ + 8354, + 'cruzeiro sign' + ], + [ + 8355, + 'french franc sign' + ], + [ + 8356, + 'lira sign' + ], + [ + 8357, + 'mill sign' + ], + [ + 8358, + 'naira sign' + ], + [ + 8359, + 'peseta sign' + ], + [ + 8360, + 'rupee sign' + ], + [ + 8361, + 'won sign' + ], + [ + 8362, + 'new sheqel sign' + ], + [ + 8363, + 'dong sign' + ], + [ + 8365, + 'kip sign' + ], + [ + 8366, + 'tugrik sign' + ], + [ + 8367, + 'drachma sign' + ], + [ + 8368, + 'german penny symbol' + ], + [ + 8369, + 'peso sign' + ], + [ + 8370, + 'guarani sign' + ], + [ + 8371, + 'austral sign' + ], + [ + 8372, + 'hryvnia sign' + ], + [ + 8373, + 'cedi sign' + ], + [ + 8374, + 'livre tournois sign' + ], + [ + 8375, + 'spesmilo sign' + ], + [ + 8376, + 'tenge sign' + ], + [ + 8377, + 'indian rupee sign' + ], + [ + 8378, + 'turkish lira sign' + ], + [ + 8379, + 'nordic mark sign' + ], + [ + 8380, + 'manat sign' + ], + [ + 8381, + 'ruble sign' + ], + [ + 20870, + 'yen character' + ], + [ + 20803, + 'yuan character' + ], + [ + 22291, + 'yuan character, in hong kong and taiwan' + ], + [ + 22278, + 'yen/yuan character variant one' + ] + ] + }, + { + name: 'Text', + characters: [ + [ + 169, + 'copyright sign' + ], + [ + 174, + 'registered sign' + ], + [ + 8482, + 'trade mark sign' + ], + [ + 8240, + 'per mille sign' + ], + [ + 181, + 'micro sign' + ], + [ + 183, + 'middle dot' + ], + [ + 8226, + 'bullet' + ], + [ + 8230, + 'three dot leader' + ], + [ + 8242, + 'minutes / feet' + ], + [ + 8243, + 'seconds / inches' + ], + [ + 167, + 'section sign' + ], + [ + 182, + 'paragraph sign' + ], + [ + 223, + 'sharp s / ess-zed' + ] + ] + }, + { + name: 'Quotations', + characters: [ + [ + 8249, + 'single left-pointing angle quotation mark' + ], + [ + 8250, + 'single right-pointing angle quotation mark' + ], + [ + 171, + 'left pointing guillemet' + ], + [ + 187, + 'right pointing guillemet' + ], + [ + 8216, + 'left single quotation mark' + ], + [ + 8217, + 'right single quotation mark' + ], + [ + 8220, + 'left double quotation mark' + ], + [ + 8221, + 'right double quotation mark' + ], + [ + 8218, + 'single low-9 quotation mark' + ], + [ + 8222, + 'double low-9 quotation mark' + ], + [ + 60, + 'less-than sign' + ], + [ + 62, + 'greater-than sign' + ], + [ + 8804, + 'less-than or equal to' + ], + [ + 8805, + 'greater-than or equal to' + ], + [ + 8211, + 'en dash' + ], + [ + 8212, + 'em dash' + ], + [ + 175, + 'macron' + ], + [ + 8254, + 'overline' + ], + [ + 164, + 'currency sign' + ], + [ + 166, + 'broken bar' + ], + [ + 168, + 'diaeresis' + ], + [ + 161, + 'inverted exclamation mark' + ], + [ + 191, + 'turned question mark' + ], + [ + 710, + 'circumflex accent' + ], + [ + 732, + 'small tilde' + ], + [ + 176, + 'degree sign' + ], + [ + 8722, + 'minus sign' + ], + [ + 177, + 'plus-minus sign' + ], + [ + 247, + 'division sign' + ], + [ + 8260, + 'fraction slash' + ], + [ + 215, + 'multiplication sign' + ], + [ + 185, + 'superscript one' + ], + [ + 178, + 'superscript two' + ], + [ + 179, + 'superscript three' + ], + [ + 188, + 'fraction one quarter' + ], + [ + 189, + 'fraction one half' + ], + [ + 190, + 'fraction three quarters' + ] + ] + }, + { + name: 'Mathematical', + characters: [ + [ + 402, + 'function / florin' + ], + [ + 8747, + 'integral' + ], + [ + 8721, + 'n-ary sumation' + ], + [ + 8734, + 'infinity' + ], + [ + 8730, + 'square root' + ], + [ + 8764, + 'similar to' + ], + [ + 8773, + 'approximately equal to' + ], + [ + 8776, + 'almost equal to' + ], + [ + 8800, + 'not equal to' + ], + [ + 8801, + 'identical to' + ], + [ + 8712, + 'element of' + ], + [ + 8713, + 'not an element of' + ], + [ + 8715, + 'contains as member' + ], + [ + 8719, + 'n-ary product' + ], + [ + 8743, + 'logical and' + ], + [ + 8744, + 'logical or' + ], + [ + 172, + 'not sign' + ], + [ + 8745, + 'intersection' + ], + [ + 8746, + 'union' + ], + [ + 8706, + 'partial differential' + ], + [ + 8704, + 'for all' + ], + [ + 8707, + 'there exists' + ], + [ + 8709, + 'diameter' + ], + [ + 8711, + 'backward difference' + ], + [ + 8727, + 'asterisk operator' + ], + [ + 8733, + 'proportional to' + ], + [ + 8736, + 'angle' + ] + ] + }, + { + name: 'Extended Latin', + characters: [ + [ + 192, + 'A - grave' + ], + [ + 193, + 'A - acute' + ], + [ + 194, + 'A - circumflex' + ], + [ + 195, + 'A - tilde' + ], + [ + 196, + 'A - diaeresis' + ], + [ + 197, + 'A - ring above' + ], + [ + 256, + 'A - macron' + ], + [ + 198, + 'ligature AE' + ], + [ + 199, + 'C - cedilla' + ], + [ + 200, + 'E - grave' + ], + [ + 201, + 'E - acute' + ], + [ + 202, + 'E - circumflex' + ], + [ + 203, + 'E - diaeresis' + ], + [ + 274, + 'E - macron' + ], + [ + 204, + 'I - grave' + ], + [ + 205, + 'I - acute' + ], + [ + 206, + 'I - circumflex' + ], + [ + 207, + 'I - diaeresis' + ], + [ + 298, + 'I - macron' + ], + [ + 208, + 'ETH' + ], + [ + 209, + 'N - tilde' + ], + [ + 210, + 'O - grave' + ], + [ + 211, + 'O - acute' + ], + [ + 212, + 'O - circumflex' + ], + [ + 213, + 'O - tilde' + ], + [ + 214, + 'O - diaeresis' + ], + [ + 216, + 'O - slash' + ], + [ + 332, + 'O - macron' + ], + [ + 338, + 'ligature OE' + ], + [ + 352, + 'S - caron' + ], + [ + 217, + 'U - grave' + ], + [ + 218, + 'U - acute' + ], + [ + 219, + 'U - circumflex' + ], + [ + 220, + 'U - diaeresis' + ], + [ + 362, + 'U - macron' + ], + [ + 221, + 'Y - acute' + ], + [ + 376, + 'Y - diaeresis' + ], + [ + 562, + 'Y - macron' + ], + [ + 222, + 'THORN' + ], + [ + 224, + 'a - grave' + ], + [ + 225, + 'a - acute' + ], + [ + 226, + 'a - circumflex' + ], + [ + 227, + 'a - tilde' + ], + [ + 228, + 'a - diaeresis' + ], + [ + 229, + 'a - ring above' + ], + [ + 257, + 'a - macron' + ], + [ + 230, + 'ligature ae' + ], + [ + 231, + 'c - cedilla' + ], + [ + 232, + 'e - grave' + ], + [ + 233, + 'e - acute' + ], + [ + 234, + 'e - circumflex' + ], + [ + 235, + 'e - diaeresis' + ], + [ + 275, + 'e - macron' + ], + [ + 236, + 'i - grave' + ], + [ + 237, + 'i - acute' + ], + [ + 238, + 'i - circumflex' + ], + [ + 239, + 'i - diaeresis' + ], + [ + 299, + 'i - macron' + ], + [ + 240, + 'eth' + ], + [ + 241, + 'n - tilde' + ], + [ + 242, + 'o - grave' + ], + [ + 243, + 'o - acute' + ], + [ + 244, + 'o - circumflex' + ], + [ + 245, + 'o - tilde' + ], + [ + 246, + 'o - diaeresis' + ], + [ + 248, + 'o slash' + ], + [ + 333, + 'o macron' + ], + [ + 339, + 'ligature oe' + ], + [ + 353, + 's - caron' + ], + [ + 249, + 'u - grave' + ], + [ + 250, + 'u - acute' + ], + [ + 251, + 'u - circumflex' + ], + [ + 252, + 'u - diaeresis' + ], + [ + 363, + 'u - macron' + ], + [ + 253, + 'y - acute' + ], + [ + 254, + 'thorn' + ], + [ + 255, + 'y - diaeresis' + ], + [ + 563, + 'y - macron' + ], + [ + 913, + 'Alpha' + ], + [ + 914, + 'Beta' + ], + [ + 915, + 'Gamma' + ], + [ + 916, + 'Delta' + ], + [ + 917, + 'Epsilon' + ], + [ + 918, + 'Zeta' + ], + [ + 919, + 'Eta' + ], + [ + 920, + 'Theta' + ], + [ + 921, + 'Iota' + ], + [ + 922, + 'Kappa' + ], + [ + 923, + 'Lambda' + ], + [ + 924, + 'Mu' + ], + [ + 925, + 'Nu' + ], + [ + 926, + 'Xi' + ], + [ + 927, + 'Omicron' + ], + [ + 928, + 'Pi' + ], + [ + 929, + 'Rho' + ], + [ + 931, + 'Sigma' + ], + [ + 932, + 'Tau' + ], + [ + 933, + 'Upsilon' + ], + [ + 934, + 'Phi' + ], + [ + 935, + 'Chi' + ], + [ + 936, + 'Psi' + ], + [ + 937, + 'Omega' + ], + [ + 945, + 'alpha' + ], + [ + 946, + 'beta' + ], + [ + 947, + 'gamma' + ], + [ + 948, + 'delta' + ], + [ + 949, + 'epsilon' + ], + [ + 950, + 'zeta' + ], + [ + 951, + 'eta' + ], + [ + 952, + 'theta' + ], + [ + 953, + 'iota' + ], + [ + 954, + 'kappa' + ], + [ + 955, + 'lambda' + ], + [ + 956, + 'mu' + ], + [ + 957, + 'nu' + ], + [ + 958, + 'xi' + ], + [ + 959, + 'omicron' + ], + [ + 960, + 'pi' + ], + [ + 961, + 'rho' + ], + [ + 962, + 'final sigma' + ], + [ + 963, + 'sigma' + ], + [ + 964, + 'tau' + ], + [ + 965, + 'upsilon' + ], + [ + 966, + 'phi' + ], + [ + 967, + 'chi' + ], + [ + 968, + 'psi' + ], + [ + 969, + 'omega' + ] + ] + }, + { + name: 'Symbols', + characters: [ + [ + 8501, + 'alef symbol' + ], + [ + 982, + 'pi symbol' + ], + [ + 8476, + 'real part symbol' + ], + [ + 978, + 'upsilon - hook symbol' + ], + [ + 8472, + 'Weierstrass p' + ], + [ + 8465, + 'imaginary part' + ] + ] + }, + { + name: 'Arrows', + characters: [ + [ + 8592, + 'leftwards arrow' + ], + [ + 8593, + 'upwards arrow' + ], + [ + 8594, + 'rightwards arrow' + ], + [ + 8595, + 'downwards arrow' + ], + [ + 8596, + 'left right arrow' + ], + [ + 8629, + 'carriage return' + ], + [ + 8656, + 'leftwards double arrow' + ], + [ + 8657, + 'upwards double arrow' + ], + [ + 8658, + 'rightwards double arrow' + ], + [ + 8659, + 'downwards double arrow' + ], + [ + 8660, + 'left right double arrow' + ], + [ + 8756, + 'therefore' + ], + [ + 8834, + 'subset of' + ], + [ + 8835, + 'superset of' + ], + [ + 8836, + 'not a subset of' + ], + [ + 8838, + 'subset of or equal to' + ], + [ + 8839, + 'superset of or equal to' + ], + [ + 8853, + 'circled plus' + ], + [ + 8855, + 'circled times' + ], + [ + 8869, + 'perpendicular' + ], + [ + 8901, + 'dot operator' + ], + [ + 8968, + 'left ceiling' + ], + [ + 8969, + 'right ceiling' + ], + [ + 8970, + 'left floor' + ], + [ + 8971, + 'right floor' + ], + [ + 9001, + 'left-pointing angle bracket' + ], + [ + 9002, + 'right-pointing angle bracket' + ], + [ + 9674, + 'lozenge' + ], + [ + 9824, + 'black spade suit' + ], + [ + 9827, + 'black club suit' + ], + [ + 9829, + 'black heart suit' + ], + [ + 9830, + 'black diamond suit' + ], + [ + 8194, + 'en space' + ], + [ + 8195, + 'em space' + ], + [ + 8201, + 'thin space' + ], + [ + 8204, + 'zero width non-joiner' + ], + [ + 8205, + 'zero width joiner' + ], + [ + 8206, + 'left-to-right mark' + ], + [ + 8207, + 'right-to-left mark' + ] + ] + } + ]; + }; + var charmapFilter = function (charmap) { + return global$1.grep(charmap, function (item) { + return isArray$1(item) && item.length === 2; + }); + }; + var getCharsFromSetting = function (settingValue) { + if (isArray$1(settingValue)) { + return [].concat(charmapFilter(settingValue)); + } + if (typeof settingValue === 'function') { + return settingValue(); + } + return []; + }; + var extendCharMap = function (editor, charmap) { + var userCharMap = getCharMap(editor); + if (userCharMap) { + charmap = [{ + name: UserDefined, + characters: getCharsFromSetting(userCharMap) + }]; + } + var userCharMapAppend = getCharMapAppend(editor); + if (userCharMapAppend) { + var userDefinedGroup = global$1.grep(charmap, function (cg) { + return cg.name === UserDefined; + }); + if (userDefinedGroup.length) { + userDefinedGroup[0].characters = [].concat(userDefinedGroup[0].characters).concat(getCharsFromSetting(userCharMapAppend)); + return charmap; + } + return [].concat(charmap).concat({ + name: UserDefined, + characters: getCharsFromSetting(userCharMapAppend) + }); + } + return charmap; + }; + var getCharMap$1 = function (editor) { + var groups = extendCharMap(editor, getDefaultCharMap()); + return groups.length > 1 ? [{ + name: 'All', + characters: bind(groups, function (g) { + return g.characters; + }) + }].concat(groups) : groups; + }; + + var get = function (editor) { + var getCharMap = function () { + return getCharMap$1(editor); + }; + var insertChar$1 = function (chr) { + insertChar(editor, chr); + }; + return { + getCharMap: getCharMap, + insertChar: insertChar$1 + }; + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + clearTimeout(timer); + } + timer = setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var nativeFromCodePoint = String.fromCodePoint; + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + var fromCodePoint = function () { + var codePoints = []; + for (var _i = 0; _i < arguments.length; _i++) { + codePoints[_i] = arguments[_i]; + } + if (nativeFromCodePoint) { + return nativeFromCodePoint.apply(void 0, codePoints); + } else { + var codeUnits = []; + var codeLen = 0; + var result = ''; + for (var index = 0, len = codePoints.length; index !== len; ++index) { + var codePoint = +codePoints[index]; + if (!(codePoint < 1114111 && codePoint >>> 0 === codePoint)) { + throw RangeError('Invalid code point: ' + codePoint); + } + if (codePoint <= 65535) { + codeLen = codeUnits.push(codePoint); + } else { + codePoint -= 65536; + codeLen = codeUnits.push((codePoint >> 10) + 55296, codePoint % 1024 + 56320); + } + if (codeLen >= 16383) { + result += String.fromCharCode.apply(null, codeUnits); + codeUnits.length = 0; + } + } + return result + String.fromCharCode.apply(null, codeUnits); + } + }; + + var charMatches = function (charCode, name, lowerCasePattern) { + if (contains(fromCodePoint(charCode).toLowerCase(), lowerCasePattern)) { + return true; + } else { + return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\s+/g, ''), lowerCasePattern); + } + }; + var scan = function (group, pattern) { + var matches = []; + var lowerCasePattern = pattern.toLowerCase(); + each(group.characters, function (g) { + if (charMatches(g[0], g[1], lowerCasePattern)) { + matches.push(g); + } + }); + return map(matches, function (m) { + return { + text: m[1], + value: fromCodePoint(m[0]), + icon: fromCodePoint(m[0]) + }; + }); + }; + + var patternName = 'pattern'; + var open = function (editor, charMap) { + var makeGroupItems = function () { + return [ + { + label: 'Search', + type: 'input', + name: patternName + }, + { + type: 'collection', + name: 'results' + } + ]; + }; + var makeTabs = function () { + return map(charMap, function (charGroup) { + return { + title: charGroup.name, + name: charGroup.name, + items: makeGroupItems() + }; + }); + }; + var makePanel = function () { + return { + type: 'panel', + items: makeGroupItems() + }; + }; + var makeTabPanel = function () { + return { + type: 'tabpanel', + tabs: makeTabs() + }; + }; + var currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); + var scanAndSet = function (dialogApi, pattern) { + find(charMap, function (group) { + return group.name === currentTab.get(); + }).each(function (f) { + var items = scan(f, pattern); + dialogApi.setData({ results: items }); + }); + }; + var SEARCH_DELAY = 40; + var updateFilter = last(function (dialogApi) { + var pattern = dialogApi.getData().pattern; + scanAndSet(dialogApi, pattern); + }, SEARCH_DELAY); + var body = charMap.length === 1 ? makePanel() : makeTabPanel(); + var initialData = { + pattern: '', + results: scan(charMap[0], '') + }; + var bridgeSpec = { + title: 'Special Character', + size: 'normal', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: initialData, + onAction: function (api, details) { + if (details.name === 'results') { + insertChar(editor, details.value); + api.close(); + } + }, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: function (dialogApi, changeData) { + if (changeData.name === patternName) { + updateFilter.throttle(dialogApi); + } + } + }; + var dialogApi = editor.windowManager.open(bridgeSpec); + dialogApi.focus(patternName); + }; + + var register = function (editor, charMap) { + editor.addCommand('mceShowCharmap', function () { + open(editor, charMap); + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var init = function (editor, all) { + editor.ui.registry.addAutocompleter('charmap', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, _maxResults) { + return new global$2(function (resolve, _reject) { + resolve(scan(all, pattern)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('charmap', { + icon: 'insert-character', + tooltip: 'Special character', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + editor.ui.registry.addMenuItem('charmap', { + icon: 'insert-character', + text: 'Special character...', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + }; + + function Plugin () { + global.add('charmap', function (editor) { + var charMap = getCharMap$1(editor); + register(editor, charMap); + register$1(editor); + init(editor, charMap[0]); + return get(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/charmap/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 0000000..3df46f2 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,n,r,t,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(e,n){var r,t=(r=n,e.fire("insertCustomChar",{chr:r}).chr);e.execCommand("mceInsertContent",!1,t)},i=function(e){return function(){return e}},o=i(!1),c=i(!0),u=function(){return l},l=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:o,isSome:o,isNone:c,getOr:r=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:r,orThunk:n,map:u,each:function(){},bind:u,exists:o,forall:c,filter:u,equals:e,equals_:e,toArray:function(){return[]},toString:i("none()")}),g=function(r){var e=i(r),n=function(){return a},t=function(e){return e(r)},a={fold:function(e,n){return n(r)},is:function(e){return r===e},isSome:c,isNone:o,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return g(e(r))},each:function(e){e(r)},bind:t,exists:t,forall:t,filter:function(e){return e(r)?a:l},toArray:function(){return[r]},toString:function(){return"some("+r+")"},equals:function(e){return e.is(r)},equals_:function(e,n){return e.fold(o,function(e){return n(r,e)})}};return a},m={some:g,none:u,from:function(e){return null===e||e===undefined?l:g(e)}},f=(t="array",function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}),h=Array.prototype.push,p=function(e,n){for(var r=e.length,t=new Array(r),a=0;a>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?r.push(o):(o-=65536,r.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,r),r.length=0)}return t+String.fromCharCode.apply(null,r)},S=function(e,n){var a=[],i=n.toLowerCase();return function(e,n){for(var r=0,t=e.length;r= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + }; + var head = function (xs) { + return get(xs, 0); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + function isCodeSample(elm) { + return elm && elm.nodeName === 'PRE' && elm.className.indexOf('language-') !== -1; + } + function trimArg(predicateFn) { + return function (arg1, arg2) { + return predicateFn(arg2); + }; + } + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var exports$1 = {}, module = { exports: exports$1 }, global$2 = {}; + (function (define, exports, module, require) { + var oldprism = window.Prism; + window.Prism = { manual: true }; + (function (f) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = f(); + } else if (typeof define === 'function' && define.amd) { + define([], f); + } else { + var g; + if (typeof window !== 'undefined') { + g = window; + } else if (typeof global$2 !== 'undefined') { + g = global$2; + } else if (typeof self !== 'undefined') { + g = self; + } else { + g = this; + } + g.EphoxContactWrapper = f(); + } + }(function () { + return function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = 'function' == typeof require && require; + if (!f && c) + return c(i, !0); + if (u) + return u(i, !0); + var a = new Error('Cannot find module \'' + i + '\''); + throw a.code = 'MODULE_NOT_FOUND', a; + } + var p = n[i] = { exports: {} }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r); + }, p, p.exports, r, e, n, t); + } + return n[i].exports; + } + for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) + o(t[i]); + return o; + } + return r; + }()({ + 1: [ + function (require, module, exports) { + Prism.languages.c = Prism.languages.extend('clike', { + 'comment': { + pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+/, + lookbehind: true + }, + 'keyword': /\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/, + 'function': /[a-z_]\w*(?=\s*\()/i, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/, + 'number': /(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i + }); + Prism.languages.insertBefore('c', 'string', { + 'macro': { + pattern: /(^\s*)#\s*[a-z]+(?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im, + lookbehind: true, + greedy: true, + alias: 'property', + inside: { + 'string': [ + { + pattern: /^(#\s*include\s*)<[^>]+>/, + lookbehind: true + }, + Prism.languages.c['string'] + ], + 'comment': Prism.languages.c['comment'], + 'directive': { + pattern: /^(#\s*)[a-z]+/, + lookbehind: true, + alias: 'keyword' + }, + 'directive-hash': /^#/, + 'punctuation': /##|\\(?=[\r\n])/, + 'expression': { + pattern: /\S[\s\S]*/, + inside: Prism.languages.c + } + } + }, + 'constant': /\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/ + }); + delete Prism.languages.c['boolean']; + }, + {} + ], + 2: [ + function (require, module, exports) { + Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(?:true|false)\b/, + 'function': /\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, + 'punctuation': /[{}[\];(),.:]/ + }; + }, + {} + ], + 3: [ + function (require, module, exports) { + (function (global) { + (function () { + var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {}; + var Prism = function (_self) { + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + var uniqueId = 0; + var _ = { + manual: _self.Prism && _self.Prism.manual, + disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, + util: { + encode: function encode(tokens) { + if (tokens instanceof Token) { + return new Token(tokens.type, encode(tokens.content), tokens.alias); + } else if (Array.isArray(tokens)) { + return tokens.map(encode); + } else { + return tokens.replace(/&/g, '&').replace(/' + env.content + ''; + }; + function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) { + for (var token in grammar) { + if (!grammar.hasOwnProperty(token) || !grammar[token]) { + continue; + } + var patterns = grammar[token]; + patterns = Array.isArray(patterns) ? patterns : [patterns]; + for (var j = 0; j < patterns.length; ++j) { + if (rematch && rematch.cause == token + ',' + j) { + return; + } + var patternObj = patterns[j], inside = patternObj.inside, lookbehind = !!patternObj.lookbehind, greedy = !!patternObj.greedy, lookbehindLength = 0, alias = patternObj.alias; + if (greedy && !patternObj.pattern.global) { + var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0]; + patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g'); + } + var pattern = patternObj.pattern || patternObj; + for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) { + if (rematch && pos >= rematch.reach) { + break; + } + var str = currentNode.value; + if (tokenList.length > text.length) { + return; + } + if (str instanceof Token) { + continue; + } + var removeCount = 1; + if (greedy && currentNode != tokenList.tail.prev) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (!match) { + break; + } + var from = match.index + (lookbehind && match[1] ? match[1].length : 0); + var to = match.index + match[0].length; + var p = pos; + p += currentNode.value.length; + while (from >= p) { + currentNode = currentNode.next; + p += currentNode.value.length; + } + p -= currentNode.value.length; + pos = p; + if (currentNode.value instanceof Token) { + continue; + } + for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === 'string'); k = k.next) { + removeCount++; + p += k.value.length; + } + removeCount--; + str = text.slice(pos, p); + match.index -= pos; + } else { + pattern.lastIndex = 0; + var match = pattern.exec(str); + } + if (!match) { + continue; + } + if (lookbehind) { + lookbehindLength = match[1] ? match[1].length : 0; + } + var from = match.index + lookbehindLength, matchStr = match[0].slice(lookbehindLength), to = from + matchStr.length, before = str.slice(0, from), after = str.slice(to); + var reach = pos + str.length; + if (rematch && reach > rematch.reach) { + rematch.reach = reach; + } + var removeFrom = currentNode.prev; + if (before) { + removeFrom = addAfter(tokenList, removeFrom, before); + pos += before.length; + } + removeRange(tokenList, removeFrom, removeCount); + var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr); + currentNode = addAfter(tokenList, removeFrom, wrapped); + if (after) { + addAfter(tokenList, currentNode, after); + } + if (removeCount > 1) { + matchGrammar(text, tokenList, grammar, currentNode.prev, pos, { + cause: token + ',' + j, + reach: reach + }); + } + } + } + } + } + function LinkedList() { + var head = { + value: null, + prev: null, + next: null + }; + var tail = { + value: null, + prev: head, + next: null + }; + head.next = tail; + this.head = head; + this.tail = tail; + this.length = 0; + } + function addAfter(list, node, value) { + var next = node.next; + var newNode = { + value: value, + prev: node, + next: next + }; + node.next = newNode; + next.prev = newNode; + list.length++; + return newNode; + } + function removeRange(list, node, count) { + var next = node.next; + for (var i = 0; i < count && next !== list.tail; i++) { + next = next.next; + } + node.next = next; + next.prev = node; + list.length -= i; + } + function toArray(list) { + var array = []; + var node = list.head.next; + while (node !== list.tail) { + array.push(node.value); + node = node.next; + } + return array; + } + if (!_self.document) { + if (!_self.addEventListener) { + return _; + } + if (!_.disableWorkerMessageHandler) { + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), lang = message.language, code = message.code, immediateClose = message.immediateClose; + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + return _; + } + var script = _.util.currentScript(); + if (script) { + _.filename = script.src; + if (script.hasAttribute('data-manual')) { + _.manual = true; + } + } + function highlightAutomaticallyCallback() { + if (!_.manual) { + _.highlightAll(); + } + } + if (!_.manual) { + var readyState = document.readyState; + if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { + document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); + } else { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(highlightAutomaticallyCallback); + } else { + window.setTimeout(highlightAutomaticallyCallback, 16); + } + } + } + return _; + }(_self); + if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; + } + if (typeof global !== 'undefined') { + global.Prism = Prism; + } + }.call(this)); + }.call(this, typeof global$2 !== 'undefined' ? global$2 : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {})); + }, + {} + ], + 4: [ + function (require, module, exports) { + (function (Prism) { + var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/; + Prism.languages.cpp = Prism.languages.extend('c', { + 'class-name': [ + { + pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g, function () { + return keyword.source; + })), + lookbehind: true + }, + /\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/, + /\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i, + /\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/ + ], + 'keyword': keyword, + 'number': { + pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i, + greedy: true + }, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, + 'boolean': /\b(?:true|false)\b/ + }); + Prism.languages.insertBefore('cpp', 'string', { + 'raw-string': { + pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, + alias: 'string', + greedy: true + } + }); + Prism.languages.insertBefore('cpp', 'class-name', { + 'base-clause': { + pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)(?:[^;{}"'])+?(?=\s*[;{])/, + lookbehind: true, + greedy: true, + inside: Prism.languages.extend('cpp', {}) + } + }); + Prism.languages.insertBefore('inside', 'operator', { 'class-name': /\b[a-z_]\w*\b(?!\s*::)/i }, Prism.languages.cpp['base-clause']); + }(Prism)); + }, + {} + ], + 5: [ + function (require, module, exports) { + (function (Prism) { + function replace(pattern, replacements) { + return pattern.replace(/<<(\d+)>>/g, function (m, index) { + return '(?:' + replacements[+index] + ')'; + }); + } + function re(pattern, replacements, flags) { + return RegExp(replace(pattern, replacements), flags || ''); + } + function nested(pattern, depthLog2) { + for (var i = 0; i < depthLog2; i++) { + pattern = pattern.replace(/<>/g, function () { + return '(?:' + pattern + ')'; + }); + } + return pattern.replace(/<>/g, '[^\\s\\S]'); + } + var keywordKinds = { + type: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void', + typeDeclaration: 'class enum interface struct', + contextual: 'add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where where', + other: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield' + }; + function keywordsToPattern(words) { + return '\\b(?:' + words.trim().replace(/ /g, '|') + ')\\b'; + } + var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration); + var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other)); + var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other); + var nonContextualKeywords = keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other); + var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source, 2); + var nestedRound = nested(/\((?:[^()]|<>)*\)/.source, 2); + var name = /@?\b[A-Za-z_]\w*\b/.source; + var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [ + name, + generic + ]); + var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [ + nonTypeKeywords, + genericName + ]); + var array = /\[\s*(?:,\s*)*\]/.source; + var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [ + identifier, + array + ]); + var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [ + generic, + nestedRound, + array + ]); + var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]); + var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [ + tuple, + identifier, + array + ]); + var typeInside = { + 'keyword': keywords, + 'punctuation': /[<>()?,.:[\]]/ + }; + var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source; + var regularString = /"(?:\\.|[^\\"\r\n])*"/.source; + var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source; + Prism.languages.csharp = Prism.languages.extend('clike', { + 'string': [ + { + pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]), + lookbehind: true, + greedy: true + }, + { + pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]), + lookbehind: true, + greedy: true + }, + { + pattern: RegExp(character), + greedy: true, + alias: 'character' + } + ], + 'class-name': [ + { + pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [ + name, + typeExpression + ]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]), + lookbehind: true + }, + { + pattern: re(/(\b<<0>>\s+)<<1>>/.source, [ + typeDeclarationKeywords, + genericName + ]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/(\bwhere\s+)<<0>>/.source, [name]), + lookbehind: true + }, + { + pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/\b<<0>>(?=\s+(?!<<1>>)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [ + typeExpression, + nonContextualKeywords, + name + ]), + inside: typeInside + } + ], + 'keyword': keywords, + 'number': /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i, + 'operator': />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/, + 'punctuation': /\?\.?|::|[{}[\];(),.:]/ + }); + Prism.languages.insertBefore('csharp', 'number', { + 'range': { + pattern: /\.\./, + alias: 'operator' + } + }); + Prism.languages.insertBefore('csharp', 'punctuation', { + 'named-parameter': { + pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]), + lookbehind: true, + alias: 'punctuation' + } + }); + Prism.languages.insertBefore('csharp', 'class-name', { + 'namespace': { + pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]), + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'type-expression': { + pattern: re(/(\b(?:default|typeof|sizeof)\s*\(\s*)(?:[^()\s]|\s(?!\s*\))|<<0>>)*(?=\s*\))/.source, [nestedRound]), + lookbehind: true, + alias: 'class-name', + inside: typeInside + }, + 'return-type': { + pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [ + typeExpression, + identifier + ]), + inside: typeInside, + alias: 'class-name' + }, + 'constructor-invocation': { + pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]), + lookbehind: true, + inside: typeInside, + alias: 'class-name' + }, + 'generic-method': { + pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [ + name, + generic + ]), + inside: { + 'function': re(/^<<0>>/.source, [name]), + 'generic': { + pattern: RegExp(generic), + alias: 'class-name', + inside: typeInside + } + } + }, + 'type-list': { + pattern: re(/\b((?:<<0>>\s+<<1>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>)(?:\s*,\s*(?:<<3>>|<<4>>))*(?=\s*(?:where|[{;]|=>|$))/.source, [ + typeDeclarationKeywords, + genericName, + name, + typeExpression, + keywords.source + ]), + lookbehind: true, + inside: { + 'keyword': keywords, + 'class-name': { + pattern: RegExp(typeExpression), + greedy: true, + inside: typeInside + }, + 'punctuation': /,/ + } + }, + 'preprocessor': { + pattern: /(^\s*)#.*/m, + lookbehind: true, + alias: 'property', + inside: { + 'directive': { + pattern: /(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/, + lookbehind: true, + alias: 'keyword' + } + } + } + }); + var regularStringOrCharacter = regularString + '|' + character; + var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]); + var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<>*\)/.source, [regularStringCharacterOrComment]), 2); + var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source; + var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [ + identifier, + roundExpression + ]); + Prism.languages.insertBefore('csharp', 'class-name', { + 'attribute': { + pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [ + attrTarget, + attr + ]), + lookbehind: true, + greedy: true, + inside: { + 'target': { + pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]), + alias: 'keyword' + }, + 'attribute-arguments': { + pattern: re(/\(<<0>>*\)/.source, [roundExpression]), + inside: Prism.languages.csharp + }, + 'class-name': { + pattern: RegExp(identifier), + inside: { 'punctuation': /\./ } + }, + 'punctuation': /[:,]/ + } + } + }); + var formatString = /:[^}\r\n]+/.source; + var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<>*\)/.source, [regularStringCharacterOrComment]), 2); + var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ + mInterpolationRound, + formatString + ]); + var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source, [regularStringOrCharacter]), 2); + var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ + sInterpolationRound, + formatString + ]); + function createInterpolationInside(interpolation, interpolationRound) { + return { + 'interpolation': { + pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]), + lookbehind: true, + inside: { + 'format-string': { + pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [ + interpolationRound, + formatString + ]), + lookbehind: true, + inside: { 'punctuation': /^:/ } + }, + 'punctuation': /^\{|\}$/, + 'expression': { + pattern: /[\s\S]+/, + alias: 'language-csharp', + inside: Prism.languages.csharp + } + } + }, + 'string': /[\s\S]+/ + }; + } + Prism.languages.insertBefore('csharp', 'string', { + 'interpolation-string': [ + { + pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]), + lookbehind: true, + greedy: true, + inside: createInterpolationInside(mInterpolation, mInterpolationRound) + }, + { + pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]), + lookbehind: true, + greedy: true, + inside: createInterpolationInside(sInterpolation, sInterpolationRound) + } + ] + }); + }(Prism)); + Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; + }, + {} + ], + 6: [ + function (require, module, exports) { + (function (Prism) { + var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/; + Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: /@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/, + inside: { + 'rule': /^@[\w-]+/, + 'selector-function-argument': { + pattern: /(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/, + lookbehind: true, + alias: 'selector' + }, + 'keyword': { + pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, + lookbehind: true + } + } + }, + 'url': { + pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'), + greedy: true, + inside: { + 'function': /^url/i, + 'punctuation': /^\(|\)$/, + 'string': { + pattern: RegExp('^' + string.source + '$'), + alias: 'url' + } + } + }, + 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'), + 'string': { + pattern: string, + greedy: true + }, + 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i, + 'important': /!important\b/i, + 'function': /[-a-z0-9]+(?=\()/i, + 'punctuation': /[(){};:,]/ + }; + Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + var markup = Prism.languages.markup; + if (markup) { + markup.tag.addInlined('style', 'css'); + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, markup.tag); + } + }(Prism)); + }, + {} + ], + 7: [ + function (require, module, exports) { + (function (Prism) { + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var className = /\b[A-Z](?:\w*[a-z]\w*)?\b/; + Prism.languages.java = Prism.languages.extend('clike', { + 'class-name': [ + className, + /\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/ + ], + 'keyword': keywords, + 'function': [ + Prism.languages.clike.function, + { + pattern: /(\:\:)[a-z_]\w*/, + lookbehind: true + } + ], + 'number': /\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, + 'operator': { + pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, + lookbehind: true + } + }); + Prism.languages.insertBefore('java', 'string', { + 'triple-quoted-string': { + pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, + greedy: true, + alias: 'string' + } + }); + Prism.languages.insertBefore('java', 'class-name', { + 'annotation': { + alias: 'punctuation', + pattern: /(^|[^.])@\w+/, + lookbehind: true + }, + 'namespace': { + pattern: RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g, function () { + return keywords.source; + })), + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'generics': { + pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/, + inside: { + 'class-name': className, + 'keyword': keywords, + 'punctuation': /[<>(),.:]/, + 'operator': /[?&|]/ + } + } + }); + }(Prism)); + }, + {} + ], + 8: [ + function (require, module, exports) { + Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|})\s*)(?:catch|finally)\b/, + lookbehind: true + }, + { + pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, + lookbehind: true + } + ], + 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, + 'function': /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, + 'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/ + }); + Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; + Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, + lookbehind: true, + greedy: true, + inside: { + 'regex-source': { + pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, + lookbehind: true, + alias: 'language-regex', + inside: Prism.languages.regex + }, + 'regex-flags': /[a-z]+$/, + 'regex-delimiter': /^\/|\/$/ + } + }, + 'function-variable': { + pattern: /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i, + inside: Prism.languages.javascript + }, + { + pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ + }); + Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + } + }); + if (Prism.languages.markup) { + Prism.languages.markup.tag.addInlined('script', 'javascript'); + } + Prism.languages.js = Prism.languages.javascript; + }, + {} + ], + 9: [ + function (require, module, exports) { + (function (Prism) { + function getPlaceholder(language, index) { + return '___' + language.toUpperCase() + index + '___'; + } + Object.defineProperties(Prism.languages['markup-templating'] = {}, { + buildPlaceholders: { + value: function (env, language, placeholderPattern, replaceFilter) { + if (env.language !== language) { + return; + } + var tokenStack = env.tokenStack = []; + env.code = env.code.replace(placeholderPattern, function (match) { + if (typeof replaceFilter === 'function' && !replaceFilter(match)) { + return match; + } + var i = tokenStack.length; + var placeholder; + while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) + ++i; + tokenStack[i] = match; + return placeholder; + }); + env.grammar = Prism.languages.markup; + } + }, + tokenizePlaceholders: { + value: function (env, language) { + if (env.language !== language || !env.tokenStack) { + return; + } + env.grammar = Prism.languages[language]; + var j = 0; + var keys = Object.keys(env.tokenStack); + function walkTokens(tokens) { + for (var i = 0; i < tokens.length; i++) { + if (j >= keys.length) { + break; + } + var token = tokens[i]; + if (typeof token === 'string' || token.content && typeof token.content === 'string') { + var k = keys[j]; + var t = env.tokenStack[k]; + var s = typeof token === 'string' ? token : token.content; + var placeholder = getPlaceholder(language, k); + var index = s.indexOf(placeholder); + if (index > -1) { + ++j; + var before = s.substring(0, index); + var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); + var after = s.substring(index + placeholder.length); + var replacement = []; + if (before) { + replacement.push.apply(replacement, walkTokens([before])); + } + replacement.push(middle); + if (after) { + replacement.push.apply(replacement, walkTokens([after])); + } + if (typeof token === 'string') { + tokens.splice.apply(tokens, [ + i, + 1 + ].concat(replacement)); + } else { + token.content = replacement; + } + } + } else if (token.content) { + walkTokens(token.content); + } + } + return tokens; + } + walkTokens(env.tokens); + } + } + }); + }(Prism)); + }, + {} + ], + 10: [ + function (require, module, exports) { + Prism.languages.markup = { + 'comment': //, + 'prolog': /<\?[\s\S]+?\?>/, + 'doctype': { + pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i, + greedy: true, + inside: { + 'internal-subset': { + pattern: /(\[)[\s\S]+(?=\]>$)/, + lookbehind: true, + greedy: true, + inside: null + }, + 'string': { + pattern: /"[^"]*"|'[^']*'/, + greedy: true + }, + 'punctuation': /^$|[[\]]/, + 'doctype-tag': /^DOCTYPE/, + 'name': /[^\s<>'"]+/ + } + }, + 'cdata': //i, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/, + inside: { + 'punctuation': [ + { + pattern: /^=/, + alias: 'attr-equals' + }, + /"|'/ + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { 'namespace': /^[^\s>\/:]+:/ } + } + } + }, + 'entity': [ + { + pattern: /&[\da-z]{1,8};/i, + alias: 'named-entity' + }, + /&#x?[\da-f]{1,8};/i + ] + }; + Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; + Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup; + Prism.hooks.add('wrap', function (env) { + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } + }); + Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { + value: function addInlined(tagName, lang) { + var includedCdataInside = {}; + includedCdataInside['language-' + lang] = { + pattern: /(^$)/i, + lookbehind: true, + inside: Prism.languages[lang] + }; + includedCdataInside['cdata'] = /^$/i; + var inside = { + 'included-cdata': { + pattern: //i, + inside: includedCdataInside + } + }; + inside['language-' + lang] = { + pattern: /[\s\S]+/, + inside: Prism.languages[lang] + }; + var def = {}; + def[tagName] = { + pattern: RegExp(/(<__[\s\S]*?>)(?:))*\]\]>|(?!)/.source.replace(/__/g, function () { + return tagName; + }), 'i'), + lookbehind: true, + greedy: true, + inside: inside + }; + Prism.languages.insertBefore('markup', 'cdata', def); + } + }); + Prism.languages.html = Prism.languages.markup; + Prism.languages.mathml = Prism.languages.markup; + Prism.languages.svg = Prism.languages.markup; + Prism.languages.xml = Prism.languages.extend('markup', {}); + Prism.languages.ssml = Prism.languages.xml; + Prism.languages.atom = Prism.languages.xml; + Prism.languages.rss = Prism.languages.xml; + }, + {} + ], + 11: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.php = Prism.languages.extend('clike', { + 'keyword': /\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i, + 'boolean': { + pattern: /\b(?:false|true)\b/i, + alias: 'constant' + }, + 'constant': [ + /\b[A-Z_][A-Z0-9_]*\b/, + /\b(?:null)\b/i + ], + 'comment': { + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/, + lookbehind: true + } + }); + Prism.languages.insertBefore('php', 'string', { + 'shell-comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + alias: 'comment' + } + }); + Prism.languages.insertBefore('php', 'comment', { + 'delimiter': { + pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, + alias: 'important' + } + }); + Prism.languages.insertBefore('php', 'keyword', { + 'variable': /\$+(?:\w+\b|(?={))/i, + 'package': { + pattern: /(\\|namespace\s+|use\s+)[\w\\]+/, + lookbehind: true, + inside: { punctuation: /\\/ } + } + }); + Prism.languages.insertBefore('php', 'operator', { + 'property': { + pattern: /(->)[\w]+/, + lookbehind: true + } + }); + var string_interpolation = { + pattern: /{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)*)/, + lookbehind: true, + inside: Prism.languages.php + }; + Prism.languages.insertBefore('php', 'string', { + 'nowdoc-string': { + pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<'?|[';]$/ } + } + } + }, + 'heredoc-string': { + pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<"?|[";]$/ } + }, + 'interpolation': string_interpolation + } + }, + 'single-quoted-string': { + pattern: /'(?:\\[\s\S]|[^\\'])*'/, + greedy: true, + alias: 'string' + }, + 'double-quoted-string': { + pattern: /"(?:\\[\s\S]|[^\\"])*"/, + greedy: true, + alias: 'string', + inside: { 'interpolation': string_interpolation } + } + }); + delete Prism.languages.php['string']; + Prism.hooks.add('before-tokenize', function (env) { + if (!/<\?/.test(env.code)) { + return; + } + var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/ig; + Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); + }); + Prism.hooks.add('after-tokenize', function (env) { + Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); + }); + }(Prism)); + }, + {} + ], + 12: [ + function (require, module, exports) { + Prism.languages.python = { + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true + }, + 'string-interpolation': { + pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + 'interpolation': { + pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/, + lookbehind: true, + inside: { + 'format-spec': { + pattern: /(:)[^:(){}]+(?=}$)/, + lookbehind: true + }, + 'conversion-option': { + pattern: /![sra](?=[:}]$)/, + alias: 'punctuation' + }, + rest: null + } + }, + 'string': /[\s\S]+/ + } + }, + 'triple-quoted-string': { + pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i, + greedy: true, + alias: 'string' + }, + 'string': { + pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true + }, + 'function': { + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, + lookbehind: true + }, + 'class-name': { + pattern: /(\bclass\s+)\w+/i, + lookbehind: true + }, + 'decorator': { + pattern: /(^\s*)@\w+(?:\.\w+)*/im, + lookbehind: true, + alias: [ + 'annotation', + 'punctuation' + ], + inside: { 'punctuation': /\./ } + }, + 'keyword': /\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, + 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, + 'boolean': /\b(?:True|False|None)\b/, + 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, + 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'punctuation': /[{}[\];(),.:]/ + }; + Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; + Prism.languages.py = Prism.languages.python; + }, + {} + ], + 13: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.ruby = Prism.languages.extend('clike', { + 'comment': [ + /#.*/, + { + pattern: /^=begin\s[\s\S]*?^=end/m, + greedy: true + } + ], + 'class-name': { + pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/ + }); + var interpolation = { + pattern: /#\{[^}]+\}/, + inside: { + 'delimiter': { + pattern: /^#\{|\}$/, + alias: 'tag' + }, + rest: Prism.languages.ruby + } + }; + delete Prism.languages.ruby.function; + Prism.languages.insertBefore('ruby', 'keyword', { + 'regex': [ + { + pattern: RegExp(/%r/.source + '(?:' + [ + /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/.source, + /\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/.source, + /\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/.source, + /\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/.source, + /<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/.source + ].join('|') + ')'), + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/, + lookbehind: true, + greedy: true + } + ], + 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, + 'symbol': { + pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, + lookbehind: true + }, + 'method-definition': { + pattern: /(\bdef\s+)[\w.]+/, + lookbehind: true, + inside: { + 'function': /\w+$/, + rest: Prism.languages.ruby + } + } + }); + Prism.languages.insertBefore('ruby', 'number', { + 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, + 'constant': /\b[A-Z]\w*(?:[?!]|\b)/ + }); + Prism.languages.ruby.string = [ + { + pattern: RegExp(/%[qQiIwWxs]?/.source + '(?:' + [ + /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, + /\((?:[^()\\]|\\[\s\S])*\)/.source, + /\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source, + /\[(?:[^\[\]\\]|\\[\s\S])*\]/.source, + /<(?:[^<>\\]|\\[\s\S])*>/.source + ].join('|') + ')'), + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + } + ]; + Prism.languages.rb = Prism.languages.ruby; + }(Prism)); + }, + {} + ], + 14: [ + function (require, module, exports) { + var Prism = require('prismjs/components/prism-core'); + require('prismjs/components/prism-clike'); + require('prismjs/components/prism-markup-templating'); + require('prismjs/components/prism-c'); + require('prismjs/components/prism-cpp'); + require('prismjs/components/prism-csharp'); + require('prismjs/components/prism-css'); + require('prismjs/components/prism-java'); + require('prismjs/components/prism-javascript'); + require('prismjs/components/prism-markup'); + require('prismjs/components/prism-php'); + require('prismjs/components/prism-python'); + require('prismjs/components/prism-ruby'); + module.exports = { boltExport: Prism }; + }, + { + 'prismjs/components/prism-c': 1, + 'prismjs/components/prism-clike': 2, + 'prismjs/components/prism-core': 3, + 'prismjs/components/prism-cpp': 4, + 'prismjs/components/prism-csharp': 5, + 'prismjs/components/prism-css': 6, + 'prismjs/components/prism-java': 7, + 'prismjs/components/prism-javascript': 8, + 'prismjs/components/prism-markup': 10, + 'prismjs/components/prism-markup-templating': 9, + 'prismjs/components/prism-php': 11, + 'prismjs/components/prism-python': 12, + 'prismjs/components/prism-ruby': 13 + } + ] + }, {}, [14])(14); + })); + var prism = window.Prism; + window.Prism = oldprism; + return prism; + }(undefined, exports$1, module, undefined)); + var Prism$1 = module.exports.boltExport; + + var getLanguages = function (editor) { + return editor.getParam('codesample_languages'); + }; + var useGlobalPrismJS = function (editor) { + return editor.getParam('codesample_global_prismjs', false, 'boolean'); + }; + + var get$1 = function (editor) { + return Global.Prism && useGlobalPrismJS(editor) ? Global.Prism : Prism$1; + }; + + var getSelectedCodeSample = function (editor) { + var node = editor.selection ? editor.selection.getNode() : null; + if (isCodeSample(node)) { + return Optional.some(node); + } + return Optional.none(); + }; + var insertCodeSample = function (editor, language, code) { + editor.undoManager.transact(function () { + var node = getSelectedCodeSample(editor); + code = global$1.DOM.encode(code); + return node.fold(function () { + editor.insertContent('

                                  ' + code + '
                                  '); + editor.selection.select(editor.$('#__new').removeAttr('id')[0]); + }, function (n) { + editor.dom.setAttrib(n, 'class', 'language-' + language); + n.innerHTML = code; + get$1(editor).highlightElement(n); + editor.selection.select(n); + }); + }); + }; + var getCurrentCode = function (editor) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return ''; + }, function (n) { + return n.textContent; + }); + }; + + var getLanguages$1 = function (editor) { + var defaultLanguages = [ + { + text: 'HTML/XML', + value: 'markup' + }, + { + text: 'JavaScript', + value: 'javascript' + }, + { + text: 'CSS', + value: 'css' + }, + { + text: 'PHP', + value: 'php' + }, + { + text: 'Ruby', + value: 'ruby' + }, + { + text: 'Python', + value: 'python' + }, + { + text: 'Java', + value: 'java' + }, + { + text: 'C', + value: 'c' + }, + { + text: 'C#', + value: 'csharp' + }, + { + text: 'C++', + value: 'cpp' + } + ]; + var customLanguages = getLanguages(editor); + return customLanguages ? customLanguages : defaultLanguages; + }; + var getCurrentLanguage = function (editor, fallback) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return fallback; + }, function (n) { + var matches = n.className.match(/language-(\w+)/); + return matches ? matches[1] : fallback; + }); + }; + + var open = function (editor) { + var languages = getLanguages$1(editor); + var defaultLanguage = head(languages).fold(function () { + return ''; + }, function (l) { + return l.value; + }); + var currentLanguage = getCurrentLanguage(editor, defaultLanguage); + var currentCode = getCurrentCode(editor); + editor.windowManager.open({ + title: 'Insert/Edit Code Sample', + size: 'large', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'language', + label: 'Language', + items: languages + }, + { + type: 'textarea', + name: 'code', + label: 'Code view' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: { + language: currentLanguage, + code: currentCode + }, + onSubmit: function (api) { + var data = api.getData(); + insertCodeSample(editor, data.language, data.code); + api.close(); + } + }); + }; + + var register = function (editor) { + editor.addCommand('codesample', function () { + var node = editor.selection.getNode(); + if (editor.selection.isCollapsed() || isCodeSample(node)) { + open(editor); + } else { + editor.formatter.toggle('code'); + } + }); + }; + + var setup = function (editor) { + var $ = editor.$; + editor.on('PreProcess', function (e) { + $('pre[contenteditable=false]', e.node).filter(trimArg(isCodeSample)).each(function (idx, elm) { + var $elm = $(elm), code = elm.textContent; + $elm.attr('class', $.trim($elm.attr('class'))); + $elm.removeAttr('contentEditable'); + $elm.empty().append($('').each(function () { + this.textContent = code; + })); + }); + }); + editor.on('SetContent', function () { + var unprocessedCodeSamples = $('pre').filter(trimArg(isCodeSample)).filter(function (idx, elm) { + return elm.contentEditable !== 'false'; + }); + if (unprocessedCodeSamples.length) { + editor.undoManager.transact(function () { + unprocessedCodeSamples.each(function (idx, elm) { + $(elm).find('br').each(function (idx, elm) { + elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm); + }); + elm.contentEditable = 'false'; + elm.innerHTML = editor.dom.encode(elm.textContent); + get$1(editor).highlightElement(elm); + elm.className = $.trim(elm.className); + }); + }); + } + }); + }; + + var isCodeSampleSelection = function (editor) { + var node = editor.selection.getStart(); + return editor.dom.is(node, 'pre[class*="language-"]'); + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('codesample', { + icon: 'code-sample', + tooltip: 'Insert/edit code sample', + onAction: function () { + return open(editor); + }, + onSetup: function (api) { + var nodeChangeHandler = function () { + api.setActive(isCodeSampleSelection(editor)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + editor.ui.registry.addMenuItem('codesample', { + text: 'Code sample...', + icon: 'code-sample', + onAction: function () { + return open(editor); + } + }); + }; + + function Plugin () { + global.add('codesample', function (editor) { + setup(editor); + register$1(editor); + register(editor); + editor.on('dblclick', function (ev) { + if (isCodeSample(ev.target)) { + open(editor); + } + }); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/codesample/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 0000000..53f78f8 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,n,t,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(e){return function(){return e}},i=s(!1),o=s(!0),a=function(){return l},l=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:i,isSome:i,isNone:o,getOr:t=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:s(null),getOrUndefined:s(undefined),or:t,orThunk:n,map:a,each:function(){},bind:a,exists:i,forall:o,filter:a,equals:e,equals_:e,toArray:function(){return[]},toString:s("none()")}),u=function(t){var e=s(t),n=function(){return a},r=function(e){return e(t)},a={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:o,isNone:i,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return u(e(t))},each:function(e){e(t)},bind:r,exists:r,forall:r,filter:function(e){return e(t)?a:l},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(i,function(e){return n(t,e)})}};return a},c={some:u,none:a,from:function(e){return null===e||e===undefined?l:u(e)}},p=function(e){return n=e,(t=0)<=t&&t>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["boolean"]},{}],2:[function(e,n,t){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},{}],3:[function(e,t,n){(function(n){(function(){var e=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,O={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function a(e){return e instanceof N?new N(e.type,a(e.content),e.alias):Array.isArray(e)?e.map(a):e.replace(/&/g,"&").replace(/=s.reach);y+=b.value.length,b=b.next){var v=b.value;if(n.length>e.length)return;if(!(v instanceof N)){var w,k,x,_,P,F,A=1;if(g&&b!=n.tail.prev){h.lastIndex=y;var S=h.exec(e);if(!S)break;var $=S.index+(d&&S[1]?S[1].length:0),j=S.index+S[0].length,E=y;for(E+=b.value.length;E<=$;)b=b.next,E+=b.value.length;if(E-=b.value.length,y=E,b.value instanceof N)continue;for(var z=b;z!==n.tail&&(Es.reach&&(s.reach=_),P=b.prev,k&&(P=B(n,P,k),y+=k.length),T(n,P,A),F=new N(i,p?O.tokenize(w,p):w,f,w),b=B(n,P,F),x&&B(n,b,x),1"+r.content+""},!u.document)return u.addEventListener&&(O.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(O.highlight(r,O.languages[t],t)),a&&u.close()},!1)),O;var e,t=O.util.currentScript();function r(){O.manual||O.highlightAll()}return t&&(O.filename=t.src,t.hasAttribute("data-manual")&&(O.manual=!0)),O.manual||("loading"===(e=document.readyState)||"interactive"===e&&t&&t.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),O}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});void 0!==t&&t.exports&&(t.exports=e),void 0!==n&&(n.Prism=e)}).call(this)}).call(this,void 0!==y?y:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(e,n,t){var r,a;r=Prism,a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,r.languages.cpp=r.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,"boolean":/\b(?:true|false)\b/}),r.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),r.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)(?:[^;{}"'])+?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:r.languages.extend("cpp",{})}}),r.languages.insertBefore("inside","operator",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},r.languages.cpp["base-clause"])},{}],5:[function(e,n,t){!function(t){function r(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function a(e,n,t){return RegExp(r(e,n),t||"")}function e(e,n){for(var t=0;t>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",s="class enum interface struct",i="add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where where",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(s),c=RegExp(l(n+" "+s+" "+i+" "+o)),p=l(s+" "+i+" "+o),d=l(n+" "+s+" "+o),g=e(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),m=e(/\((?:[^()]|<>)*\)/.source,2),f=/@?\b[A-Za-z_]\w*\b/.source,h=r(/<<0>>(?:\s*<<1>>)?/.source,[f,g]),b=r(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[p,h]),y=/\[\s*(?:,\s*)*\]/.source,v=r(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[b,y]),w=r(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,m,y]),k=r(/\(<<0>>+(?:,<<0>>+)+\)/.source,[w]),x=r(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[k,b,y]),_={keyword:c,punctuation:/[<>()?,.:[\]]/},P=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,F=/"(?:\\.|[^\\"\r\n])*"/.source,A=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;t.languages.csharp=t.languages.extend("clike",{string:[{pattern:a(/(^|[^$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0},{pattern:a(/(^|[^@$\\])<<0>>/.source,[F]),lookbehind:!0,greedy:!0},{pattern:RegExp(P),greedy:!0,alias:"character"}],"class-name":[{pattern:a(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[b]),lookbehind:!0,inside:_},{pattern:a(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[f,x]),lookbehind:!0,inside:_},{pattern:a(/(\busing\s+)<<0>>(?=\s*=)/.source,[f]),lookbehind:!0},{pattern:a(/(\b<<0>>\s+)<<1>>/.source,[u,h]),lookbehind:!0,inside:_},{pattern:a(/(\bcatch\s*\(\s*)<<0>>/.source,[b]),lookbehind:!0,inside:_},{pattern:a(/(\bwhere\s+)<<0>>/.source,[f]),lookbehind:!0},{pattern:a(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[v]),lookbehind:!0,inside:_},{pattern:a(/\b<<0>>(?=\s+(?!<<1>>)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[x,d,f]),inside:_}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),t.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),t.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:a(/([(,]\s*)<<0>>(?=\s*:)/.source,[f]),lookbehind:!0,alias:"punctuation"}}),t.languages.insertBefore("csharp","class-name",{namespace:{pattern:a(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[f]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:a(/(\b(?:default|typeof|sizeof)\s*\(\s*)(?:[^()\s]|\s(?!\s*\))|<<0>>)*(?=\s*\))/.source,[m]),lookbehind:!0,alias:"class-name",inside:_},"return-type":{pattern:a(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[x,b]),inside:_,alias:"class-name"},"constructor-invocation":{pattern:a(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[x]),lookbehind:!0,inside:_,alias:"class-name"},"generic-method":{pattern:a(/<<0>>\s*<<1>>(?=\s*\()/.source,[f,g]),inside:{"function":a(/^<<0>>/.source,[f]),generic:{pattern:RegExp(g),alias:"class-name",inside:_}}},"type-list":{pattern:a(/\b((?:<<0>>\s+<<1>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>)(?:\s*,\s*(?:<<3>>|<<4>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,h,f,x,c.source]),lookbehind:!0,inside:{keyword:c,"class-name":{pattern:RegExp(x),greedy:!0,inside:_},punctuation:/,/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var S=F+"|"+P,$=r(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[S]),j=e(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[$]),2),E=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,z=r(/<<0>>(?:\s*\(<<1>>*\))?/.source,[b,j]);t.languages.insertBefore("csharp","class-name",{attribute:{pattern:a(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[E,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:a(/^<<0>>(?=\s*:)/.source,[E]),alias:"keyword"},"attribute-arguments":{pattern:a(/\(<<0>>*\)/.source,[j]),inside:t.languages.csharp},"class-name":{pattern:RegExp(b),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var C=/:[^}\r\n]+/.source,O=e(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[$]),2),N=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[O,C]),B=e(r(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[S]),2),T=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[B,C]);function D(e,n){return{interpolation:{pattern:a(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[e]),lookbehind:!0,inside:{"format-string":{pattern:a(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[n,C]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:t.languages.csharp}}},string:/[\s\S]+/}}t.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:a(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:D(N,O)},{pattern:a(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[T]),lookbehind:!0,greedy:!0,inside:D(T,B)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp},{}],6:[function(e,n,t){!function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{"function":/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+n.source+")*?(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism)},{}],7:[function(e,n,t){var r,a,s;r=Prism,a=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,s=/\b[A-Z](?:\w*[a-z]\w*)?\b/,r.languages.java=r.languages.extend("clike",{"class-name":[s,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:a,"function":[r.languages.clike["function"],{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),r.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),r.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return a.source})),lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})},{}],8:[function(e,n,t){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,"function":/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript},{}],9:[function(e,n,t){function b(e,n){return"___"+e.toUpperCase()+n+"___"}var y;y=Prism,Object.defineProperties(y.languages["markup-templating"]={},{buildPlaceholders:{value:function(r,a,e,s){var i;r.language===a&&(i=r.tokenStack=[],r.code=r.code.replace(e,function(e){if("function"==typeof s&&!s(e))return e;for(var n,t=i.length;-1!==r.code.indexOf(n=b(a,t));)++t;return i[t]=e,n}),r.grammar=y.languages.markup)}},tokenizePlaceholders:{value:function(d,g){var m,f;d.language===g&&d.tokenStack&&(d.grammar=y.languages[g],m=0,f=Object.keys(d.tokenStack),function h(e){for(var n=0;n=f.length);n++){var t,r,a,s,i,o,l,u,c,p=e[n];"string"==typeof p||p.content&&"string"==typeof p.content?(t=f[m],r=d.tokenStack[t],a="string"==typeof p?p:p.content,s=b(g,t),-1<(i=a.indexOf(s))&&(++m,o=a.substring(0,i),l=new y.Token(g,y.tokenize(r,d.grammar),"language-"+g,r),u=a.substring(i+s.length),c=[],o&&c.push.apply(c,h([o])),c.push(l),u&&c.push.apply(c,h([u])),"string"==typeof p?e.splice.apply(e,[n,1].concat(c)):p.content=c)):p.content&&h(p.content)}return e}(d.tokens))}}})},{}],10:[function(e,n,t){Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:t}};r["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var a={};a[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:r},Prism.languages.insertBefore("markup","cdata",a)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml},{}],11:[function(e,n,t){!function(n){n.languages.php=n.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,"boolean":{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),n.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var e={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)*)/,lookbehind:!0,inside:n.languages.php};n.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:e}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:e}}}),delete n.languages.php.string,n.hooks.add("before-tokenize",function(e){/<\?/.test(e.code)&&n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism)},{}],12:[function(e,n,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},{}],13:[function(e,n,t){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby["function"],e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp(/%r/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/.source,/\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/.source,/<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/.source].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{"function":/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism)},{}],14:[function(e,n,t){var r=e("prismjs/components/prism-core");e("prismjs/components/prism-clike"),e("prismjs/components/prism-markup-templating"),e("prismjs/components/prism-c"),e("prismjs/components/prism-cpp"),e("prismjs/components/prism-csharp"),e("prismjs/components/prism-css"),e("prismjs/components/prism-java"),e("prismjs/components/prism-javascript"),e("prismjs/components/prism-markup"),e("prismjs/components/prism-php"),e("prismjs/components/prism-python"),e("prismjs/components/prism-ruby"),n.exports={boltExport:r}},{"prismjs/components/prism-c":1,"prismjs/components/prism-clike":2,"prismjs/components/prism-core":3,"prismjs/components/prism-cpp":4,"prismjs/components/prism-csharp":5,"prismjs/components/prism-css":6,"prismjs/components/prism-java":7,"prismjs/components/prism-javascript":8,"prismjs/components/prism-markup":10,"prismjs/components/prism-markup-templating":9,"prismjs/components/prism-php":11,"prismjs/components/prism-python":12,"prismjs/components/prism-ruby":13}]},{},[14])(14)});var a=window.Prism;window.Prism=e}(undefined,h,b,undefined);var v=b.exports.boltExport,w=function(e){return f.Prism&&e.getParam("codesample_global_prismjs",!1,"boolean")?f.Prism:v},k=function(e){var n=e.selection?e.selection.getNode():null;return g(n)?c.some(n):c.none()},x=function(s){var t,e=s.getParam("codesample_languages")||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],n=p(e).fold(function(){return""},function(e){return e.value}),r=(t=n,k(s).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})),a=k(s).fold(function(){return""},function(e){return e.textContent});s.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:e},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:a},onSubmit:function(e){var n,t,r,a=e.getData();n=s,t=a.language,r=a.code,n.undoManager.transact(function(){var e=k(n);return r=d.DOM.encode(r),e.fold(function(){n.insertContent('
                                  '+r+"
                                  "),n.selection.select(n.$("#__new").removeAttr("id")[0])},function(e){n.dom.setAttrib(e,"class","language-"+t),e.innerHTML=r,w(n).highlightElement(e),n.selection.select(e)})}),e.close()}})},_=function(r){r.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:function(){return x(r)},onSetup:function(t){var e=function(){var e,n;t.setActive((n=(e=r).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))};return r.on("NodeChange",e),function(){return r.off("NodeChange",e)}}}),r.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:function(){return x(r)}})};r.add("codesample",function(n){var t,a,r;a=(t=n).$,t.on("PreProcess",function(e){a("pre[contenteditable=false]",e.node).filter(m(g)).each(function(e,n){var t=a(n),r=n.textContent;t.attr("class",a.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(a("").each(function(){this.textContent=r}))})}),t.on("SetContent",function(){var e=a("pre").filter(m(g)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){a(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),w(t).highlightElement(n),n.className=a.trim(n.className)})})}),_(n),(r=n).addCommand("codesample",function(){var e=r.selection.getNode();r.selection.isCollapsed()||g(e)?x(r):r.formatter.toggle("code")}),n.on("dblclick",function(e){g(e.target)&&x(n)})})}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/colorpicker/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/colorpicker/plugin.js new file mode 100644 index 0000000..c8cbff2 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/colorpicker/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('colorpicker', function () { + console.warn('Color picker plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/colorpicker/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 0000000..67519fb --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")})}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/contextmenu/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/contextmenu/plugin.js new file mode 100644 index 0000000..084e287 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/contextmenu/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('contextmenu', function () { + console.warn('Context menu plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/contextmenu/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 0000000..3fe1c73 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){console.warn("Context menu plugin is now built in to the core editor, please remove it from your editor configuration")})}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/directionality/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/directionality/plugin.js new file mode 100644 index 0000000..fc9e6eb --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/directionality/plugin.js @@ -0,0 +1,314 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var setDir = function (editor, dir) { + var dom = editor.dom; + var curDir; + var blocks = editor.selection.getSelectedBlocks(); + if (blocks.length) { + curDir = dom.getAttrib(blocks[0], 'dir'); + global$1.each(blocks, function (block) { + if (!dom.getParent(block.parentNode, '*[dir="' + dir + '"]', dom.getRoot())) { + dom.setAttrib(block, 'dir', curDir !== dir ? dir : null); + } + }); + editor.nodeChanged(); + } + }; + + var register = function (editor) { + editor.addCommand('mceDirectionLTR', function () { + setDir(editor, 'ltr'); + }); + editor.addCommand('mceDirectionRTL', function () { + setDir(editor, 'rtl'); + }); + }; + + var noop = function () { + }; + var compose1 = function (fbc, fab) { + return function (a) { + return fbc(fab(a)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isFunction = isSimpleType('function'); + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var fromHtml = function (html, scope) { + var doc = scope || document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var DOCUMENT = 9; + var DOCUMENT_FRAGMENT = 11; + var TEXT = 3; + + var type = function (element) { + return element.dom.nodeType; + }; + var isType = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType(TEXT); + var isDocument = isType(DOCUMENT); + var isDocumentFragment = isType(DOCUMENT_FRAGMENT); + + var owner = function (element) { + return SugarElement.fromDom(element.dom.ownerDocument); + }; + var documentOrOwner = function (dos) { + return isDocument(dos) ? dos : owner(dos); + }; + + var isShadowRoot = function (dos) { + return isDocumentFragment(dos); + }; + var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); + var getRootNode = supported ? function (e) { + return SugarElement.fromDom(e.dom.getRootNode()); + } : documentOrOwner; + var getShadowRoot = function (e) { + var r = getRootNode(e); + return isShadowRoot(r) ? Optional.some(r) : Optional.none(); + }; + var getShadowHost = function (e) { + return SugarElement.fromDom(e.dom.host); + }; + + var inBody = function (element) { + var dom = isText(element) ? element.dom.parentNode : element.dom; + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + var doc = dom.ownerDocument; + return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { + return doc.body.contains(dom); + }, compose1(inBody, getShadowHost)); + }; + + var get = function (element, property) { + var dom = element.dom; + var styles = window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var getDirection = function (element) { + return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; + }; + + var getNodeChangeHandler = function (editor, dir) { + return function (api) { + var nodeChangeHandler = function (e) { + var element = SugarElement.fromDom(e.element); + api.setActive(getDirection(element) === dir); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('ltr', { + tooltip: 'Left to right', + icon: 'ltr', + onAction: function () { + return editor.execCommand('mceDirectionLTR'); + }, + onSetup: getNodeChangeHandler(editor, 'ltr') + }); + editor.ui.registry.addToggleButton('rtl', { + tooltip: 'Right to left', + icon: 'rtl', + onAction: function () { + return editor.execCommand('mceDirectionRTL'); + }, + onSetup: getNodeChangeHandler(editor, 'rtl') + }); + }; + + function Plugin () { + global.add('directionality', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/directionality/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 0000000..e20ec96 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n,t,e,o,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(n,t){var e,o=n.dom,r=n.selection.getSelectedBlocks();r.length&&(e=o.getAttrib(r[0],"dir"),u.each(r,function(n){o.getParent(n.parentNode,'*[dir="'+t+'"]',o.getRoot())||o.setAttrib(n,"dir",e!==t?t:null)}),n.nodeChanged())},c=function(n){return function(){return n}},f=c(!1),d=c(!0),l=function(){return m},m=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:f,isSome:f,isNone:d,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:c(null),getOrUndefined:c(undefined),or:e,orThunk:t,map:l,each:function(){},bind:l,exists:f,forall:d,filter:l,equals:n,equals_:n,toArray:function(){return[]},toString:c("none()")}),a=function(e){var n=c(e),t=function(){return r},o=function(n){return n(e)},r={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:d,isNone:f,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return a(n(e))},each:function(n){n(e)},bind:o,exists:o,forall:o,filter:function(n){return n(e)?r:m},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(f,function(n){return t(e,n)})}};return r},s={some:a,none:l,from:function(n){return null===n||n===undefined?m:a(n)}},g=(o="function",function(n){return typeof n===o}),h=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:n}},y={fromHtml:function(n,t){var e=(t||document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1', + fitzpatrick_scale: false, + category: "symbols" + }, + 1234: { + keywords: [ "numbers", "blue-square" ], + "char": '\ud83d\udd22', + fitzpatrick_scale: false, + category: "symbols" + }, + grinning: { + keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], + "char": '\ud83d\ude00', + fitzpatrick_scale: false, + category: "people" + }, + grimacing: { + keywords: [ "face", "grimace", "teeth" ], + "char": '\ud83d\ude2c', + fitzpatrick_scale: false, + category: "people" + }, + grin: { + keywords: [ "face", "happy", "smile", "joy", "kawaii" ], + "char": '\ud83d\ude01', + fitzpatrick_scale: false, + category: "people" + }, + joy: { + keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], + "char": '\ud83d\ude02', + fitzpatrick_scale: false, + category: "people" + }, + rofl: { + keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], + "char": '\ud83e\udd23', + fitzpatrick_scale: false, + category: "people" + }, + partying: { + keywords: [ "face", "celebration", "woohoo" ], + "char": '\ud83e\udd73', + fitzpatrick_scale: false, + category: "people" + }, + smiley: { + keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], + "char": '\ud83d\ude03', + fitzpatrick_scale: false, + category: "people" + }, + smile: { + keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], + "char": '\ud83d\ude04', + fitzpatrick_scale: false, + category: "people" + }, + sweat_smile: { + keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], + "char": '\ud83d\ude05', + fitzpatrick_scale: false, + category: "people" + }, + laughing: { + keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], + "char": '\ud83d\ude06', + fitzpatrick_scale: false, + category: "people" + }, + innocent: { + keywords: [ "face", "angel", "heaven", "halo" ], + "char": '\ud83d\ude07', + fitzpatrick_scale: false, + category: "people" + }, + wink: { + keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], + "char": '\ud83d\ude09', + fitzpatrick_scale: false, + category: "people" + }, + blush: { + keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], + "char": '\ud83d\ude0a', + fitzpatrick_scale: false, + category: "people" + }, + slightly_smiling_face: { + keywords: [ "face", "smile" ], + "char": '\ud83d\ude42', + fitzpatrick_scale: false, + category: "people" + }, + upside_down_face: { + keywords: [ "face", "flipped", "silly", "smile" ], + "char": '\ud83d\ude43', + fitzpatrick_scale: false, + category: "people" + }, + relaxed: { + keywords: [ "face", "blush", "massage", "happiness" ], + "char": '\u263a\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + yum: { + keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], + "char": '\ud83d\ude0b', + fitzpatrick_scale: false, + category: "people" + }, + relieved: { + keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], + "char": '\ud83d\ude0c', + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], + "char": '\ud83d\ude0d', + fitzpatrick_scale: false, + category: "people" + }, + smiling_face_with_three_hearts: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], + "char": '\ud83e\udd70', + fitzpatrick_scale: false, + category: "people" + }, + kissing_heart: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + "char": '\ud83d\ude18', + fitzpatrick_scale: false, + category: "people" + }, + kissing: { + keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], + "char": '\ud83d\ude17', + fitzpatrick_scale: false, + category: "people" + }, + kissing_smiling_eyes: { + keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], + "char": '\ud83d\ude19', + fitzpatrick_scale: false, + category: "people" + }, + kissing_closed_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + "char": '\ud83d\ude1a', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_winking_eye: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], + "char": '\ud83d\ude1c', + fitzpatrick_scale: false, + category: "people" + }, + zany: { + keywords: [ "face", "goofy", "crazy" ], + "char": '\ud83e\udd2a', + fitzpatrick_scale: false, + category: "people" + }, + raised_eyebrow: { + keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], + "char": '\ud83e\udd28', + fitzpatrick_scale: false, + category: "people" + }, + monocle: { + keywords: [ "face", "stuffy", "wealthy" ], + "char": '\ud83e\uddd0', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_closed_eyes: { + keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], + "char": '\ud83d\ude1d', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], + "char": '\ud83d\ude1b', + fitzpatrick_scale: false, + category: "people" + }, + money_mouth_face: { + keywords: [ "face", "rich", "dollar", "money" ], + "char": '\ud83e\udd11', + fitzpatrick_scale: false, + category: "people" + }, + nerd_face: { + keywords: [ "face", "nerdy", "geek", "dork" ], + "char": '\ud83e\udd13', + fitzpatrick_scale: false, + category: "people" + }, + sunglasses: { + keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], + "char": '\ud83d\ude0e', + fitzpatrick_scale: false, + category: "people" + }, + star_struck: { + keywords: [ "face", "smile", "starry", "eyes", "grinning" ], + "char": '\ud83e\udd29', + fitzpatrick_scale: false, + category: "people" + }, + clown_face: { + keywords: [ "face" ], + "char": '\ud83e\udd21', + fitzpatrick_scale: false, + category: "people" + }, + cowboy_hat_face: { + keywords: [ "face", "cowgirl", "hat" ], + "char": '\ud83e\udd20', + fitzpatrick_scale: false, + category: "people" + }, + hugs: { + keywords: [ "face", "smile", "hug" ], + "char": '\ud83e\udd17', + fitzpatrick_scale: false, + category: "people" + }, + smirk: { + keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], + "char": '\ud83d\ude0f', + fitzpatrick_scale: false, + category: "people" + }, + no_mouth: { + keywords: [ "face", "hellokitty" ], + "char": '\ud83d\ude36', + fitzpatrick_scale: false, + category: "people" + }, + neutral_face: { + keywords: [ "indifference", "meh", ":|", "neutral" ], + "char": '\ud83d\ude10', + fitzpatrick_scale: false, + category: "people" + }, + expressionless: { + keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], + "char": '\ud83d\ude11', + fitzpatrick_scale: false, + category: "people" + }, + unamused: { + keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], + "char": '\ud83d\ude12', + fitzpatrick_scale: false, + category: "people" + }, + roll_eyes: { + keywords: [ "face", "eyeroll", "frustrated" ], + "char": '\ud83d\ude44', + fitzpatrick_scale: false, + category: "people" + }, + thinking: { + keywords: [ "face", "hmmm", "think", "consider" ], + "char": '\ud83e\udd14', + fitzpatrick_scale: false, + category: "people" + }, + lying_face: { + keywords: [ "face", "lie", "pinocchio" ], + "char": '\ud83e\udd25', + fitzpatrick_scale: false, + category: "people" + }, + hand_over_mouth: { + keywords: [ "face", "whoops", "shock", "surprise" ], + "char": '\ud83e\udd2d', + fitzpatrick_scale: false, + category: "people" + }, + shushing: { + keywords: [ "face", "quiet", "shhh" ], + "char": '\ud83e\udd2b', + fitzpatrick_scale: false, + category: "people" + }, + symbols_over_mouth: { + keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], + "char": '\ud83e\udd2c', + fitzpatrick_scale: false, + category: "people" + }, + exploding_head: { + keywords: [ "face", "shocked", "mind", "blown" ], + "char": '\ud83e\udd2f', + fitzpatrick_scale: false, + category: "people" + }, + flushed: { + keywords: [ "face", "blush", "shy", "flattered" ], + "char": '\ud83d\ude33', + fitzpatrick_scale: false, + category: "people" + }, + disappointed: { + keywords: [ "face", "sad", "upset", "depressed", ":(" ], + "char": '\ud83d\ude1e', + fitzpatrick_scale: false, + category: "people" + }, + worried: { + keywords: [ "face", "concern", "nervous", ":(" ], + "char": '\ud83d\ude1f', + fitzpatrick_scale: false, + category: "people" + }, + angry: { + keywords: [ "mad", "face", "annoyed", "frustrated" ], + "char": '\ud83d\ude20', + fitzpatrick_scale: false, + category: "people" + }, + rage: { + keywords: [ "angry", "mad", "hate", "despise" ], + "char": '\ud83d\ude21', + fitzpatrick_scale: false, + category: "people" + }, + pensive: { + keywords: [ "face", "sad", "depressed", "upset" ], + "char": '\ud83d\ude14', + fitzpatrick_scale: false, + category: "people" + }, + confused: { + keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], + "char": '\ud83d\ude15', + fitzpatrick_scale: false, + category: "people" + }, + slightly_frowning_face: { + keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], + "char": '\ud83d\ude41', + fitzpatrick_scale: false, + category: "people" + }, + frowning_face: { + keywords: [ "face", "sad", "upset", "frown" ], + "char": '\u2639', + fitzpatrick_scale: false, + category: "people" + }, + persevere: { + keywords: [ "face", "sick", "no", "upset", "oops" ], + "char": '\ud83d\ude23', + fitzpatrick_scale: false, + category: "people" + }, + confounded: { + keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], + "char": '\ud83d\ude16', + fitzpatrick_scale: false, + category: "people" + }, + tired_face: { + keywords: [ "sick", "whine", "upset", "frustrated" ], + "char": '\ud83d\ude2b', + fitzpatrick_scale: false, + category: "people" + }, + weary: { + keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], + "char": '\ud83d\ude29', + fitzpatrick_scale: false, + category: "people" + }, + pleading: { + keywords: [ "face", "begging", "mercy" ], + "char": '\ud83e\udd7a', + fitzpatrick_scale: false, + category: "people" + }, + triumph: { + keywords: [ "face", "gas", "phew", "proud", "pride" ], + "char": '\ud83d\ude24', + fitzpatrick_scale: false, + category: "people" + }, + open_mouth: { + keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], + "char": '\ud83d\ude2e', + fitzpatrick_scale: false, + category: "people" + }, + scream: { + keywords: [ "face", "munch", "scared", "omg" ], + "char": '\ud83d\ude31', + fitzpatrick_scale: false, + category: "people" + }, + fearful: { + keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], + "char": '\ud83d\ude28', + fitzpatrick_scale: false, + category: "people" + }, + cold_sweat: { + keywords: [ "face", "nervous", "sweat" ], + "char": '\ud83d\ude30', + fitzpatrick_scale: false, + category: "people" + }, + hushed: { + keywords: [ "face", "woo", "shh" ], + "char": '\ud83d\ude2f', + fitzpatrick_scale: false, + category: "people" + }, + frowning: { + keywords: [ "face", "aw", "what" ], + "char": '\ud83d\ude26', + fitzpatrick_scale: false, + category: "people" + }, + anguished: { + keywords: [ "face", "stunned", "nervous" ], + "char": '\ud83d\ude27', + fitzpatrick_scale: false, + category: "people" + }, + cry: { + keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], + "char": '\ud83d\ude22', + fitzpatrick_scale: false, + category: "people" + }, + disappointed_relieved: { + keywords: [ "face", "phew", "sweat", "nervous" ], + "char": '\ud83d\ude25', + fitzpatrick_scale: false, + category: "people" + }, + drooling_face: { + keywords: [ "face" ], + "char": '\ud83e\udd24', + fitzpatrick_scale: false, + category: "people" + }, + sleepy: { + keywords: [ "face", "tired", "rest", "nap" ], + "char": '\ud83d\ude2a', + fitzpatrick_scale: false, + category: "people" + }, + sweat: { + keywords: [ "face", "hot", "sad", "tired", "exercise" ], + "char": '\ud83d\ude13', + fitzpatrick_scale: false, + category: "people" + }, + hot: { + keywords: [ "face", "feverish", "heat", "red", "sweating" ], + "char": '\ud83e\udd75', + fitzpatrick_scale: false, + category: "people" + }, + cold: { + keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], + "char": '\ud83e\udd76', + fitzpatrick_scale: false, + category: "people" + }, + sob: { + keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], + "char": '\ud83d\ude2d', + fitzpatrick_scale: false, + category: "people" + }, + dizzy_face: { + keywords: [ "spent", "unconscious", "xox", "dizzy" ], + "char": '\ud83d\ude35', + fitzpatrick_scale: false, + category: "people" + }, + astonished: { + keywords: [ "face", "xox", "surprised", "poisoned" ], + "char": '\ud83d\ude32', + fitzpatrick_scale: false, + category: "people" + }, + zipper_mouth_face: { + keywords: [ "face", "sealed", "zipper", "secret" ], + "char": '\ud83e\udd10', + fitzpatrick_scale: false, + category: "people" + }, + nauseated_face: { + keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], + "char": '\ud83e\udd22', + fitzpatrick_scale: false, + category: "people" + }, + sneezing_face: { + keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], + "char": '\ud83e\udd27', + fitzpatrick_scale: false, + category: "people" + }, + vomiting: { + keywords: [ "face", "sick" ], + "char": '\ud83e\udd2e', + fitzpatrick_scale: false, + category: "people" + }, + mask: { + keywords: [ "face", "sick", "ill", "disease" ], + "char": '\ud83d\ude37', + fitzpatrick_scale: false, + category: "people" + }, + face_with_thermometer: { + keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], + "char": '\ud83e\udd12', + fitzpatrick_scale: false, + category: "people" + }, + face_with_head_bandage: { + keywords: [ "injured", "clumsy", "bandage", "hurt" ], + "char": '\ud83e\udd15', + fitzpatrick_scale: false, + category: "people" + }, + woozy: { + keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], + "char": '\ud83e\udd74', + fitzpatrick_scale: false, + category: "people" + }, + sleeping: { + keywords: [ "face", "tired", "sleepy", "night", "zzz" ], + "char": '\ud83d\ude34', + fitzpatrick_scale: false, + category: "people" + }, + zzz: { + keywords: [ "sleepy", "tired", "dream" ], + "char": '\ud83d\udca4', + fitzpatrick_scale: false, + category: "people" + }, + poop: { + keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], + "char": '\ud83d\udca9', + fitzpatrick_scale: false, + category: "people" + }, + smiling_imp: { + keywords: [ "devil", "horns" ], + "char": '\ud83d\ude08', + fitzpatrick_scale: false, + category: "people" + }, + imp: { + keywords: [ "devil", "angry", "horns" ], + "char": '\ud83d\udc7f', + fitzpatrick_scale: false, + category: "people" + }, + japanese_ogre: { + keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], + "char": '\ud83d\udc79', + fitzpatrick_scale: false, + category: "people" + }, + japanese_goblin: { + keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], + "char": '\ud83d\udc7a', + fitzpatrick_scale: false, + category: "people" + }, + skull: { + keywords: [ "dead", "skeleton", "creepy", "death" ], + "char": '\ud83d\udc80', + fitzpatrick_scale: false, + category: "people" + }, + ghost: { + keywords: [ "halloween", "spooky", "scary" ], + "char": '\ud83d\udc7b', + fitzpatrick_scale: false, + category: "people" + }, + alien: { + keywords: [ "UFO", "paul", "weird", "outer_space" ], + "char": '\ud83d\udc7d', + fitzpatrick_scale: false, + category: "people" + }, + robot: { + keywords: [ "computer", "machine", "bot" ], + "char": '\ud83e\udd16', + fitzpatrick_scale: false, + category: "people" + }, + smiley_cat: { + keywords: [ "animal", "cats", "happy", "smile" ], + "char": '\ud83d\ude3a', + fitzpatrick_scale: false, + category: "people" + }, + smile_cat: { + keywords: [ "animal", "cats", "smile" ], + "char": '\ud83d\ude38', + fitzpatrick_scale: false, + category: "people" + }, + joy_cat: { + keywords: [ "animal", "cats", "haha", "happy", "tears" ], + "char": '\ud83d\ude39', + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes_cat: { + keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], + "char": '\ud83d\ude3b', + fitzpatrick_scale: false, + category: "people" + }, + smirk_cat: { + keywords: [ "animal", "cats", "smirk" ], + "char": '\ud83d\ude3c', + fitzpatrick_scale: false, + category: "people" + }, + kissing_cat: { + keywords: [ "animal", "cats", "kiss" ], + "char": '\ud83d\ude3d', + fitzpatrick_scale: false, + category: "people" + }, + scream_cat: { + keywords: [ "animal", "cats", "munch", "scared", "scream" ], + "char": '\ud83d\ude40', + fitzpatrick_scale: false, + category: "people" + }, + crying_cat_face: { + keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], + "char": '\ud83d\ude3f', + fitzpatrick_scale: false, + category: "people" + }, + pouting_cat: { + keywords: [ "animal", "cats" ], + "char": '\ud83d\ude3e', + fitzpatrick_scale: false, + category: "people" + }, + palms_up: { + keywords: [ "hands", "gesture", "cupped", "prayer" ], + "char": '\ud83e\udd32', + fitzpatrick_scale: true, + category: "people" + }, + raised_hands: { + keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], + "char": '\ud83d\ude4c', + fitzpatrick_scale: true, + category: "people" + }, + clap: { + keywords: [ "hands", "praise", "applause", "congrats", "yay" ], + "char": '\ud83d\udc4f', + fitzpatrick_scale: true, + category: "people" + }, + wave: { + keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], + "char": '\ud83d\udc4b', + fitzpatrick_scale: true, + category: "people" + }, + call_me_hand: { + keywords: [ "hands", "gesture" ], + "char": '\ud83e\udd19', + fitzpatrick_scale: true, + category: "people" + }, + "+1": { + keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], + "char": '\ud83d\udc4d', + fitzpatrick_scale: true, + category: "people" + }, + "-1": { + keywords: [ "thumbsdown", "no", "dislike", "hand" ], + "char": '\ud83d\udc4e', + fitzpatrick_scale: true, + category: "people" + }, + facepunch: { + keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], + "char": '\ud83d\udc4a', + fitzpatrick_scale: true, + category: "people" + }, + fist: { + keywords: [ "fingers", "hand", "grasp" ], + "char": '\u270a', + fitzpatrick_scale: true, + category: "people" + }, + fist_left: { + keywords: [ "hand", "fistbump" ], + "char": '\ud83e\udd1b', + fitzpatrick_scale: true, + category: "people" + }, + fist_right: { + keywords: [ "hand", "fistbump" ], + "char": '\ud83e\udd1c', + fitzpatrick_scale: true, + category: "people" + }, + v: { + keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], + "char": '\u270c', + fitzpatrick_scale: true, + category: "people" + }, + ok_hand: { + keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], + "char": '\ud83d\udc4c', + fitzpatrick_scale: true, + category: "people" + }, + raised_hand: { + keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], + "char": '\u270b', + fitzpatrick_scale: true, + category: "people" + }, + raised_back_of_hand: { + keywords: [ "fingers", "raised", "backhand" ], + "char": '\ud83e\udd1a', + fitzpatrick_scale: true, + category: "people" + }, + open_hands: { + keywords: [ "fingers", "butterfly", "hands", "open" ], + "char": '\ud83d\udc50', + fitzpatrick_scale: true, + category: "people" + }, + muscle: { + keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], + "char": '\ud83d\udcaa', + fitzpatrick_scale: true, + category: "people" + }, + pray: { + keywords: [ "please", "hope", "wish", "namaste", "highfive" ], + "char": '\ud83d\ude4f', + fitzpatrick_scale: true, + category: "people" + }, + foot: { + keywords: [ "kick", "stomp" ], + "char": '\ud83e\uddb6', + fitzpatrick_scale: true, + category: "people" + }, + leg: { + keywords: [ "kick", "limb" ], + "char": '\ud83e\uddb5', + fitzpatrick_scale: true, + category: "people" + }, + handshake: { + keywords: [ "agreement", "shake" ], + "char": '\ud83e\udd1d', + fitzpatrick_scale: false, + category: "people" + }, + point_up: { + keywords: [ "hand", "fingers", "direction", "up" ], + "char": '\u261d', + fitzpatrick_scale: true, + category: "people" + }, + point_up_2: { + keywords: [ "fingers", "hand", "direction", "up" ], + "char": '\ud83d\udc46', + fitzpatrick_scale: true, + category: "people" + }, + point_down: { + keywords: [ "fingers", "hand", "direction", "down" ], + "char": '\ud83d\udc47', + fitzpatrick_scale: true, + category: "people" + }, + point_left: { + keywords: [ "direction", "fingers", "hand", "left" ], + "char": '\ud83d\udc48', + fitzpatrick_scale: true, + category: "people" + }, + point_right: { + keywords: [ "fingers", "hand", "direction", "right" ], + "char": '\ud83d\udc49', + fitzpatrick_scale: true, + category: "people" + }, + fu: { + keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], + "char": '\ud83d\udd95', + fitzpatrick_scale: true, + category: "people" + }, + raised_hand_with_fingers_splayed: { + keywords: [ "hand", "fingers", "palm" ], + "char": '\ud83d\udd90', + fitzpatrick_scale: true, + category: "people" + }, + love_you: { + keywords: [ "hand", "fingers", "gesture" ], + "char": '\ud83e\udd1f', + fitzpatrick_scale: true, + category: "people" + }, + metal: { + keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], + "char": '\ud83e\udd18', + fitzpatrick_scale: true, + category: "people" + }, + crossed_fingers: { + keywords: [ "good", "lucky" ], + "char": '\ud83e\udd1e', + fitzpatrick_scale: true, + category: "people" + }, + vulcan_salute: { + keywords: [ "hand", "fingers", "spock", "star trek" ], + "char": '\ud83d\udd96', + fitzpatrick_scale: true, + category: "people" + }, + writing_hand: { + keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], + "char": '\u270d', + fitzpatrick_scale: true, + category: "people" + }, + selfie: { + keywords: [ "camera", "phone" ], + "char": '\ud83e\udd33', + fitzpatrick_scale: true, + category: "people" + }, + nail_care: { + keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], + "char": '\ud83d\udc85', + fitzpatrick_scale: true, + category: "people" + }, + lips: { + keywords: [ "mouth", "kiss" ], + "char": '\ud83d\udc44', + fitzpatrick_scale: false, + category: "people" + }, + tooth: { + keywords: [ "teeth", "dentist" ], + "char": '\ud83e\uddb7', + fitzpatrick_scale: false, + category: "people" + }, + tongue: { + keywords: [ "mouth", "playful" ], + "char": '\ud83d\udc45', + fitzpatrick_scale: false, + category: "people" + }, + ear: { + keywords: [ "face", "hear", "sound", "listen" ], + "char": '\ud83d\udc42', + fitzpatrick_scale: true, + category: "people" + }, + nose: { + keywords: [ "smell", "sniff" ], + "char": '\ud83d\udc43', + fitzpatrick_scale: true, + category: "people" + }, + eye: { + keywords: [ "face", "look", "see", "watch", "stare" ], + "char": '\ud83d\udc41', + fitzpatrick_scale: false, + category: "people" + }, + eyes: { + keywords: [ "look", "watch", "stalk", "peek", "see" ], + "char": '\ud83d\udc40', + fitzpatrick_scale: false, + category: "people" + }, + brain: { + keywords: [ "smart", "intelligent" ], + "char": '\ud83e\udde0', + fitzpatrick_scale: false, + category: "people" + }, + bust_in_silhouette: { + keywords: [ "user", "person", "human" ], + "char": '\ud83d\udc64', + fitzpatrick_scale: false, + category: "people" + }, + busts_in_silhouette: { + keywords: [ "user", "person", "human", "group", "team" ], + "char": '\ud83d\udc65', + fitzpatrick_scale: false, + category: "people" + }, + speaking_head: { + keywords: [ "user", "person", "human", "sing", "say", "talk" ], + "char": '\ud83d\udde3', + fitzpatrick_scale: false, + category: "people" + }, + baby: { + keywords: [ "child", "boy", "girl", "toddler" ], + "char": '\ud83d\udc76', + fitzpatrick_scale: true, + category: "people" + }, + child: { + keywords: [ "gender-neutral", "young" ], + "char": '\ud83e\uddd2', + fitzpatrick_scale: true, + category: "people" + }, + boy: { + keywords: [ "man", "male", "guy", "teenager" ], + "char": '\ud83d\udc66', + fitzpatrick_scale: true, + category: "people" + }, + girl: { + keywords: [ "female", "woman", "teenager" ], + "char": '\ud83d\udc67', + fitzpatrick_scale: true, + category: "people" + }, + adult: { + keywords: [ "gender-neutral", "person" ], + "char": '\ud83e\uddd1', + fitzpatrick_scale: true, + category: "people" + }, + man: { + keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], + "char": '\ud83d\udc68', + fitzpatrick_scale: true, + category: "people" + }, + woman: { + keywords: [ "female", "girls", "lady" ], + "char": '\ud83d\udc69', + fitzpatrick_scale: true, + category: "people" + }, + blonde_woman: { + keywords: [ "woman", "female", "girl", "blonde", "person" ], + "char": '\ud83d\udc71\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + blonde_man: { + keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], + "char": '\ud83d\udc71', + fitzpatrick_scale: true, + category: "people" + }, + bearded_person: { + keywords: [ "person", "bewhiskered" ], + "char": '\ud83e\uddd4', + fitzpatrick_scale: true, + category: "people" + }, + older_adult: { + keywords: [ "human", "elder", "senior", "gender-neutral" ], + "char": '\ud83e\uddd3', + fitzpatrick_scale: true, + category: "people" + }, + older_man: { + keywords: [ "human", "male", "men", "old", "elder", "senior" ], + "char": '\ud83d\udc74', + fitzpatrick_scale: true, + category: "people" + }, + older_woman: { + keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], + "char": '\ud83d\udc75', + fitzpatrick_scale: true, + category: "people" + }, + man_with_gua_pi_mao: { + keywords: [ "male", "boy", "chinese" ], + "char": '\ud83d\udc72', + fitzpatrick_scale: true, + category: "people" + }, + woman_with_headscarf: { + keywords: [ "female", "hijab", "mantilla", "tichel" ], + "char": '\ud83e\uddd5', + fitzpatrick_scale: true, + category: "people" + }, + woman_with_turban: { + keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], + "char": '\ud83d\udc73\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_with_turban: { + keywords: [ "male", "indian", "hinduism", "arabs" ], + "char": '\ud83d\udc73', + fitzpatrick_scale: true, + category: "people" + }, + policewoman: { + keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], + "char": '\ud83d\udc6e\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + policeman: { + keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], + "char": '\ud83d\udc6e', + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_woman: { + keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], + "char": '\ud83d\udc77\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_man: { + keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], + "char": '\ud83d\udc77', + fitzpatrick_scale: true, + category: "people" + }, + guardswoman: { + keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], + "char": '\ud83d\udc82\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + guardsman: { + keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], + "char": '\ud83d\udc82', + fitzpatrick_scale: true, + category: "people" + }, + female_detective: { + keywords: [ "human", "spy", "detective", "female", "woman" ], + "char": '\ud83d\udd75\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + male_detective: { + keywords: [ "human", "spy", "detective" ], + "char": '\ud83d\udd75', + fitzpatrick_scale: true, + category: "people" + }, + woman_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], + "char": '\ud83d\udc69\u200d\u2695\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], + "char": '\ud83d\udc68\u200d\u2695\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_farmer: { + keywords: [ "rancher", "gardener", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udf3e', + fitzpatrick_scale: true, + category: "people" + }, + man_farmer: { + keywords: [ "rancher", "gardener", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udf3e', + fitzpatrick_scale: true, + category: "people" + }, + woman_cook: { + keywords: [ "chef", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udf73', + fitzpatrick_scale: true, + category: "people" + }, + man_cook: { + keywords: [ "chef", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udf73', + fitzpatrick_scale: true, + category: "people" + }, + woman_student: { + keywords: [ "graduate", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udf93', + fitzpatrick_scale: true, + category: "people" + }, + man_student: { + keywords: [ "graduate", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udf93', + fitzpatrick_scale: true, + category: "people" + }, + woman_singer: { + keywords: [ "rockstar", "entertainer", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udfa4', + fitzpatrick_scale: true, + category: "people" + }, + man_singer: { + keywords: [ "rockstar", "entertainer", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udfa4', + fitzpatrick_scale: true, + category: "people" + }, + woman_teacher: { + keywords: [ "instructor", "professor", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udfeb', + fitzpatrick_scale: true, + category: "people" + }, + man_teacher: { + keywords: [ "instructor", "professor", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udfeb', + fitzpatrick_scale: true, + category: "people" + }, + woman_factory_worker: { + keywords: [ "assembly", "industrial", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udfed', + fitzpatrick_scale: true, + category: "people" + }, + man_factory_worker: { + keywords: [ "assembly", "industrial", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udfed', + fitzpatrick_scale: true, + category: "people" + }, + woman_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], + "char": '\ud83d\udc69\u200d\ud83d\udcbb', + fitzpatrick_scale: true, + category: "people" + }, + man_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], + "char": '\ud83d\udc68\u200d\ud83d\udcbb', + fitzpatrick_scale: true, + category: "people" + }, + woman_office_worker: { + keywords: [ "business", "manager", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83d\udcbc', + fitzpatrick_scale: true, + category: "people" + }, + man_office_worker: { + keywords: [ "business", "manager", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83d\udcbc', + fitzpatrick_scale: true, + category: "people" + }, + woman_mechanic: { + keywords: [ "plumber", "woman", "human", "wrench" ], + "char": '\ud83d\udc69\u200d\ud83d\udd27', + fitzpatrick_scale: true, + category: "people" + }, + man_mechanic: { + keywords: [ "plumber", "man", "human", "wrench" ], + "char": '\ud83d\udc68\u200d\ud83d\udd27', + fitzpatrick_scale: true, + category: "people" + }, + woman_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83d\udd2c', + fitzpatrick_scale: true, + category: "people" + }, + man_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83d\udd2c', + fitzpatrick_scale: true, + category: "people" + }, + woman_artist: { + keywords: [ "painter", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udfa8', + fitzpatrick_scale: true, + category: "people" + }, + man_artist: { + keywords: [ "painter", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udfa8', + fitzpatrick_scale: true, + category: "people" + }, + woman_firefighter: { + keywords: [ "fireman", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83d\ude92', + fitzpatrick_scale: true, + category: "people" + }, + man_firefighter: { + keywords: [ "fireman", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83d\ude92', + fitzpatrick_scale: true, + category: "people" + }, + woman_pilot: { + keywords: [ "aviator", "plane", "woman", "human" ], + "char": '\ud83d\udc69\u200d\u2708\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_pilot: { + keywords: [ "aviator", "plane", "man", "human" ], + "char": '\ud83d\udc68\u200d\u2708\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_astronaut: { + keywords: [ "space", "rocket", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83d\ude80', + fitzpatrick_scale: true, + category: "people" + }, + man_astronaut: { + keywords: [ "space", "rocket", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83d\ude80', + fitzpatrick_scale: true, + category: "people" + }, + woman_judge: { + keywords: [ "justice", "court", "woman", "human" ], + "char": '\ud83d\udc69\u200d\u2696\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_judge: { + keywords: [ "justice", "court", "man", "human" ], + "char": '\ud83d\udc68\u200d\u2696\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_superhero: { + keywords: [ "woman", "female", "good", "heroine", "superpowers" ], + "char": '\ud83e\uddb8\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_superhero: { + keywords: [ "man", "male", "good", "hero", "superpowers" ], + "char": '\ud83e\uddb8\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_supervillain: { + keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], + "char": '\ud83e\uddb9\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_supervillain: { + keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], + "char": '\ud83e\uddb9\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + mrs_claus: { + keywords: [ "woman", "female", "xmas", "mother christmas" ], + "char": '\ud83e\udd36', + fitzpatrick_scale: true, + category: "people" + }, + santa: { + keywords: [ "festival", "man", "male", "xmas", "father christmas" ], + "char": '\ud83c\udf85', + fitzpatrick_scale: true, + category: "people" + }, + sorceress: { + keywords: [ "woman", "female", "mage", "witch" ], + "char": '\ud83e\uddd9\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + wizard: { + keywords: [ "man", "male", "mage", "sorcerer" ], + "char": '\ud83e\uddd9\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_elf: { + keywords: [ "woman", "female" ], + "char": '\ud83e\udddd\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_elf: { + keywords: [ "man", "male" ], + "char": '\ud83e\udddd\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_vampire: { + keywords: [ "woman", "female" ], + "char": '\ud83e\udddb\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_vampire: { + keywords: [ "man", "male", "dracula" ], + "char": '\ud83e\udddb\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_zombie: { + keywords: [ "woman", "female", "undead", "walking dead" ], + "char": '\ud83e\udddf\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + man_zombie: { + keywords: [ "man", "male", "dracula", "undead", "walking dead" ], + "char": '\ud83e\udddf\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + woman_genie: { + keywords: [ "woman", "female" ], + "char": '\ud83e\uddde\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + man_genie: { + keywords: [ "man", "male" ], + "char": '\ud83e\uddde\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + mermaid: { + keywords: [ "woman", "female", "merwoman", "ariel" ], + "char": '\ud83e\udddc\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + merman: { + keywords: [ "man", "male", "triton" ], + "char": '\ud83e\udddc\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_fairy: { + keywords: [ "woman", "female" ], + "char": '\ud83e\uddda\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_fairy: { + keywords: [ "man", "male" ], + "char": '\ud83e\uddda\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + angel: { + keywords: [ "heaven", "wings", "halo" ], + "char": '\ud83d\udc7c', + fitzpatrick_scale: true, + category: "people" + }, + pregnant_woman: { + keywords: [ "baby" ], + "char": '\ud83e\udd30', + fitzpatrick_scale: true, + category: "people" + }, + breastfeeding: { + keywords: [ "nursing", "baby" ], + "char": '\ud83e\udd31', + fitzpatrick_scale: true, + category: "people" + }, + princess: { + keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], + "char": '\ud83d\udc78', + fitzpatrick_scale: true, + category: "people" + }, + prince: { + keywords: [ "boy", "man", "male", "crown", "royal", "king" ], + "char": '\ud83e\udd34', + fitzpatrick_scale: true, + category: "people" + }, + bride_with_veil: { + keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], + "char": '\ud83d\udc70', + fitzpatrick_scale: true, + category: "people" + }, + man_in_tuxedo: { + keywords: [ "couple", "marriage", "wedding", "groom" ], + "char": '\ud83e\udd35', + fitzpatrick_scale: true, + category: "people" + }, + running_woman: { + keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], + "char": '\ud83c\udfc3\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + running_man: { + keywords: [ "man", "walking", "exercise", "race", "running" ], + "char": '\ud83c\udfc3', + fitzpatrick_scale: true, + category: "people" + }, + walking_woman: { + keywords: [ "human", "feet", "steps", "woman", "female" ], + "char": '\ud83d\udeb6\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + walking_man: { + keywords: [ "human", "feet", "steps" ], + "char": '\ud83d\udeb6', + fitzpatrick_scale: true, + category: "people" + }, + dancer: { + keywords: [ "female", "girl", "woman", "fun" ], + "char": '\ud83d\udc83', + fitzpatrick_scale: true, + category: "people" + }, + man_dancing: { + keywords: [ "male", "boy", "fun", "dancer" ], + "char": '\ud83d\udd7a', + fitzpatrick_scale: true, + category: "people" + }, + dancing_women: { + keywords: [ "female", "bunny", "women", "girls" ], + "char": '\ud83d\udc6f', + fitzpatrick_scale: false, + category: "people" + }, + dancing_men: { + keywords: [ "male", "bunny", "men", "boys" ], + "char": '\ud83d\udc6f\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + couple: { + keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], + "char": '\ud83d\udc6b', + fitzpatrick_scale: false, + category: "people" + }, + two_men_holding_hands: { + keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], + "char": '\ud83d\udc6c', + fitzpatrick_scale: false, + category: "people" + }, + two_women_holding_hands: { + keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], + "char": '\ud83d\udc6d', + fitzpatrick_scale: false, + category: "people" + }, + bowing_woman: { + keywords: [ "woman", "female", "girl" ], + "char": '\ud83d\ude47\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + bowing_man: { + keywords: [ "man", "male", "boy" ], + "char": '\ud83d\ude47', + fitzpatrick_scale: true, + category: "people" + }, + man_facepalming: { + keywords: [ "man", "male", "boy", "disbelief" ], + "char": '\ud83e\udd26\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_facepalming: { + keywords: [ "woman", "female", "girl", "disbelief" ], + "char": '\ud83e\udd26\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_shrugging: { + keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], + "char": '\ud83e\udd37', + fitzpatrick_scale: true, + category: "people" + }, + man_shrugging: { + keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], + "char": '\ud83e\udd37\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_woman: { + keywords: [ "female", "girl", "woman", "human", "information" ], + "char": '\ud83d\udc81', + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_man: { + keywords: [ "male", "boy", "man", "human", "information" ], + "char": '\ud83d\udc81\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + no_good_woman: { + keywords: [ "female", "girl", "woman", "nope" ], + "char": '\ud83d\ude45', + fitzpatrick_scale: true, + category: "people" + }, + no_good_man: { + keywords: [ "male", "boy", "man", "nope" ], + "char": '\ud83d\ude45\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + ok_woman: { + keywords: [ "women", "girl", "female", "pink", "human", "woman" ], + "char": '\ud83d\ude46', + fitzpatrick_scale: true, + category: "people" + }, + ok_man: { + keywords: [ "men", "boy", "male", "blue", "human", "man" ], + "char": '\ud83d\ude46\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_woman: { + keywords: [ "female", "girl", "woman" ], + "char": '\ud83d\ude4b', + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_man: { + keywords: [ "male", "boy", "man" ], + "char": '\ud83d\ude4b\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + pouting_woman: { + keywords: [ "female", "girl", "woman" ], + "char": '\ud83d\ude4e', + fitzpatrick_scale: true, + category: "people" + }, + pouting_man: { + keywords: [ "male", "boy", "man" ], + "char": '\ud83d\ude4e\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + frowning_woman: { + keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], + "char": '\ud83d\ude4d', + fitzpatrick_scale: true, + category: "people" + }, + frowning_man: { + keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], + "char": '\ud83d\ude4d\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + haircut_woman: { + keywords: [ "female", "girl", "woman" ], + "char": '\ud83d\udc87', + fitzpatrick_scale: true, + category: "people" + }, + haircut_man: { + keywords: [ "male", "boy", "man" ], + "char": '\ud83d\udc87\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + massage_woman: { + keywords: [ "female", "girl", "woman", "head" ], + "char": '\ud83d\udc86', + fitzpatrick_scale: true, + category: "people" + }, + massage_man: { + keywords: [ "male", "boy", "man", "head" ], + "char": '\ud83d\udc86\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_in_steamy_room: { + keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], + "char": '\ud83e\uddd6\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_in_steamy_room: { + keywords: [ "male", "man", "spa", "steamroom", "sauna" ], + "char": '\ud83e\uddd6\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + couple_with_heart_woman_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": '\ud83d\udc91', + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_woman_woman: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69', + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_man_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": '\ud83d\udc8f', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_woman_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_man: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy: { + keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], + "char": '\ud83d\udc6a', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl: { + keywords: [ "home", "parents", "people", "human", "child" ], + "char": '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": '\ud83d\udc69\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": '\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": '\ud83d\udc68\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": '\ud83d\udc68\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + yarn: { + keywords: [ "ball", "crochet", "knit" ], + "char": '\ud83e\uddf6', + fitzpatrick_scale: false, + category: "people" + }, + thread: { + keywords: [ "needle", "sewing", "spool", "string" ], + "char": '\ud83e\uddf5', + fitzpatrick_scale: false, + category: "people" + }, + coat: { + keywords: [ "jacket" ], + "char": '\ud83e\udde5', + fitzpatrick_scale: false, + category: "people" + }, + labcoat: { + keywords: [ "doctor", "experiment", "scientist", "chemist" ], + "char": '\ud83e\udd7c', + fitzpatrick_scale: false, + category: "people" + }, + womans_clothes: { + keywords: [ "fashion", "shopping_bags", "female" ], + "char": '\ud83d\udc5a', + fitzpatrick_scale: false, + category: "people" + }, + tshirt: { + keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], + "char": '\ud83d\udc55', + fitzpatrick_scale: false, + category: "people" + }, + jeans: { + keywords: [ "fashion", "shopping" ], + "char": '\ud83d\udc56', + fitzpatrick_scale: false, + category: "people" + }, + necktie: { + keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], + "char": '\ud83d\udc54', + fitzpatrick_scale: false, + category: "people" + }, + dress: { + keywords: [ "clothes", "fashion", "shopping" ], + "char": '\ud83d\udc57', + fitzpatrick_scale: false, + category: "people" + }, + bikini: { + keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], + "char": '\ud83d\udc59', + fitzpatrick_scale: false, + category: "people" + }, + kimono: { + keywords: [ "dress", "fashion", "women", "female", "japanese" ], + "char": '\ud83d\udc58', + fitzpatrick_scale: false, + category: "people" + }, + lipstick: { + keywords: [ "female", "girl", "fashion", "woman" ], + "char": '\ud83d\udc84', + fitzpatrick_scale: false, + category: "people" + }, + kiss: { + keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc8b', + fitzpatrick_scale: false, + category: "people" + }, + footprints: { + keywords: [ "feet", "tracking", "walking", "beach" ], + "char": '\ud83d\udc63', + fitzpatrick_scale: false, + category: "people" + }, + flat_shoe: { + keywords: [ "ballet", "slip-on", "slipper" ], + "char": '\ud83e\udd7f', + fitzpatrick_scale: false, + category: "people" + }, + high_heel: { + keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], + "char": '\ud83d\udc60', + fitzpatrick_scale: false, + category: "people" + }, + sandal: { + keywords: [ "shoes", "fashion", "flip flops" ], + "char": '\ud83d\udc61', + fitzpatrick_scale: false, + category: "people" + }, + boot: { + keywords: [ "shoes", "fashion" ], + "char": '\ud83d\udc62', + fitzpatrick_scale: false, + category: "people" + }, + mans_shoe: { + keywords: [ "fashion", "male" ], + "char": '\ud83d\udc5e', + fitzpatrick_scale: false, + category: "people" + }, + athletic_shoe: { + keywords: [ "shoes", "sports", "sneakers" ], + "char": '\ud83d\udc5f', + fitzpatrick_scale: false, + category: "people" + }, + hiking_boot: { + keywords: [ "backpacking", "camping", "hiking" ], + "char": '\ud83e\udd7e', + fitzpatrick_scale: false, + category: "people" + }, + socks: { + keywords: [ "stockings", "clothes" ], + "char": '\ud83e\udde6', + fitzpatrick_scale: false, + category: "people" + }, + gloves: { + keywords: [ "hands", "winter", "clothes" ], + "char": '\ud83e\udde4', + fitzpatrick_scale: false, + category: "people" + }, + scarf: { + keywords: [ "neck", "winter", "clothes" ], + "char": '\ud83e\udde3', + fitzpatrick_scale: false, + category: "people" + }, + womans_hat: { + keywords: [ "fashion", "accessories", "female", "lady", "spring" ], + "char": '\ud83d\udc52', + fitzpatrick_scale: false, + category: "people" + }, + tophat: { + keywords: [ "magic", "gentleman", "classy", "circus" ], + "char": '\ud83c\udfa9', + fitzpatrick_scale: false, + category: "people" + }, + billed_hat: { + keywords: [ "cap", "baseball" ], + "char": '\ud83e\udde2', + fitzpatrick_scale: false, + category: "people" + }, + rescue_worker_helmet: { + keywords: [ "construction", "build" ], + "char": '\u26d1', + fitzpatrick_scale: false, + category: "people" + }, + mortar_board: { + keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], + "char": '\ud83c\udf93', + fitzpatrick_scale: false, + category: "people" + }, + crown: { + keywords: [ "king", "kod", "leader", "royalty", "lord" ], + "char": '\ud83d\udc51', + fitzpatrick_scale: false, + category: "people" + }, + school_satchel: { + keywords: [ "student", "education", "bag", "backpack" ], + "char": '\ud83c\udf92', + fitzpatrick_scale: false, + category: "people" + }, + luggage: { + keywords: [ "packing", "travel" ], + "char": '\ud83e\uddf3', + fitzpatrick_scale: false, + category: "people" + }, + pouch: { + keywords: [ "bag", "accessories", "shopping" ], + "char": '\ud83d\udc5d', + fitzpatrick_scale: false, + category: "people" + }, + purse: { + keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], + "char": '\ud83d\udc5b', + fitzpatrick_scale: false, + category: "people" + }, + handbag: { + keywords: [ "fashion", "accessory", "accessories", "shopping" ], + "char": '\ud83d\udc5c', + fitzpatrick_scale: false, + category: "people" + }, + briefcase: { + keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], + "char": '\ud83d\udcbc', + fitzpatrick_scale: false, + category: "people" + }, + eyeglasses: { + keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], + "char": '\ud83d\udc53', + fitzpatrick_scale: false, + category: "people" + }, + dark_sunglasses: { + keywords: [ "face", "cool", "accessories" ], + "char": '\ud83d\udd76', + fitzpatrick_scale: false, + category: "people" + }, + goggles: { + keywords: [ "eyes", "protection", "safety" ], + "char": '\ud83e\udd7d', + fitzpatrick_scale: false, + category: "people" + }, + ring: { + keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], + "char": '\ud83d\udc8d', + fitzpatrick_scale: false, + category: "people" + }, + closed_umbrella: { + keywords: [ "weather", "rain", "drizzle" ], + "char": '\ud83c\udf02', + fitzpatrick_scale: false, + category: "people" + }, + dog: { + keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], + "char": '\ud83d\udc36', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat: { + keywords: [ "animal", "meow", "nature", "pet", "kitten" ], + "char": '\ud83d\udc31', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse: { + keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], + "char": '\ud83d\udc2d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hamster: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc39', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit: { + keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], + "char": '\ud83d\udc30', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fox_face: { + keywords: [ "animal", "nature", "face" ], + "char": '\ud83e\udd8a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bear: { + keywords: [ "animal", "nature", "wild" ], + "char": '\ud83d\udc3b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + panda_face: { + keywords: [ "animal", "nature", "panda" ], + "char": '\ud83d\udc3c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + koala: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc28', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger: { + keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], + "char": '\ud83d\udc2f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lion: { + keywords: [ "animal", "nature" ], + "char": '\ud83e\udd81', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + "char": '\ud83d\udc2e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig: { + keywords: [ "animal", "oink", "nature" ], + "char": '\ud83d\udc37', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig_nose: { + keywords: [ "animal", "oink" ], + "char": '\ud83d\udc3d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + frog: { + keywords: [ "animal", "nature", "croak", "toad" ], + "char": '\ud83d\udc38', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + squid: { + keywords: [ "animal", "nature", "ocean", "sea" ], + "char": '\ud83e\udd91', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + octopus: { + keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], + "char": '\ud83d\udc19', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shrimp: { + keywords: [ "animal", "ocean", "nature", "seafood" ], + "char": '\ud83e\udd90', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey_face: { + keywords: [ "animal", "nature", "circus" ], + "char": '\ud83d\udc35', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + gorilla: { + keywords: [ "animal", "nature", "circus" ], + "char": '\ud83e\udd8d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + see_no_evil: { + keywords: [ "monkey", "animal", "nature", "haha" ], + "char": '\ud83d\ude48', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hear_no_evil: { + keywords: [ "animal", "monkey", "nature" ], + "char": '\ud83d\ude49', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + speak_no_evil: { + keywords: [ "monkey", "animal", "nature", "omg" ], + "char": '\ud83d\ude4a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey: { + keywords: [ "animal", "nature", "banana", "circus" ], + "char": '\ud83d\udc12', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chicken: { + keywords: [ "animal", "cluck", "nature", "bird" ], + "char": '\ud83d\udc14', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + penguin: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc27', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bird: { + keywords: [ "animal", "nature", "fly", "tweet", "spring" ], + "char": '\ud83d\udc26', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + baby_chick: { + keywords: [ "animal", "chicken", "bird" ], + "char": '\ud83d\udc24', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatching_chick: { + keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], + "char": '\ud83d\udc23', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatched_chick: { + keywords: [ "animal", "chicken", "baby", "bird" ], + "char": '\ud83d\udc25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + duck: { + keywords: [ "animal", "nature", "bird", "mallard" ], + "char": '\ud83e\udd86', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + eagle: { + keywords: [ "animal", "nature", "bird" ], + "char": '\ud83e\udd85', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + owl: { + keywords: [ "animal", "nature", "bird", "hoot" ], + "char": '\ud83e\udd89', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bat: { + keywords: [ "animal", "nature", "blind", "vampire" ], + "char": '\ud83e\udd87', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wolf: { + keywords: [ "animal", "nature", "wild" ], + "char": '\ud83d\udc3a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boar: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc17', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + horse: { + keywords: [ "animal", "brown", "nature" ], + "char": '\ud83d\udc34', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + unicorn: { + keywords: [ "animal", "nature", "mystical" ], + "char": '\ud83e\udd84', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + honeybee: { + keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], + "char": '\ud83d\udc1d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bug: { + keywords: [ "animal", "insect", "nature", "worm" ], + "char": '\ud83d\udc1b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + butterfly: { + keywords: [ "animal", "insect", "nature", "caterpillar" ], + "char": '\ud83e\udd8b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snail: { + keywords: [ "slow", "animal", "shell" ], + "char": '\ud83d\udc0c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + beetle: { + keywords: [ "animal", "insect", "nature", "ladybug" ], + "char": '\ud83d\udc1e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ant: { + keywords: [ "animal", "insect", "nature", "bug" ], + "char": '\ud83d\udc1c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + grasshopper: { + keywords: [ "animal", "cricket", "chirp" ], + "char": '\ud83e\udd97', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider: { + keywords: [ "animal", "arachnid" ], + "char": '\ud83d\udd77', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + scorpion: { + keywords: [ "animal", "arachnid" ], + "char": '\ud83e\udd82', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crab: { + keywords: [ "animal", "crustacean" ], + "char": '\ud83e\udd80', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snake: { + keywords: [ "animal", "evil", "nature", "hiss", "python" ], + "char": '\ud83d\udc0d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lizard: { + keywords: [ "animal", "nature", "reptile" ], + "char": '\ud83e\udd8e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + "t-rex": { + keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], + "char": '\ud83e\udd96', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sauropod: { + keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], + "char": '\ud83e\udd95', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turtle: { + keywords: [ "animal", "slow", "nature", "tortoise" ], + "char": '\ud83d\udc22', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tropical_fish: { + keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], + "char": '\ud83d\udc20', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fish: { + keywords: [ "animal", "food", "nature" ], + "char": '\ud83d\udc1f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blowfish: { + keywords: [ "animal", "nature", "food", "sea", "ocean" ], + "char": '\ud83d\udc21', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dolphin: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], + "char": '\ud83d\udc2c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shark: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], + "char": '\ud83e\udd88', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale: { + keywords: [ "animal", "nature", "sea", "ocean" ], + "char": '\ud83d\udc33', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale2: { + keywords: [ "animal", "nature", "sea", "ocean" ], + "char": '\ud83d\udc0b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crocodile: { + keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], + "char": '\ud83d\udc0a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leopard: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc06', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zebra: { + keywords: [ "animal", "nature", "stripes", "safari" ], + "char": '\ud83e\udd93', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger2: { + keywords: [ "animal", "nature", "roar" ], + "char": '\ud83d\udc05', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + water_buffalo: { + keywords: [ "animal", "nature", "ox", "cow" ], + "char": '\ud83d\udc03', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ox: { + keywords: [ "animal", "cow", "beef" ], + "char": '\ud83d\udc02', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow2: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + "char": '\ud83d\udc04', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deer: { + keywords: [ "animal", "nature", "horns", "venison" ], + "char": '\ud83e\udd8c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dromedary_camel: { + keywords: [ "animal", "hot", "desert", "hump" ], + "char": '\ud83d\udc2a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + camel: { + keywords: [ "animal", "nature", "hot", "desert", "hump" ], + "char": '\ud83d\udc2b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + giraffe: { + keywords: [ "animal", "nature", "spots", "safari" ], + "char": '\ud83e\udd92', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + elephant: { + keywords: [ "animal", "nature", "nose", "th", "circus" ], + "char": '\ud83d\udc18', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rhinoceros: { + keywords: [ "animal", "nature", "horn" ], + "char": '\ud83e\udd8f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + goat: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc10', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ram: { + keywords: [ "animal", "sheep", "nature" ], + "char": '\ud83d\udc0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sheep: { + keywords: [ "animal", "nature", "wool", "shipit" ], + "char": '\ud83d\udc11', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + racehorse: { + keywords: [ "animal", "gamble", "luck" ], + "char": '\ud83d\udc0e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig2: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc16', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rat: { + keywords: [ "animal", "mouse", "rodent" ], + "char": '\ud83d\udc00', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse2: { + keywords: [ "animal", "nature", "rodent" ], + "char": '\ud83d\udc01', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rooster: { + keywords: [ "animal", "nature", "chicken" ], + "char": '\ud83d\udc13', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turkey: { + keywords: [ "animal", "bird" ], + "char": '\ud83e\udd83', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dove: { + keywords: [ "animal", "bird" ], + "char": '\ud83d\udd4a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dog2: { + keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], + "char": '\ud83d\udc15', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + poodle: { + keywords: [ "dog", "animal", "101", "nature", "pet" ], + "char": '\ud83d\udc29', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat2: { + keywords: [ "animal", "meow", "pet", "cats" ], + "char": '\ud83d\udc08', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit2: { + keywords: [ "animal", "nature", "pet", "magic", "spring" ], + "char": '\ud83d\udc07', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chipmunk: { + keywords: [ "animal", "nature", "rodent", "squirrel" ], + "char": '\ud83d\udc3f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hedgehog: { + keywords: [ "animal", "nature", "spiny" ], + "char": '\ud83e\udd94', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + raccoon: { + keywords: [ "animal", "nature" ], + "char": '\ud83e\udd9d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + llama: { + keywords: [ "animal", "nature", "alpaca" ], + "char": '\ud83e\udd99', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hippopotamus: { + keywords: [ "animal", "nature" ], + "char": '\ud83e\udd9b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + kangaroo: { + keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], + "char": '\ud83e\udd98', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + badger: { + keywords: [ "animal", "nature", "honey" ], + "char": '\ud83e\udda1', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + swan: { + keywords: [ "animal", "nature", "bird" ], + "char": '\ud83e\udda2', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + peacock: { + keywords: [ "animal", "nature", "peahen", "bird" ], + "char": '\ud83e\udd9a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + parrot: { + keywords: [ "animal", "nature", "bird", "pirate", "talk" ], + "char": '\ud83e\udd9c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lobster: { + keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], + "char": '\ud83e\udd9e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mosquito: { + keywords: [ "animal", "nature", "insect", "malaria" ], + "char": '\ud83e\udd9f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + paw_prints: { + keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], + "char": '\ud83d\udc3e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + "char": '\ud83d\udc09', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon_face: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + "char": '\ud83d\udc32', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cactus: { + keywords: [ "vegetable", "plant", "nature" ], + "char": '\ud83c\udf35', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + christmas_tree: { + keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], + "char": '\ud83c\udf84', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + evergreen_tree: { + keywords: [ "plant", "nature" ], + "char": '\ud83c\udf32', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deciduous_tree: { + keywords: [ "plant", "nature" ], + "char": '\ud83c\udf33', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + palm_tree: { + keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], + "char": '\ud83c\udf34', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + seedling: { + keywords: [ "plant", "nature", "grass", "lawn", "spring" ], + "char": '\ud83c\udf31', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + herb: { + keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], + "char": '\ud83c\udf3f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shamrock: { + keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], + "char": '\u2618', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + four_leaf_clover: { + keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], + "char": '\ud83c\udf40', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bamboo: { + keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], + "char": '\ud83c\udf8d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tanabata_tree: { + keywords: [ "plant", "nature", "branch", "summer" ], + "char": '\ud83c\udf8b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leaves: { + keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], + "char": '\ud83c\udf43', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fallen_leaf: { + keywords: [ "nature", "plant", "vegetable", "leaves" ], + "char": '\ud83c\udf42', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + maple_leaf: { + keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], + "char": '\ud83c\udf41', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ear_of_rice: { + keywords: [ "nature", "plant" ], + "char": '\ud83c\udf3e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hibiscus: { + keywords: [ "plant", "vegetable", "flowers", "beach" ], + "char": '\ud83c\udf3a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunflower: { + keywords: [ "nature", "plant", "fall" ], + "char": '\ud83c\udf3b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rose: { + keywords: [ "flowers", "valentines", "love", "spring" ], + "char": '\ud83c\udf39', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wilted_flower: { + keywords: [ "plant", "nature", "flower" ], + "char": '\ud83e\udd40', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tulip: { + keywords: [ "flowers", "plant", "nature", "summer", "spring" ], + "char": '\ud83c\udf37', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blossom: { + keywords: [ "nature", "flowers", "yellow" ], + "char": '\ud83c\udf3c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cherry_blossom: { + keywords: [ "nature", "plant", "spring", "flower" ], + "char": '\ud83c\udf38', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bouquet: { + keywords: [ "flowers", "nature", "spring" ], + "char": '\ud83d\udc90', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mushroom: { + keywords: [ "plant", "vegetable" ], + "char": '\ud83c\udf44', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chestnut: { + keywords: [ "food", "squirrel" ], + "char": '\ud83c\udf30', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + jack_o_lantern: { + keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], + "char": '\ud83c\udf83', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shell: { + keywords: [ "nature", "sea", "beach" ], + "char": '\ud83d\udc1a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider_web: { + keywords: [ "animal", "insect", "arachnid", "silk" ], + "char": '\ud83d\udd78', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_americas: { + keywords: [ "globe", "world", "USA", "international" ], + "char": '\ud83c\udf0e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_africa: { + keywords: [ "globe", "world", "international" ], + "char": '\ud83c\udf0d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_asia: { + keywords: [ "globe", "world", "east", "international" ], + "char": '\ud83c\udf0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon: { + keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf15', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_gibbous_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], + "char": '\ud83c\udf16', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf17', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf18', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf11', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf12', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf13', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_gibbous_moon: { + keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], + "char": '\ud83c\udf14', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf1a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf1d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf1b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf1c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_with_face: { + keywords: [ "nature", "morning", "sky" ], + "char": '\ud83c\udf1e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crescent_moon: { + keywords: [ "night", "sleep", "sky", "evening", "magic" ], + "char": '\ud83c\udf19', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star: { + keywords: [ "night", "yellow" ], + "char": '\u2b50', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star2: { + keywords: [ "night", "sparkle", "awesome", "good", "magic" ], + "char": '\ud83c\udf1f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dizzy: { + keywords: [ "star", "sparkle", "shoot", "magic" ], + "char": '\ud83d\udcab', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sparkles: { + keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], + "char": '\u2728', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + comet: { + keywords: [ "space" ], + "char": '\u2604', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunny: { + keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], + "char": '\u2600\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_small_cloud: { + keywords: [ "weather" ], + "char": '\ud83c\udf24', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + partly_sunny: { + keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], + "char": '\u26c5', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_large_cloud: { + keywords: [ "weather" ], + "char": '\ud83c\udf25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_rain_cloud: { + keywords: [ "weather" ], + "char": '\ud83c\udf26', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud: { + keywords: [ "weather", "sky" ], + "char": '\u2601\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_rain: { + keywords: [ "weather" ], + "char": '\ud83c\udf27', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning_and_rain: { + keywords: [ "weather", "lightning" ], + "char": '\u26c8', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning: { + keywords: [ "weather", "thunder" ], + "char": '\ud83c\udf29', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zap: { + keywords: [ "thunder", "weather", "lightning bolt", "fast" ], + "char": '\u26a1', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fire: { + keywords: [ "hot", "cook", "flame" ], + "char": '\ud83d\udd25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boom: { + keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], + "char": '\ud83d\udca5', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowflake: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], + "char": '\u2744\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_snow: { + keywords: [ "weather" ], + "char": '\ud83c\udf28', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], + "char": '\u26c4', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman_with_snow: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], + "char": '\u2603', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wind_face: { + keywords: [ "gust", "air" ], + "char": '\ud83c\udf2c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dash: { + keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], + "char": '\ud83d\udca8', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tornado: { + keywords: [ "weather", "cyclone", "twister" ], + "char": '\ud83c\udf2a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fog: { + keywords: [ "weather" ], + "char": '\ud83c\udf2b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + open_umbrella: { + keywords: [ "weather", "spring" ], + "char": '\u2602', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + umbrella: { + keywords: [ "rainy", "weather", "spring" ], + "char": '\u2614', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + droplet: { + keywords: [ "water", "drip", "faucet", "spring" ], + "char": '\ud83d\udca7', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sweat_drops: { + keywords: [ "water", "drip", "oops" ], + "char": '\ud83d\udca6', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ocean: { + keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], + "char": '\ud83c\udf0a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + green_apple: { + keywords: [ "fruit", "nature" ], + "char": '\ud83c\udf4f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + apple: { + keywords: [ "fruit", "mac", "school" ], + "char": '\ud83c\udf4e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pear: { + keywords: [ "fruit", "nature", "food" ], + "char": '\ud83c\udf50', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tangerine: { + keywords: [ "food", "fruit", "nature", "orange" ], + "char": '\ud83c\udf4a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lemon: { + keywords: [ "fruit", "nature" ], + "char": '\ud83c\udf4b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + banana: { + keywords: [ "fruit", "food", "monkey" ], + "char": '\ud83c\udf4c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + watermelon: { + keywords: [ "fruit", "food", "picnic", "summer" ], + "char": '\ud83c\udf49', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + grapes: { + keywords: [ "fruit", "food", "wine" ], + "char": '\ud83c\udf47', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + strawberry: { + keywords: [ "fruit", "food", "nature" ], + "char": '\ud83c\udf53', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + melon: { + keywords: [ "fruit", "nature", "food" ], + "char": '\ud83c\udf48', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cherries: { + keywords: [ "food", "fruit" ], + "char": '\ud83c\udf52', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peach: { + keywords: [ "fruit", "nature", "food" ], + "char": '\ud83c\udf51', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pineapple: { + keywords: [ "fruit", "nature", "food" ], + "char": '\ud83c\udf4d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coconut: { + keywords: [ "fruit", "nature", "food", "palm" ], + "char": '\ud83e\udd65', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + kiwi_fruit: { + keywords: [ "fruit", "food" ], + "char": '\ud83e\udd5d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + mango: { + keywords: [ "fruit", "food", "tropical" ], + "char": '\ud83e\udd6d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + avocado: { + keywords: [ "fruit", "food" ], + "char": '\ud83e\udd51', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + broccoli: { + keywords: [ "fruit", "food", "vegetable" ], + "char": '\ud83e\udd66', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tomato: { + keywords: [ "fruit", "vegetable", "nature", "food" ], + "char": '\ud83c\udf45', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + eggplant: { + keywords: [ "vegetable", "nature", "food", "aubergine" ], + "char": '\ud83c\udf46', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cucumber: { + keywords: [ "fruit", "food", "pickle" ], + "char": '\ud83e\udd52', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + carrot: { + keywords: [ "vegetable", "food", "orange" ], + "char": '\ud83e\udd55', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hot_pepper: { + keywords: [ "food", "spicy", "chilli", "chili" ], + "char": '\ud83c\udf36', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + potato: { + keywords: [ "food", "tuber", "vegatable", "starch" ], + "char": '\ud83e\udd54', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + corn: { + keywords: [ "food", "vegetable", "plant" ], + "char": '\ud83c\udf3d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + leafy_greens: { + keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], + "char": '\ud83e\udd6c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sweet_potato: { + keywords: [ "food", "nature" ], + "char": '\ud83c\udf60', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peanuts: { + keywords: [ "food", "nut" ], + "char": '\ud83e\udd5c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + honey_pot: { + keywords: [ "bees", "sweet", "kitchen" ], + "char": '\ud83c\udf6f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + croissant: { + keywords: [ "food", "bread", "french" ], + "char": '\ud83e\udd50', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bread: { + keywords: [ "food", "wheat", "breakfast", "toast" ], + "char": '\ud83c\udf5e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baguette_bread: { + keywords: [ "food", "bread", "french" ], + "char": '\ud83e\udd56', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bagel: { + keywords: [ "food", "bread", "bakery", "schmear" ], + "char": '\ud83e\udd6f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pretzel: { + keywords: [ "food", "bread", "twisted" ], + "char": '\ud83e\udd68', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cheese: { + keywords: [ "food", "chadder" ], + "char": '\ud83e\uddc0', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + egg: { + keywords: [ "food", "chicken", "breakfast" ], + "char": '\ud83e\udd5a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bacon: { + keywords: [ "food", "breakfast", "pork", "pig", "meat" ], + "char": '\ud83e\udd53', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + steak: { + keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], + "char": '\ud83e\udd69', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pancakes: { + keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], + "char": '\ud83e\udd5e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + poultry_leg: { + keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], + "char": '\ud83c\udf57', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + meat_on_bone: { + keywords: [ "good", "food", "drumstick" ], + "char": '\ud83c\udf56', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bone: { + keywords: [ "skeleton" ], + "char": '\ud83e\uddb4', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_shrimp: { + keywords: [ "food", "animal", "appetizer", "summer" ], + "char": '\ud83c\udf64', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_egg: { + keywords: [ "food", "breakfast", "kitchen", "egg" ], + "char": '\ud83c\udf73', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hamburger: { + keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], + "char": '\ud83c\udf54', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fries: { + keywords: [ "chips", "snack", "fast food" ], + "char": '\ud83c\udf5f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stuffed_flatbread: { + keywords: [ "food", "flatbread", "stuffed", "gyro" ], + "char": '\ud83e\udd59', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hotdog: { + keywords: [ "food", "frankfurter" ], + "char": '\ud83c\udf2d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pizza: { + keywords: [ "food", "party" ], + "char": '\ud83c\udf55', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sandwich: { + keywords: [ "food", "lunch", "bread" ], + "char": '\ud83e\udd6a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + canned_food: { + keywords: [ "food", "soup" ], + "char": '\ud83e\udd6b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spaghetti: { + keywords: [ "food", "italian", "noodle" ], + "char": '\ud83c\udf5d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + taco: { + keywords: [ "food", "mexican" ], + "char": '\ud83c\udf2e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + burrito: { + keywords: [ "food", "mexican" ], + "char": '\ud83c\udf2f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + green_salad: { + keywords: [ "food", "healthy", "lettuce" ], + "char": '\ud83e\udd57', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shallow_pan_of_food: { + keywords: [ "food", "cooking", "casserole", "paella" ], + "char": '\ud83e\udd58', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ramen: { + keywords: [ "food", "japanese", "noodle", "chopsticks" ], + "char": '\ud83c\udf5c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stew: { + keywords: [ "food", "meat", "soup" ], + "char": '\ud83c\udf72', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fish_cake: { + keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], + "char": '\ud83c\udf65', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fortune_cookie: { + keywords: [ "food", "prophecy" ], + "char": '\ud83e\udd60', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sushi: { + keywords: [ "food", "fish", "japanese", "rice" ], + "char": '\ud83c\udf63', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bento: { + keywords: [ "food", "japanese", "box" ], + "char": '\ud83c\udf71', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + curry: { + keywords: [ "food", "spicy", "hot", "indian" ], + "char": '\ud83c\udf5b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_ball: { + keywords: [ "food", "japanese" ], + "char": '\ud83c\udf59', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice: { + keywords: [ "food", "china", "asian" ], + "char": '\ud83c\udf5a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_cracker: { + keywords: [ "food", "japanese" ], + "char": '\ud83c\udf58', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + oden: { + keywords: [ "food", "japanese" ], + "char": '\ud83c\udf62', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dango: { + keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], + "char": '\ud83c\udf61', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shaved_ice: { + keywords: [ "hot", "dessert", "summer" ], + "char": '\ud83c\udf67', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ice_cream: { + keywords: [ "food", "hot", "dessert" ], + "char": '\ud83c\udf68', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + icecream: { + keywords: [ "food", "hot", "dessert", "summer" ], + "char": '\ud83c\udf66', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pie: { + keywords: [ "food", "dessert", "pastry" ], + "char": '\ud83e\udd67', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cake: { + keywords: [ "food", "dessert" ], + "char": '\ud83c\udf70', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cupcake: { + keywords: [ "food", "dessert", "bakery", "sweet" ], + "char": '\ud83e\uddc1', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + moon_cake: { + keywords: [ "food", "autumn" ], + "char": '\ud83e\udd6e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + birthday: { + keywords: [ "food", "dessert", "cake" ], + "char": '\ud83c\udf82', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + custard: { + keywords: [ "dessert", "food" ], + "char": '\ud83c\udf6e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + candy: { + keywords: [ "snack", "dessert", "sweet", "lolly" ], + "char": '\ud83c\udf6c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lollipop: { + keywords: [ "food", "snack", "candy", "sweet" ], + "char": '\ud83c\udf6d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chocolate_bar: { + keywords: [ "food", "snack", "dessert", "sweet" ], + "char": '\ud83c\udf6b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + popcorn: { + keywords: [ "food", "movie theater", "films", "snack" ], + "char": '\ud83c\udf7f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dumpling: { + keywords: [ "food", "empanada", "pierogi", "potsticker" ], + "char": '\ud83e\udd5f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + doughnut: { + keywords: [ "food", "dessert", "snack", "sweet", "donut" ], + "char": '\ud83c\udf69', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cookie: { + keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], + "char": '\ud83c\udf6a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + milk_glass: { + keywords: [ "beverage", "drink", "cow" ], + "char": '\ud83e\udd5b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beer: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + "char": '\ud83c\udf7a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beers: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + "char": '\ud83c\udf7b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + clinking_glasses: { + keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], + "char": '\ud83e\udd42', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + wine_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], + "char": '\ud83c\udf77', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tumbler_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], + "char": '\ud83e\udd43', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cocktail: { + keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], + "char": '\ud83c\udf78', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tropical_drink: { + keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], + "char": '\ud83c\udf79', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + champagne: { + keywords: [ "drink", "wine", "bottle", "celebration" ], + "char": '\ud83c\udf7e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sake: { + keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], + "char": '\ud83c\udf76', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tea: { + keywords: [ "drink", "bowl", "breakfast", "green", "british" ], + "char": '\ud83c\udf75', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cup_with_straw: { + keywords: [ "drink", "soda" ], + "char": '\ud83e\udd64', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coffee: { + keywords: [ "beverage", "caffeine", "latte", "espresso" ], + "char": '\u2615', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baby_bottle: { + keywords: [ "food", "container", "milk" ], + "char": '\ud83c\udf7c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + salt: { + keywords: [ "condiment", "shaker" ], + "char": '\ud83e\uddc2', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spoon: { + keywords: [ "cutlery", "kitchen", "tableware" ], + "char": '\ud83e\udd44', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fork_and_knife: { + keywords: [ "cutlery", "kitchen" ], + "char": '\ud83c\udf74', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + plate_with_cutlery: { + keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], + "char": '\ud83c\udf7d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bowl_with_spoon: { + keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], + "char": '\ud83e\udd63', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + takeout_box: { + keywords: [ "food", "leftovers" ], + "char": '\ud83e\udd61', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chopsticks: { + keywords: [ "food" ], + "char": '\ud83e\udd62', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + soccer: { + keywords: [ "sports", "football" ], + "char": '\u26bd', + fitzpatrick_scale: false, + category: "activity" + }, + basketball: { + keywords: [ "sports", "balls", "NBA" ], + "char": '\ud83c\udfc0', + fitzpatrick_scale: false, + category: "activity" + }, + football: { + keywords: [ "sports", "balls", "NFL" ], + "char": '\ud83c\udfc8', + fitzpatrick_scale: false, + category: "activity" + }, + baseball: { + keywords: [ "sports", "balls" ], + "char": '\u26be', + fitzpatrick_scale: false, + category: "activity" + }, + softball: { + keywords: [ "sports", "balls" ], + "char": '\ud83e\udd4e', + fitzpatrick_scale: false, + category: "activity" + }, + tennis: { + keywords: [ "sports", "balls", "green" ], + "char": '\ud83c\udfbe', + fitzpatrick_scale: false, + category: "activity" + }, + volleyball: { + keywords: [ "sports", "balls" ], + "char": '\ud83c\udfd0', + fitzpatrick_scale: false, + category: "activity" + }, + rugby_football: { + keywords: [ "sports", "team" ], + "char": '\ud83c\udfc9', + fitzpatrick_scale: false, + category: "activity" + }, + flying_disc: { + keywords: [ "sports", "frisbee", "ultimate" ], + "char": '\ud83e\udd4f', + fitzpatrick_scale: false, + category: "activity" + }, + "8ball": { + keywords: [ "pool", "hobby", "game", "luck", "magic" ], + "char": '\ud83c\udfb1', + fitzpatrick_scale: false, + category: "activity" + }, + golf: { + keywords: [ "sports", "business", "flag", "hole", "summer" ], + "char": '\u26f3', + fitzpatrick_scale: false, + category: "activity" + }, + golfing_woman: { + keywords: [ "sports", "business", "woman", "female" ], + "char": '\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + golfing_man: { + keywords: [ "sports", "business" ], + "char": '\ud83c\udfcc', + fitzpatrick_scale: true, + category: "activity" + }, + ping_pong: { + keywords: [ "sports", "pingpong" ], + "char": '\ud83c\udfd3', + fitzpatrick_scale: false, + category: "activity" + }, + badminton: { + keywords: [ "sports" ], + "char": '\ud83c\udff8', + fitzpatrick_scale: false, + category: "activity" + }, + goal_net: { + keywords: [ "sports" ], + "char": '\ud83e\udd45', + fitzpatrick_scale: false, + category: "activity" + }, + ice_hockey: { + keywords: [ "sports" ], + "char": '\ud83c\udfd2', + fitzpatrick_scale: false, + category: "activity" + }, + field_hockey: { + keywords: [ "sports" ], + "char": '\ud83c\udfd1', + fitzpatrick_scale: false, + category: "activity" + }, + lacrosse: { + keywords: [ "sports", "ball", "stick" ], + "char": '\ud83e\udd4d', + fitzpatrick_scale: false, + category: "activity" + }, + cricket: { + keywords: [ "sports" ], + "char": '\ud83c\udfcf', + fitzpatrick_scale: false, + category: "activity" + }, + ski: { + keywords: [ "sports", "winter", "cold", "snow" ], + "char": '\ud83c\udfbf', + fitzpatrick_scale: false, + category: "activity" + }, + skier: { + keywords: [ "sports", "winter", "snow" ], + "char": '\u26f7', + fitzpatrick_scale: false, + category: "activity" + }, + snowboarder: { + keywords: [ "sports", "winter" ], + "char": '\ud83c\udfc2', + fitzpatrick_scale: true, + category: "activity" + }, + person_fencing: { + keywords: [ "sports", "fencing", "sword" ], + "char": '\ud83e\udd3a', + fitzpatrick_scale: false, + category: "activity" + }, + women_wrestling: { + keywords: [ "sports", "wrestlers" ], + "char": '\ud83e\udd3c\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + men_wrestling: { + keywords: [ "sports", "wrestlers" ], + "char": '\ud83e\udd3c\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + woman_cartwheeling: { + keywords: [ "gymnastics" ], + "char": '\ud83e\udd38\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_cartwheeling: { + keywords: [ "gymnastics" ], + "char": '\ud83e\udd38\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_handball: { + keywords: [ "sports" ], + "char": '\ud83e\udd3e\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_handball: { + keywords: [ "sports" ], + "char": '\ud83e\udd3e\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + ice_skate: { + keywords: [ "sports" ], + "char": '\u26f8', + fitzpatrick_scale: false, + category: "activity" + }, + curling_stone: { + keywords: [ "sports" ], + "char": '\ud83e\udd4c', + fitzpatrick_scale: false, + category: "activity" + }, + skateboard: { + keywords: [ "board" ], + "char": '\ud83d\udef9', + fitzpatrick_scale: false, + category: "activity" + }, + sled: { + keywords: [ "sleigh", "luge", "toboggan" ], + "char": '\ud83d\udef7', + fitzpatrick_scale: false, + category: "activity" + }, + bow_and_arrow: { + keywords: [ "sports" ], + "char": '\ud83c\udff9', + fitzpatrick_scale: false, + category: "activity" + }, + fishing_pole_and_fish: { + keywords: [ "food", "hobby", "summer" ], + "char": '\ud83c\udfa3', + fitzpatrick_scale: false, + category: "activity" + }, + boxing_glove: { + keywords: [ "sports", "fighting" ], + "char": '\ud83e\udd4a', + fitzpatrick_scale: false, + category: "activity" + }, + martial_arts_uniform: { + keywords: [ "judo", "karate", "taekwondo" ], + "char": '\ud83e\udd4b', + fitzpatrick_scale: false, + category: "activity" + }, + rowing_woman: { + keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], + "char": '\ud83d\udea3\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + rowing_man: { + keywords: [ "sports", "hobby", "water", "ship" ], + "char": '\ud83d\udea3', + fitzpatrick_scale: true, + category: "activity" + }, + climbing_woman: { + keywords: [ "sports", "hobby", "woman", "female", "rock" ], + "char": '\ud83e\uddd7\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + climbing_man: { + keywords: [ "sports", "hobby", "man", "male", "rock" ], + "char": '\ud83e\uddd7\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + swimming_woman: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], + "char": '\ud83c\udfca\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + swimming_man: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], + "char": '\ud83c\udfca', + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_water_polo: { + keywords: [ "sports", "pool" ], + "char": '\ud83e\udd3d\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_water_polo: { + keywords: [ "sports", "pool" ], + "char": '\ud83e\udd3d\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + woman_in_lotus_position: { + keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + "char": '\ud83e\uddd8\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_in_lotus_position: { + keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + "char": '\ud83e\uddd8\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + surfing_woman: { + keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], + "char": '\ud83c\udfc4\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + surfing_man: { + keywords: [ "sports", "ocean", "sea", "summer", "beach" ], + "char": '\ud83c\udfc4', + fitzpatrick_scale: true, + category: "activity" + }, + bath: { + keywords: [ "clean", "shower", "bathroom" ], + "char": '\ud83d\udec0', + fitzpatrick_scale: true, + category: "activity" + }, + basketball_woman: { + keywords: [ "sports", "human", "woman", "female" ], + "char": '\u26f9\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + basketball_man: { + keywords: [ "sports", "human" ], + "char": '\u26f9', + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_woman: { + keywords: [ "sports", "training", "exercise", "woman", "female" ], + "char": '\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_man: { + keywords: [ "sports", "training", "exercise" ], + "char": '\ud83c\udfcb', + fitzpatrick_scale: true, + category: "activity" + }, + biking_woman: { + keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], + "char": '\ud83d\udeb4\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + biking_man: { + keywords: [ "sports", "bike", "exercise", "hipster" ], + "char": '\ud83d\udeb4', + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_woman: { + keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], + "char": '\ud83d\udeb5\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_man: { + keywords: [ "transportation", "sports", "human", "race", "bike" ], + "char": '\ud83d\udeb5', + fitzpatrick_scale: true, + category: "activity" + }, + horse_racing: { + keywords: [ "animal", "betting", "competition", "gambling", "luck" ], + "char": '\ud83c\udfc7', + fitzpatrick_scale: true, + category: "activity" + }, + business_suit_levitating: { + keywords: [ "suit", "business", "levitate", "hover", "jump" ], + "char": '\ud83d\udd74', + fitzpatrick_scale: true, + category: "activity" + }, + trophy: { + keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], + "char": '\ud83c\udfc6', + fitzpatrick_scale: false, + category: "activity" + }, + running_shirt_with_sash: { + keywords: [ "play", "pageant" ], + "char": '\ud83c\udfbd', + fitzpatrick_scale: false, + category: "activity" + }, + medal_sports: { + keywords: [ "award", "winning" ], + "char": '\ud83c\udfc5', + fitzpatrick_scale: false, + category: "activity" + }, + medal_military: { + keywords: [ "award", "winning", "army" ], + "char": '\ud83c\udf96', + fitzpatrick_scale: false, + category: "activity" + }, + "1st_place_medal": { + keywords: [ "award", "winning", "first" ], + "char": '\ud83e\udd47', + fitzpatrick_scale: false, + category: "activity" + }, + "2nd_place_medal": { + keywords: [ "award", "second" ], + "char": '\ud83e\udd48', + fitzpatrick_scale: false, + category: "activity" + }, + "3rd_place_medal": { + keywords: [ "award", "third" ], + "char": '\ud83e\udd49', + fitzpatrick_scale: false, + category: "activity" + }, + reminder_ribbon: { + keywords: [ "sports", "cause", "support", "awareness" ], + "char": '\ud83c\udf97', + fitzpatrick_scale: false, + category: "activity" + }, + rosette: { + keywords: [ "flower", "decoration", "military" ], + "char": '\ud83c\udff5', + fitzpatrick_scale: false, + category: "activity" + }, + ticket: { + keywords: [ "event", "concert", "pass" ], + "char": '\ud83c\udfab', + fitzpatrick_scale: false, + category: "activity" + }, + tickets: { + keywords: [ "sports", "concert", "entrance" ], + "char": '\ud83c\udf9f', + fitzpatrick_scale: false, + category: "activity" + }, + performing_arts: { + keywords: [ "acting", "theater", "drama" ], + "char": '\ud83c\udfad', + fitzpatrick_scale: false, + category: "activity" + }, + art: { + keywords: [ "design", "paint", "draw", "colors" ], + "char": '\ud83c\udfa8', + fitzpatrick_scale: false, + category: "activity" + }, + circus_tent: { + keywords: [ "festival", "carnival", "party" ], + "char": '\ud83c\udfaa', + fitzpatrick_scale: false, + category: "activity" + }, + woman_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + "char": '\ud83e\udd39\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + "char": '\ud83e\udd39\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + microphone: { + keywords: [ "sound", "music", "PA", "sing", "talkshow" ], + "char": '\ud83c\udfa4', + fitzpatrick_scale: false, + category: "activity" + }, + headphones: { + keywords: [ "music", "score", "gadgets" ], + "char": '\ud83c\udfa7', + fitzpatrick_scale: false, + category: "activity" + }, + musical_score: { + keywords: [ "treble", "clef", "compose" ], + "char": '\ud83c\udfbc', + fitzpatrick_scale: false, + category: "activity" + }, + musical_keyboard: { + keywords: [ "piano", "instrument", "compose" ], + "char": '\ud83c\udfb9', + fitzpatrick_scale: false, + category: "activity" + }, + drum: { + keywords: [ "music", "instrument", "drumsticks", "snare" ], + "char": '\ud83e\udd41', + fitzpatrick_scale: false, + category: "activity" + }, + saxophone: { + keywords: [ "music", "instrument", "jazz", "blues" ], + "char": '\ud83c\udfb7', + fitzpatrick_scale: false, + category: "activity" + }, + trumpet: { + keywords: [ "music", "brass" ], + "char": '\ud83c\udfba', + fitzpatrick_scale: false, + category: "activity" + }, + guitar: { + keywords: [ "music", "instrument" ], + "char": '\ud83c\udfb8', + fitzpatrick_scale: false, + category: "activity" + }, + violin: { + keywords: [ "music", "instrument", "orchestra", "symphony" ], + "char": '\ud83c\udfbb', + fitzpatrick_scale: false, + category: "activity" + }, + clapper: { + keywords: [ "movie", "film", "record" ], + "char": '\ud83c\udfac', + fitzpatrick_scale: false, + category: "activity" + }, + video_game: { + keywords: [ "play", "console", "PS4", "controller" ], + "char": '\ud83c\udfae', + fitzpatrick_scale: false, + category: "activity" + }, + space_invader: { + keywords: [ "game", "arcade", "play" ], + "char": '\ud83d\udc7e', + fitzpatrick_scale: false, + category: "activity" + }, + dart: { + keywords: [ "game", "play", "bar", "target", "bullseye" ], + "char": '\ud83c\udfaf', + fitzpatrick_scale: false, + category: "activity" + }, + game_die: { + keywords: [ "dice", "random", "tabletop", "play", "luck" ], + "char": '\ud83c\udfb2', + fitzpatrick_scale: false, + category: "activity" + }, + chess_pawn: { + keywords: [ "expendable" ], + "char": "\u265f", + fitzpatrick_scale: false, + category: "activity" + }, + slot_machine: { + keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], + "char": '\ud83c\udfb0', + fitzpatrick_scale: false, + category: "activity" + }, + jigsaw: { + keywords: [ "interlocking", "puzzle", "piece" ], + "char": '\ud83e\udde9', + fitzpatrick_scale: false, + category: "activity" + }, + bowling: { + keywords: [ "sports", "fun", "play" ], + "char": '\ud83c\udfb3', + fitzpatrick_scale: false, + category: "activity" + }, + red_car: { + keywords: [ "red", "transportation", "vehicle" ], + "char": '\ud83d\ude97', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + taxi: { + keywords: [ "uber", "vehicle", "cars", "transportation" ], + "char": '\ud83d\ude95', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + blue_car: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude99', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bus: { + keywords: [ "car", "vehicle", "transportation" ], + "char": '\ud83d\ude8c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + trolleybus: { + keywords: [ "bart", "transportation", "vehicle" ], + "char": '\ud83d\ude8e', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + racing_car: { + keywords: [ "sports", "race", "fast", "formula", "f1" ], + "char": '\ud83c\udfce', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + police_car: { + keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], + "char": '\ud83d\ude93', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ambulance: { + keywords: [ "health", "911", "hospital" ], + "char": '\ud83d\ude91', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fire_engine: { + keywords: [ "transportation", "cars", "vehicle" ], + "char": '\ud83d\ude92', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + minibus: { + keywords: [ "vehicle", "car", "transportation" ], + "char": '\ud83d\ude90', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + truck: { + keywords: [ "cars", "transportation" ], + "char": '\ud83d\ude9a', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + articulated_lorry: { + keywords: [ "vehicle", "cars", "transportation", "express" ], + "char": '\ud83d\ude9b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tractor: { + keywords: [ "vehicle", "car", "farming", "agriculture" ], + "char": '\ud83d\ude9c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kick_scooter: { + keywords: [ "vehicle", "kick", "razor" ], + "char": '\ud83d\udef4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorcycle: { + keywords: [ "race", "sports", "fast" ], + "char": '\ud83c\udfcd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bike: { + keywords: [ "sports", "bicycle", "exercise", "hipster" ], + "char": '\ud83d\udeb2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_scooter: { + keywords: [ "vehicle", "vespa", "sasha" ], + "char": '\ud83d\udef5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rotating_light: { + keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], + "char": '\ud83d\udea8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_police_car: { + keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], + "char": '\ud83d\ude94', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_bus: { + keywords: [ "vehicle", "transportation" ], + "char": '\ud83d\ude8d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_automobile: { + keywords: [ "car", "vehicle", "transportation" ], + "char": '\ud83d\ude98', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_taxi: { + keywords: [ "vehicle", "cars", "uber" ], + "char": '\ud83d\ude96', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + aerial_tramway: { + keywords: [ "transportation", "vehicle", "ski" ], + "char": '\ud83d\udea1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_cableway: { + keywords: [ "transportation", "vehicle", "ski" ], + "char": '\ud83d\udea0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + suspension_railway: { + keywords: [ "vehicle", "transportation" ], + "char": '\ud83d\ude9f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_car: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude83', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train: { + keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], + "char": '\ud83d\ude8b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + monorail: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude9d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_side: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude84', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_front: { + keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], + "char": '\ud83d\ude85', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + light_rail: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude88', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_railway: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude9e', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + steam_locomotive: { + keywords: [ "transportation", "vehicle", "train" ], + "char": '\ud83d\ude82', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train2: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude86', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + metro: { + keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], + "char": '\ud83d\ude87', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tram: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude8a', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + station: { + keywords: [ "transportation", "vehicle", "public" ], + "char": '\ud83d\ude89', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flying_saucer: { + keywords: [ "transportation", "vehicle", "ufo" ], + "char": '\ud83d\udef8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + helicopter: { + keywords: [ "transportation", "vehicle", "fly" ], + "char": '\ud83d\ude81', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + small_airplane: { + keywords: [ "flight", "transportation", "fly", "vehicle" ], + "char": '\ud83d\udee9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + airplane: { + keywords: [ "vehicle", "transportation", "flight", "fly" ], + "char": '\u2708\ufe0f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_departure: { + keywords: [ "airport", "flight", "landing" ], + "char": '\ud83d\udeeb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_arrival: { + keywords: [ "airport", "flight", "boarding" ], + "char": '\ud83d\udeec', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sailboat: { + keywords: [ "ship", "summer", "transportation", "water", "sailing" ], + "char": '\u26f5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_boat: { + keywords: [ "ship" ], + "char": '\ud83d\udee5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + speedboat: { + keywords: [ "ship", "transportation", "vehicle", "summer" ], + "char": '\ud83d\udea4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferry: { + keywords: [ "boat", "ship", "yacht" ], + "char": '\u26f4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + passenger_ship: { + keywords: [ "yacht", "cruise", "ferry" ], + "char": '\ud83d\udef3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rocket: { + keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], + "char": '\ud83d\ude80', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + artificial_satellite: { + keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], + "char": '\ud83d\udef0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + seat: { + keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], + "char": '\ud83d\udcba', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + canoe: { + keywords: [ "boat", "paddle", "water", "ship" ], + "char": '\ud83d\udef6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + anchor: { + keywords: [ "ship", "ferry", "sea", "boat" ], + "char": '\u2693', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + construction: { + keywords: [ "wip", "progress", "caution", "warning" ], + "char": '\ud83d\udea7', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fuelpump: { + keywords: [ "gas station", "petroleum" ], + "char": '\u26fd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + busstop: { + keywords: [ "transportation", "wait" ], + "char": '\ud83d\ude8f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + vertical_traffic_light: { + keywords: [ "transportation", "driving" ], + "char": '\ud83d\udea6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + traffic_light: { + keywords: [ "transportation", "signal" ], + "char": '\ud83d\udea5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + checkered_flag: { + keywords: [ "contest", "finishline", "race", "gokart" ], + "char": '\ud83c\udfc1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ship: { + keywords: [ "transportation", "titanic", "deploy" ], + "char": '\ud83d\udea2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferris_wheel: { + keywords: [ "photo", "carnival", "londoneye" ], + "char": '\ud83c\udfa1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + roller_coaster: { + keywords: [ "carnival", "playground", "photo", "fun" ], + "char": '\ud83c\udfa2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + carousel_horse: { + keywords: [ "photo", "carnival" ], + "char": '\ud83c\udfa0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + building_construction: { + keywords: [ "wip", "working", "progress" ], + "char": '\ud83c\udfd7', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + foggy: { + keywords: [ "photo", "mountain" ], + "char": '\ud83c\udf01', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tokyo_tower: { + keywords: [ "photo", "japanese" ], + "char": '\ud83d\uddfc', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + factory: { + keywords: [ "building", "industry", "pollution", "smoke" ], + "char": '\ud83c\udfed', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fountain: { + keywords: [ "photo", "summer", "water", "fresh" ], + "char": '\u26f2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rice_scene: { + keywords: [ "photo", "japan", "asia", "tsukimi" ], + "char": '\ud83c\udf91', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain: { + keywords: [ "photo", "nature", "environment" ], + "char": '\u26f0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_snow: { + keywords: [ "photo", "nature", "environment", "winter", "cold" ], + "char": '\ud83c\udfd4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mount_fuji: { + keywords: [ "photo", "mountain", "nature", "japanese" ], + "char": '\ud83d\uddfb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + volcano: { + keywords: [ "photo", "nature", "disaster" ], + "char": '\ud83c\udf0b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japan: { + keywords: [ "nation", "country", "japanese", "asia" ], + "char": '\ud83d\uddfe', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + camping: { + keywords: [ "photo", "outdoors", "tent" ], + "char": '\ud83c\udfd5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tent: { + keywords: [ "photo", "camping", "outdoors" ], + "char": '\u26fa', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + national_park: { + keywords: [ "photo", "environment", "nature" ], + "char": '\ud83c\udfde', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorway: { + keywords: [ "road", "cupertino", "interstate", "highway" ], + "char": '\ud83d\udee3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_track: { + keywords: [ "train", "transportation" ], + "char": '\ud83d\udee4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise: { + keywords: [ "morning", "view", "vacation", "photo" ], + "char": '\ud83c\udf05', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise_over_mountains: { + keywords: [ "view", "vacation", "photo" ], + "char": '\ud83c\udf04', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert: { + keywords: [ "photo", "warm", "saharah" ], + "char": '\ud83c\udfdc', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + beach_umbrella: { + keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], + "char": '\ud83c\udfd6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert_island: { + keywords: [ "photo", "tropical", "mojito" ], + "char": '\ud83c\udfdd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunrise: { + keywords: [ "photo", "good morning", "dawn" ], + "char": '\ud83c\udf07', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunset: { + keywords: [ "photo", "evening", "sky", "buildings" ], + "char": '\ud83c\udf06', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + cityscape: { + keywords: [ "photo", "night life", "urban" ], + "char": '\ud83c\udfd9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + night_with_stars: { + keywords: [ "evening", "city", "downtown" ], + "char": '\ud83c\udf03', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bridge_at_night: { + keywords: [ "photo", "sanfrancisco" ], + "char": '\ud83c\udf09', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + milky_way: { + keywords: [ "photo", "space", "stars" ], + "char": '\ud83c\udf0c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stars: { + keywords: [ "night", "photo" ], + "char": '\ud83c\udf20', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sparkler: { + keywords: [ "stars", "night", "shine" ], + "char": '\ud83c\udf87', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fireworks: { + keywords: [ "photo", "festival", "carnival", "congratulations" ], + "char": '\ud83c\udf86', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rainbow: { + keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], + "char": '\ud83c\udf08', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + houses: { + keywords: [ "buildings", "photo" ], + "char": '\ud83c\udfd8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_castle: { + keywords: [ "building", "royalty", "history" ], + "char": '\ud83c\udff0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japanese_castle: { + keywords: [ "photo", "building" ], + "char": '\ud83c\udfef', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stadium: { + keywords: [ "photo", "place", "sports", "concert", "venue" ], + "char": '\ud83c\udfdf', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + statue_of_liberty: { + keywords: [ "american", "newyork" ], + "char": '\ud83d\uddfd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house: { + keywords: [ "building", "home" ], + "char": '\ud83c\udfe0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house_with_garden: { + keywords: [ "home", "plant", "nature" ], + "char": '\ud83c\udfe1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + derelict_house: { + keywords: [ "abandon", "evict", "broken", "building" ], + "char": '\ud83c\udfda', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + office: { + keywords: [ "building", "bureau", "work" ], + "char": '\ud83c\udfe2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + department_store: { + keywords: [ "building", "shopping", "mall" ], + "char": '\ud83c\udfec', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + post_office: { + keywords: [ "building", "envelope", "communication" ], + "char": '\ud83c\udfe3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_post_office: { + keywords: [ "building", "email" ], + "char": '\ud83c\udfe4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hospital: { + keywords: [ "building", "health", "surgery", "doctor" ], + "char": '\ud83c\udfe5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bank: { + keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], + "char": '\ud83c\udfe6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hotel: { + keywords: [ "building", "accomodation", "checkin" ], + "char": '\ud83c\udfe8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + convenience_store: { + keywords: [ "building", "shopping", "groceries" ], + "char": '\ud83c\udfea', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + school: { + keywords: [ "building", "student", "education", "learn", "teach" ], + "char": '\ud83c\udfeb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + love_hotel: { + keywords: [ "like", "affection", "dating" ], + "char": '\ud83c\udfe9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + wedding: { + keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], + "char": '\ud83d\udc92', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + classical_building: { + keywords: [ "art", "culture", "history" ], + "char": '\ud83c\udfdb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + church: { + keywords: [ "building", "religion", "christ" ], + "char": '\u26ea', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mosque: { + keywords: [ "islam", "worship", "minaret" ], + "char": '\ud83d\udd4c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + synagogue: { + keywords: [ "judaism", "worship", "temple", "jewish" ], + "char": '\ud83d\udd4d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kaaba: { + keywords: [ "mecca", "mosque", "islam" ], + "char": '\ud83d\udd4b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + shinto_shrine: { + keywords: [ "temple", "japan", "kyoto" ], + "char": '\u26e9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + watch: { + keywords: [ "time", "accessories" ], + "char": '\u231a', + fitzpatrick_scale: false, + category: "objects" + }, + iphone: { + keywords: [ "technology", "apple", "gadgets", "dial" ], + "char": '\ud83d\udcf1', + fitzpatrick_scale: false, + category: "objects" + }, + calling: { + keywords: [ "iphone", "incoming" ], + "char": '\ud83d\udcf2', + fitzpatrick_scale: false, + category: "objects" + }, + computer: { + keywords: [ "technology", "laptop", "screen", "display", "monitor" ], + "char": '\ud83d\udcbb', + fitzpatrick_scale: false, + category: "objects" + }, + keyboard: { + keywords: [ "technology", "computer", "type", "input", "text" ], + "char": '\u2328', + fitzpatrick_scale: false, + category: "objects" + }, + desktop_computer: { + keywords: [ "technology", "computing", "screen" ], + "char": '\ud83d\udda5', + fitzpatrick_scale: false, + category: "objects" + }, + printer: { + keywords: [ "paper", "ink" ], + "char": '\ud83d\udda8', + fitzpatrick_scale: false, + category: "objects" + }, + computer_mouse: { + keywords: [ "click" ], + "char": '\ud83d\uddb1', + fitzpatrick_scale: false, + category: "objects" + }, + trackball: { + keywords: [ "technology", "trackpad" ], + "char": '\ud83d\uddb2', + fitzpatrick_scale: false, + category: "objects" + }, + joystick: { + keywords: [ "game", "play" ], + "char": '\ud83d\udd79', + fitzpatrick_scale: false, + category: "objects" + }, + clamp: { + keywords: [ "tool" ], + "char": '\ud83d\udddc', + fitzpatrick_scale: false, + category: "objects" + }, + minidisc: { + keywords: [ "technology", "record", "data", "disk", "90s" ], + "char": '\ud83d\udcbd', + fitzpatrick_scale: false, + category: "objects" + }, + floppy_disk: { + keywords: [ "oldschool", "technology", "save", "90s", "80s" ], + "char": '\ud83d\udcbe', + fitzpatrick_scale: false, + category: "objects" + }, + cd: { + keywords: [ "technology", "dvd", "disk", "disc", "90s" ], + "char": '\ud83d\udcbf', + fitzpatrick_scale: false, + category: "objects" + }, + dvd: { + keywords: [ "cd", "disk", "disc" ], + "char": '\ud83d\udcc0', + fitzpatrick_scale: false, + category: "objects" + }, + vhs: { + keywords: [ "record", "video", "oldschool", "90s", "80s" ], + "char": '\ud83d\udcfc', + fitzpatrick_scale: false, + category: "objects" + }, + camera: { + keywords: [ "gadgets", "photography" ], + "char": '\ud83d\udcf7', + fitzpatrick_scale: false, + category: "objects" + }, + camera_flash: { + keywords: [ "photography", "gadgets" ], + "char": '\ud83d\udcf8', + fitzpatrick_scale: false, + category: "objects" + }, + video_camera: { + keywords: [ "film", "record" ], + "char": '\ud83d\udcf9', + fitzpatrick_scale: false, + category: "objects" + }, + movie_camera: { + keywords: [ "film", "record" ], + "char": '\ud83c\udfa5', + fitzpatrick_scale: false, + category: "objects" + }, + film_projector: { + keywords: [ "video", "tape", "record", "movie" ], + "char": '\ud83d\udcfd', + fitzpatrick_scale: false, + category: "objects" + }, + film_strip: { + keywords: [ "movie" ], + "char": '\ud83c\udf9e', + fitzpatrick_scale: false, + category: "objects" + }, + telephone_receiver: { + keywords: [ "technology", "communication", "dial" ], + "char": '\ud83d\udcde', + fitzpatrick_scale: false, + category: "objects" + }, + phone: { + keywords: [ "technology", "communication", "dial", "telephone" ], + "char": '\u260e\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + pager: { + keywords: [ "bbcall", "oldschool", "90s" ], + "char": '\ud83d\udcdf', + fitzpatrick_scale: false, + category: "objects" + }, + fax: { + keywords: [ "communication", "technology" ], + "char": '\ud83d\udce0', + fitzpatrick_scale: false, + category: "objects" + }, + tv: { + keywords: [ "technology", "program", "oldschool", "show", "television" ], + "char": '\ud83d\udcfa', + fitzpatrick_scale: false, + category: "objects" + }, + radio: { + keywords: [ "communication", "music", "podcast", "program" ], + "char": '\ud83d\udcfb', + fitzpatrick_scale: false, + category: "objects" + }, + studio_microphone: { + keywords: [ "sing", "recording", "artist", "talkshow" ], + "char": '\ud83c\udf99', + fitzpatrick_scale: false, + category: "objects" + }, + level_slider: { + keywords: [ "scale" ], + "char": '\ud83c\udf9a', + fitzpatrick_scale: false, + category: "objects" + }, + control_knobs: { + keywords: [ "dial" ], + "char": '\ud83c\udf9b', + fitzpatrick_scale: false, + category: "objects" + }, + compass: { + keywords: [ "magnetic", "navigation", "orienteering" ], + "char": '\ud83e\udded', + fitzpatrick_scale: false, + category: "objects" + }, + stopwatch: { + keywords: [ "time", "deadline" ], + "char": '\u23f1', + fitzpatrick_scale: false, + category: "objects" + }, + timer_clock: { + keywords: [ "alarm" ], + "char": '\u23f2', + fitzpatrick_scale: false, + category: "objects" + }, + alarm_clock: { + keywords: [ "time", "wake" ], + "char": '\u23f0', + fitzpatrick_scale: false, + category: "objects" + }, + mantelpiece_clock: { + keywords: [ "time" ], + "char": '\ud83d\udd70', + fitzpatrick_scale: false, + category: "objects" + }, + hourglass_flowing_sand: { + keywords: [ "oldschool", "time", "countdown" ], + "char": '\u23f3', + fitzpatrick_scale: false, + category: "objects" + }, + hourglass: { + keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], + "char": '\u231b', + fitzpatrick_scale: false, + category: "objects" + }, + satellite: { + keywords: [ "communication", "future", "radio", "space" ], + "char": '\ud83d\udce1', + fitzpatrick_scale: false, + category: "objects" + }, + battery: { + keywords: [ "power", "energy", "sustain" ], + "char": '\ud83d\udd0b', + fitzpatrick_scale: false, + category: "objects" + }, + electric_plug: { + keywords: [ "charger", "power" ], + "char": '\ud83d\udd0c', + fitzpatrick_scale: false, + category: "objects" + }, + bulb: { + keywords: [ "light", "electricity", "idea" ], + "char": '\ud83d\udca1', + fitzpatrick_scale: false, + category: "objects" + }, + flashlight: { + keywords: [ "dark", "camping", "sight", "night" ], + "char": '\ud83d\udd26', + fitzpatrick_scale: false, + category: "objects" + }, + candle: { + keywords: [ "fire", "wax" ], + "char": '\ud83d\udd6f', + fitzpatrick_scale: false, + category: "objects" + }, + fire_extinguisher: { + keywords: [ "quench" ], + "char": '\ud83e\uddef', + fitzpatrick_scale: false, + category: "objects" + }, + wastebasket: { + keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], + "char": '\ud83d\uddd1', + fitzpatrick_scale: false, + category: "objects" + }, + oil_drum: { + keywords: [ "barrell" ], + "char": '\ud83d\udee2', + fitzpatrick_scale: false, + category: "objects" + }, + money_with_wings: { + keywords: [ "dollar", "bills", "payment", "sale" ], + "char": '\ud83d\udcb8', + fitzpatrick_scale: false, + category: "objects" + }, + dollar: { + keywords: [ "money", "sales", "bill", "currency" ], + "char": '\ud83d\udcb5', + fitzpatrick_scale: false, + category: "objects" + }, + yen: { + keywords: [ "money", "sales", "japanese", "dollar", "currency" ], + "char": '\ud83d\udcb4', + fitzpatrick_scale: false, + category: "objects" + }, + euro: { + keywords: [ "money", "sales", "dollar", "currency" ], + "char": '\ud83d\udcb6', + fitzpatrick_scale: false, + category: "objects" + }, + pound: { + keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], + "char": '\ud83d\udcb7', + fitzpatrick_scale: false, + category: "objects" + }, + moneybag: { + keywords: [ "dollar", "payment", "coins", "sale" ], + "char": '\ud83d\udcb0', + fitzpatrick_scale: false, + category: "objects" + }, + credit_card: { + keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], + "char": '\ud83d\udcb3', + fitzpatrick_scale: false, + category: "objects" + }, + gem: { + keywords: [ "blue", "ruby", "diamond", "jewelry" ], + "char": '\ud83d\udc8e', + fitzpatrick_scale: false, + category: "objects" + }, + balance_scale: { + keywords: [ "law", "fairness", "weight" ], + "char": '\u2696', + fitzpatrick_scale: false, + category: "objects" + }, + toolbox: { + keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], + "char": '\ud83e\uddf0', + fitzpatrick_scale: false, + category: "objects" + }, + wrench: { + keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], + "char": '\ud83d\udd27', + fitzpatrick_scale: false, + category: "objects" + }, + hammer: { + keywords: [ "tools", "build", "create" ], + "char": '\ud83d\udd28', + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_pick: { + keywords: [ "tools", "build", "create" ], + "char": '\u2692', + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_wrench: { + keywords: [ "tools", "build", "create" ], + "char": '\ud83d\udee0', + fitzpatrick_scale: false, + category: "objects" + }, + pick: { + keywords: [ "tools", "dig" ], + "char": '\u26cf', + fitzpatrick_scale: false, + category: "objects" + }, + nut_and_bolt: { + keywords: [ "handy", "tools", "fix" ], + "char": '\ud83d\udd29', + fitzpatrick_scale: false, + category: "objects" + }, + gear: { + keywords: [ "cog" ], + "char": '\u2699', + fitzpatrick_scale: false, + category: "objects" + }, + brick: { + keywords: [ "bricks" ], + "char": '\ud83e\uddf1', + fitzpatrick_scale: false, + category: "objects" + }, + chains: { + keywords: [ "lock", "arrest" ], + "char": '\u26d3', + fitzpatrick_scale: false, + category: "objects" + }, + magnet: { + keywords: [ "attraction", "magnetic" ], + "char": '\ud83e\uddf2', + fitzpatrick_scale: false, + category: "objects" + }, + gun: { + keywords: [ "violence", "weapon", "pistol", "revolver" ], + "char": '\ud83d\udd2b', + fitzpatrick_scale: false, + category: "objects" + }, + bomb: { + keywords: [ "boom", "explode", "explosion", "terrorism" ], + "char": '\ud83d\udca3', + fitzpatrick_scale: false, + category: "objects" + }, + firecracker: { + keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], + "char": '\ud83e\udde8', + fitzpatrick_scale: false, + category: "objects" + }, + hocho: { + keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], + "char": '\ud83d\udd2a', + fitzpatrick_scale: false, + category: "objects" + }, + dagger: { + keywords: [ "weapon" ], + "char": '\ud83d\udde1', + fitzpatrick_scale: false, + category: "objects" + }, + crossed_swords: { + keywords: [ "weapon" ], + "char": '\u2694', + fitzpatrick_scale: false, + category: "objects" + }, + shield: { + keywords: [ "protection", "security" ], + "char": '\ud83d\udee1', + fitzpatrick_scale: false, + category: "objects" + }, + smoking: { + keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], + "char": '\ud83d\udeac', + fitzpatrick_scale: false, + category: "objects" + }, + skull_and_crossbones: { + keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], + "char": '\u2620', + fitzpatrick_scale: false, + category: "objects" + }, + coffin: { + keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], + "char": '\u26b0', + fitzpatrick_scale: false, + category: "objects" + }, + funeral_urn: { + keywords: [ "dead", "die", "death", "rip", "ashes" ], + "char": '\u26b1', + fitzpatrick_scale: false, + category: "objects" + }, + amphora: { + keywords: [ "vase", "jar" ], + "char": '\ud83c\udffa', + fitzpatrick_scale: false, + category: "objects" + }, + crystal_ball: { + keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], + "char": '\ud83d\udd2e', + fitzpatrick_scale: false, + category: "objects" + }, + prayer_beads: { + keywords: [ "dhikr", "religious" ], + "char": '\ud83d\udcff', + fitzpatrick_scale: false, + category: "objects" + }, + nazar_amulet: { + keywords: [ "bead", "charm" ], + "char": '\ud83e\uddff', + fitzpatrick_scale: false, + category: "objects" + }, + barber: { + keywords: [ "hair", "salon", "style" ], + "char": '\ud83d\udc88', + fitzpatrick_scale: false, + category: "objects" + }, + alembic: { + keywords: [ "distilling", "science", "experiment", "chemistry" ], + "char": '\u2697', + fitzpatrick_scale: false, + category: "objects" + }, + telescope: { + keywords: [ "stars", "space", "zoom", "science", "astronomy" ], + "char": '\ud83d\udd2d', + fitzpatrick_scale: false, + category: "objects" + }, + microscope: { + keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], + "char": '\ud83d\udd2c', + fitzpatrick_scale: false, + category: "objects" + }, + hole: { + keywords: [ "embarrassing" ], + "char": '\ud83d\udd73', + fitzpatrick_scale: false, + category: "objects" + }, + pill: { + keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], + "char": '\ud83d\udc8a', + fitzpatrick_scale: false, + category: "objects" + }, + syringe: { + keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], + "char": '\ud83d\udc89', + fitzpatrick_scale: false, + category: "objects" + }, + dna: { + keywords: [ "biologist", "genetics", "life" ], + "char": '\ud83e\uddec', + fitzpatrick_scale: false, + category: "objects" + }, + microbe: { + keywords: [ "amoeba", "bacteria", "germs" ], + "char": '\ud83e\udda0', + fitzpatrick_scale: false, + category: "objects" + }, + petri_dish: { + keywords: [ "bacteria", "biology", "culture", "lab" ], + "char": '\ud83e\uddeb', + fitzpatrick_scale: false, + category: "objects" + }, + test_tube: { + keywords: [ "chemistry", "experiment", "lab", "science" ], + "char": '\ud83e\uddea', + fitzpatrick_scale: false, + category: "objects" + }, + thermometer: { + keywords: [ "weather", "temperature", "hot", "cold" ], + "char": '\ud83c\udf21', + fitzpatrick_scale: false, + category: "objects" + }, + broom: { + keywords: [ "cleaning", "sweeping", "witch" ], + "char": '\ud83e\uddf9', + fitzpatrick_scale: false, + category: "objects" + }, + basket: { + keywords: [ "laundry" ], + "char": '\ud83e\uddfa', + fitzpatrick_scale: false, + category: "objects" + }, + toilet_paper: { + keywords: [ "roll" ], + "char": '\ud83e\uddfb', + fitzpatrick_scale: false, + category: "objects" + }, + label: { + keywords: [ "sale", "tag" ], + "char": '\ud83c\udff7', + fitzpatrick_scale: false, + category: "objects" + }, + bookmark: { + keywords: [ "favorite", "label", "save" ], + "char": '\ud83d\udd16', + fitzpatrick_scale: false, + category: "objects" + }, + toilet: { + keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], + "char": '\ud83d\udebd', + fitzpatrick_scale: false, + category: "objects" + }, + shower: { + keywords: [ "clean", "water", "bathroom" ], + "char": '\ud83d\udebf', + fitzpatrick_scale: false, + category: "objects" + }, + bathtub: { + keywords: [ "clean", "shower", "bathroom" ], + "char": '\ud83d\udec1', + fitzpatrick_scale: false, + category: "objects" + }, + soap: { + keywords: [ "bar", "bathing", "cleaning", "lather" ], + "char": '\ud83e\uddfc', + fitzpatrick_scale: false, + category: "objects" + }, + sponge: { + keywords: [ "absorbing", "cleaning", "porous" ], + "char": '\ud83e\uddfd', + fitzpatrick_scale: false, + category: "objects" + }, + lotion_bottle: { + keywords: [ "moisturizer", "sunscreen" ], + "char": '\ud83e\uddf4', + fitzpatrick_scale: false, + category: "objects" + }, + key: { + keywords: [ "lock", "door", "password" ], + "char": '\ud83d\udd11', + fitzpatrick_scale: false, + category: "objects" + }, + old_key: { + keywords: [ "lock", "door", "password" ], + "char": '\ud83d\udddd', + fitzpatrick_scale: false, + category: "objects" + }, + couch_and_lamp: { + keywords: [ "read", "chill" ], + "char": '\ud83d\udecb', + fitzpatrick_scale: false, + category: "objects" + }, + sleeping_bed: { + keywords: [ "bed", "rest" ], + "char": '\ud83d\udecc', + fitzpatrick_scale: true, + category: "objects" + }, + bed: { + keywords: [ "sleep", "rest" ], + "char": '\ud83d\udecf', + fitzpatrick_scale: false, + category: "objects" + }, + door: { + keywords: [ "house", "entry", "exit" ], + "char": '\ud83d\udeaa', + fitzpatrick_scale: false, + category: "objects" + }, + bellhop_bell: { + keywords: [ "service" ], + "char": '\ud83d\udece', + fitzpatrick_scale: false, + category: "objects" + }, + teddy_bear: { + keywords: [ "plush", "stuffed" ], + "char": '\ud83e\uddf8', + fitzpatrick_scale: false, + category: "objects" + }, + framed_picture: { + keywords: [ "photography" ], + "char": '\ud83d\uddbc', + fitzpatrick_scale: false, + category: "objects" + }, + world_map: { + keywords: [ "location", "direction" ], + "char": '\ud83d\uddfa', + fitzpatrick_scale: false, + category: "objects" + }, + parasol_on_ground: { + keywords: [ "weather", "summer" ], + "char": '\u26f1', + fitzpatrick_scale: false, + category: "objects" + }, + moyai: { + keywords: [ "rock", "easter island", "moai" ], + "char": '\ud83d\uddff', + fitzpatrick_scale: false, + category: "objects" + }, + shopping: { + keywords: [ "mall", "buy", "purchase" ], + "char": '\ud83d\udecd', + fitzpatrick_scale: false, + category: "objects" + }, + shopping_cart: { + keywords: [ "trolley" ], + "char": '\ud83d\uded2', + fitzpatrick_scale: false, + category: "objects" + }, + balloon: { + keywords: [ "party", "celebration", "birthday", "circus" ], + "char": '\ud83c\udf88', + fitzpatrick_scale: false, + category: "objects" + }, + flags: { + keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], + "char": '\ud83c\udf8f', + fitzpatrick_scale: false, + category: "objects" + }, + ribbon: { + keywords: [ "decoration", "pink", "girl", "bowtie" ], + "char": '\ud83c\udf80', + fitzpatrick_scale: false, + category: "objects" + }, + gift: { + keywords: [ "present", "birthday", "christmas", "xmas" ], + "char": '\ud83c\udf81', + fitzpatrick_scale: false, + category: "objects" + }, + confetti_ball: { + keywords: [ "festival", "party", "birthday", "circus" ], + "char": '\ud83c\udf8a', + fitzpatrick_scale: false, + category: "objects" + }, + tada: { + keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], + "char": '\ud83c\udf89', + fitzpatrick_scale: false, + category: "objects" + }, + dolls: { + keywords: [ "japanese", "toy", "kimono" ], + "char": '\ud83c\udf8e', + fitzpatrick_scale: false, + category: "objects" + }, + wind_chime: { + keywords: [ "nature", "ding", "spring", "bell" ], + "char": '\ud83c\udf90', + fitzpatrick_scale: false, + category: "objects" + }, + crossed_flags: { + keywords: [ "japanese", "nation", "country", "border" ], + "char": '\ud83c\udf8c', + fitzpatrick_scale: false, + category: "objects" + }, + izakaya_lantern: { + keywords: [ "light", "paper", "halloween", "spooky" ], + "char": '\ud83c\udfee', + fitzpatrick_scale: false, + category: "objects" + }, + red_envelope: { + keywords: [ "gift" ], + "char": '\ud83e\udde7', + fitzpatrick_scale: false, + category: "objects" + }, + email: { + keywords: [ "letter", "postal", "inbox", "communication" ], + "char": '\u2709\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + envelope_with_arrow: { + keywords: [ "email", "communication" ], + "char": '\ud83d\udce9', + fitzpatrick_scale: false, + category: "objects" + }, + incoming_envelope: { + keywords: [ "email", "inbox" ], + "char": '\ud83d\udce8', + fitzpatrick_scale: false, + category: "objects" + }, + "e-mail": { + keywords: [ "communication", "inbox" ], + "char": '\ud83d\udce7', + fitzpatrick_scale: false, + category: "objects" + }, + love_letter: { + keywords: [ "email", "like", "affection", "envelope", "valentines" ], + "char": '\ud83d\udc8c', + fitzpatrick_scale: false, + category: "objects" + }, + postbox: { + keywords: [ "email", "letter", "envelope" ], + "char": '\ud83d\udcee', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_closed: { + keywords: [ "email", "communication", "inbox" ], + "char": '\ud83d\udcea', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox: { + keywords: [ "email", "inbox", "communication" ], + "char": '\ud83d\udceb', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_mail: { + keywords: [ "email", "inbox", "communication" ], + "char": '\ud83d\udcec', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_no_mail: { + keywords: [ "email", "inbox" ], + "char": '\ud83d\udced', + fitzpatrick_scale: false, + category: "objects" + }, + "package": { + keywords: [ "mail", "gift", "cardboard", "box", "moving" ], + "char": '\ud83d\udce6', + fitzpatrick_scale: false, + category: "objects" + }, + postal_horn: { + keywords: [ "instrument", "music" ], + "char": '\ud83d\udcef', + fitzpatrick_scale: false, + category: "objects" + }, + inbox_tray: { + keywords: [ "email", "documents" ], + "char": '\ud83d\udce5', + fitzpatrick_scale: false, + category: "objects" + }, + outbox_tray: { + keywords: [ "inbox", "email" ], + "char": '\ud83d\udce4', + fitzpatrick_scale: false, + category: "objects" + }, + scroll: { + keywords: [ "documents", "ancient", "history", "paper" ], + "char": '\ud83d\udcdc', + fitzpatrick_scale: false, + category: "objects" + }, + page_with_curl: { + keywords: [ "documents", "office", "paper" ], + "char": '\ud83d\udcc3', + fitzpatrick_scale: false, + category: "objects" + }, + bookmark_tabs: { + keywords: [ "favorite", "save", "order", "tidy" ], + "char": '\ud83d\udcd1', + fitzpatrick_scale: false, + category: "objects" + }, + receipt: { + keywords: [ "accounting", "expenses" ], + "char": '\ud83e\uddfe', + fitzpatrick_scale: false, + category: "objects" + }, + bar_chart: { + keywords: [ "graph", "presentation", "stats" ], + "char": '\ud83d\udcca', + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_upwards_trend: { + keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], + "char": '\ud83d\udcc8', + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_downwards_trend: { + keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], + "char": '\ud83d\udcc9', + fitzpatrick_scale: false, + category: "objects" + }, + page_facing_up: { + keywords: [ "documents", "office", "paper", "information" ], + "char": '\ud83d\udcc4', + fitzpatrick_scale: false, + category: "objects" + }, + date: { + keywords: [ "calendar", "schedule" ], + "char": '\ud83d\udcc5', + fitzpatrick_scale: false, + category: "objects" + }, + calendar: { + keywords: [ "schedule", "date", "planning" ], + "char": '\ud83d\udcc6', + fitzpatrick_scale: false, + category: "objects" + }, + spiral_calendar: { + keywords: [ "date", "schedule", "planning" ], + "char": '\ud83d\uddd3', + fitzpatrick_scale: false, + category: "objects" + }, + card_index: { + keywords: [ "business", "stationery" ], + "char": '\ud83d\udcc7', + fitzpatrick_scale: false, + category: "objects" + }, + card_file_box: { + keywords: [ "business", "stationery" ], + "char": '\ud83d\uddc3', + fitzpatrick_scale: false, + category: "objects" + }, + ballot_box: { + keywords: [ "election", "vote" ], + "char": '\ud83d\uddf3', + fitzpatrick_scale: false, + category: "objects" + }, + file_cabinet: { + keywords: [ "filing", "organizing" ], + "char": '\ud83d\uddc4', + fitzpatrick_scale: false, + category: "objects" + }, + clipboard: { + keywords: [ "stationery", "documents" ], + "char": '\ud83d\udccb', + fitzpatrick_scale: false, + category: "objects" + }, + spiral_notepad: { + keywords: [ "memo", "stationery" ], + "char": '\ud83d\uddd2', + fitzpatrick_scale: false, + category: "objects" + }, + file_folder: { + keywords: [ "documents", "business", "office" ], + "char": '\ud83d\udcc1', + fitzpatrick_scale: false, + category: "objects" + }, + open_file_folder: { + keywords: [ "documents", "load" ], + "char": '\ud83d\udcc2', + fitzpatrick_scale: false, + category: "objects" + }, + card_index_dividers: { + keywords: [ "organizing", "business", "stationery" ], + "char": '\ud83d\uddc2', + fitzpatrick_scale: false, + category: "objects" + }, + newspaper_roll: { + keywords: [ "press", "headline" ], + "char": '\ud83d\uddde', + fitzpatrick_scale: false, + category: "objects" + }, + newspaper: { + keywords: [ "press", "headline" ], + "char": '\ud83d\udcf0', + fitzpatrick_scale: false, + category: "objects" + }, + notebook: { + keywords: [ "stationery", "record", "notes", "paper", "study" ], + "char": '\ud83d\udcd3', + fitzpatrick_scale: false, + category: "objects" + }, + closed_book: { + keywords: [ "read", "library", "knowledge", "textbook", "learn" ], + "char": '\ud83d\udcd5', + fitzpatrick_scale: false, + category: "objects" + }, + green_book: { + keywords: [ "read", "library", "knowledge", "study" ], + "char": '\ud83d\udcd7', + fitzpatrick_scale: false, + category: "objects" + }, + blue_book: { + keywords: [ "read", "library", "knowledge", "learn", "study" ], + "char": '\ud83d\udcd8', + fitzpatrick_scale: false, + category: "objects" + }, + orange_book: { + keywords: [ "read", "library", "knowledge", "textbook", "study" ], + "char": '\ud83d\udcd9', + fitzpatrick_scale: false, + category: "objects" + }, + notebook_with_decorative_cover: { + keywords: [ "classroom", "notes", "record", "paper", "study" ], + "char": '\ud83d\udcd4', + fitzpatrick_scale: false, + category: "objects" + }, + ledger: { + keywords: [ "notes", "paper" ], + "char": '\ud83d\udcd2', + fitzpatrick_scale: false, + category: "objects" + }, + books: { + keywords: [ "literature", "library", "study" ], + "char": '\ud83d\udcda', + fitzpatrick_scale: false, + category: "objects" + }, + open_book: { + keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], + "char": '\ud83d\udcd6', + fitzpatrick_scale: false, + category: "objects" + }, + safety_pin: { + keywords: [ "diaper" ], + "char": '\ud83e\uddf7', + fitzpatrick_scale: false, + category: "objects" + }, + link: { + keywords: [ "rings", "url" ], + "char": '\ud83d\udd17', + fitzpatrick_scale: false, + category: "objects" + }, + paperclip: { + keywords: [ "documents", "stationery" ], + "char": '\ud83d\udcce', + fitzpatrick_scale: false, + category: "objects" + }, + paperclips: { + keywords: [ "documents", "stationery" ], + "char": '\ud83d\udd87', + fitzpatrick_scale: false, + category: "objects" + }, + scissors: { + keywords: [ "stationery", "cut" ], + "char": '\u2702\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + triangular_ruler: { + keywords: [ "stationery", "math", "architect", "sketch" ], + "char": '\ud83d\udcd0', + fitzpatrick_scale: false, + category: "objects" + }, + straight_ruler: { + keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], + "char": '\ud83d\udccf', + fitzpatrick_scale: false, + category: "objects" + }, + abacus: { + keywords: [ "calculation" ], + "char": '\ud83e\uddee', + fitzpatrick_scale: false, + category: "objects" + }, + pushpin: { + keywords: [ "stationery", "mark", "here" ], + "char": '\ud83d\udccc', + fitzpatrick_scale: false, + category: "objects" + }, + round_pushpin: { + keywords: [ "stationery", "location", "map", "here" ], + "char": '\ud83d\udccd', + fitzpatrick_scale: false, + category: "objects" + }, + triangular_flag_on_post: { + keywords: [ "mark", "milestone", "place" ], + "char": '\ud83d\udea9', + fitzpatrick_scale: false, + category: "objects" + }, + white_flag: { + keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], + "char": '\ud83c\udff3', + fitzpatrick_scale: false, + category: "objects" + }, + black_flag: { + keywords: [ "pirate" ], + "char": '\ud83c\udff4', + fitzpatrick_scale: false, + category: "objects" + }, + rainbow_flag: { + keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], + "char": '\ud83c\udff3\ufe0f\u200d\ud83c\udf08', + fitzpatrick_scale: false, + category: "objects" + }, + closed_lock_with_key: { + keywords: [ "security", "privacy" ], + "char": '\ud83d\udd10', + fitzpatrick_scale: false, + category: "objects" + }, + lock: { + keywords: [ "security", "password", "padlock" ], + "char": '\ud83d\udd12', + fitzpatrick_scale: false, + category: "objects" + }, + unlock: { + keywords: [ "privacy", "security" ], + "char": '\ud83d\udd13', + fitzpatrick_scale: false, + category: "objects" + }, + lock_with_ink_pen: { + keywords: [ "security", "secret" ], + "char": '\ud83d\udd0f', + fitzpatrick_scale: false, + category: "objects" + }, + pen: { + keywords: [ "stationery", "writing", "write" ], + "char": '\ud83d\udd8a', + fitzpatrick_scale: false, + category: "objects" + }, + fountain_pen: { + keywords: [ "stationery", "writing", "write" ], + "char": '\ud83d\udd8b', + fitzpatrick_scale: false, + category: "objects" + }, + black_nib: { + keywords: [ "pen", "stationery", "writing", "write" ], + "char": '\u2712\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + memo: { + keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], + "char": '\ud83d\udcdd', + fitzpatrick_scale: false, + category: "objects" + }, + pencil2: { + keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], + "char": '\u270f\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + crayon: { + keywords: [ "drawing", "creativity" ], + "char": '\ud83d\udd8d', + fitzpatrick_scale: false, + category: "objects" + }, + paintbrush: { + keywords: [ "drawing", "creativity", "art" ], + "char": '\ud83d\udd8c', + fitzpatrick_scale: false, + category: "objects" + }, + mag: { + keywords: [ "search", "zoom", "find", "detective" ], + "char": '\ud83d\udd0d', + fitzpatrick_scale: false, + category: "objects" + }, + mag_right: { + keywords: [ "search", "zoom", "find", "detective" ], + "char": '\ud83d\udd0e', + fitzpatrick_scale: false, + category: "objects" + }, + heart: { + keywords: [ "love", "like", "valentines" ], + "char": '\u2764\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + orange_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83e\udde1', + fitzpatrick_scale: false, + category: "symbols" + }, + yellow_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc9b', + fitzpatrick_scale: false, + category: "symbols" + }, + green_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc9a', + fitzpatrick_scale: false, + category: "symbols" + }, + blue_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc99', + fitzpatrick_scale: false, + category: "symbols" + }, + purple_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc9c', + fitzpatrick_scale: false, + category: "symbols" + }, + black_heart: { + keywords: [ "evil" ], + "char": '\ud83d\udda4', + fitzpatrick_scale: false, + category: "symbols" + }, + broken_heart: { + keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], + "char": '\ud83d\udc94', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_heart_exclamation: { + keywords: [ "decoration", "love" ], + "char": '\u2763', + fitzpatrick_scale: false, + category: "symbols" + }, + two_hearts: { + keywords: [ "love", "like", "affection", "valentines", "heart" ], + "char": '\ud83d\udc95', + fitzpatrick_scale: false, + category: "symbols" + }, + revolving_hearts: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc9e', + fitzpatrick_scale: false, + category: "symbols" + }, + heartbeat: { + keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], + "char": '\ud83d\udc93', + fitzpatrick_scale: false, + category: "symbols" + }, + heartpulse: { + keywords: [ "like", "love", "affection", "valentines", "pink" ], + "char": '\ud83d\udc97', + fitzpatrick_scale: false, + category: "symbols" + }, + sparkling_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc96', + fitzpatrick_scale: false, + category: "symbols" + }, + cupid: { + keywords: [ "love", "like", "heart", "affection", "valentines" ], + "char": '\ud83d\udc98', + fitzpatrick_scale: false, + category: "symbols" + }, + gift_heart: { + keywords: [ "love", "valentines" ], + "char": '\ud83d\udc9d', + fitzpatrick_scale: false, + category: "symbols" + }, + heart_decoration: { + keywords: [ "purple-square", "love", "like" ], + "char": '\ud83d\udc9f', + fitzpatrick_scale: false, + category: "symbols" + }, + peace_symbol: { + keywords: [ "hippie" ], + "char": '\u262e', + fitzpatrick_scale: false, + category: "symbols" + }, + latin_cross: { + keywords: [ "christianity" ], + "char": '\u271d', + fitzpatrick_scale: false, + category: "symbols" + }, + star_and_crescent: { + keywords: [ "islam" ], + "char": '\u262a', + fitzpatrick_scale: false, + category: "symbols" + }, + om: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + "char": '\ud83d\udd49', + fitzpatrick_scale: false, + category: "symbols" + }, + wheel_of_dharma: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + "char": '\u2638', + fitzpatrick_scale: false, + category: "symbols" + }, + star_of_david: { + keywords: [ "judaism" ], + "char": '\u2721', + fitzpatrick_scale: false, + category: "symbols" + }, + six_pointed_star: { + keywords: [ "purple-square", "religion", "jewish", "hexagram" ], + "char": '\ud83d\udd2f', + fitzpatrick_scale: false, + category: "symbols" + }, + menorah: { + keywords: [ "hanukkah", "candles", "jewish" ], + "char": '\ud83d\udd4e', + fitzpatrick_scale: false, + category: "symbols" + }, + yin_yang: { + keywords: [ "balance" ], + "char": '\u262f', + fitzpatrick_scale: false, + category: "symbols" + }, + orthodox_cross: { + keywords: [ "suppedaneum", "religion" ], + "char": '\u2626', + fitzpatrick_scale: false, + category: "symbols" + }, + place_of_worship: { + keywords: [ "religion", "church", "temple", "prayer" ], + "char": '\ud83d\uded0', + fitzpatrick_scale: false, + category: "symbols" + }, + ophiuchus: { + keywords: [ "sign", "purple-square", "constellation", "astrology" ], + "char": '\u26ce', + fitzpatrick_scale: false, + category: "symbols" + }, + aries: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": '\u2648', + fitzpatrick_scale: false, + category: "symbols" + }, + taurus: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + "char": '\u2649', + fitzpatrick_scale: false, + category: "symbols" + }, + gemini: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u264a', + fitzpatrick_scale: false, + category: "symbols" + }, + cancer: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u264b', + fitzpatrick_scale: false, + category: "symbols" + }, + leo: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": '\u264c', + fitzpatrick_scale: false, + category: "symbols" + }, + virgo: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u264d', + fitzpatrick_scale: false, + category: "symbols" + }, + libra: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": '\u264e', + fitzpatrick_scale: false, + category: "symbols" + }, + scorpius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], + "char": '\u264f', + fitzpatrick_scale: false, + category: "symbols" + }, + sagittarius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u2650', + fitzpatrick_scale: false, + category: "symbols" + }, + capricorn: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u2651', + fitzpatrick_scale: false, + category: "symbols" + }, + aquarius: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": '\u2652', + fitzpatrick_scale: false, + category: "symbols" + }, + pisces: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + "char": '\u2653', + fitzpatrick_scale: false, + category: "symbols" + }, + id: { + keywords: [ "purple-square", "words" ], + "char": '\ud83c\udd94', + fitzpatrick_scale: false, + category: "symbols" + }, + atom_symbol: { + keywords: [ "science", "physics", "chemistry" ], + "char": '\u269b', + fitzpatrick_scale: false, + category: "symbols" + }, + u7a7a: { + keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], + "char": '\ud83c\ude33', + fitzpatrick_scale: false, + category: "symbols" + }, + u5272: { + keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], + "char": '\ud83c\ude39', + fitzpatrick_scale: false, + category: "symbols" + }, + radioactive: { + keywords: [ "nuclear", "danger" ], + "char": '\u2622', + fitzpatrick_scale: false, + category: "symbols" + }, + biohazard: { + keywords: [ "danger" ], + "char": '\u2623', + fitzpatrick_scale: false, + category: "symbols" + }, + mobile_phone_off: { + keywords: [ "mute", "orange-square", "silence", "quiet" ], + "char": '\ud83d\udcf4', + fitzpatrick_scale: false, + category: "symbols" + }, + vibration_mode: { + keywords: [ "orange-square", "phone" ], + "char": '\ud83d\udcf3', + fitzpatrick_scale: false, + category: "symbols" + }, + u6709: { + keywords: [ "orange-square", "chinese", "have", "kanji" ], + "char": '\ud83c\ude36', + fitzpatrick_scale: false, + category: "symbols" + }, + u7121: { + keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], + "char": '\ud83c\ude1a', + fitzpatrick_scale: false, + category: "symbols" + }, + u7533: { + keywords: [ "chinese", "japanese", "kanji", "orange-square" ], + "char": '\ud83c\ude38', + fitzpatrick_scale: false, + category: "symbols" + }, + u55b6: { + keywords: [ "japanese", "opening hours", "orange-square" ], + "char": '\ud83c\ude3a', + fitzpatrick_scale: false, + category: "symbols" + }, + u6708: { + keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], + "char": '\ud83c\ude37\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + eight_pointed_black_star: { + keywords: [ "orange-square", "shape", "polygon" ], + "char": '\u2734\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + vs: { + keywords: [ "words", "orange-square" ], + "char": '\ud83c\udd9a', + fitzpatrick_scale: false, + category: "symbols" + }, + accept: { + keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], + "char": '\ud83c\ude51', + fitzpatrick_scale: false, + category: "symbols" + }, + white_flower: { + keywords: [ "japanese", "spring" ], + "char": '\ud83d\udcae', + fitzpatrick_scale: false, + category: "symbols" + }, + ideograph_advantage: { + keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], + "char": '\ud83c\ude50', + fitzpatrick_scale: false, + category: "symbols" + }, + secret: { + keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], + "char": '\u3299\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + congratulations: { + keywords: [ "chinese", "kanji", "japanese", "red-circle" ], + "char": '\u3297\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + u5408: { + keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], + "char": '\ud83c\ude34', + fitzpatrick_scale: false, + category: "symbols" + }, + u6e80: { + keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], + "char": '\ud83c\ude35', + fitzpatrick_scale: false, + category: "symbols" + }, + u7981: { + keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], + "char": '\ud83c\ude32', + fitzpatrick_scale: false, + category: "symbols" + }, + a: { + keywords: [ "red-square", "alphabet", "letter" ], + "char": '\ud83c\udd70\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + b: { + keywords: [ "red-square", "alphabet", "letter" ], + "char": '\ud83c\udd71\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + ab: { + keywords: [ "red-square", "alphabet" ], + "char": '\ud83c\udd8e', + fitzpatrick_scale: false, + category: "symbols" + }, + cl: { + keywords: [ "alphabet", "words", "red-square" ], + "char": '\ud83c\udd91', + fitzpatrick_scale: false, + category: "symbols" + }, + o2: { + keywords: [ "alphabet", "red-square", "letter" ], + "char": '\ud83c\udd7e\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + sos: { + keywords: [ "help", "red-square", "words", "emergency", "911" ], + "char": '\ud83c\udd98', + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry: { + keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], + "char": '\u26d4', + fitzpatrick_scale: false, + category: "symbols" + }, + name_badge: { + keywords: [ "fire", "forbid" ], + "char": '\ud83d\udcdb', + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry_sign: { + keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], + "char": '\ud83d\udeab', + fitzpatrick_scale: false, + category: "symbols" + }, + x: { + keywords: [ "no", "delete", "remove", "cancel", "red" ], + "char": '\u274c', + fitzpatrick_scale: false, + category: "symbols" + }, + o: { + keywords: [ "circle", "round" ], + "char": '\u2b55', + fitzpatrick_scale: false, + category: "symbols" + }, + stop_sign: { + keywords: [ "stop" ], + "char": '\ud83d\uded1', + fitzpatrick_scale: false, + category: "symbols" + }, + anger: { + keywords: [ "angry", "mad" ], + "char": '\ud83d\udca2', + fitzpatrick_scale: false, + category: "symbols" + }, + hotsprings: { + keywords: [ "bath", "warm", "relax" ], + "char": '\u2668\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + no_pedestrians: { + keywords: [ "rules", "crossing", "walking", "circle" ], + "char": '\ud83d\udeb7', + fitzpatrick_scale: false, + category: "symbols" + }, + do_not_litter: { + keywords: [ "trash", "bin", "garbage", "circle" ], + "char": '\ud83d\udeaf', + fitzpatrick_scale: false, + category: "symbols" + }, + no_bicycles: { + keywords: [ "cyclist", "prohibited", "circle" ], + "char": '\ud83d\udeb3', + fitzpatrick_scale: false, + category: "symbols" + }, + "non-potable_water": { + keywords: [ "drink", "faucet", "tap", "circle" ], + "char": '\ud83d\udeb1', + fitzpatrick_scale: false, + category: "symbols" + }, + underage: { + keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], + "char": '\ud83d\udd1e', + fitzpatrick_scale: false, + category: "symbols" + }, + no_mobile_phones: { + keywords: [ "iphone", "mute", "circle" ], + "char": '\ud83d\udcf5', + fitzpatrick_scale: false, + category: "symbols" + }, + exclamation: { + keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], + "char": '\u2757', + fitzpatrick_scale: false, + category: "symbols" + }, + grey_exclamation: { + keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], + "char": '\u2755', + fitzpatrick_scale: false, + category: "symbols" + }, + question: { + keywords: [ "doubt", "confused" ], + "char": '\u2753', + fitzpatrick_scale: false, + category: "symbols" + }, + grey_question: { + keywords: [ "doubts", "gray", "huh", "confused" ], + "char": '\u2754', + fitzpatrick_scale: false, + category: "symbols" + }, + bangbang: { + keywords: [ "exclamation", "surprise" ], + "char": '\u203c\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + interrobang: { + keywords: [ "wat", "punctuation", "surprise" ], + "char": '\u2049\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + low_brightness: { + keywords: [ "sun", "afternoon", "warm", "summer" ], + "char": '\ud83d\udd05', + fitzpatrick_scale: false, + category: "symbols" + }, + high_brightness: { + keywords: [ "sun", "light" ], + "char": '\ud83d\udd06', + fitzpatrick_scale: false, + category: "symbols" + }, + trident: { + keywords: [ "weapon", "spear" ], + "char": '\ud83d\udd31', + fitzpatrick_scale: false, + category: "symbols" + }, + fleur_de_lis: { + keywords: [ "decorative", "scout" ], + "char": '\u269c', + fitzpatrick_scale: false, + category: "symbols" + }, + part_alternation_mark: { + keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], + "char": '\u303d\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + warning: { + keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], + "char": '\u26a0\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + children_crossing: { + keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], + "char": '\ud83d\udeb8', + fitzpatrick_scale: false, + category: "symbols" + }, + beginner: { + keywords: [ "badge", "shield" ], + "char": '\ud83d\udd30', + fitzpatrick_scale: false, + category: "symbols" + }, + recycle: { + keywords: [ "arrow", "environment", "garbage", "trash" ], + "char": '\u267b\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + u6307: { + keywords: [ "chinese", "point", "green-square", "kanji" ], + "char": '\ud83c\ude2f', + fitzpatrick_scale: false, + category: "symbols" + }, + chart: { + keywords: [ "green-square", "graph", "presentation", "stats" ], + "char": '\ud83d\udcb9', + fitzpatrick_scale: false, + category: "symbols" + }, + sparkle: { + keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], + "char": '\u2747\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + eight_spoked_asterisk: { + keywords: [ "star", "sparkle", "green-square" ], + "char": '\u2733\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + negative_squared_cross_mark: { + keywords: [ "x", "green-square", "no", "deny" ], + "char": '\u274e', + fitzpatrick_scale: false, + category: "symbols" + }, + white_check_mark: { + keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], + "char": '\u2705', + fitzpatrick_scale: false, + category: "symbols" + }, + diamond_shape_with_a_dot_inside: { + keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], + "char": '\ud83d\udca0', + fitzpatrick_scale: false, + category: "symbols" + }, + cyclone: { + keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], + "char": '\ud83c\udf00', + fitzpatrick_scale: false, + category: "symbols" + }, + loop: { + keywords: [ "tape", "cassette" ], + "char": '\u27bf', + fitzpatrick_scale: false, + category: "symbols" + }, + globe_with_meridians: { + keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], + "char": '\ud83c\udf10', + fitzpatrick_scale: false, + category: "symbols" + }, + m: { + keywords: [ "alphabet", "blue-circle", "letter" ], + "char": '\u24c2\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + atm: { + keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], + "char": '\ud83c\udfe7', + fitzpatrick_scale: false, + category: "symbols" + }, + sa: { + keywords: [ "japanese", "blue-square", "katakana" ], + "char": '\ud83c\ude02\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + passport_control: { + keywords: [ "custom", "blue-square" ], + "char": '\ud83d\udec2', + fitzpatrick_scale: false, + category: "symbols" + }, + customs: { + keywords: [ "passport", "border", "blue-square" ], + "char": '\ud83d\udec3', + fitzpatrick_scale: false, + category: "symbols" + }, + baggage_claim: { + keywords: [ "blue-square", "airport", "transport" ], + "char": '\ud83d\udec4', + fitzpatrick_scale: false, + category: "symbols" + }, + left_luggage: { + keywords: [ "blue-square", "travel" ], + "char": '\ud83d\udec5', + fitzpatrick_scale: false, + category: "symbols" + }, + wheelchair: { + keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], + "char": '\u267f', + fitzpatrick_scale: false, + category: "symbols" + }, + no_smoking: { + keywords: [ "cigarette", "blue-square", "smell", "smoke" ], + "char": '\ud83d\udead', + fitzpatrick_scale: false, + category: "symbols" + }, + wc: { + keywords: [ "toilet", "restroom", "blue-square" ], + "char": '\ud83d\udebe', + fitzpatrick_scale: false, + category: "symbols" + }, + parking: { + keywords: [ "cars", "blue-square", "alphabet", "letter" ], + "char": '\ud83c\udd7f\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + potable_water: { + keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], + "char": '\ud83d\udeb0', + fitzpatrick_scale: false, + category: "symbols" + }, + mens: { + keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], + "char": '\ud83d\udeb9', + fitzpatrick_scale: false, + category: "symbols" + }, + womens: { + keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], + "char": '\ud83d\udeba', + fitzpatrick_scale: false, + category: "symbols" + }, + baby_symbol: { + keywords: [ "orange-square", "child" ], + "char": '\ud83d\udebc', + fitzpatrick_scale: false, + category: "symbols" + }, + restroom: { + keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], + "char": '\ud83d\udebb', + fitzpatrick_scale: false, + category: "symbols" + }, + put_litter_in_its_place: { + keywords: [ "blue-square", "sign", "human", "info" ], + "char": '\ud83d\udeae', + fitzpatrick_scale: false, + category: "symbols" + }, + cinema: { + keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], + "char": '\ud83c\udfa6', + fitzpatrick_scale: false, + category: "symbols" + }, + signal_strength: { + keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], + "char": '\ud83d\udcf6', + fitzpatrick_scale: false, + category: "symbols" + }, + koko: { + keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], + "char": '\ud83c\ude01', + fitzpatrick_scale: false, + category: "symbols" + }, + ng: { + keywords: [ "blue-square", "words", "shape", "icon" ], + "char": '\ud83c\udd96', + fitzpatrick_scale: false, + category: "symbols" + }, + ok: { + keywords: [ "good", "agree", "yes", "blue-square" ], + "char": '\ud83c\udd97', + fitzpatrick_scale: false, + category: "symbols" + }, + up: { + keywords: [ "blue-square", "above", "high" ], + "char": '\ud83c\udd99', + fitzpatrick_scale: false, + category: "symbols" + }, + cool: { + keywords: [ "words", "blue-square" ], + "char": '\ud83c\udd92', + fitzpatrick_scale: false, + category: "symbols" + }, + "new": { + keywords: [ "blue-square", "words", "start" ], + "char": '\ud83c\udd95', + fitzpatrick_scale: false, + category: "symbols" + }, + free: { + keywords: [ "blue-square", "words" ], + "char": '\ud83c\udd93', + fitzpatrick_scale: false, + category: "symbols" + }, + zero: { + keywords: [ "0", "numbers", "blue-square", "null" ], + "char": '0\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + one: { + keywords: [ "blue-square", "numbers", "1" ], + "char": '1\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + two: { + keywords: [ "numbers", "2", "prime", "blue-square" ], + "char": '2\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + three: { + keywords: [ "3", "numbers", "prime", "blue-square" ], + "char": '3\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + four: { + keywords: [ "4", "numbers", "blue-square" ], + "char": '4\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + five: { + keywords: [ "5", "numbers", "blue-square", "prime" ], + "char": '5\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + six: { + keywords: [ "6", "numbers", "blue-square" ], + "char": '6\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + seven: { + keywords: [ "7", "numbers", "blue-square", "prime" ], + "char": '7\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + eight: { + keywords: [ "8", "blue-square", "numbers" ], + "char": '8\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + nine: { + keywords: [ "blue-square", "numbers", "9" ], + "char": '9\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + keycap_ten: { + keywords: [ "numbers", "10", "blue-square" ], + "char": '\ud83d\udd1f', + fitzpatrick_scale: false, + category: "symbols" + }, + asterisk: { + keywords: [ "star", "keycap" ], + "char": '*\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + eject_button: { + keywords: [ "blue-square" ], + "char": '\u23cf\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_forward: { + keywords: [ "blue-square", "right", "direction", "play" ], + "char": '\u25b6\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + pause_button: { + keywords: [ "pause", "blue-square" ], + "char": '\u23f8', + fitzpatrick_scale: false, + category: "symbols" + }, + next_track_button: { + keywords: [ "forward", "next", "blue-square" ], + "char": '\u23ed', + fitzpatrick_scale: false, + category: "symbols" + }, + stop_button: { + keywords: [ "blue-square" ], + "char": '\u23f9', + fitzpatrick_scale: false, + category: "symbols" + }, + record_button: { + keywords: [ "blue-square" ], + "char": '\u23fa', + fitzpatrick_scale: false, + category: "symbols" + }, + play_or_pause_button: { + keywords: [ "blue-square", "play", "pause" ], + "char": '\u23ef', + fitzpatrick_scale: false, + category: "symbols" + }, + previous_track_button: { + keywords: [ "backward" ], + "char": '\u23ee', + fitzpatrick_scale: false, + category: "symbols" + }, + fast_forward: { + keywords: [ "blue-square", "play", "speed", "continue" ], + "char": '\u23e9', + fitzpatrick_scale: false, + category: "symbols" + }, + rewind: { + keywords: [ "play", "blue-square" ], + "char": '\u23ea', + fitzpatrick_scale: false, + category: "symbols" + }, + twisted_rightwards_arrows: { + keywords: [ "blue-square", "shuffle", "music", "random" ], + "char": '\ud83d\udd00', + fitzpatrick_scale: false, + category: "symbols" + }, + repeat: { + keywords: [ "loop", "record" ], + "char": '\ud83d\udd01', + fitzpatrick_scale: false, + category: "symbols" + }, + repeat_one: { + keywords: [ "blue-square", "loop" ], + "char": '\ud83d\udd02', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_backward: { + keywords: [ "blue-square", "left", "direction" ], + "char": '\u25c0\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_small: { + keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], + "char": '\ud83d\udd3c', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down_small: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": '\ud83d\udd3d', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_up: { + keywords: [ "blue-square", "direction", "top" ], + "char": '\u23eb', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": '\u23ec', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right: { + keywords: [ "blue-square", "next" ], + "char": '\u27a1\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_left: { + keywords: [ "blue-square", "previous", "back" ], + "char": '\u2b05\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up: { + keywords: [ "blue-square", "continue", "top", "direction" ], + "char": '\u2b06\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": '\u2b07\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_right: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], + "char": '\u2197\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_right: { + keywords: [ "blue-square", "direction", "diagonal", "southeast" ], + "char": '\u2198\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_left: { + keywords: [ "blue-square", "direction", "diagonal", "southwest" ], + "char": '\u2199\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_left: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], + "char": '\u2196\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_down: { + keywords: [ "blue-square", "direction", "way", "vertical" ], + "char": '\u2195\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + left_right_arrow: { + keywords: [ "shape", "direction", "horizontal", "sideways" ], + "char": '\u2194\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_counterclockwise: { + keywords: [ "blue-square", "sync", "cycle" ], + "char": '\ud83d\udd04', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right_hook: { + keywords: [ "blue-square", "return", "rotate", "direction" ], + "char": '\u21aa\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + leftwards_arrow_with_hook: { + keywords: [ "back", "return", "blue-square", "undo", "enter" ], + "char": '\u21a9\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_up: { + keywords: [ "blue-square", "direction", "top" ], + "char": '\u2934\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": '\u2935\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + hash: { + keywords: [ "symbol", "blue-square", "twitter" ], + "char": '#\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + information_source: { + keywords: [ "blue-square", "alphabet", "letter" ], + "char": '\u2139\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + abc: { + keywords: [ "blue-square", "alphabet" ], + "char": '\ud83d\udd24', + fitzpatrick_scale: false, + category: "symbols" + }, + abcd: { + keywords: [ "blue-square", "alphabet" ], + "char": '\ud83d\udd21', + fitzpatrick_scale: false, + category: "symbols" + }, + capital_abcd: { + keywords: [ "alphabet", "words", "blue-square" ], + "char": '\ud83d\udd20', + fitzpatrick_scale: false, + category: "symbols" + }, + symbols: { + keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], + "char": '\ud83d\udd23', + fitzpatrick_scale: false, + category: "symbols" + }, + musical_note: { + keywords: [ "score", "tone", "sound" ], + "char": '\ud83c\udfb5', + fitzpatrick_scale: false, + category: "symbols" + }, + notes: { + keywords: [ "music", "score" ], + "char": '\ud83c\udfb6', + fitzpatrick_scale: false, + category: "symbols" + }, + wavy_dash: { + keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], + "char": '\u3030\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + curly_loop: { + keywords: [ "scribble", "draw", "shape", "squiggle" ], + "char": '\u27b0', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_check_mark: { + keywords: [ "ok", "nike", "answer", "yes", "tick" ], + "char": '\u2714\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_clockwise: { + keywords: [ "sync", "cycle", "round", "repeat" ], + "char": '\ud83d\udd03', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_plus_sign: { + keywords: [ "math", "calculation", "addition", "more", "increase" ], + "char": '\u2795', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_minus_sign: { + keywords: [ "math", "calculation", "subtract", "less" ], + "char": '\u2796', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_division_sign: { + keywords: [ "divide", "math", "calculation" ], + "char": '\u2797', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_multiplication_x: { + keywords: [ "math", "calculation" ], + "char": '\u2716\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + infinity: { + keywords: [ "forever" ], + "char": '\u267e', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_dollar_sign: { + keywords: [ "money", "sales", "payment", "currency", "buck" ], + "char": '\ud83d\udcb2', + fitzpatrick_scale: false, + category: "symbols" + }, + currency_exchange: { + keywords: [ "money", "sales", "dollar", "travel" ], + "char": '\ud83d\udcb1', + fitzpatrick_scale: false, + category: "symbols" + }, + copyright: { + keywords: [ "ip", "license", "circle", "law", "legal" ], + "char": '\xa9\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + registered: { + keywords: [ "alphabet", "circle" ], + "char": '\xae\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + tm: { + keywords: [ "trademark", "brand", "law", "legal" ], + "char": '\u2122\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + end: { + keywords: [ "words", "arrow" ], + "char": '\ud83d\udd1a', + fitzpatrick_scale: false, + category: "symbols" + }, + back: { + keywords: [ "arrow", "words", "return" ], + "char": '\ud83d\udd19', + fitzpatrick_scale: false, + category: "symbols" + }, + on: { + keywords: [ "arrow", "words" ], + "char": '\ud83d\udd1b', + fitzpatrick_scale: false, + category: "symbols" + }, + top: { + keywords: [ "words", "blue-square" ], + "char": '\ud83d\udd1d', + fitzpatrick_scale: false, + category: "symbols" + }, + soon: { + keywords: [ "arrow", "words" ], + "char": '\ud83d\udd1c', + fitzpatrick_scale: false, + category: "symbols" + }, + ballot_box_with_check: { + keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], + "char": '\u2611\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + radio_button: { + keywords: [ "input", "old", "music", "circle" ], + "char": '\ud83d\udd18', + fitzpatrick_scale: false, + category: "symbols" + }, + white_circle: { + keywords: [ "shape", "round" ], + "char": '\u26aa', + fitzpatrick_scale: false, + category: "symbols" + }, + black_circle: { + keywords: [ "shape", "button", "round" ], + "char": '\u26ab', + fitzpatrick_scale: false, + category: "symbols" + }, + red_circle: { + keywords: [ "shape", "error", "danger" ], + "char": '\ud83d\udd34', + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_circle: { + keywords: [ "shape", "icon", "button" ], + "char": '\ud83d\udd35', + fitzpatrick_scale: false, + category: "symbols" + }, + small_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": '\ud83d\udd38', + fitzpatrick_scale: false, + category: "symbols" + }, + small_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": '\ud83d\udd39', + fitzpatrick_scale: false, + category: "symbols" + }, + large_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": '\ud83d\udd36', + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": '\ud83d\udd37', + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle: { + keywords: [ "shape", "direction", "up", "top" ], + "char": '\ud83d\udd3a', + fitzpatrick_scale: false, + category: "symbols" + }, + black_small_square: { + keywords: [ "shape", "icon" ], + "char": '\u25aa\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + white_small_square: { + keywords: [ "shape", "icon" ], + "char": '\u25ab\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + black_large_square: { + keywords: [ "shape", "icon", "button" ], + "char": '\u2b1b', + fitzpatrick_scale: false, + category: "symbols" + }, + white_large_square: { + keywords: [ "shape", "icon", "stone", "button" ], + "char": '\u2b1c', + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle_down: { + keywords: [ "shape", "direction", "bottom" ], + "char": '\ud83d\udd3b', + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_square: { + keywords: [ "shape", "button", "icon" ], + "char": '\u25fc\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_square: { + keywords: [ "shape", "stone", "icon" ], + "char": '\u25fb\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_small_square: { + keywords: [ "icon", "shape", "button" ], + "char": '\u25fe', + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_small_square: { + keywords: [ "shape", "stone", "icon", "button" ], + "char": '\u25fd', + fitzpatrick_scale: false, + category: "symbols" + }, + black_square_button: { + keywords: [ "shape", "input", "frame" ], + "char": '\ud83d\udd32', + fitzpatrick_scale: false, + category: "symbols" + }, + white_square_button: { + keywords: [ "shape", "input" ], + "char": '\ud83d\udd33', + fitzpatrick_scale: false, + category: "symbols" + }, + speaker: { + keywords: [ "sound", "volume", "silence", "broadcast" ], + "char": '\ud83d\udd08', + fitzpatrick_scale: false, + category: "symbols" + }, + sound: { + keywords: [ "volume", "speaker", "broadcast" ], + "char": '\ud83d\udd09', + fitzpatrick_scale: false, + category: "symbols" + }, + loud_sound: { + keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], + "char": '\ud83d\udd0a', + fitzpatrick_scale: false, + category: "symbols" + }, + mute: { + keywords: [ "sound", "volume", "silence", "quiet" ], + "char": '\ud83d\udd07', + fitzpatrick_scale: false, + category: "symbols" + }, + mega: { + keywords: [ "sound", "speaker", "volume" ], + "char": '\ud83d\udce3', + fitzpatrick_scale: false, + category: "symbols" + }, + loudspeaker: { + keywords: [ "volume", "sound" ], + "char": '\ud83d\udce2', + fitzpatrick_scale: false, + category: "symbols" + }, + bell: { + keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], + "char": '\ud83d\udd14', + fitzpatrick_scale: false, + category: "symbols" + }, + no_bell: { + keywords: [ "sound", "volume", "mute", "quiet", "silent" ], + "char": '\ud83d\udd15', + fitzpatrick_scale: false, + category: "symbols" + }, + black_joker: { + keywords: [ "poker", "cards", "game", "play", "magic" ], + "char": '\ud83c\udccf', + fitzpatrick_scale: false, + category: "symbols" + }, + mahjong: { + keywords: [ "game", "play", "chinese", "kanji" ], + "char": '\ud83c\udc04', + fitzpatrick_scale: false, + category: "symbols" + }, + spades: { + keywords: [ "poker", "cards", "suits", "magic" ], + "char": '\u2660\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + clubs: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": '\u2663\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + hearts: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": '\u2665\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + diamonds: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": '\u2666\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + flower_playing_cards: { + keywords: [ "game", "sunset", "red" ], + "char": '\ud83c\udfb4', + fitzpatrick_scale: false, + category: "symbols" + }, + thought_balloon: { + keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], + "char": '\ud83d\udcad', + fitzpatrick_scale: false, + category: "symbols" + }, + right_anger_bubble: { + keywords: [ "caption", "speech", "thinking", "mad" ], + "char": '\ud83d\uddef', + fitzpatrick_scale: false, + category: "symbols" + }, + speech_balloon: { + keywords: [ "bubble", "words", "message", "talk", "chatting" ], + "char": '\ud83d\udcac', + fitzpatrick_scale: false, + category: "symbols" + }, + left_speech_bubble: { + keywords: [ "words", "message", "talk", "chatting" ], + "char": '\ud83d\udde8', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd50', + fitzpatrick_scale: false, + category: "symbols" + }, + clock2: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd51', + fitzpatrick_scale: false, + category: "symbols" + }, + clock3: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd52', + fitzpatrick_scale: false, + category: "symbols" + }, + clock4: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd53', + fitzpatrick_scale: false, + category: "symbols" + }, + clock5: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd54', + fitzpatrick_scale: false, + category: "symbols" + }, + clock6: { + keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], + "char": '\ud83d\udd55', + fitzpatrick_scale: false, + category: "symbols" + }, + clock7: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd56', + fitzpatrick_scale: false, + category: "symbols" + }, + clock8: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd57', + fitzpatrick_scale: false, + category: "symbols" + }, + clock9: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd58', + fitzpatrick_scale: false, + category: "symbols" + }, + clock10: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd59', + fitzpatrick_scale: false, + category: "symbols" + }, + clock11: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5a', + fitzpatrick_scale: false, + category: "symbols" + }, + clock12: { + keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], + "char": '\ud83d\udd5b', + fitzpatrick_scale: false, + category: "symbols" + }, + clock130: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5c', + fitzpatrick_scale: false, + category: "symbols" + }, + clock230: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5d', + fitzpatrick_scale: false, + category: "symbols" + }, + clock330: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5e', + fitzpatrick_scale: false, + category: "symbols" + }, + clock430: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5f', + fitzpatrick_scale: false, + category: "symbols" + }, + clock530: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd60', + fitzpatrick_scale: false, + category: "symbols" + }, + clock630: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd61', + fitzpatrick_scale: false, + category: "symbols" + }, + clock730: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd62', + fitzpatrick_scale: false, + category: "symbols" + }, + clock830: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd63', + fitzpatrick_scale: false, + category: "symbols" + }, + clock930: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd64', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1030: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd65', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1130: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd66', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1230: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd67', + fitzpatrick_scale: false, + category: "symbols" + }, + afghanistan: { + keywords: [ "af", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + aland_islands: { + keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + albania: { + keywords: [ "al", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + algeria: { + keywords: [ "dz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + american_samoa: { + keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + andorra: { + keywords: [ "ad", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + angola: { + keywords: [ "ao", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + anguilla: { + keywords: [ "ai", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + antarctica: { + keywords: [ "aq", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + antigua_barbuda: { + keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + argentina: { + keywords: [ "ar", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + armenia: { + keywords: [ "am", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + aruba: { + keywords: [ "aw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + australia: { + keywords: [ "au", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + austria: { + keywords: [ "at", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + azerbaijan: { + keywords: [ "az", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + bahamas: { + keywords: [ "bs", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + bahrain: { + keywords: [ "bh", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + bangladesh: { + keywords: [ "bd", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + barbados: { + keywords: [ "bb", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + belarus: { + keywords: [ "by", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + belgium: { + keywords: [ "be", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + belize: { + keywords: [ "bz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + benin: { + keywords: [ "bj", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + bermuda: { + keywords: [ "bm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + bhutan: { + keywords: [ "bt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + bolivia: { + keywords: [ "bo", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + caribbean_netherlands: { + keywords: [ "bonaire", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + bosnia_herzegovina: { + keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + botswana: { + keywords: [ "bw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + brazil: { + keywords: [ "br", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + british_indian_ocean_territory: { + keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + british_virgin_islands: { + keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + brunei: { + keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + bulgaria: { + keywords: [ "bg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + burkina_faso: { + keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + burundi: { + keywords: [ "bi", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + cape_verde: { + keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + cambodia: { + keywords: [ "kh", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + cameroon: { + keywords: [ "cm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + canada: { + keywords: [ "ca", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + canary_islands: { + keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + cayman_islands: { + keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + central_african_republic: { + keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + chad: { + keywords: [ "td", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + chile: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + cn: { + keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + christmas_island: { + keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + cocos_islands: { + keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + colombia: { + keywords: [ "co", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + comoros: { + keywords: [ "km", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + congo_brazzaville: { + keywords: [ "congo", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + congo_kinshasa: { + keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + cook_islands: { + keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + costa_rica: { + keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + croatia: { + keywords: [ "hr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + cuba: { + keywords: [ "cu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + curacao: { + keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + cyprus: { + keywords: [ "cy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + czech_republic: { + keywords: [ "cz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + denmark: { + keywords: [ "dk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + djibouti: { + keywords: [ "dj", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + dominica: { + keywords: [ "dm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + dominican_republic: { + keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + ecuador: { + keywords: [ "ec", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + egypt: { + keywords: [ "eg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + el_salvador: { + keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + equatorial_guinea: { + keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + eritrea: { + keywords: [ "er", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + estonia: { + keywords: [ "ee", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + ethiopia: { + keywords: [ "et", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + eu: { + keywords: [ "european", "union", "flag", "banner" ], + "char": '\ud83c\uddea\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + falkland_islands: { + keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + faroe_islands: { + keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + fiji: { + keywords: [ "fj", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + finland: { + keywords: [ "fi", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + fr: { + keywords: [ "banner", "flag", "nation", "france", "french", "country" ], + "char": '\ud83c\uddeb\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + french_guiana: { + keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + french_polynesia: { + keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + french_southern_territories: { + keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + gabon: { + keywords: [ "ga", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + gambia: { + keywords: [ "gm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + georgia: { + keywords: [ "ge", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + de: { + keywords: [ "german", "nation", "flag", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + ghana: { + keywords: [ "gh", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + gibraltar: { + keywords: [ "gi", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + greece: { + keywords: [ "gr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + greenland: { + keywords: [ "gl", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + grenada: { + keywords: [ "gd", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + guadeloupe: { + keywords: [ "gp", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + guam: { + keywords: [ "gu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + guatemala: { + keywords: [ "gt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + guernsey: { + keywords: [ "gg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + guinea: { + keywords: [ "gn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + guinea_bissau: { + keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + guyana: { + keywords: [ "gy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + haiti: { + keywords: [ "ht", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + honduras: { + keywords: [ "hn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + hong_kong: { + keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + hungary: { + keywords: [ "hu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + iceland: { + keywords: [ "is", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + india: { + keywords: [ "in", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + indonesia: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + iran: { + keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + iraq: { + keywords: [ "iq", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + ireland: { + keywords: [ "ie", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + isle_of_man: { + keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + israel: { + keywords: [ "il", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + it: { + keywords: [ "italy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + cote_divoire: { + keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + jamaica: { + keywords: [ "jm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddef\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + jp: { + keywords: [ "japanese", "nation", "flag", "country", "banner" ], + "char": '\ud83c\uddef\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + jersey: { + keywords: [ "je", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddef\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + jordan: { + keywords: [ "jo", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddef\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + kazakhstan: { + keywords: [ "kz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + kenya: { + keywords: [ "ke", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + kiribati: { + keywords: [ "ki", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + kosovo: { + keywords: [ "xk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfd\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + kuwait: { + keywords: [ "kw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + kyrgyzstan: { + keywords: [ "kg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + laos: { + keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + latvia: { + keywords: [ "lv", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + lebanon: { + keywords: [ "lb", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + lesotho: { + keywords: [ "ls", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + liberia: { + keywords: [ "lr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + libya: { + keywords: [ "ly", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + liechtenstein: { + keywords: [ "li", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + lithuania: { + keywords: [ "lt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + luxembourg: { + keywords: [ "lu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + macau: { + keywords: [ "macao", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + macedonia: { + keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + madagascar: { + keywords: [ "mg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + malawi: { + keywords: [ "mw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + malaysia: { + keywords: [ "my", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + maldives: { + keywords: [ "mv", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + mali: { + keywords: [ "ml", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + malta: { + keywords: [ "mt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + marshall_islands: { + keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + martinique: { + keywords: [ "mq", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + mauritania: { + keywords: [ "mr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + mauritius: { + keywords: [ "mu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + mayotte: { + keywords: [ "yt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfe\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + mexico: { + keywords: [ "mx", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + micronesia: { + keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + moldova: { + keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + monaco: { + keywords: [ "mc", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + mongolia: { + keywords: [ "mn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + montenegro: { + keywords: [ "me", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + montserrat: { + keywords: [ "ms", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + morocco: { + keywords: [ "ma", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + mozambique: { + keywords: [ "mz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + myanmar: { + keywords: [ "mm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + namibia: { + keywords: [ "na", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + nauru: { + keywords: [ "nr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + nepal: { + keywords: [ "np", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + netherlands: { + keywords: [ "nl", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + new_caledonia: { + keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + new_zealand: { + keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + nicaragua: { + keywords: [ "ni", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + niger: { + keywords: [ "ne", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + nigeria: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + niue: { + keywords: [ "nu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + norfolk_island: { + keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + northern_mariana_islands: { + keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + north_korea: { + keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + norway: { + keywords: [ "no", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + oman: { + keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf4\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + pakistan: { + keywords: [ "pk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + palau: { + keywords: [ "pw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + palestinian_territories: { + keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + panama: { + keywords: [ "pa", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + papua_new_guinea: { + keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + paraguay: { + keywords: [ "py", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + peru: { + keywords: [ "pe", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + philippines: { + keywords: [ "ph", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + pitcairn_islands: { + keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + poland: { + keywords: [ "pl", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + portugal: { + keywords: [ "pt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + puerto_rico: { + keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + qatar: { + keywords: [ "qa", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf6\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + reunion: { + keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + romania: { + keywords: [ "ro", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + ru: { + keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + rwanda: { + keywords: [ "rw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + st_barthelemy: { + keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + st_helena: { + keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + st_kitts_nevis: { + keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + st_lucia: { + keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + st_pierre_miquelon: { + keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + st_vincent_grenadines: { + keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + samoa: { + keywords: [ "ws", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfc\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + san_marino: { + keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + sao_tome_principe: { + keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + saudi_arabia: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + senegal: { + keywords: [ "sn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + serbia: { + keywords: [ "rs", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + seychelles: { + keywords: [ "sc", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + sierra_leone: { + keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + singapore: { + keywords: [ "sg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + sint_maarten: { + keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + slovakia: { + keywords: [ "sk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + slovenia: { + keywords: [ "si", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + solomon_islands: { + keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + somalia: { + keywords: [ "so", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + south_africa: { + keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddff\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + south_georgia_south_sandwich_islands: { + keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + kr: { + keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + south_sudan: { + keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + es: { + keywords: [ "spain", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + sri_lanka: { + keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + sudan: { + keywords: [ "sd", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + suriname: { + keywords: [ "sr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + swaziland: { + keywords: [ "sz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + sweden: { + keywords: [ "se", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + switzerland: { + keywords: [ "ch", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + syria: { + keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + taiwan: { + keywords: [ "tw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + tajikistan: { + keywords: [ "tj", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + tanzania: { + keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + thailand: { + keywords: [ "th", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + timor_leste: { + keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + togo: { + keywords: [ "tg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + tokelau: { + keywords: [ "tk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + tonga: { + keywords: [ "to", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + trinidad_tobago: { + keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + tunisia: { + keywords: [ "tn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + tr: { + keywords: [ "turkey", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + turkmenistan: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + turks_caicos_islands: { + keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + tuvalu: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + uganda: { + keywords: [ "ug", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + ukraine: { + keywords: [ "ua", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + united_arab_emirates: { + keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + uk: { + keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], + "char": '\ud83c\uddec\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + england: { + keywords: [ "flag", "english" ], + "char": '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + scotland: { + keywords: [ "flag", "scottish" ], + "char": '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + wales: { + keywords: [ "flag", "welsh" ], + "char": '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + us: { + keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + us_virgin_islands: { + keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + uruguay: { + keywords: [ "uy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + uzbekistan: { + keywords: [ "uz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + vanuatu: { + keywords: [ "vu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + vatican_city: { + keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + venezuela: { + keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + vietnam: { + keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + wallis_futuna: { + keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfc\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + western_sahara: { + keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + yemen: { + keywords: [ "ye", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfe\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + zambia: { + keywords: [ "zm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddff\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + zimbabwe: { + keywords: [ "zw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddff\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + united_nations: { + keywords: [ "un", "flag", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + pirate_flag: { + keywords: [ "skull", "crossbones", "flag", "banner" ], + "char": '\ud83c\udff4\u200d\u2620\ufe0f', + fitzpatrick_scale: false, + category: "flags" + } +}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojiimages.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojiimages.min.js new file mode 100644 index 0000000..1bc8d72 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojiimages.min.js @@ -0,0 +1,3 @@ +// Source: npm package: emojilib +// Images provided by twemoji: https://github.com/twitter/twemoji +window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],"char":'\ud83d\udcaf',fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],"char":'\ud83d\udd22',fitzpatrick_scale:!1,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],"char":'\ud83d\ude00',fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],"char":'\ud83d\ude2c',fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],"char":'\ud83d\ude01',fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],"char":'\ud83d\ude02',fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],"char":'\ud83e\udd23',fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],"char":'\ud83e\udd73',fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],"char":'\ud83d\ude03',fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],"char":'\ud83d\ude04',fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],"char":'\ud83d\ude05',fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],"char":'\ud83d\ude06',fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],"char":'\ud83d\ude07',fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],"char":'\ud83d\ude09',fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],"char":'\ud83d\ude0a',fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],"char":'\ud83d\ude42',fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],"char":'\ud83d\ude43',fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],"char":'\u263a\ufe0f',fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],"char":'\ud83d\ude0b',fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],"char":'\ud83d\ude0c',fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],"char":'\ud83d\ude0d',fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],"char":'\ud83e\udd70',fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],"char":'\ud83d\ude18',fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],"char":'\ud83d\ude17',fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],"char":'\ud83d\ude19',fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],"char":'\ud83d\ude1a',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],"char":'\ud83d\ude1c',fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],"char":'\ud83e\udd2a',fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],"char":'\ud83e\udd28',fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],"char":'\ud83e\uddd0',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],"char":'\ud83d\ude1d',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],"char":'\ud83d\ude1b',fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],"char":'\ud83e\udd11',fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],"char":'\ud83e\udd13',fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],"char":'\ud83d\ude0e',fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],"char":'\ud83e\udd29',fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],"char":'\ud83e\udd21',fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],"char":'\ud83e\udd20',fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],"char":'\ud83e\udd17',fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],"char":'\ud83d\ude0f',fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],"char":'\ud83d\ude36',fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],"char":'\ud83d\ude10',fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],"char":'\ud83d\ude11',fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],"char":'\ud83d\ude12',fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],"char":'\ud83d\ude44',fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],"char":'\ud83e\udd14',fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],"char":'\ud83e\udd25',fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],"char":'\ud83e\udd2d',fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],"char":'\ud83e\udd2b',fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],"char":'\ud83e\udd2c',fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],"char":'\ud83e\udd2f',fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],"char":'\ud83d\ude33',fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],"char":'\ud83d\ude1e',fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],"char":'\ud83d\ude1f',fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],"char":'\ud83d\ude20',fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],"char":'\ud83d\ude21',fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],"char":'\ud83d\ude14',fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],"char":'\ud83d\ude15',fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],"char":'\ud83d\ude41',fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],"char":'\u2639',fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],"char":'\ud83d\ude23',fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],"char":'\ud83d\ude16',fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],"char":'\ud83d\ude2b',fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],"char":'\ud83d\ude29',fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],"char":'\ud83e\udd7a',fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],"char":'\ud83d\ude24',fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],"char":'\ud83d\ude2e',fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],"char":'\ud83d\ude31',fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],"char":'\ud83d\ude28',fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],"char":'\ud83d\ude30',fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],"char":'\ud83d\ude2f',fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],"char":'\ud83d\ude26',fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],"char":'\ud83d\ude27',fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],"char":'\ud83d\ude22',fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],"char":'\ud83d\ude25',fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],"char":'\ud83e\udd24',fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],"char":'\ud83d\ude2a',fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],"char":'\ud83d\ude13',fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],"char":'\ud83e\udd75',fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],"char":'\ud83e\udd76',fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],"char":'\ud83d\ude2d',fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],"char":'\ud83d\ude35',fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],"char":'\ud83d\ude32',fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],"char":'\ud83e\udd10',fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],"char":'\ud83e\udd22',fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],"char":'\ud83e\udd27',fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],"char":'\ud83e\udd2e',fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],"char":'\ud83d\ude37',fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],"char":'\ud83e\udd12',fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],"char":'\ud83e\udd15',fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],"char":'\ud83e\udd74',fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],"char":'\ud83d\ude34',fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],"char":'\ud83d\udca4',fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],"char":'\ud83d\udca9',fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],"char":'\ud83d\ude08',fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],"char":'\ud83d\udc7f',fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],"char":'\ud83d\udc79',fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],"char":'\ud83d\udc7a',fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],"char":'\ud83d\udc80',fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],"char":'\ud83d\udc7b',fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],"char":'\ud83d\udc7d',fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],"char":'\ud83e\udd16',fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],"char":'\ud83d\ude3a',fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],"char":'\ud83d\ude38',fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],"char":'\ud83d\ude39',fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],"char":'\ud83d\ude3b',fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],"char":'\ud83d\ude3c',fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],"char":'\ud83d\ude3d',fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],"char":'\ud83d\ude40',fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],"char":'\ud83d\ude3f',fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],"char":'\ud83d\ude3e',fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],"char":'\ud83e\udd32',fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],"char":'\ud83d\ude4c',fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],"char":'\ud83d\udc4f',fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],"char":'\ud83d\udc4b',fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],"char":'\ud83e\udd19',fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],"char":'\ud83d\udc4d',fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],"char":'\ud83d\udc4e',fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],"char":'\ud83d\udc4a',fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],"char":'\u270a',fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],"char":'\ud83e\udd1b',fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],"char":'\ud83e\udd1c',fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],"char":'\u270c',fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],"char":'\ud83d\udc4c',fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],"char":'\u270b',fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],"char":'\ud83e\udd1a',fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],"char":'\ud83d\udc50',fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],"char":'\ud83d\udcaa',fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],"char":'\ud83d\ude4f',fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],"char":'\ud83e\uddb6',fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],"char":'\ud83e\uddb5',fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],"char":'\ud83e\udd1d',fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],"char":'\u261d',fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],"char":'\ud83d\udc46',fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],"char":'\ud83d\udc47',fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],"char":'\ud83d\udc48',fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],"char":'\ud83d\udc49',fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],"char":'\ud83d\udd95',fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],"char":'\ud83d\udd90',fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],"char":'\ud83e\udd1f',fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],"char":'\ud83e\udd18',fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],"char":'\ud83e\udd1e',fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],"char":'\ud83d\udd96',fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],"char":'\u270d',fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],"char":'\ud83e\udd33',fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],"char":'\ud83d\udc85',fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],"char":'\ud83d\udc44',fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],"char":'\ud83e\uddb7',fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],"char":'\ud83d\udc45',fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],"char":'\ud83d\udc42',fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],"char":'\ud83d\udc43',fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],"char":'\ud83d\udc41',fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],"char":'\ud83d\udc40',fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],"char":'\ud83e\udde0',fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],"char":'\ud83d\udc64',fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],"char":'\ud83d\udc65',fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],"char":'\ud83d\udde3',fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],"char":'\ud83d\udc76',fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],"char":'\ud83e\uddd2',fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],"char":'\ud83d\udc66',fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],"char":'\ud83d\udc67',fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],"char":'\ud83e\uddd1',fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],"char":'\ud83d\udc68',fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],"char":'\ud83d\udc69',fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],"char":'\ud83d\udc71\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],"char":'\ud83d\udc71',fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],"char":'\ud83e\uddd4',fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],"char":'\ud83e\uddd3',fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],"char":'\ud83d\udc74',fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],"char":'\ud83d\udc75',fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],"char":'\ud83d\udc72',fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],"char":'\ud83e\uddd5',fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],"char":'\ud83d\udc73\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],"char":'\ud83d\udc73',fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],"char":'\ud83d\udc6e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],"char":'\ud83d\udc6e',fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],"char":'\ud83d\udc77\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],"char":'\ud83d\udc77',fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],"char":'\ud83d\udc82\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],"char":'\ud83d\udc82',fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],"char":'\ud83d\udd75\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],"char":'\ud83d\udd75',fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],"char":'\ud83d\udc69\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],"char":'\ud83d\udc68\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],"char":'\ud83d\udc69\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],"char":'\ud83d\udc68\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],"char":'\ud83d\udc69\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],"char":'\ud83d\udc68\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],"char":'\ud83d\udc69\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],"char":'\ud83d\udc68\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],"char":'\ud83d\udc69\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],"char":'\ud83d\udc68\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],"char":'\ud83d\udc69\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],"char":'\ud83d\udc68\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],"char":'\ud83d\udc69\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],"char":'\ud83d\udc68\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],"char":'\ud83d\udc69\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],"char":'\ud83d\udc68\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],"char":'\ud83d\udc69\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],"char":'\ud83d\udc68\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],"char":'\ud83e\uddb8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],"char":'\ud83e\uddb8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],"char":'\ud83e\uddb9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],"char":'\ud83e\uddb9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],"char":'\ud83e\udd36',fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],"char":'\ud83c\udf85',fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],"char":'\ud83e\uddd9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],"char":'\ud83e\uddd9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],"char":'\ud83e\udddd\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],"char":'\ud83e\udddd\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],"char":'\ud83e\udddb\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],"char":'\ud83e\udddb\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],"char":'\ud83e\udddf\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],"char":'\ud83e\udddf\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],"char":'\ud83e\uddde\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],"char":'\ud83e\uddde\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],"char":'\ud83e\udddc\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],"char":'\ud83e\udddc\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],"char":'\ud83e\uddda\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],"char":'\ud83e\uddda\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],"char":'\ud83d\udc7c',fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],"char":'\ud83e\udd30',fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],"char":'\ud83e\udd31',fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],"char":'\ud83d\udc78',fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],"char":'\ud83e\udd34',fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],"char":'\ud83d\udc70',fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],"char":'\ud83e\udd35',fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],"char":'\ud83c\udfc3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],"char":'\ud83c\udfc3',fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],"char":'\ud83d\udeb6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],"char":'\ud83d\udeb6',fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],"char":'\ud83d\udc83',fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],"char":'\ud83d\udd7a',fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],"char":'\ud83d\udc6f',fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],"char":'\ud83d\udc6f\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],"char":'\ud83d\udc6b',fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],"char":'\ud83d\udc6c',fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],"char":'\ud83d\udc6d',fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],"char":'\ud83d\ude47\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],"char":'\ud83d\ude47',fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],"char":'\ud83e\udd26\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],"char":'\ud83e\udd26\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],"char":'\ud83e\udd37',fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],"char":'\ud83e\udd37\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],"char":'\ud83d\udc81',fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],"char":'\ud83d\udc81\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],"char":'\ud83d\ude45',fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],"char":'\ud83d\ude45\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],"char":'\ud83d\ude46',fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],"char":'\ud83d\ude46\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],"char":'\ud83d\ude4b',fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],"char":'\ud83d\ude4b\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],"char":'\ud83d\ude4e',fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],"char":'\ud83d\ude4e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],"char":'\ud83d\ude4d',fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],"char":'\ud83d\ude4d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],"char":'\ud83d\udc87',fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],"char":'\ud83d\udc87\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],"char":'\ud83d\udc86',fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],"char":'\ud83d\udc86\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],"char":'\ud83e\uddd6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],"char":'\ud83e\uddd6\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":'\ud83d\udc91',fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],"char":'\ud83d\udc8f',fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],"char":'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],"char":'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],"char":'\ud83d\udc6a',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],"char":'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],"char":'\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],"char":'\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],"char":'\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],"char":'\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],"char":'\ud83e\uddf6',fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],"char":'\ud83e\uddf5',fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],"char":'\ud83e\udde5',fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],"char":'\ud83e\udd7c',fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],"char":'\ud83d\udc5a',fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],"char":'\ud83d\udc55',fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],"char":'\ud83d\udc56',fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],"char":'\ud83d\udc54',fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],"char":'\ud83d\udc57',fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],"char":'\ud83d\udc59',fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],"char":'\ud83d\udc58',fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],"char":'\ud83d\udc84',fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],"char":'\ud83d\udc8b',fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],"char":'\ud83d\udc63',fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],"char":'\ud83e\udd7f',fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],"char":'\ud83d\udc60',fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],"char":'\ud83d\udc61',fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],"char":'\ud83d\udc62',fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],"char":'\ud83d\udc5e',fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],"char":'\ud83d\udc5f',fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],"char":'\ud83e\udd7e',fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],"char":'\ud83e\udde6',fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],"char":'\ud83e\udde4',fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],"char":'\ud83e\udde3',fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],"char":'\ud83d\udc52',fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],"char":'\ud83c\udfa9',fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],"char":'\ud83e\udde2',fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],"char":'\u26d1',fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],"char":'\ud83c\udf93',fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],"char":'\ud83d\udc51',fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],"char":'\ud83c\udf92',fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],"char":'\ud83e\uddf3',fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],"char":'\ud83d\udc5d',fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],"char":'\ud83d\udc5b',fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],"char":'\ud83d\udc5c',fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],"char":'\ud83d\udcbc',fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],"char":'\ud83d\udc53',fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],"char":'\ud83d\udd76',fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],"char":'\ud83e\udd7d',fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],"char":'\ud83d\udc8d',fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],"char":'\ud83c\udf02',fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],"char":'\ud83d\udc36',fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],"char":'\ud83d\udc31',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],"char":'\ud83d\udc2d',fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],"char":'\ud83d\udc39',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],"char":'\ud83d\udc30',fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],"char":'\ud83e\udd8a',fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],"char":'\ud83d\udc3b',fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],"char":'\ud83d\udc3c',fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],"char":'\ud83d\udc28',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],"char":'\ud83d\udc2f',fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],"char":'\ud83e\udd81',fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],"char":'\ud83d\udc2e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],"char":'\ud83d\udc37',fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],"char":'\ud83d\udc3d',fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],"char":'\ud83d\udc38',fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],"char":'\ud83e\udd91',fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],"char":'\ud83d\udc19',fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],"char":'\ud83e\udd90',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],"char":'\ud83d\udc35',fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],"char":'\ud83e\udd8d',fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],"char":'\ud83d\ude48',fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],"char":'\ud83d\ude49',fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],"char":'\ud83d\ude4a',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],"char":'\ud83d\udc12',fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],"char":'\ud83d\udc14',fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],"char":'\ud83d\udc27',fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],"char":'\ud83d\udc26',fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],"char":'\ud83d\udc24',fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],"char":'\ud83d\udc23',fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],"char":'\ud83d\udc25',fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],"char":'\ud83e\udd86',fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],"char":'\ud83e\udd85',fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],"char":'\ud83e\udd89',fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],"char":'\ud83e\udd87',fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],"char":'\ud83d\udc3a',fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],"char":'\ud83d\udc17',fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],"char":'\ud83d\udc34',fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],"char":'\ud83e\udd84',fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],"char":'\ud83d\udc1d',fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],"char":'\ud83d\udc1b',fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],"char":'\ud83e\udd8b',fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],"char":'\ud83d\udc0c',fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],"char":'\ud83d\udc1e',fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],"char":'\ud83d\udc1c',fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],"char":'\ud83e\udd97',fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],"char":'\ud83d\udd77',fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],"char":'\ud83e\udd82',fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],"char":'\ud83e\udd80',fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],"char":'\ud83d\udc0d',fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],"char":'\ud83e\udd8e',fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],"char":'\ud83e\udd96',fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],"char":'\ud83e\udd95',fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],"char":'\ud83d\udc22',fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],"char":'\ud83d\udc20',fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],"char":'\ud83d\udc1f',fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],"char":'\ud83d\udc21',fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],"char":'\ud83d\udc2c',fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],"char":'\ud83e\udd88',fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],"char":'\ud83d\udc33',fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],"char":'\ud83d\udc0b',fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],"char":'\ud83d\udc0a',fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],"char":'\ud83d\udc06',fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],"char":'\ud83e\udd93',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],"char":'\ud83d\udc05',fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],"char":'\ud83d\udc03',fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],"char":'\ud83d\udc02',fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],"char":'\ud83d\udc04',fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],"char":'\ud83e\udd8c',fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],"char":'\ud83d\udc2a',fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],"char":'\ud83d\udc2b',fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],"char":'\ud83e\udd92',fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],"char":'\ud83d\udc18',fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],"char":'\ud83e\udd8f',fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],"char":'\ud83d\udc10',fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],"char":'\ud83d\udc0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],"char":'\ud83d\udc11',fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],"char":'\ud83d\udc0e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],"char":'\ud83d\udc16',fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],"char":'\ud83d\udc00',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],"char":'\ud83d\udc01',fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],"char":'\ud83d\udc13',fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],"char":'\ud83e\udd83',fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],"char":'\ud83d\udd4a',fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],"char":'\ud83d\udc15',fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],"char":'\ud83d\udc29',fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],"char":'\ud83d\udc08',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],"char":'\ud83d\udc07',fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],"char":'\ud83d\udc3f',fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],"char":'\ud83e\udd94',fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],"char":'\ud83e\udd9d',fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],"char":'\ud83e\udd99',fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],"char":'\ud83e\udd9b',fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],"char":'\ud83e\udd98',fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],"char":'\ud83e\udda1',fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],"char":'\ud83e\udda2',fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],"char":'\ud83e\udd9a',fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],"char":'\ud83e\udd9c',fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],"char":'\ud83e\udd9e',fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],"char":'\ud83e\udd9f',fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],"char":'\ud83d\udc3e',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],"char":'\ud83d\udc09',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],"char":'\ud83d\udc32',fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],"char":'\ud83c\udf35',fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],"char":'\ud83c\udf84',fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],"char":'\ud83c\udf32',fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],"char":'\ud83c\udf33',fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],"char":'\ud83c\udf34',fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],"char":'\ud83c\udf31',fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],"char":'\ud83c\udf3f',fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],"char":'\u2618',fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],"char":'\ud83c\udf40',fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],"char":'\ud83c\udf8d',fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],"char":'\ud83c\udf8b',fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],"char":'\ud83c\udf43',fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],"char":'\ud83c\udf42',fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],"char":'\ud83c\udf41',fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],"char":'\ud83c\udf3e',fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],"char":'\ud83c\udf3a',fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],"char":'\ud83c\udf3b',fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],"char":'\ud83c\udf39',fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],"char":'\ud83e\udd40',fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],"char":'\ud83c\udf37',fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],"char":'\ud83c\udf3c',fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],"char":'\ud83c\udf38',fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],"char":'\ud83d\udc90',fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],"char":'\ud83c\udf44',fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],"char":'\ud83c\udf30',fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],"char":'\ud83c\udf83',fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],"char":'\ud83d\udc1a',fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],"char":'\ud83d\udd78',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],"char":'\ud83c\udf0e',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],"char":'\ud83c\udf0d',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],"char":'\ud83c\udf0f',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf15',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],"char":'\ud83c\udf16',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf17',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf18',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf11',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf12',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf13',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],"char":'\ud83c\udf14',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf1a',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf1d',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf1b',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf1c',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],"char":'\ud83c\udf1e',fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],"char":'\ud83c\udf19',fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],"char":'\u2b50',fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],"char":'\ud83c\udf1f',fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],"char":'\ud83d\udcab',fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],"char":'\u2728',fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],"char":'\u2604',fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],"char":'\u2600\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],"char":'\ud83c\udf24',fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],"char":'\u26c5',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],"char":'\ud83c\udf25',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],"char":'\ud83c\udf26',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],"char":'\u2601\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],"char":'\ud83c\udf27',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],"char":'\u26c8',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],"char":'\ud83c\udf29',fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],"char":'\u26a1',fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],"char":'\ud83d\udd25',fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],"char":'\ud83d\udca5',fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],"char":'\u2744\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],"char":'\ud83c\udf28',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],"char":'\u26c4',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],"char":'\u2603',fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],"char":'\ud83c\udf2c',fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],"char":'\ud83d\udca8',fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],"char":'\ud83c\udf2a',fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],"char":'\ud83c\udf2b',fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],"char":'\u2602',fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],"char":'\u2614',fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],"char":'\ud83d\udca7',fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],"char":'\ud83d\udca6',fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],"char":'\ud83c\udf0a',fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],"char":'\ud83c\udf4f',fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],"char":'\ud83c\udf4e',fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],"char":'\ud83c\udf50',fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],"char":'\ud83c\udf4a',fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],"char":'\ud83c\udf4b',fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],"char":'\ud83c\udf4c',fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],"char":'\ud83c\udf49',fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],"char":'\ud83c\udf47',fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],"char":'\ud83c\udf53',fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],"char":'\ud83c\udf48',fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],"char":'\ud83c\udf52',fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],"char":'\ud83c\udf51',fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],"char":'\ud83c\udf4d',fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],"char":'\ud83e\udd65',fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],"char":'\ud83e\udd5d',fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],"char":'\ud83e\udd6d',fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],"char":'\ud83e\udd51',fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],"char":'\ud83e\udd66',fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],"char":'\ud83c\udf45',fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],"char":'\ud83c\udf46',fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],"char":'\ud83e\udd52',fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],"char":'\ud83e\udd55',fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],"char":'\ud83c\udf36',fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],"char":'\ud83e\udd54',fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],"char":'\ud83c\udf3d',fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],"char":'\ud83e\udd6c',fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],"char":'\ud83c\udf60',fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],"char":'\ud83e\udd5c',fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],"char":'\ud83c\udf6f',fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],"char":'\ud83e\udd50',fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],"char":'\ud83c\udf5e',fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],"char":'\ud83e\udd56',fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],"char":'\ud83e\udd6f',fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],"char":'\ud83e\udd68',fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],"char":'\ud83e\uddc0',fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],"char":'\ud83e\udd5a',fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],"char":'\ud83e\udd53',fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],"char":'\ud83e\udd69',fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],"char":'\ud83e\udd5e',fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],"char":'\ud83c\udf57',fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],"char":'\ud83c\udf56',fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],"char":'\ud83e\uddb4',fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],"char":'\ud83c\udf64',fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],"char":'\ud83c\udf73',fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],"char":'\ud83c\udf54',fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],"char":'\ud83c\udf5f',fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],"char":'\ud83e\udd59',fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],"char":'\ud83c\udf2d',fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],"char":'\ud83c\udf55',fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],"char":'\ud83e\udd6a',fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],"char":'\ud83e\udd6b',fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],"char":'\ud83c\udf5d',fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],"char":'\ud83c\udf2e',fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],"char":'\ud83c\udf2f',fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],"char":'\ud83e\udd57',fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],"char":'\ud83e\udd58',fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],"char":'\ud83c\udf5c',fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],"char":'\ud83c\udf72',fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],"char":'\ud83c\udf65',fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],"char":'\ud83e\udd60',fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],"char":'\ud83c\udf63',fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],"char":'\ud83c\udf71',fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],"char":'\ud83c\udf5b',fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],"char":'\ud83c\udf59',fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],"char":'\ud83c\udf5a',fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],"char":'\ud83c\udf58',fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],"char":'\ud83c\udf62',fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],"char":'\ud83c\udf61',fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],"char":'\ud83c\udf67',fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],"char":'\ud83c\udf68',fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],"char":'\ud83c\udf66',fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],"char":'\ud83e\udd67',fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],"char":'\ud83c\udf70',fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],"char":'\ud83e\uddc1',fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],"char":'\ud83e\udd6e',fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],"char":'\ud83c\udf82',fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],"char":'\ud83c\udf6e',fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],"char":'\ud83c\udf6c',fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],"char":'\ud83c\udf6d',fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],"char":'\ud83c\udf6b',fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],"char":'\ud83c\udf7f',fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],"char":'\ud83e\udd5f',fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],"char":'\ud83c\udf69',fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],"char":'\ud83c\udf6a',fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],"char":'\ud83e\udd5b',fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"char":'\ud83c\udf7a',fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"char":'\ud83c\udf7b',fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],"char":'\ud83e\udd42',fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],"char":'\ud83c\udf77',fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],"char":'\ud83e\udd43',fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],"char":'\ud83c\udf78',fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],"char":'\ud83c\udf79',fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],"char":'\ud83c\udf7e',fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],"char":'\ud83c\udf76',fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],"char":'\ud83c\udf75',fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],"char":'\ud83e\udd64',fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],"char":'\u2615',fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],"char":'\ud83c\udf7c',fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],"char":'\ud83e\uddc2',fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],"char":'\ud83e\udd44',fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],"char":'\ud83c\udf74',fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],"char":'\ud83c\udf7d',fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],"char":'\ud83e\udd63',fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],"char":'\ud83e\udd61',fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],"char":'\ud83e\udd62',fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],"char":'\u26bd',fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],"char":'\ud83c\udfc0',fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],"char":'\ud83c\udfc8',fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],"char":'\u26be',fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],"char":'\ud83e\udd4e',fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],"char":'\ud83c\udfbe',fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],"char":'\ud83c\udfd0',fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],"char":'\ud83c\udfc9',fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],"char":'\ud83e\udd4f',fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],"char":'\ud83c\udfb1',fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],"char":'\u26f3',fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],"char":'\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],"char":'\ud83c\udfcc',fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],"char":'\ud83c\udfd3',fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],"char":'\ud83c\udff8',fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],"char":'\ud83e\udd45',fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],"char":'\ud83c\udfd2',fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],"char":'\ud83c\udfd1',fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],"char":'\ud83e\udd4d',fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],"char":'\ud83c\udfcf',fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],"char":'\ud83c\udfbf',fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],"char":'\u26f7',fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],"char":'\ud83c\udfc2',fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],"char":'\ud83e\udd3a',fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],"char":'\ud83e\udd3c\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],"char":'\ud83e\udd3c\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],"char":'\ud83e\udd38\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],"char":'\ud83e\udd38\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],"char":'\ud83e\udd3e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],"char":'\ud83e\udd3e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],"char":'\u26f8',fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],"char":'\ud83e\udd4c',fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],"char":'\ud83d\udef9',fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],"char":'\ud83d\udef7',fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],"char":'\ud83c\udff9',fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],"char":'\ud83c\udfa3',fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],"char":'\ud83e\udd4a',fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],"char":'\ud83e\udd4b',fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],"char":'\ud83d\udea3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],"char":'\ud83d\udea3',fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],"char":'\ud83e\uddd7\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],"char":'\ud83e\uddd7\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],"char":'\ud83c\udfca\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],"char":'\ud83c\udfca',fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],"char":'\ud83e\udd3d\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],"char":'\ud83e\udd3d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],"char":'\ud83e\uddd8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],"char":'\ud83e\uddd8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],"char":'\ud83c\udfc4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],"char":'\ud83c\udfc4',fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],"char":'\ud83d\udec0',fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],"char":'\u26f9\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],"char":'\u26f9',fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],"char":'\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],"char":'\ud83c\udfcb',fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],"char":'\ud83d\udeb4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],"char":'\ud83d\udeb4',fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],"char":'\ud83d\udeb5\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],"char":'\ud83d\udeb5',fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],"char":'\ud83c\udfc7',fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],"char":'\ud83d\udd74',fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],"char":'\ud83c\udfc6',fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],"char":'\ud83c\udfbd',fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],"char":'\ud83c\udfc5',fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],"char":'\ud83c\udf96',fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],"char":'\ud83e\udd47',fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],"char":'\ud83e\udd48',fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],"char":'\ud83e\udd49',fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],"char":'\ud83c\udf97',fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],"char":'\ud83c\udff5',fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],"char":'\ud83c\udfab',fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],"char":'\ud83c\udf9f',fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],"char":'\ud83c\udfad',fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],"char":'\ud83c\udfa8',fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],"char":'\ud83c\udfaa',fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],"char":'\ud83e\udd39\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],"char":'\ud83e\udd39\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],"char":'\ud83c\udfa4',fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],"char":'\ud83c\udfa7',fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],"char":'\ud83c\udfbc',fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],"char":'\ud83c\udfb9',fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],"char":'\ud83e\udd41',fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],"char":'\ud83c\udfb7',fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],"char":'\ud83c\udfba',fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],"char":'\ud83c\udfb8',fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],"char":'\ud83c\udfbb',fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],"char":'\ud83c\udfac',fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],"char":'\ud83c\udfae',fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],"char":'\ud83d\udc7e',fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],"char":'\ud83c\udfaf',fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],"char":'\ud83c\udfb2',fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],"char":"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],"char":'\ud83c\udfb0',fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],"char":'\ud83e\udde9',fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],"char":'\ud83c\udfb3',fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],"char":'\ud83d\ude97',fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],"char":'\ud83d\ude95',fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],"char":'\ud83d\ude99',fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],"char":'\ud83d\ude8c',fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],"char":'\ud83d\ude8e',fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],"char":'\ud83c\udfce',fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],"char":'\ud83d\ude93',fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],"char":'\ud83d\ude91',fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],"char":'\ud83d\ude92',fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],"char":'\ud83d\ude90',fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],"char":'\ud83d\ude9a',fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],"char":'\ud83d\ude9b',fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],"char":'\ud83d\ude9c',fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],"char":'\ud83d\udef4',fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],"char":'\ud83c\udfcd',fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],"char":'\ud83d\udeb2',fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],"char":'\ud83d\udef5',fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],"char":'\ud83d\udea8',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],"char":'\ud83d\ude94',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],"char":'\ud83d\ude8d',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],"char":'\ud83d\ude98',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],"char":'\ud83d\ude96',fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],"char":'\ud83d\udea1',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],"char":'\ud83d\udea0',fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],"char":'\ud83d\ude9f',fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],"char":'\ud83d\ude83',fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],"char":'\ud83d\ude8b',fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],"char":'\ud83d\ude9d',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],"char":'\ud83d\ude84',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],"char":'\ud83d\ude85',fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],"char":'\ud83d\ude88',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],"char":'\ud83d\ude9e',fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],"char":'\ud83d\ude82',fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],"char":'\ud83d\ude86',fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],"char":'\ud83d\ude87',fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],"char":'\ud83d\ude8a',fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],"char":'\ud83d\ude89',fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],"char":'\ud83d\udef8',fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],"char":'\ud83d\ude81',fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],"char":'\ud83d\udee9',fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],"char":'\u2708\ufe0f',fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],"char":'\ud83d\udeeb',fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],"char":'\ud83d\udeec',fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],"char":'\u26f5',fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],"char":'\ud83d\udee5',fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],"char":'\ud83d\udea4',fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],"char":'\u26f4',fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],"char":'\ud83d\udef3',fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],"char":'\ud83d\ude80',fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],"char":'\ud83d\udef0',fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],"char":'\ud83d\udcba',fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],"char":'\ud83d\udef6',fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],"char":'\u2693',fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],"char":'\ud83d\udea7',fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],"char":'\u26fd',fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],"char":'\ud83d\ude8f',fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],"char":'\ud83d\udea6',fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],"char":'\ud83d\udea5',fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],"char":'\ud83c\udfc1',fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],"char":'\ud83d\udea2',fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],"char":'\ud83c\udfa1',fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],"char":'\ud83c\udfa2',fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],"char":'\ud83c\udfa0',fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],"char":'\ud83c\udfd7',fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],"char":'\ud83c\udf01',fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],"char":'\ud83d\uddfc',fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],"char":'\ud83c\udfed',fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],"char":'\u26f2',fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],"char":'\ud83c\udf91',fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],"char":'\u26f0',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],"char":'\ud83c\udfd4',fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],"char":'\ud83d\uddfb',fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],"char":'\ud83c\udf0b',fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],"char":'\ud83d\uddfe',fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],"char":'\ud83c\udfd5',fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],"char":'\u26fa',fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],"char":'\ud83c\udfde',fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],"char":'\ud83d\udee3',fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],"char":'\ud83d\udee4',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],"char":'\ud83c\udf05',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],"char":'\ud83c\udf04',fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],"char":'\ud83c\udfdc',fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],"char":'\ud83c\udfd6',fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],"char":'\ud83c\udfdd',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],"char":'\ud83c\udf07',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],"char":'\ud83c\udf06',fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],"char":'\ud83c\udfd9',fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],"char":'\ud83c\udf03',fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],"char":'\ud83c\udf09',fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],"char":'\ud83c\udf0c',fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],"char":'\ud83c\udf20',fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],"char":'\ud83c\udf87',fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],"char":'\ud83c\udf86',fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],"char":'\ud83c\udf08',fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],"char":'\ud83c\udfd8',fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],"char":'\ud83c\udff0',fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],"char":'\ud83c\udfef',fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],"char":'\ud83c\udfdf',fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],"char":'\ud83d\uddfd',fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],"char":'\ud83c\udfe0',fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],"char":'\ud83c\udfe1',fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],"char":'\ud83c\udfda',fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],"char":'\ud83c\udfe2',fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],"char":'\ud83c\udfec',fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],"char":'\ud83c\udfe3',fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],"char":'\ud83c\udfe4',fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],"char":'\ud83c\udfe5',fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],"char":'\ud83c\udfe6',fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],"char":'\ud83c\udfe8',fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],"char":'\ud83c\udfea',fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],"char":'\ud83c\udfeb',fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],"char":'\ud83c\udfe9',fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],"char":'\ud83d\udc92',fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],"char":'\ud83c\udfdb',fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],"char":'\u26ea',fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],"char":'\ud83d\udd4c',fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],"char":'\ud83d\udd4d',fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],"char":'\ud83d\udd4b',fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],"char":'\u26e9',fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],"char":'\u231a',fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],"char":'\ud83d\udcf1',fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],"char":'\ud83d\udcf2',fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],"char":'\ud83d\udcbb',fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],"char":'\u2328',fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],"char":'\ud83d\udda5',fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],"char":'\ud83d\udda8',fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],"char":'\ud83d\uddb1',fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],"char":'\ud83d\uddb2',fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],"char":'\ud83d\udd79',fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],"char":'\ud83d\udddc',fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],"char":'\ud83d\udcbd',fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],"char":'\ud83d\udcbe',fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],"char":'\ud83d\udcbf',fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],"char":'\ud83d\udcc0',fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],"char":'\ud83d\udcfc',fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],"char":'\ud83d\udcf7',fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],"char":'\ud83d\udcf8',fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],"char":'\ud83d\udcf9',fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],"char":'\ud83c\udfa5',fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],"char":'\ud83d\udcfd',fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],"char":'\ud83c\udf9e',fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],"char":'\ud83d\udcde',fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],"char":'\u260e\ufe0f',fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],"char":'\ud83d\udcdf',fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],"char":'\ud83d\udce0',fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],"char":'\ud83d\udcfa',fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],"char":'\ud83d\udcfb',fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],"char":'\ud83c\udf99',fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],"char":'\ud83c\udf9a',fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],"char":'\ud83c\udf9b',fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],"char":'\ud83e\udded',fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],"char":'\u23f1',fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],"char":'\u23f2',fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],"char":'\u23f0',fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],"char":'\ud83d\udd70',fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],"char":'\u23f3',fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],"char":'\u231b',fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],"char":'\ud83d\udce1',fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],"char":'\ud83d\udd0b',fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],"char":'\ud83d\udd0c',fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],"char":'\ud83d\udca1',fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],"char":'\ud83d\udd26',fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],"char":'\ud83d\udd6f',fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],"char":'\ud83e\uddef',fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],"char":'\ud83d\uddd1',fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],"char":'\ud83d\udee2',fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],"char":'\ud83d\udcb8',fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],"char":'\ud83d\udcb5',fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],"char":'\ud83d\udcb4',fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],"char":'\ud83d\udcb6',fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],"char":'\ud83d\udcb7',fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],"char":'\ud83d\udcb0',fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],"char":'\ud83d\udcb3',fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],"char":'\ud83d\udc8e',fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],"char":'\u2696',fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],"char":'\ud83e\uddf0',fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],"char":'\ud83d\udd27',fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],"char":'\ud83d\udd28',fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],"char":'\u2692',fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],"char":'\ud83d\udee0',fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],"char":'\u26cf',fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],"char":'\ud83d\udd29',fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],"char":'\u2699',fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],"char":'\ud83e\uddf1',fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],"char":'\u26d3',fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],"char":'\ud83e\uddf2',fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],"char":'\ud83d\udd2b',fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],"char":'\ud83d\udca3',fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],"char":'\ud83e\udde8',fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],"char":'\ud83d\udd2a',fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],"char":'\ud83d\udde1',fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],"char":'\u2694',fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],"char":'\ud83d\udee1',fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],"char":'\ud83d\udeac',fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],"char":'\u2620',fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],"char":'\u26b0',fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],"char":'\u26b1',fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],"char":'\ud83c\udffa',fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],"char":'\ud83d\udd2e',fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],"char":'\ud83d\udcff',fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],"char":'\ud83e\uddff',fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],"char":'\ud83d\udc88',fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],"char":'\u2697',fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],"char":'\ud83d\udd2d',fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],"char":'\ud83d\udd2c',fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],"char":'\ud83d\udd73',fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],"char":'\ud83d\udc8a',fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],"char":'\ud83d\udc89',fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],"char":'\ud83e\uddec',fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],"char":'\ud83e\udda0',fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],"char":'\ud83e\uddeb',fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],"char":'\ud83e\uddea',fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],"char":'\ud83c\udf21',fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],"char":'\ud83e\uddf9',fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],"char":'\ud83e\uddfa',fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],"char":'\ud83e\uddfb',fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],"char":'\ud83c\udff7',fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],"char":'\ud83d\udd16',fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],"char":'\ud83d\udebd',fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],"char":'\ud83d\udebf',fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],"char":'\ud83d\udec1',fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],"char":'\ud83e\uddfc',fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],"char":'\ud83e\uddfd',fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],"char":'\ud83e\uddf4',fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],"char":'\ud83d\udd11',fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],"char":'\ud83d\udddd',fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],"char":'\ud83d\udecb',fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],"char":'\ud83d\udecc',fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],"char":'\ud83d\udecf',fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],"char":'\ud83d\udeaa',fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],"char":'\ud83d\udece',fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],"char":'\ud83e\uddf8',fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],"char":'\ud83d\uddbc',fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],"char":'\ud83d\uddfa',fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],"char":'\u26f1',fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],"char":'\ud83d\uddff',fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],"char":'\ud83d\udecd',fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],"char":'\ud83d\uded2',fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],"char":'\ud83c\udf88',fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],"char":'\ud83c\udf8f',fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],"char":'\ud83c\udf80',fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],"char":'\ud83c\udf81',fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],"char":'\ud83c\udf8a',fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],"char":'\ud83c\udf89',fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],"char":'\ud83c\udf8e',fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],"char":'\ud83c\udf90',fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],"char":'\ud83c\udf8c',fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],"char":'\ud83c\udfee',fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],"char":'\ud83e\udde7',fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],"char":'\u2709\ufe0f',fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],"char":'\ud83d\udce9',fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],"char":'\ud83d\udce8',fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],"char":'\ud83d\udce7',fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],"char":'\ud83d\udc8c',fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],"char":'\ud83d\udcee',fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],"char":'\ud83d\udcea',fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],"char":'\ud83d\udceb',fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],"char":'\ud83d\udcec',fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],"char":'\ud83d\udced',fitzpatrick_scale:!1,category:"objects"},"package":{keywords:["mail","gift","cardboard","box","moving"],"char":'\ud83d\udce6',fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],"char":'\ud83d\udcef',fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],"char":'\ud83d\udce5',fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],"char":'\ud83d\udce4',fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],"char":'\ud83d\udcdc',fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],"char":'\ud83d\udcc3',fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],"char":'\ud83d\udcd1',fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],"char":'\ud83e\uddfe',fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],"char":'\ud83d\udcca',fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],"char":'\ud83d\udcc8',fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],"char":'\ud83d\udcc9',fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],"char":'\ud83d\udcc4',fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],"char":'\ud83d\udcc5',fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],"char":'\ud83d\udcc6',fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],"char":'\ud83d\uddd3',fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],"char":'\ud83d\udcc7',fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],"char":'\ud83d\uddc3',fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],"char":'\ud83d\uddf3',fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],"char":'\ud83d\uddc4',fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],"char":'\ud83d\udccb',fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],"char":'\ud83d\uddd2',fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],"char":'\ud83d\udcc1',fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],"char":'\ud83d\udcc2',fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],"char":'\ud83d\uddc2',fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],"char":'\ud83d\uddde',fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],"char":'\ud83d\udcf0',fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],"char":'\ud83d\udcd3',fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],"char":'\ud83d\udcd5',fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],"char":'\ud83d\udcd7',fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],"char":'\ud83d\udcd8',fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],"char":'\ud83d\udcd9',fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],"char":'\ud83d\udcd4',fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],"char":'\ud83d\udcd2',fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],"char":'\ud83d\udcda',fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],"char":'\ud83d\udcd6',fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],"char":'\ud83e\uddf7',fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],"char":'\ud83d\udd17',fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],"char":'\ud83d\udcce',fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],"char":'\ud83d\udd87',fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],"char":'\u2702\ufe0f',fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],"char":'\ud83d\udcd0',fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],"char":'\ud83d\udccf',fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],"char":'\ud83e\uddee',fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],"char":'\ud83d\udccc',fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],"char":'\ud83d\udccd',fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],"char":'\ud83d\udea9',fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],"char":'\ud83c\udff3',fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],"char":'\ud83c\udff4',fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],"char":'\ud83c\udff3\ufe0f\u200d\ud83c\udf08',fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],"char":'\ud83d\udd10',fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],"char":'\ud83d\udd12',fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],"char":'\ud83d\udd13',fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],"char":'\ud83d\udd0f',fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],"char":'\ud83d\udd8a',fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],"char":'\ud83d\udd8b',fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],"char":'\u2712\ufe0f',fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],"char":'\ud83d\udcdd',fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],"char":'\u270f\ufe0f',fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],"char":'\ud83d\udd8d',fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],"char":'\ud83d\udd8c',fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],"char":'\ud83d\udd0d',fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],"char":'\ud83d\udd0e',fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],"char":'\u2764\ufe0f',fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83e\udde1',fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc9b',fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc9a',fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc99',fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc9c',fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],"char":'\ud83d\udda4',fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],"char":'\ud83d\udc94',fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],"char":'\u2763',fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],"char":'\ud83d\udc95',fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc9e',fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],"char":'\ud83d\udc93',fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],"char":'\ud83d\udc97',fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc96',fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],"char":'\ud83d\udc98',fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],"char":'\ud83d\udc9d',fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],"char":'\ud83d\udc9f',fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],"char":'\u262e',fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],"char":'\u271d',fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],"char":'\u262a',fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],"char":'\ud83d\udd49',fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],"char":'\u2638',fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],"char":'\u2721',fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],"char":'\ud83d\udd2f',fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],"char":'\ud83d\udd4e',fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],"char":'\u262f',fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],"char":'\u2626',fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],"char":'\ud83d\uded0',fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],"char":'\u26ce',fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],"char":'\u2648',fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],"char":'\u2649',fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u264a',fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u264b',fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],"char":'\u264c',fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u264d',fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],"char":'\u264e',fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],"char":'\u264f',fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u2650',fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u2651',fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],"char":'\u2652',fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],"char":'\u2653',fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],"char":'\ud83c\udd94',fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],"char":'\u269b',fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],"char":'\ud83c\ude33',fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],"char":'\ud83c\ude39',fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],"char":'\u2622',fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],"char":'\u2623',fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],"char":'\ud83d\udcf4',fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],"char":'\ud83d\udcf3',fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],"char":'\ud83c\ude36',fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],"char":'\ud83c\ude1a',fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],"char":'\ud83c\ude38',fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],"char":'\ud83c\ude3a',fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],"char":'\ud83c\ude37\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],"char":'\u2734\ufe0f',fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],"char":'\ud83c\udd9a',fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],"char":'\ud83c\ude51',fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],"char":'\ud83d\udcae',fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],"char":'\ud83c\ude50',fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],"char":'\u3299\ufe0f',fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],"char":'\u3297\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],"char":'\ud83c\ude34',fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],"char":'\ud83c\ude35',fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],"char":'\ud83c\ude32',fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],"char":'\ud83c\udd70\ufe0f',fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],"char":'\ud83c\udd71\ufe0f',fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],"char":'\ud83c\udd8e',fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],"char":'\ud83c\udd91',fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],"char":'\ud83c\udd7e\ufe0f',fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],"char":'\ud83c\udd98',fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],"char":'\u26d4',fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],"char":'\ud83d\udcdb',fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],"char":'\ud83d\udeab',fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],"char":'\u274c',fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],"char":'\u2b55',fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],"char":'\ud83d\uded1',fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],"char":'\ud83d\udca2',fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],"char":'\u2668\ufe0f',fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],"char":'\ud83d\udeb7',fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],"char":'\ud83d\udeaf',fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],"char":'\ud83d\udeb3',fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],"char":'\ud83d\udeb1',fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],"char":'\ud83d\udd1e',fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],"char":'\ud83d\udcf5',fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],"char":'\u2757',fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],"char":'\u2755',fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],"char":'\u2753',fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],"char":'\u2754',fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],"char":'\u203c\ufe0f',fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],"char":'\u2049\ufe0f',fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],"char":'\ud83d\udd05',fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],"char":'\ud83d\udd06',fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],"char":'\ud83d\udd31',fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],"char":'\u269c',fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],"char":'\u303d\ufe0f',fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],"char":'\u26a0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],"char":'\ud83d\udeb8',fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],"char":'\ud83d\udd30',fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],"char":'\u267b\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],"char":'\ud83c\ude2f',fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],"char":'\ud83d\udcb9',fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],"char":'\u2747\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],"char":'\u2733\ufe0f',fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],"char":'\u274e',fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],"char":'\u2705',fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],"char":'\ud83d\udca0',fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],"char":'\ud83c\udf00',fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],"char":'\u27bf',fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],"char":'\ud83c\udf10',fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],"char":'\u24c2\ufe0f',fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],"char":'\ud83c\udfe7',fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],"char":'\ud83c\ude02\ufe0f',fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],"char":'\ud83d\udec2',fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],"char":'\ud83d\udec3',fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],"char":'\ud83d\udec4',fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],"char":'\ud83d\udec5',fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],"char":'\u267f',fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],"char":'\ud83d\udead',fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],"char":'\ud83d\udebe',fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],"char":'\ud83c\udd7f\ufe0f',fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],"char":'\ud83d\udeb0',fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],"char":'\ud83d\udeb9',fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],"char":'\ud83d\udeba',fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],"char":'\ud83d\udebc',fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],"char":'\ud83d\udebb',fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],"char":'\ud83d\udeae',fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],"char":'\ud83c\udfa6',fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],"char":'\ud83d\udcf6',fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],"char":'\ud83c\ude01',fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],"char":'\ud83c\udd96',fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],"char":'\ud83c\udd97',fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],"char":'\ud83c\udd99',fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],"char":'\ud83c\udd92',fitzpatrick_scale:!1,category:"symbols"},"new":{keywords:["blue-square","words","start"],"char":'\ud83c\udd95',fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],"char":'\ud83c\udd93',fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],"char":'0\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],"char":'1\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],"char":'2\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],"char":'3\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],"char":'4\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],"char":'5\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],"char":'6\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],"char":'7\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],"char":'8\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],"char":'9\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],"char":'\ud83d\udd1f',fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],"char":'*\u20e3',fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],"char":'\u23cf\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],"char":'\u25b6\ufe0f',fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],"char":'\u23f8',fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],"char":'\u23ed',fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],"char":'\u23f9',fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],"char":'\u23fa',fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],"char":'\u23ef',fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],"char":'\u23ee',fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],"char":'\u23e9',fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],"char":'\u23ea',fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],"char":'\ud83d\udd00',fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],"char":'\ud83d\udd01',fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],"char":'\ud83d\udd02',fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],"char":'\u25c0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],"char":'\ud83d\udd3c',fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],"char":'\ud83d\udd3d',fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],"char":'\u23eb',fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],"char":'\u23ec',fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],"char":'\u27a1\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],"char":'\u2b05\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],"char":'\u2b06\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],"char":'\u2b07\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],"char":'\u2197\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],"char":'\u2198\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],"char":'\u2199\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],"char":'\u2196\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],"char":'\u2195\ufe0f',fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],"char":'\u2194\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],"char":'\ud83d\udd04',fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],"char":'\u21aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],"char":'\u21a9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],"char":'\u2934\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],"char":'\u2935\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],"char":'#\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],"char":'\u2139\ufe0f',fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],"char":'\ud83d\udd24',fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],"char":'\ud83d\udd21',fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],"char":'\ud83d\udd20',fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],"char":'\ud83d\udd23',fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],"char":'\ud83c\udfb5',fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],"char":'\ud83c\udfb6',fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],"char":'\u3030\ufe0f',fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],"char":'\u27b0',fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],"char":'\u2714\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],"char":'\ud83d\udd03',fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],"char":'\u2795',fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],"char":'\u2796',fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],"char":'\u2797',fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],"char":'\u2716\ufe0f',fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],"char":'\u267e',fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],"char":'\ud83d\udcb2',fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],"char":'\ud83d\udcb1',fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],"char":'\xa9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],"char":'\xae\ufe0f',fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],"char":'\u2122\ufe0f',fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],"char":'\ud83d\udd1a',fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],"char":'\ud83d\udd19',fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],"char":'\ud83d\udd1b',fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],"char":'\ud83d\udd1d',fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],"char":'\ud83d\udd1c',fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],"char":'\u2611\ufe0f',fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],"char":'\ud83d\udd18',fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],"char":'\u26aa',fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],"char":'\u26ab',fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],"char":'\ud83d\udd34',fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],"char":'\ud83d\udd35',fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],"char":'\ud83d\udd38',fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],"char":'\ud83d\udd39',fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],"char":'\ud83d\udd36',fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],"char":'\ud83d\udd37',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],"char":'\ud83d\udd3a',fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],"char":'\u25aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],"char":'\u25ab\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],"char":'\u2b1b',fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],"char":'\u2b1c',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],"char":'\ud83d\udd3b',fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],"char":'\u25fc\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],"char":'\u25fb\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],"char":'\u25fe',fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],"char":'\u25fd',fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],"char":'\ud83d\udd32',fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],"char":'\ud83d\udd33',fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],"char":'\ud83d\udd08',fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],"char":'\ud83d\udd09',fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],"char":'\ud83d\udd0a',fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],"char":'\ud83d\udd07',fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],"char":'\ud83d\udce3',fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],"char":'\ud83d\udce2',fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],"char":'\ud83d\udd14',fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],"char":'\ud83d\udd15',fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],"char":'\ud83c\udccf',fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],"char":'\ud83c\udc04',fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],"char":'\u2660\ufe0f',fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],"char":'\u2663\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],"char":'\u2665\ufe0f',fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],"char":'\u2666\ufe0f',fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],"char":'\ud83c\udfb4',fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],"char":'\ud83d\udcad',fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],"char":'\ud83d\uddef',fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],"char":'\ud83d\udcac',fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],"char":'\ud83d\udde8',fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd50',fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd51',fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd52',fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd53',fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd54',fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],"char":'\ud83d\udd55',fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd56',fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd57',fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd58',fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd59',fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5a',fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],"char":'\ud83d\udd5b',fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5c',fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5d',fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5e',fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5f',fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd60',fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd61',fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd62',fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd63',fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd64',fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd65',fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd66',fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd67',fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],"char":'\ud83c\udde8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],"char":'\ud83c\uddea\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],"char":'\ud83c\uddeb\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],"char":'\ud83c\udde9\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],"char":'\ud83c\uddef\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],"char":'\ud83c\uddef\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],"char":'\ud83c\uddef\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],"char":'\ud83c\uddef\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],"char":'\ud83c\uddfd\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],"char":'\ud83c\uddfe\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],"char":'\ud83c\uddf0\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],"char":'\ud83c\uddf4\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],"char":'\ud83c\uddf6\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],"char":'\ud83c\uddfc\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],"char":'\ud83c\uddff\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],"char":'\ud83c\uddf0\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],"char":'\ud83c\uddec\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],"char":'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],"char":'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],"char":'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],"char":'\ud83c\uddfc\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],"char":'\ud83c\uddfe\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],"char":'\ud83c\uddff\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],"char":'\ud83c\uddff\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],"char":'\ud83c\uddfa\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],"char":'\ud83c\udff4\u200d\u2620\ufe0f',fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojis.js b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojis.js new file mode 100644 index 0000000..4adb59b --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojis.js @@ -0,0 +1,9423 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons", { + grinning: { + keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], + "char": "\ud83d\ude00", + fitzpatrick_scale: false, + category: "people" + }, + grimacing: { + keywords: [ "face", "grimace", "teeth" ], + "char": "\ud83d\ude2c", + fitzpatrick_scale: false, + category: "people" + }, + grin: { + keywords: [ "face", "happy", "smile", "joy", "kawaii" ], + "char": "\ud83d\ude01", + fitzpatrick_scale: false, + category: "people" + }, + joy: { + keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], + "char": "\ud83d\ude02", + fitzpatrick_scale: false, + category: "people" + }, + rofl: { + keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], + "char": "\ud83e\udd23", + fitzpatrick_scale: false, + category: "people" + }, + partying: { + keywords: [ "face", "celebration", "woohoo" ], + "char": "\ud83e\udd73", + fitzpatrick_scale: false, + category: "people" + }, + smiley: { + keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], + "char": "\ud83d\ude03", + fitzpatrick_scale: false, + category: "people" + }, + smile: { + keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], + "char": "\ud83d\ude04", + fitzpatrick_scale: false, + category: "people" + }, + sweat_smile: { + keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], + "char": "\ud83d\ude05", + fitzpatrick_scale: false, + category: "people" + }, + laughing: { + keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], + "char": "\ud83d\ude06", + fitzpatrick_scale: false, + category: "people" + }, + innocent: { + keywords: [ "face", "angel", "heaven", "halo" ], + "char": "\ud83d\ude07", + fitzpatrick_scale: false, + category: "people" + }, + wink: { + keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], + "char": "\ud83d\ude09", + fitzpatrick_scale: false, + category: "people" + }, + blush: { + keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], + "char": "\ud83d\ude0a", + fitzpatrick_scale: false, + category: "people" + }, + slightly_smiling_face: { + keywords: [ "face", "smile" ], + "char": "\ud83d\ude42", + fitzpatrick_scale: false, + category: "people" + }, + upside_down_face: { + keywords: [ "face", "flipped", "silly", "smile" ], + "char": "\ud83d\ude43", + fitzpatrick_scale: false, + category: "people" + }, + relaxed: { + keywords: [ "face", "blush", "massage", "happiness" ], + "char": "\u263a\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + yum: { + keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], + "char": "\ud83d\ude0b", + fitzpatrick_scale: false, + category: "people" + }, + relieved: { + keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], + "char": "\ud83d\ude0c", + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], + "char": "\ud83d\ude0d", + fitzpatrick_scale: false, + category: "people" + }, + smiling_face_with_three_hearts: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], + "char": "\ud83e\udd70", + fitzpatrick_scale: false, + category: "people" + }, + kissing_heart: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + "char": "\ud83d\ude18", + fitzpatrick_scale: false, + category: "people" + }, + kissing: { + keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], + "char": "\ud83d\ude17", + fitzpatrick_scale: false, + category: "people" + }, + kissing_smiling_eyes: { + keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], + "char": "\ud83d\ude19", + fitzpatrick_scale: false, + category: "people" + }, + kissing_closed_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + "char": "\ud83d\ude1a", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_winking_eye: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], + "char": "\ud83d\ude1c", + fitzpatrick_scale: false, + category: "people" + }, + zany: { + keywords: [ "face", "goofy", "crazy" ], + "char": "\ud83e\udd2a", + fitzpatrick_scale: false, + category: "people" + }, + raised_eyebrow: { + keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], + "char": "\ud83e\udd28", + fitzpatrick_scale: false, + category: "people" + }, + monocle: { + keywords: [ "face", "stuffy", "wealthy" ], + "char": "\ud83e\uddd0", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_closed_eyes: { + keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], + "char": "\ud83d\ude1d", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], + "char": "\ud83d\ude1b", + fitzpatrick_scale: false, + category: "people" + }, + money_mouth_face: { + keywords: [ "face", "rich", "dollar", "money" ], + "char": "\ud83e\udd11", + fitzpatrick_scale: false, + category: "people" + }, + nerd_face: { + keywords: [ "face", "nerdy", "geek", "dork" ], + "char": "\ud83e\udd13", + fitzpatrick_scale: false, + category: "people" + }, + sunglasses: { + keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], + "char": "\ud83d\ude0e", + fitzpatrick_scale: false, + category: "people" + }, + star_struck: { + keywords: [ "face", "smile", "starry", "eyes", "grinning" ], + "char": "\ud83e\udd29", + fitzpatrick_scale: false, + category: "people" + }, + clown_face: { + keywords: [ "face" ], + "char": "\ud83e\udd21", + fitzpatrick_scale: false, + category: "people" + }, + cowboy_hat_face: { + keywords: [ "face", "cowgirl", "hat" ], + "char": "\ud83e\udd20", + fitzpatrick_scale: false, + category: "people" + }, + hugs: { + keywords: [ "face", "smile", "hug" ], + "char": "\ud83e\udd17", + fitzpatrick_scale: false, + category: "people" + }, + smirk: { + keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], + "char": "\ud83d\ude0f", + fitzpatrick_scale: false, + category: "people" + }, + no_mouth: { + keywords: [ "face", "hellokitty" ], + "char": "\ud83d\ude36", + fitzpatrick_scale: false, + category: "people" + }, + neutral_face: { + keywords: [ "indifference", "meh", ":|", "neutral" ], + "char": "\ud83d\ude10", + fitzpatrick_scale: false, + category: "people" + }, + expressionless: { + keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], + "char": "\ud83d\ude11", + fitzpatrick_scale: false, + category: "people" + }, + unamused: { + keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], + "char": "\ud83d\ude12", + fitzpatrick_scale: false, + category: "people" + }, + roll_eyes: { + keywords: [ "face", "eyeroll", "frustrated" ], + "char": "\ud83d\ude44", + fitzpatrick_scale: false, + category: "people" + }, + thinking: { + keywords: [ "face", "hmmm", "think", "consider" ], + "char": "\ud83e\udd14", + fitzpatrick_scale: false, + category: "people" + }, + lying_face: { + keywords: [ "face", "lie", "pinocchio" ], + "char": "\ud83e\udd25", + fitzpatrick_scale: false, + category: "people" + }, + hand_over_mouth: { + keywords: [ "face", "whoops", "shock", "surprise" ], + "char": "\ud83e\udd2d", + fitzpatrick_scale: false, + category: "people" + }, + shushing: { + keywords: [ "face", "quiet", "shhh" ], + "char": "\ud83e\udd2b", + fitzpatrick_scale: false, + category: "people" + }, + symbols_over_mouth: { + keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], + "char": "\ud83e\udd2c", + fitzpatrick_scale: false, + category: "people" + }, + exploding_head: { + keywords: [ "face", "shocked", "mind", "blown" ], + "char": "\ud83e\udd2f", + fitzpatrick_scale: false, + category: "people" + }, + flushed: { + keywords: [ "face", "blush", "shy", "flattered" ], + "char": "\ud83d\ude33", + fitzpatrick_scale: false, + category: "people" + }, + disappointed: { + keywords: [ "face", "sad", "upset", "depressed", ":(" ], + "char": "\ud83d\ude1e", + fitzpatrick_scale: false, + category: "people" + }, + worried: { + keywords: [ "face", "concern", "nervous", ":(" ], + "char": "\ud83d\ude1f", + fitzpatrick_scale: false, + category: "people" + }, + angry: { + keywords: [ "mad", "face", "annoyed", "frustrated" ], + "char": "\ud83d\ude20", + fitzpatrick_scale: false, + category: "people" + }, + rage: { + keywords: [ "angry", "mad", "hate", "despise" ], + "char": "\ud83d\ude21", + fitzpatrick_scale: false, + category: "people" + }, + pensive: { + keywords: [ "face", "sad", "depressed", "upset" ], + "char": "\ud83d\ude14", + fitzpatrick_scale: false, + category: "people" + }, + confused: { + keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], + "char": "\ud83d\ude15", + fitzpatrick_scale: false, + category: "people" + }, + slightly_frowning_face: { + keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], + "char": "\ud83d\ude41", + fitzpatrick_scale: false, + category: "people" + }, + frowning_face: { + keywords: [ "face", "sad", "upset", "frown" ], + "char": "\u2639", + fitzpatrick_scale: false, + category: "people" + }, + persevere: { + keywords: [ "face", "sick", "no", "upset", "oops" ], + "char": "\ud83d\ude23", + fitzpatrick_scale: false, + category: "people" + }, + confounded: { + keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], + "char": "\ud83d\ude16", + fitzpatrick_scale: false, + category: "people" + }, + tired_face: { + keywords: [ "sick", "whine", "upset", "frustrated" ], + "char": "\ud83d\ude2b", + fitzpatrick_scale: false, + category: "people" + }, + weary: { + keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], + "char": "\ud83d\ude29", + fitzpatrick_scale: false, + category: "people" + }, + pleading: { + keywords: [ "face", "begging", "mercy" ], + "char": "\ud83e\udd7a", + fitzpatrick_scale: false, + category: "people" + }, + triumph: { + keywords: [ "face", "gas", "phew", "proud", "pride" ], + "char": "\ud83d\ude24", + fitzpatrick_scale: false, + category: "people" + }, + open_mouth: { + keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], + "char": "\ud83d\ude2e", + fitzpatrick_scale: false, + category: "people" + }, + scream: { + keywords: [ "face", "munch", "scared", "omg" ], + "char": "\ud83d\ude31", + fitzpatrick_scale: false, + category: "people" + }, + fearful: { + keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], + "char": "\ud83d\ude28", + fitzpatrick_scale: false, + category: "people" + }, + cold_sweat: { + keywords: [ "face", "nervous", "sweat" ], + "char": "\ud83d\ude30", + fitzpatrick_scale: false, + category: "people" + }, + hushed: { + keywords: [ "face", "woo", "shh" ], + "char": "\ud83d\ude2f", + fitzpatrick_scale: false, + category: "people" + }, + frowning: { + keywords: [ "face", "aw", "what" ], + "char": "\ud83d\ude26", + fitzpatrick_scale: false, + category: "people" + }, + anguished: { + keywords: [ "face", "stunned", "nervous" ], + "char": "\ud83d\ude27", + fitzpatrick_scale: false, + category: "people" + }, + cry: { + keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], + "char": "\ud83d\ude22", + fitzpatrick_scale: false, + category: "people" + }, + disappointed_relieved: { + keywords: [ "face", "phew", "sweat", "nervous" ], + "char": "\ud83d\ude25", + fitzpatrick_scale: false, + category: "people" + }, + drooling_face: { + keywords: [ "face" ], + "char": "\ud83e\udd24", + fitzpatrick_scale: false, + category: "people" + }, + sleepy: { + keywords: [ "face", "tired", "rest", "nap" ], + "char": "\ud83d\ude2a", + fitzpatrick_scale: false, + category: "people" + }, + sweat: { + keywords: [ "face", "hot", "sad", "tired", "exercise" ], + "char": "\ud83d\ude13", + fitzpatrick_scale: false, + category: "people" + }, + hot: { + keywords: [ "face", "feverish", "heat", "red", "sweating" ], + "char": "\ud83e\udd75", + fitzpatrick_scale: false, + category: "people" + }, + cold: { + keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], + "char": "\ud83e\udd76", + fitzpatrick_scale: false, + category: "people" + }, + sob: { + keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], + "char": "\ud83d\ude2d", + fitzpatrick_scale: false, + category: "people" + }, + dizzy_face: { + keywords: [ "spent", "unconscious", "xox", "dizzy" ], + "char": "\ud83d\ude35", + fitzpatrick_scale: false, + category: "people" + }, + astonished: { + keywords: [ "face", "xox", "surprised", "poisoned" ], + "char": "\ud83d\ude32", + fitzpatrick_scale: false, + category: "people" + }, + zipper_mouth_face: { + keywords: [ "face", "sealed", "zipper", "secret" ], + "char": "\ud83e\udd10", + fitzpatrick_scale: false, + category: "people" + }, + nauseated_face: { + keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], + "char": "\ud83e\udd22", + fitzpatrick_scale: false, + category: "people" + }, + sneezing_face: { + keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], + "char": "\ud83e\udd27", + fitzpatrick_scale: false, + category: "people" + }, + vomiting: { + keywords: [ "face", "sick" ], + "char": "\ud83e\udd2e", + fitzpatrick_scale: false, + category: "people" + }, + mask: { + keywords: [ "face", "sick", "ill", "disease" ], + "char": "\ud83d\ude37", + fitzpatrick_scale: false, + category: "people" + }, + face_with_thermometer: { + keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], + "char": "\ud83e\udd12", + fitzpatrick_scale: false, + category: "people" + }, + face_with_head_bandage: { + keywords: [ "injured", "clumsy", "bandage", "hurt" ], + "char": "\ud83e\udd15", + fitzpatrick_scale: false, + category: "people" + }, + woozy: { + keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], + "char": "\ud83e\udd74", + fitzpatrick_scale: false, + category: "people" + }, + sleeping: { + keywords: [ "face", "tired", "sleepy", "night", "zzz" ], + "char": "\ud83d\ude34", + fitzpatrick_scale: false, + category: "people" + }, + zzz: { + keywords: [ "sleepy", "tired", "dream" ], + "char": "\ud83d\udca4", + fitzpatrick_scale: false, + category: "people" + }, + poop: { + keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], + "char": "\ud83d\udca9", + fitzpatrick_scale: false, + category: "people" + }, + smiling_imp: { + keywords: [ "devil", "horns" ], + "char": "\ud83d\ude08", + fitzpatrick_scale: false, + category: "people" + }, + imp: { + keywords: [ "devil", "angry", "horns" ], + "char": "\ud83d\udc7f", + fitzpatrick_scale: false, + category: "people" + }, + japanese_ogre: { + keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], + "char": "\ud83d\udc79", + fitzpatrick_scale: false, + category: "people" + }, + japanese_goblin: { + keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], + "char": "\ud83d\udc7a", + fitzpatrick_scale: false, + category: "people" + }, + skull: { + keywords: [ "dead", "skeleton", "creepy", "death" ], + "char": "\ud83d\udc80", + fitzpatrick_scale: false, + category: "people" + }, + ghost: { + keywords: [ "halloween", "spooky", "scary" ], + "char": "\ud83d\udc7b", + fitzpatrick_scale: false, + category: "people" + }, + alien: { + keywords: [ "UFO", "paul", "weird", "outer_space" ], + "char": "\ud83d\udc7d", + fitzpatrick_scale: false, + category: "people" + }, + robot: { + keywords: [ "computer", "machine", "bot" ], + "char": "\ud83e\udd16", + fitzpatrick_scale: false, + category: "people" + }, + smiley_cat: { + keywords: [ "animal", "cats", "happy", "smile" ], + "char": "\ud83d\ude3a", + fitzpatrick_scale: false, + category: "people" + }, + smile_cat: { + keywords: [ "animal", "cats", "smile" ], + "char": "\ud83d\ude38", + fitzpatrick_scale: false, + category: "people" + }, + joy_cat: { + keywords: [ "animal", "cats", "haha", "happy", "tears" ], + "char": "\ud83d\ude39", + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes_cat: { + keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], + "char": "\ud83d\ude3b", + fitzpatrick_scale: false, + category: "people" + }, + smirk_cat: { + keywords: [ "animal", "cats", "smirk" ], + "char": "\ud83d\ude3c", + fitzpatrick_scale: false, + category: "people" + }, + kissing_cat: { + keywords: [ "animal", "cats", "kiss" ], + "char": "\ud83d\ude3d", + fitzpatrick_scale: false, + category: "people" + }, + scream_cat: { + keywords: [ "animal", "cats", "munch", "scared", "scream" ], + "char": "\ud83d\ude40", + fitzpatrick_scale: false, + category: "people" + }, + crying_cat_face: { + keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], + "char": "\ud83d\ude3f", + fitzpatrick_scale: false, + category: "people" + }, + pouting_cat: { + keywords: [ "animal", "cats" ], + "char": "\ud83d\ude3e", + fitzpatrick_scale: false, + category: "people" + }, + palms_up: { + keywords: [ "hands", "gesture", "cupped", "prayer" ], + "char": "\ud83e\udd32", + fitzpatrick_scale: true, + category: "people" + }, + raised_hands: { + keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], + "char": "\ud83d\ude4c", + fitzpatrick_scale: true, + category: "people" + }, + clap: { + keywords: [ "hands", "praise", "applause", "congrats", "yay" ], + "char": "\ud83d\udc4f", + fitzpatrick_scale: true, + category: "people" + }, + wave: { + keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], + "char": "\ud83d\udc4b", + fitzpatrick_scale: true, + category: "people" + }, + call_me_hand: { + keywords: [ "hands", "gesture" ], + "char": "\ud83e\udd19", + fitzpatrick_scale: true, + category: "people" + }, + "+1": { + keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], + "char": "\ud83d\udc4d", + fitzpatrick_scale: true, + category: "people" + }, + "-1": { + keywords: [ "thumbsdown", "no", "dislike", "hand" ], + "char": "\ud83d\udc4e", + fitzpatrick_scale: true, + category: "people" + }, + facepunch: { + keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], + "char": "\ud83d\udc4a", + fitzpatrick_scale: true, + category: "people" + }, + fist: { + keywords: [ "fingers", "hand", "grasp" ], + "char": "\u270a", + fitzpatrick_scale: true, + category: "people" + }, + fist_left: { + keywords: [ "hand", "fistbump" ], + "char": "\ud83e\udd1b", + fitzpatrick_scale: true, + category: "people" + }, + fist_right: { + keywords: [ "hand", "fistbump" ], + "char": "\ud83e\udd1c", + fitzpatrick_scale: true, + category: "people" + }, + v: { + keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], + "char": "\u270c", + fitzpatrick_scale: true, + category: "people" + }, + ok_hand: { + keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], + "char": "\ud83d\udc4c", + fitzpatrick_scale: true, + category: "people" + }, + raised_hand: { + keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], + "char": "\u270b", + fitzpatrick_scale: true, + category: "people" + }, + raised_back_of_hand: { + keywords: [ "fingers", "raised", "backhand" ], + "char": "\ud83e\udd1a", + fitzpatrick_scale: true, + category: "people" + }, + open_hands: { + keywords: [ "fingers", "butterfly", "hands", "open" ], + "char": "\ud83d\udc50", + fitzpatrick_scale: true, + category: "people" + }, + muscle: { + keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], + "char": "\ud83d\udcaa", + fitzpatrick_scale: true, + category: "people" + }, + pray: { + keywords: [ "please", "hope", "wish", "namaste", "highfive" ], + "char": "\ud83d\ude4f", + fitzpatrick_scale: true, + category: "people" + }, + foot: { + keywords: [ "kick", "stomp" ], + "char": "\ud83e\uddb6", + fitzpatrick_scale: true, + category: "people" + }, + leg: { + keywords: [ "kick", "limb" ], + "char": "\ud83e\uddb5", + fitzpatrick_scale: true, + category: "people" + }, + handshake: { + keywords: [ "agreement", "shake" ], + "char": "\ud83e\udd1d", + fitzpatrick_scale: false, + category: "people" + }, + point_up: { + keywords: [ "hand", "fingers", "direction", "up" ], + "char": "\u261d", + fitzpatrick_scale: true, + category: "people" + }, + point_up_2: { + keywords: [ "fingers", "hand", "direction", "up" ], + "char": "\ud83d\udc46", + fitzpatrick_scale: true, + category: "people" + }, + point_down: { + keywords: [ "fingers", "hand", "direction", "down" ], + "char": "\ud83d\udc47", + fitzpatrick_scale: true, + category: "people" + }, + point_left: { + keywords: [ "direction", "fingers", "hand", "left" ], + "char": "\ud83d\udc48", + fitzpatrick_scale: true, + category: "people" + }, + point_right: { + keywords: [ "fingers", "hand", "direction", "right" ], + "char": "\ud83d\udc49", + fitzpatrick_scale: true, + category: "people" + }, + fu: { + keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], + "char": "\ud83d\udd95", + fitzpatrick_scale: true, + category: "people" + }, + raised_hand_with_fingers_splayed: { + keywords: [ "hand", "fingers", "palm" ], + "char": "\ud83d\udd90", + fitzpatrick_scale: true, + category: "people" + }, + love_you: { + keywords: [ "hand", "fingers", "gesture" ], + "char": "\ud83e\udd1f", + fitzpatrick_scale: true, + category: "people" + }, + metal: { + keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], + "char": "\ud83e\udd18", + fitzpatrick_scale: true, + category: "people" + }, + crossed_fingers: { + keywords: [ "good", "lucky" ], + "char": "\ud83e\udd1e", + fitzpatrick_scale: true, + category: "people" + }, + vulcan_salute: { + keywords: [ "hand", "fingers", "spock", "star trek" ], + "char": "\ud83d\udd96", + fitzpatrick_scale: true, + category: "people" + }, + writing_hand: { + keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], + "char": "\u270d", + fitzpatrick_scale: true, + category: "people" + }, + selfie: { + keywords: [ "camera", "phone" ], + "char": "\ud83e\udd33", + fitzpatrick_scale: true, + category: "people" + }, + nail_care: { + keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], + "char": "\ud83d\udc85", + fitzpatrick_scale: true, + category: "people" + }, + lips: { + keywords: [ "mouth", "kiss" ], + "char": "\ud83d\udc44", + fitzpatrick_scale: false, + category: "people" + }, + tooth: { + keywords: [ "teeth", "dentist" ], + "char": "\ud83e\uddb7", + fitzpatrick_scale: false, + category: "people" + }, + tongue: { + keywords: [ "mouth", "playful" ], + "char": "\ud83d\udc45", + fitzpatrick_scale: false, + category: "people" + }, + ear: { + keywords: [ "face", "hear", "sound", "listen" ], + "char": "\ud83d\udc42", + fitzpatrick_scale: true, + category: "people" + }, + nose: { + keywords: [ "smell", "sniff" ], + "char": "\ud83d\udc43", + fitzpatrick_scale: true, + category: "people" + }, + eye: { + keywords: [ "face", "look", "see", "watch", "stare" ], + "char": "\ud83d\udc41", + fitzpatrick_scale: false, + category: "people" + }, + eyes: { + keywords: [ "look", "watch", "stalk", "peek", "see" ], + "char": "\ud83d\udc40", + fitzpatrick_scale: false, + category: "people" + }, + brain: { + keywords: [ "smart", "intelligent" ], + "char": "\ud83e\udde0", + fitzpatrick_scale: false, + category: "people" + }, + bust_in_silhouette: { + keywords: [ "user", "person", "human" ], + "char": "\ud83d\udc64", + fitzpatrick_scale: false, + category: "people" + }, + busts_in_silhouette: { + keywords: [ "user", "person", "human", "group", "team" ], + "char": "\ud83d\udc65", + fitzpatrick_scale: false, + category: "people" + }, + speaking_head: { + keywords: [ "user", "person", "human", "sing", "say", "talk" ], + "char": "\ud83d\udde3", + fitzpatrick_scale: false, + category: "people" + }, + baby: { + keywords: [ "child", "boy", "girl", "toddler" ], + "char": "\ud83d\udc76", + fitzpatrick_scale: true, + category: "people" + }, + child: { + keywords: [ "gender-neutral", "young" ], + "char": "\ud83e\uddd2", + fitzpatrick_scale: true, + category: "people" + }, + boy: { + keywords: [ "man", "male", "guy", "teenager" ], + "char": "\ud83d\udc66", + fitzpatrick_scale: true, + category: "people" + }, + girl: { + keywords: [ "female", "woman", "teenager" ], + "char": "\ud83d\udc67", + fitzpatrick_scale: true, + category: "people" + }, + adult: { + keywords: [ "gender-neutral", "person" ], + "char": "\ud83e\uddd1", + fitzpatrick_scale: true, + category: "people" + }, + man: { + keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], + "char": "\ud83d\udc68", + fitzpatrick_scale: true, + category: "people" + }, + woman: { + keywords: [ "female", "girls", "lady" ], + "char": "\ud83d\udc69", + fitzpatrick_scale: true, + category: "people" + }, + blonde_woman: { + keywords: [ "woman", "female", "girl", "blonde", "person" ], + "char": "\ud83d\udc71\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + blonde_man: { + keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], + "char": "\ud83d\udc71", + fitzpatrick_scale: true, + category: "people" + }, + bearded_person: { + keywords: [ "person", "bewhiskered" ], + "char": "\ud83e\uddd4", + fitzpatrick_scale: true, + category: "people" + }, + older_adult: { + keywords: [ "human", "elder", "senior", "gender-neutral" ], + "char": "\ud83e\uddd3", + fitzpatrick_scale: true, + category: "people" + }, + older_man: { + keywords: [ "human", "male", "men", "old", "elder", "senior" ], + "char": "\ud83d\udc74", + fitzpatrick_scale: true, + category: "people" + }, + older_woman: { + keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], + "char": "\ud83d\udc75", + fitzpatrick_scale: true, + category: "people" + }, + man_with_gua_pi_mao: { + keywords: [ "male", "boy", "chinese" ], + "char": "\ud83d\udc72", + fitzpatrick_scale: true, + category: "people" + }, + woman_with_headscarf: { + keywords: [ "female", "hijab", "mantilla", "tichel" ], + "char": "\ud83e\uddd5", + fitzpatrick_scale: true, + category: "people" + }, + woman_with_turban: { + keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], + "char": "\ud83d\udc73\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_with_turban: { + keywords: [ "male", "indian", "hinduism", "arabs" ], + "char": "\ud83d\udc73", + fitzpatrick_scale: true, + category: "people" + }, + policewoman: { + keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], + "char": "\ud83d\udc6e\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + policeman: { + keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], + "char": "\ud83d\udc6e", + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_woman: { + keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], + "char": "\ud83d\udc77\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_man: { + keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], + "char": "\ud83d\udc77", + fitzpatrick_scale: true, + category: "people" + }, + guardswoman: { + keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], + "char": "\ud83d\udc82\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + guardsman: { + keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], + "char": "\ud83d\udc82", + fitzpatrick_scale: true, + category: "people" + }, + female_detective: { + keywords: [ "human", "spy", "detective", "female", "woman" ], + "char": "\ud83d\udd75\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + male_detective: { + keywords: [ "human", "spy", "detective" ], + "char": "\ud83d\udd75", + fitzpatrick_scale: true, + category: "people" + }, + woman_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], + "char": "\ud83d\udc69\u200d\u2695\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], + "char": "\ud83d\udc68\u200d\u2695\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_farmer: { + keywords: [ "rancher", "gardener", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udf3e", + fitzpatrick_scale: true, + category: "people" + }, + man_farmer: { + keywords: [ "rancher", "gardener", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udf3e", + fitzpatrick_scale: true, + category: "people" + }, + woman_cook: { + keywords: [ "chef", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udf73", + fitzpatrick_scale: true, + category: "people" + }, + man_cook: { + keywords: [ "chef", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udf73", + fitzpatrick_scale: true, + category: "people" + }, + woman_student: { + keywords: [ "graduate", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udf93", + fitzpatrick_scale: true, + category: "people" + }, + man_student: { + keywords: [ "graduate", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udf93", + fitzpatrick_scale: true, + category: "people" + }, + woman_singer: { + keywords: [ "rockstar", "entertainer", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udfa4", + fitzpatrick_scale: true, + category: "people" + }, + man_singer: { + keywords: [ "rockstar", "entertainer", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udfa4", + fitzpatrick_scale: true, + category: "people" + }, + woman_teacher: { + keywords: [ "instructor", "professor", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udfeb", + fitzpatrick_scale: true, + category: "people" + }, + man_teacher: { + keywords: [ "instructor", "professor", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udfeb", + fitzpatrick_scale: true, + category: "people" + }, + woman_factory_worker: { + keywords: [ "assembly", "industrial", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udfed", + fitzpatrick_scale: true, + category: "people" + }, + man_factory_worker: { + keywords: [ "assembly", "industrial", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udfed", + fitzpatrick_scale: true, + category: "people" + }, + woman_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], + "char": "\ud83d\udc69\u200d\ud83d\udcbb", + fitzpatrick_scale: true, + category: "people" + }, + man_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], + "char": "\ud83d\udc68\u200d\ud83d\udcbb", + fitzpatrick_scale: true, + category: "people" + }, + woman_office_worker: { + keywords: [ "business", "manager", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83d\udcbc", + fitzpatrick_scale: true, + category: "people" + }, + man_office_worker: { + keywords: [ "business", "manager", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83d\udcbc", + fitzpatrick_scale: true, + category: "people" + }, + woman_mechanic: { + keywords: [ "plumber", "woman", "human", "wrench" ], + "char": "\ud83d\udc69\u200d\ud83d\udd27", + fitzpatrick_scale: true, + category: "people" + }, + man_mechanic: { + keywords: [ "plumber", "man", "human", "wrench" ], + "char": "\ud83d\udc68\u200d\ud83d\udd27", + fitzpatrick_scale: true, + category: "people" + }, + woman_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83d\udd2c", + fitzpatrick_scale: true, + category: "people" + }, + man_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83d\udd2c", + fitzpatrick_scale: true, + category: "people" + }, + woman_artist: { + keywords: [ "painter", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udfa8", + fitzpatrick_scale: true, + category: "people" + }, + man_artist: { + keywords: [ "painter", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udfa8", + fitzpatrick_scale: true, + category: "people" + }, + woman_firefighter: { + keywords: [ "fireman", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83d\ude92", + fitzpatrick_scale: true, + category: "people" + }, + man_firefighter: { + keywords: [ "fireman", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83d\ude92", + fitzpatrick_scale: true, + category: "people" + }, + woman_pilot: { + keywords: [ "aviator", "plane", "woman", "human" ], + "char": "\ud83d\udc69\u200d\u2708\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_pilot: { + keywords: [ "aviator", "plane", "man", "human" ], + "char": "\ud83d\udc68\u200d\u2708\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_astronaut: { + keywords: [ "space", "rocket", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83d\ude80", + fitzpatrick_scale: true, + category: "people" + }, + man_astronaut: { + keywords: [ "space", "rocket", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83d\ude80", + fitzpatrick_scale: true, + category: "people" + }, + woman_judge: { + keywords: [ "justice", "court", "woman", "human" ], + "char": "\ud83d\udc69\u200d\u2696\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_judge: { + keywords: [ "justice", "court", "man", "human" ], + "char": "\ud83d\udc68\u200d\u2696\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_superhero: { + keywords: [ "woman", "female", "good", "heroine", "superpowers" ], + "char": "\ud83e\uddb8\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_superhero: { + keywords: [ "man", "male", "good", "hero", "superpowers" ], + "char": "\ud83e\uddb8\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_supervillain: { + keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], + "char": "\ud83e\uddb9\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_supervillain: { + keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], + "char": "\ud83e\uddb9\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + mrs_claus: { + keywords: [ "woman", "female", "xmas", "mother christmas" ], + "char": "\ud83e\udd36", + fitzpatrick_scale: true, + category: "people" + }, + santa: { + keywords: [ "festival", "man", "male", "xmas", "father christmas" ], + "char": "\ud83c\udf85", + fitzpatrick_scale: true, + category: "people" + }, + sorceress: { + keywords: [ "woman", "female", "mage", "witch" ], + "char": "\ud83e\uddd9\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + wizard: { + keywords: [ "man", "male", "mage", "sorcerer" ], + "char": "\ud83e\uddd9\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_elf: { + keywords: [ "woman", "female" ], + "char": "\ud83e\udddd\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_elf: { + keywords: [ "man", "male" ], + "char": "\ud83e\udddd\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_vampire: { + keywords: [ "woman", "female" ], + "char": "\ud83e\udddb\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_vampire: { + keywords: [ "man", "male", "dracula" ], + "char": "\ud83e\udddb\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_zombie: { + keywords: [ "woman", "female", "undead", "walking dead" ], + "char": "\ud83e\udddf\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + man_zombie: { + keywords: [ "man", "male", "dracula", "undead", "walking dead" ], + "char": "\ud83e\udddf\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + woman_genie: { + keywords: [ "woman", "female" ], + "char": "\ud83e\uddde\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + man_genie: { + keywords: [ "man", "male" ], + "char": "\ud83e\uddde\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + mermaid: { + keywords: [ "woman", "female", "merwoman", "ariel" ], + "char": "\ud83e\udddc\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + merman: { + keywords: [ "man", "male", "triton" ], + "char": "\ud83e\udddc\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_fairy: { + keywords: [ "woman", "female" ], + "char": "\ud83e\uddda\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_fairy: { + keywords: [ "man", "male" ], + "char": "\ud83e\uddda\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + angel: { + keywords: [ "heaven", "wings", "halo" ], + "char": "\ud83d\udc7c", + fitzpatrick_scale: true, + category: "people" + }, + pregnant_woman: { + keywords: [ "baby" ], + "char": "\ud83e\udd30", + fitzpatrick_scale: true, + category: "people" + }, + breastfeeding: { + keywords: [ "nursing", "baby" ], + "char": "\ud83e\udd31", + fitzpatrick_scale: true, + category: "people" + }, + princess: { + keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], + "char": "\ud83d\udc78", + fitzpatrick_scale: true, + category: "people" + }, + prince: { + keywords: [ "boy", "man", "male", "crown", "royal", "king" ], + "char": "\ud83e\udd34", + fitzpatrick_scale: true, + category: "people" + }, + bride_with_veil: { + keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], + "char": "\ud83d\udc70", + fitzpatrick_scale: true, + category: "people" + }, + man_in_tuxedo: { + keywords: [ "couple", "marriage", "wedding", "groom" ], + "char": "\ud83e\udd35", + fitzpatrick_scale: true, + category: "people" + }, + running_woman: { + keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], + "char": "\ud83c\udfc3\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + running_man: { + keywords: [ "man", "walking", "exercise", "race", "running" ], + "char": "\ud83c\udfc3", + fitzpatrick_scale: true, + category: "people" + }, + walking_woman: { + keywords: [ "human", "feet", "steps", "woman", "female" ], + "char": "\ud83d\udeb6\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + walking_man: { + keywords: [ "human", "feet", "steps" ], + "char": "\ud83d\udeb6", + fitzpatrick_scale: true, + category: "people" + }, + dancer: { + keywords: [ "female", "girl", "woman", "fun" ], + "char": "\ud83d\udc83", + fitzpatrick_scale: true, + category: "people" + }, + man_dancing: { + keywords: [ "male", "boy", "fun", "dancer" ], + "char": "\ud83d\udd7a", + fitzpatrick_scale: true, + category: "people" + }, + dancing_women: { + keywords: [ "female", "bunny", "women", "girls" ], + "char": "\ud83d\udc6f", + fitzpatrick_scale: false, + category: "people" + }, + dancing_men: { + keywords: [ "male", "bunny", "men", "boys" ], + "char": "\ud83d\udc6f\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + couple: { + keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], + "char": "\ud83d\udc6b", + fitzpatrick_scale: false, + category: "people" + }, + two_men_holding_hands: { + keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], + "char": "\ud83d\udc6c", + fitzpatrick_scale: false, + category: "people" + }, + two_women_holding_hands: { + keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], + "char": "\ud83d\udc6d", + fitzpatrick_scale: false, + category: "people" + }, + bowing_woman: { + keywords: [ "woman", "female", "girl" ], + "char": "\ud83d\ude47\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + bowing_man: { + keywords: [ "man", "male", "boy" ], + "char": "\ud83d\ude47", + fitzpatrick_scale: true, + category: "people" + }, + man_facepalming: { + keywords: [ "man", "male", "boy", "disbelief" ], + "char": "\ud83e\udd26\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_facepalming: { + keywords: [ "woman", "female", "girl", "disbelief" ], + "char": "\ud83e\udd26\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_shrugging: { + keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], + "char": "\ud83e\udd37", + fitzpatrick_scale: true, + category: "people" + }, + man_shrugging: { + keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], + "char": "\ud83e\udd37\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_woman: { + keywords: [ "female", "girl", "woman", "human", "information" ], + "char": "\ud83d\udc81", + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_man: { + keywords: [ "male", "boy", "man", "human", "information" ], + "char": "\ud83d\udc81\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + no_good_woman: { + keywords: [ "female", "girl", "woman", "nope" ], + "char": "\ud83d\ude45", + fitzpatrick_scale: true, + category: "people" + }, + no_good_man: { + keywords: [ "male", "boy", "man", "nope" ], + "char": "\ud83d\ude45\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + ok_woman: { + keywords: [ "women", "girl", "female", "pink", "human", "woman" ], + "char": "\ud83d\ude46", + fitzpatrick_scale: true, + category: "people" + }, + ok_man: { + keywords: [ "men", "boy", "male", "blue", "human", "man" ], + "char": "\ud83d\ude46\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_woman: { + keywords: [ "female", "girl", "woman" ], + "char": "\ud83d\ude4b", + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_man: { + keywords: [ "male", "boy", "man" ], + "char": "\ud83d\ude4b\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + pouting_woman: { + keywords: [ "female", "girl", "woman" ], + "char": "\ud83d\ude4e", + fitzpatrick_scale: true, + category: "people" + }, + pouting_man: { + keywords: [ "male", "boy", "man" ], + "char": "\ud83d\ude4e\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + frowning_woman: { + keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], + "char": "\ud83d\ude4d", + fitzpatrick_scale: true, + category: "people" + }, + frowning_man: { + keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], + "char": "\ud83d\ude4d\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + haircut_woman: { + keywords: [ "female", "girl", "woman" ], + "char": "\ud83d\udc87", + fitzpatrick_scale: true, + category: "people" + }, + haircut_man: { + keywords: [ "male", "boy", "man" ], + "char": "\ud83d\udc87\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + massage_woman: { + keywords: [ "female", "girl", "woman", "head" ], + "char": "\ud83d\udc86", + fitzpatrick_scale: true, + category: "people" + }, + massage_man: { + keywords: [ "male", "boy", "man", "head" ], + "char": "\ud83d\udc86\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_in_steamy_room: { + keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], + "char": "\ud83e\uddd6\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_in_steamy_room: { + keywords: [ "male", "man", "spa", "steamroom", "sauna" ], + "char": "\ud83e\uddd6\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + couple_with_heart_woman_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": "\ud83d\udc91", + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_woman_woman: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69", + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_man_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": "\ud83d\udc8f", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_woman_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_man: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy: { + keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], + "char": "\ud83d\udc6a", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl: { + keywords: [ "home", "parents", "people", "human", "child" ], + "char": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": "\ud83d\udc69\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": "\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": "\ud83d\udc68\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": "\ud83d\udc68\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + yarn: { + keywords: [ "ball", "crochet", "knit" ], + "char": "\ud83e\uddf6", + fitzpatrick_scale: false, + category: "people" + }, + thread: { + keywords: [ "needle", "sewing", "spool", "string" ], + "char": "\ud83e\uddf5", + fitzpatrick_scale: false, + category: "people" + }, + coat: { + keywords: [ "jacket" ], + "char": "\ud83e\udde5", + fitzpatrick_scale: false, + category: "people" + }, + labcoat: { + keywords: [ "doctor", "experiment", "scientist", "chemist" ], + "char": "\ud83e\udd7c", + fitzpatrick_scale: false, + category: "people" + }, + womans_clothes: { + keywords: [ "fashion", "shopping_bags", "female" ], + "char": "\ud83d\udc5a", + fitzpatrick_scale: false, + category: "people" + }, + tshirt: { + keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], + "char": "\ud83d\udc55", + fitzpatrick_scale: false, + category: "people" + }, + jeans: { + keywords: [ "fashion", "shopping" ], + "char": "\ud83d\udc56", + fitzpatrick_scale: false, + category: "people" + }, + necktie: { + keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], + "char": "\ud83d\udc54", + fitzpatrick_scale: false, + category: "people" + }, + dress: { + keywords: [ "clothes", "fashion", "shopping" ], + "char": "\ud83d\udc57", + fitzpatrick_scale: false, + category: "people" + }, + bikini: { + keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], + "char": "\ud83d\udc59", + fitzpatrick_scale: false, + category: "people" + }, + kimono: { + keywords: [ "dress", "fashion", "women", "female", "japanese" ], + "char": "\ud83d\udc58", + fitzpatrick_scale: false, + category: "people" + }, + lipstick: { + keywords: [ "female", "girl", "fashion", "woman" ], + "char": "\ud83d\udc84", + fitzpatrick_scale: false, + category: "people" + }, + kiss: { + keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc8b", + fitzpatrick_scale: false, + category: "people" + }, + footprints: { + keywords: [ "feet", "tracking", "walking", "beach" ], + "char": "\ud83d\udc63", + fitzpatrick_scale: false, + category: "people" + }, + flat_shoe: { + keywords: [ "ballet", "slip-on", "slipper" ], + "char": "\ud83e\udd7f", + fitzpatrick_scale: false, + category: "people" + }, + high_heel: { + keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], + "char": "\ud83d\udc60", + fitzpatrick_scale: false, + category: "people" + }, + sandal: { + keywords: [ "shoes", "fashion", "flip flops" ], + "char": "\ud83d\udc61", + fitzpatrick_scale: false, + category: "people" + }, + boot: { + keywords: [ "shoes", "fashion" ], + "char": "\ud83d\udc62", + fitzpatrick_scale: false, + category: "people" + }, + mans_shoe: { + keywords: [ "fashion", "male" ], + "char": "\ud83d\udc5e", + fitzpatrick_scale: false, + category: "people" + }, + athletic_shoe: { + keywords: [ "shoes", "sports", "sneakers" ], + "char": "\ud83d\udc5f", + fitzpatrick_scale: false, + category: "people" + }, + hiking_boot: { + keywords: [ "backpacking", "camping", "hiking" ], + "char": "\ud83e\udd7e", + fitzpatrick_scale: false, + category: "people" + }, + socks: { + keywords: [ "stockings", "clothes" ], + "char": "\ud83e\udde6", + fitzpatrick_scale: false, + category: "people" + }, + gloves: { + keywords: [ "hands", "winter", "clothes" ], + "char": "\ud83e\udde4", + fitzpatrick_scale: false, + category: "people" + }, + scarf: { + keywords: [ "neck", "winter", "clothes" ], + "char": "\ud83e\udde3", + fitzpatrick_scale: false, + category: "people" + }, + womans_hat: { + keywords: [ "fashion", "accessories", "female", "lady", "spring" ], + "char": "\ud83d\udc52", + fitzpatrick_scale: false, + category: "people" + }, + tophat: { + keywords: [ "magic", "gentleman", "classy", "circus" ], + "char": "\ud83c\udfa9", + fitzpatrick_scale: false, + category: "people" + }, + billed_hat: { + keywords: [ "cap", "baseball" ], + "char": "\ud83e\udde2", + fitzpatrick_scale: false, + category: "people" + }, + rescue_worker_helmet: { + keywords: [ "construction", "build" ], + "char": "\u26d1", + fitzpatrick_scale: false, + category: "people" + }, + mortar_board: { + keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], + "char": "\ud83c\udf93", + fitzpatrick_scale: false, + category: "people" + }, + crown: { + keywords: [ "king", "kod", "leader", "royalty", "lord" ], + "char": "\ud83d\udc51", + fitzpatrick_scale: false, + category: "people" + }, + school_satchel: { + keywords: [ "student", "education", "bag", "backpack" ], + "char": "\ud83c\udf92", + fitzpatrick_scale: false, + category: "people" + }, + luggage: { + keywords: [ "packing", "travel" ], + "char": "\ud83e\uddf3", + fitzpatrick_scale: false, + category: "people" + }, + pouch: { + keywords: [ "bag", "accessories", "shopping" ], + "char": "\ud83d\udc5d", + fitzpatrick_scale: false, + category: "people" + }, + purse: { + keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], + "char": "\ud83d\udc5b", + fitzpatrick_scale: false, + category: "people" + }, + handbag: { + keywords: [ "fashion", "accessory", "accessories", "shopping" ], + "char": "\ud83d\udc5c", + fitzpatrick_scale: false, + category: "people" + }, + briefcase: { + keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], + "char": "\ud83d\udcbc", + fitzpatrick_scale: false, + category: "people" + }, + eyeglasses: { + keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], + "char": "\ud83d\udc53", + fitzpatrick_scale: false, + category: "people" + }, + dark_sunglasses: { + keywords: [ "face", "cool", "accessories" ], + "char": "\ud83d\udd76", + fitzpatrick_scale: false, + category: "people" + }, + goggles: { + keywords: [ "eyes", "protection", "safety" ], + "char": "\ud83e\udd7d", + fitzpatrick_scale: false, + category: "people" + }, + ring: { + keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], + "char": "\ud83d\udc8d", + fitzpatrick_scale: false, + category: "people" + }, + closed_umbrella: { + keywords: [ "weather", "rain", "drizzle" ], + "char": "\ud83c\udf02", + fitzpatrick_scale: false, + category: "people" + }, + dog: { + keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], + "char": "\ud83d\udc36", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat: { + keywords: [ "animal", "meow", "nature", "pet", "kitten" ], + "char": "\ud83d\udc31", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse: { + keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], + "char": "\ud83d\udc2d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hamster: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc39", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit: { + keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], + "char": "\ud83d\udc30", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fox_face: { + keywords: [ "animal", "nature", "face" ], + "char": "\ud83e\udd8a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bear: { + keywords: [ "animal", "nature", "wild" ], + "char": "\ud83d\udc3b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + panda_face: { + keywords: [ "animal", "nature", "panda" ], + "char": "\ud83d\udc3c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + koala: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc28", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger: { + keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], + "char": "\ud83d\udc2f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lion: { + keywords: [ "animal", "nature" ], + "char": "\ud83e\udd81", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + "char": "\ud83d\udc2e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig: { + keywords: [ "animal", "oink", "nature" ], + "char": "\ud83d\udc37", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig_nose: { + keywords: [ "animal", "oink" ], + "char": "\ud83d\udc3d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + frog: { + keywords: [ "animal", "nature", "croak", "toad" ], + "char": "\ud83d\udc38", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + squid: { + keywords: [ "animal", "nature", "ocean", "sea" ], + "char": "\ud83e\udd91", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + octopus: { + keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], + "char": "\ud83d\udc19", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shrimp: { + keywords: [ "animal", "ocean", "nature", "seafood" ], + "char": "\ud83e\udd90", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey_face: { + keywords: [ "animal", "nature", "circus" ], + "char": "\ud83d\udc35", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + gorilla: { + keywords: [ "animal", "nature", "circus" ], + "char": "\ud83e\udd8d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + see_no_evil: { + keywords: [ "monkey", "animal", "nature", "haha" ], + "char": "\ud83d\ude48", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hear_no_evil: { + keywords: [ "animal", "monkey", "nature" ], + "char": "\ud83d\ude49", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + speak_no_evil: { + keywords: [ "monkey", "animal", "nature", "omg" ], + "char": "\ud83d\ude4a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey: { + keywords: [ "animal", "nature", "banana", "circus" ], + "char": "\ud83d\udc12", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chicken: { + keywords: [ "animal", "cluck", "nature", "bird" ], + "char": "\ud83d\udc14", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + penguin: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc27", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bird: { + keywords: [ "animal", "nature", "fly", "tweet", "spring" ], + "char": "\ud83d\udc26", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + baby_chick: { + keywords: [ "animal", "chicken", "bird" ], + "char": "\ud83d\udc24", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatching_chick: { + keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], + "char": "\ud83d\udc23", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatched_chick: { + keywords: [ "animal", "chicken", "baby", "bird" ], + "char": "\ud83d\udc25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + duck: { + keywords: [ "animal", "nature", "bird", "mallard" ], + "char": "\ud83e\udd86", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + eagle: { + keywords: [ "animal", "nature", "bird" ], + "char": "\ud83e\udd85", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + owl: { + keywords: [ "animal", "nature", "bird", "hoot" ], + "char": "\ud83e\udd89", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bat: { + keywords: [ "animal", "nature", "blind", "vampire" ], + "char": "\ud83e\udd87", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wolf: { + keywords: [ "animal", "nature", "wild" ], + "char": "\ud83d\udc3a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boar: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc17", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + horse: { + keywords: [ "animal", "brown", "nature" ], + "char": "\ud83d\udc34", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + unicorn: { + keywords: [ "animal", "nature", "mystical" ], + "char": "\ud83e\udd84", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + honeybee: { + keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], + "char": "\ud83d\udc1d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bug: { + keywords: [ "animal", "insect", "nature", "worm" ], + "char": "\ud83d\udc1b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + butterfly: { + keywords: [ "animal", "insect", "nature", "caterpillar" ], + "char": "\ud83e\udd8b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snail: { + keywords: [ "slow", "animal", "shell" ], + "char": "\ud83d\udc0c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + beetle: { + keywords: [ "animal", "insect", "nature", "ladybug" ], + "char": "\ud83d\udc1e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ant: { + keywords: [ "animal", "insect", "nature", "bug" ], + "char": "\ud83d\udc1c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + grasshopper: { + keywords: [ "animal", "cricket", "chirp" ], + "char": "\ud83e\udd97", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider: { + keywords: [ "animal", "arachnid" ], + "char": "\ud83d\udd77", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + scorpion: { + keywords: [ "animal", "arachnid" ], + "char": "\ud83e\udd82", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crab: { + keywords: [ "animal", "crustacean" ], + "char": "\ud83e\udd80", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snake: { + keywords: [ "animal", "evil", "nature", "hiss", "python" ], + "char": "\ud83d\udc0d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lizard: { + keywords: [ "animal", "nature", "reptile" ], + "char": "\ud83e\udd8e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + "t-rex": { + keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], + "char": "\ud83e\udd96", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sauropod: { + keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], + "char": "\ud83e\udd95", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turtle: { + keywords: [ "animal", "slow", "nature", "tortoise" ], + "char": "\ud83d\udc22", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tropical_fish: { + keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], + "char": "\ud83d\udc20", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fish: { + keywords: [ "animal", "food", "nature" ], + "char": "\ud83d\udc1f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blowfish: { + keywords: [ "animal", "nature", "food", "sea", "ocean" ], + "char": "\ud83d\udc21", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dolphin: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], + "char": "\ud83d\udc2c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shark: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], + "char": "\ud83e\udd88", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale: { + keywords: [ "animal", "nature", "sea", "ocean" ], + "char": "\ud83d\udc33", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale2: { + keywords: [ "animal", "nature", "sea", "ocean" ], + "char": "\ud83d\udc0b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crocodile: { + keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], + "char": "\ud83d\udc0a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leopard: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc06", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zebra: { + keywords: [ "animal", "nature", "stripes", "safari" ], + "char": "\ud83e\udd93", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger2: { + keywords: [ "animal", "nature", "roar" ], + "char": "\ud83d\udc05", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + water_buffalo: { + keywords: [ "animal", "nature", "ox", "cow" ], + "char": "\ud83d\udc03", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ox: { + keywords: [ "animal", "cow", "beef" ], + "char": "\ud83d\udc02", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow2: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + "char": "\ud83d\udc04", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deer: { + keywords: [ "animal", "nature", "horns", "venison" ], + "char": "\ud83e\udd8c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dromedary_camel: { + keywords: [ "animal", "hot", "desert", "hump" ], + "char": "\ud83d\udc2a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + camel: { + keywords: [ "animal", "nature", "hot", "desert", "hump" ], + "char": "\ud83d\udc2b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + giraffe: { + keywords: [ "animal", "nature", "spots", "safari" ], + "char": "\ud83e\udd92", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + elephant: { + keywords: [ "animal", "nature", "nose", "th", "circus" ], + "char": "\ud83d\udc18", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rhinoceros: { + keywords: [ "animal", "nature", "horn" ], + "char": "\ud83e\udd8f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + goat: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc10", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ram: { + keywords: [ "animal", "sheep", "nature" ], + "char": "\ud83d\udc0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sheep: { + keywords: [ "animal", "nature", "wool", "shipit" ], + "char": "\ud83d\udc11", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + racehorse: { + keywords: [ "animal", "gamble", "luck" ], + "char": "\ud83d\udc0e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig2: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc16", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rat: { + keywords: [ "animal", "mouse", "rodent" ], + "char": "\ud83d\udc00", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse2: { + keywords: [ "animal", "nature", "rodent" ], + "char": "\ud83d\udc01", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rooster: { + keywords: [ "animal", "nature", "chicken" ], + "char": "\ud83d\udc13", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turkey: { + keywords: [ "animal", "bird" ], + "char": "\ud83e\udd83", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dove: { + keywords: [ "animal", "bird" ], + "char": "\ud83d\udd4a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dog2: { + keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], + "char": "\ud83d\udc15", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + poodle: { + keywords: [ "dog", "animal", "101", "nature", "pet" ], + "char": "\ud83d\udc29", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat2: { + keywords: [ "animal", "meow", "pet", "cats" ], + "char": "\ud83d\udc08", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit2: { + keywords: [ "animal", "nature", "pet", "magic", "spring" ], + "char": "\ud83d\udc07", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chipmunk: { + keywords: [ "animal", "nature", "rodent", "squirrel" ], + "char": "\ud83d\udc3f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hedgehog: { + keywords: [ "animal", "nature", "spiny" ], + "char": "\ud83e\udd94", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + raccoon: { + keywords: [ "animal", "nature" ], + "char": "\ud83e\udd9d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + llama: { + keywords: [ "animal", "nature", "alpaca" ], + "char": "\ud83e\udd99", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hippopotamus: { + keywords: [ "animal", "nature" ], + "char": "\ud83e\udd9b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + kangaroo: { + keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], + "char": "\ud83e\udd98", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + badger: { + keywords: [ "animal", "nature", "honey" ], + "char": "\ud83e\udda1", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + swan: { + keywords: [ "animal", "nature", "bird" ], + "char": "\ud83e\udda2", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + peacock: { + keywords: [ "animal", "nature", "peahen", "bird" ], + "char": "\ud83e\udd9a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + parrot: { + keywords: [ "animal", "nature", "bird", "pirate", "talk" ], + "char": "\ud83e\udd9c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lobster: { + keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], + "char": "\ud83e\udd9e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mosquito: { + keywords: [ "animal", "nature", "insect", "malaria" ], + "char": "\ud83e\udd9f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + paw_prints: { + keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], + "char": "\ud83d\udc3e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + "char": "\ud83d\udc09", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon_face: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + "char": "\ud83d\udc32", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cactus: { + keywords: [ "vegetable", "plant", "nature" ], + "char": "\ud83c\udf35", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + christmas_tree: { + keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], + "char": "\ud83c\udf84", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + evergreen_tree: { + keywords: [ "plant", "nature" ], + "char": "\ud83c\udf32", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deciduous_tree: { + keywords: [ "plant", "nature" ], + "char": "\ud83c\udf33", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + palm_tree: { + keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], + "char": "\ud83c\udf34", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + seedling: { + keywords: [ "plant", "nature", "grass", "lawn", "spring" ], + "char": "\ud83c\udf31", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + herb: { + keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], + "char": "\ud83c\udf3f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shamrock: { + keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], + "char": "\u2618", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + four_leaf_clover: { + keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], + "char": "\ud83c\udf40", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bamboo: { + keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], + "char": "\ud83c\udf8d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tanabata_tree: { + keywords: [ "plant", "nature", "branch", "summer" ], + "char": "\ud83c\udf8b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leaves: { + keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], + "char": "\ud83c\udf43", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fallen_leaf: { + keywords: [ "nature", "plant", "vegetable", "leaves" ], + "char": "\ud83c\udf42", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + maple_leaf: { + keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], + "char": "\ud83c\udf41", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ear_of_rice: { + keywords: [ "nature", "plant" ], + "char": "\ud83c\udf3e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hibiscus: { + keywords: [ "plant", "vegetable", "flowers", "beach" ], + "char": "\ud83c\udf3a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunflower: { + keywords: [ "nature", "plant", "fall" ], + "char": "\ud83c\udf3b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rose: { + keywords: [ "flowers", "valentines", "love", "spring" ], + "char": "\ud83c\udf39", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wilted_flower: { + keywords: [ "plant", "nature", "flower" ], + "char": "\ud83e\udd40", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tulip: { + keywords: [ "flowers", "plant", "nature", "summer", "spring" ], + "char": "\ud83c\udf37", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blossom: { + keywords: [ "nature", "flowers", "yellow" ], + "char": "\ud83c\udf3c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cherry_blossom: { + keywords: [ "nature", "plant", "spring", "flower" ], + "char": "\ud83c\udf38", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bouquet: { + keywords: [ "flowers", "nature", "spring" ], + "char": "\ud83d\udc90", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mushroom: { + keywords: [ "plant", "vegetable" ], + "char": "\ud83c\udf44", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chestnut: { + keywords: [ "food", "squirrel" ], + "char": "\ud83c\udf30", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + jack_o_lantern: { + keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], + "char": "\ud83c\udf83", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shell: { + keywords: [ "nature", "sea", "beach" ], + "char": "\ud83d\udc1a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider_web: { + keywords: [ "animal", "insect", "arachnid", "silk" ], + "char": "\ud83d\udd78", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_americas: { + keywords: [ "globe", "world", "USA", "international" ], + "char": "\ud83c\udf0e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_africa: { + keywords: [ "globe", "world", "international" ], + "char": "\ud83c\udf0d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_asia: { + keywords: [ "globe", "world", "east", "international" ], + "char": "\ud83c\udf0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon: { + keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf15", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_gibbous_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], + "char": "\ud83c\udf16", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf17", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf18", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf11", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf12", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf13", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_gibbous_moon: { + keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], + "char": "\ud83c\udf14", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf1a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf1d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf1b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf1c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_with_face: { + keywords: [ "nature", "morning", "sky" ], + "char": "\ud83c\udf1e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crescent_moon: { + keywords: [ "night", "sleep", "sky", "evening", "magic" ], + "char": "\ud83c\udf19", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star: { + keywords: [ "night", "yellow" ], + "char": "\u2b50", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star2: { + keywords: [ "night", "sparkle", "awesome", "good", "magic" ], + "char": "\ud83c\udf1f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dizzy: { + keywords: [ "star", "sparkle", "shoot", "magic" ], + "char": "\ud83d\udcab", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sparkles: { + keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], + "char": "\u2728", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + comet: { + keywords: [ "space" ], + "char": "\u2604", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunny: { + keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], + "char": "\u2600\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_small_cloud: { + keywords: [ "weather" ], + "char": "\ud83c\udf24", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + partly_sunny: { + keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], + "char": "\u26c5", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_large_cloud: { + keywords: [ "weather" ], + "char": "\ud83c\udf25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_rain_cloud: { + keywords: [ "weather" ], + "char": "\ud83c\udf26", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud: { + keywords: [ "weather", "sky" ], + "char": "\u2601\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_rain: { + keywords: [ "weather" ], + "char": "\ud83c\udf27", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning_and_rain: { + keywords: [ "weather", "lightning" ], + "char": "\u26c8", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning: { + keywords: [ "weather", "thunder" ], + "char": "\ud83c\udf29", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zap: { + keywords: [ "thunder", "weather", "lightning bolt", "fast" ], + "char": "\u26a1", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fire: { + keywords: [ "hot", "cook", "flame" ], + "char": "\ud83d\udd25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boom: { + keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], + "char": "\ud83d\udca5", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowflake: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], + "char": "\u2744\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_snow: { + keywords: [ "weather" ], + "char": "\ud83c\udf28", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], + "char": "\u26c4", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman_with_snow: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], + "char": "\u2603", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wind_face: { + keywords: [ "gust", "air" ], + "char": "\ud83c\udf2c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dash: { + keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], + "char": "\ud83d\udca8", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tornado: { + keywords: [ "weather", "cyclone", "twister" ], + "char": "\ud83c\udf2a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fog: { + keywords: [ "weather" ], + "char": "\ud83c\udf2b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + open_umbrella: { + keywords: [ "weather", "spring" ], + "char": "\u2602", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + umbrella: { + keywords: [ "rainy", "weather", "spring" ], + "char": "\u2614", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + droplet: { + keywords: [ "water", "drip", "faucet", "spring" ], + "char": "\ud83d\udca7", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sweat_drops: { + keywords: [ "water", "drip", "oops" ], + "char": "\ud83d\udca6", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ocean: { + keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], + "char": "\ud83c\udf0a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + green_apple: { + keywords: [ "fruit", "nature" ], + "char": "\ud83c\udf4f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + apple: { + keywords: [ "fruit", "mac", "school" ], + "char": "\ud83c\udf4e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pear: { + keywords: [ "fruit", "nature", "food" ], + "char": "\ud83c\udf50", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tangerine: { + keywords: [ "food", "fruit", "nature", "orange" ], + "char": "\ud83c\udf4a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lemon: { + keywords: [ "fruit", "nature" ], + "char": "\ud83c\udf4b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + banana: { + keywords: [ "fruit", "food", "monkey" ], + "char": "\ud83c\udf4c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + watermelon: { + keywords: [ "fruit", "food", "picnic", "summer" ], + "char": "\ud83c\udf49", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + grapes: { + keywords: [ "fruit", "food", "wine" ], + "char": "\ud83c\udf47", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + strawberry: { + keywords: [ "fruit", "food", "nature" ], + "char": "\ud83c\udf53", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + melon: { + keywords: [ "fruit", "nature", "food" ], + "char": "\ud83c\udf48", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cherries: { + keywords: [ "food", "fruit" ], + "char": "\ud83c\udf52", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peach: { + keywords: [ "fruit", "nature", "food" ], + "char": "\ud83c\udf51", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pineapple: { + keywords: [ "fruit", "nature", "food" ], + "char": "\ud83c\udf4d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coconut: { + keywords: [ "fruit", "nature", "food", "palm" ], + "char": "\ud83e\udd65", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + kiwi_fruit: { + keywords: [ "fruit", "food" ], + "char": "\ud83e\udd5d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + mango: { + keywords: [ "fruit", "food", "tropical" ], + "char": "\ud83e\udd6d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + avocado: { + keywords: [ "fruit", "food" ], + "char": "\ud83e\udd51", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + broccoli: { + keywords: [ "fruit", "food", "vegetable" ], + "char": "\ud83e\udd66", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tomato: { + keywords: [ "fruit", "vegetable", "nature", "food" ], + "char": "\ud83c\udf45", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + eggplant: { + keywords: [ "vegetable", "nature", "food", "aubergine" ], + "char": "\ud83c\udf46", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cucumber: { + keywords: [ "fruit", "food", "pickle" ], + "char": "\ud83e\udd52", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + carrot: { + keywords: [ "vegetable", "food", "orange" ], + "char": "\ud83e\udd55", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hot_pepper: { + keywords: [ "food", "spicy", "chilli", "chili" ], + "char": "\ud83c\udf36", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + potato: { + keywords: [ "food", "tuber", "vegatable", "starch" ], + "char": "\ud83e\udd54", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + corn: { + keywords: [ "food", "vegetable", "plant" ], + "char": "\ud83c\udf3d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + leafy_greens: { + keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], + "char": "\ud83e\udd6c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sweet_potato: { + keywords: [ "food", "nature" ], + "char": "\ud83c\udf60", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peanuts: { + keywords: [ "food", "nut" ], + "char": "\ud83e\udd5c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + honey_pot: { + keywords: [ "bees", "sweet", "kitchen" ], + "char": "\ud83c\udf6f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + croissant: { + keywords: [ "food", "bread", "french" ], + "char": "\ud83e\udd50", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bread: { + keywords: [ "food", "wheat", "breakfast", "toast" ], + "char": "\ud83c\udf5e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baguette_bread: { + keywords: [ "food", "bread", "french" ], + "char": "\ud83e\udd56", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bagel: { + keywords: [ "food", "bread", "bakery", "schmear" ], + "char": "\ud83e\udd6f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pretzel: { + keywords: [ "food", "bread", "twisted" ], + "char": "\ud83e\udd68", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cheese: { + keywords: [ "food", "chadder" ], + "char": "\ud83e\uddc0", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + egg: { + keywords: [ "food", "chicken", "breakfast" ], + "char": "\ud83e\udd5a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bacon: { + keywords: [ "food", "breakfast", "pork", "pig", "meat" ], + "char": "\ud83e\udd53", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + steak: { + keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], + "char": "\ud83e\udd69", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pancakes: { + keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], + "char": "\ud83e\udd5e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + poultry_leg: { + keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], + "char": "\ud83c\udf57", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + meat_on_bone: { + keywords: [ "good", "food", "drumstick" ], + "char": "\ud83c\udf56", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bone: { + keywords: [ "skeleton" ], + "char": "\ud83e\uddb4", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_shrimp: { + keywords: [ "food", "animal", "appetizer", "summer" ], + "char": "\ud83c\udf64", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_egg: { + keywords: [ "food", "breakfast", "kitchen", "egg" ], + "char": "\ud83c\udf73", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hamburger: { + keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], + "char": "\ud83c\udf54", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fries: { + keywords: [ "chips", "snack", "fast food" ], + "char": "\ud83c\udf5f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stuffed_flatbread: { + keywords: [ "food", "flatbread", "stuffed", "gyro" ], + "char": "\ud83e\udd59", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hotdog: { + keywords: [ "food", "frankfurter" ], + "char": "\ud83c\udf2d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pizza: { + keywords: [ "food", "party" ], + "char": "\ud83c\udf55", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sandwich: { + keywords: [ "food", "lunch", "bread" ], + "char": "\ud83e\udd6a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + canned_food: { + keywords: [ "food", "soup" ], + "char": "\ud83e\udd6b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spaghetti: { + keywords: [ "food", "italian", "noodle" ], + "char": "\ud83c\udf5d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + taco: { + keywords: [ "food", "mexican" ], + "char": "\ud83c\udf2e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + burrito: { + keywords: [ "food", "mexican" ], + "char": "\ud83c\udf2f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + green_salad: { + keywords: [ "food", "healthy", "lettuce" ], + "char": "\ud83e\udd57", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shallow_pan_of_food: { + keywords: [ "food", "cooking", "casserole", "paella" ], + "char": "\ud83e\udd58", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ramen: { + keywords: [ "food", "japanese", "noodle", "chopsticks" ], + "char": "\ud83c\udf5c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stew: { + keywords: [ "food", "meat", "soup" ], + "char": "\ud83c\udf72", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fish_cake: { + keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], + "char": "\ud83c\udf65", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fortune_cookie: { + keywords: [ "food", "prophecy" ], + "char": "\ud83e\udd60", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sushi: { + keywords: [ "food", "fish", "japanese", "rice" ], + "char": "\ud83c\udf63", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bento: { + keywords: [ "food", "japanese", "box" ], + "char": "\ud83c\udf71", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + curry: { + keywords: [ "food", "spicy", "hot", "indian" ], + "char": "\ud83c\udf5b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_ball: { + keywords: [ "food", "japanese" ], + "char": "\ud83c\udf59", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice: { + keywords: [ "food", "china", "asian" ], + "char": "\ud83c\udf5a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_cracker: { + keywords: [ "food", "japanese" ], + "char": "\ud83c\udf58", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + oden: { + keywords: [ "food", "japanese" ], + "char": "\ud83c\udf62", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dango: { + keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], + "char": "\ud83c\udf61", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shaved_ice: { + keywords: [ "hot", "dessert", "summer" ], + "char": "\ud83c\udf67", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ice_cream: { + keywords: [ "food", "hot", "dessert" ], + "char": "\ud83c\udf68", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + icecream: { + keywords: [ "food", "hot", "dessert", "summer" ], + "char": "\ud83c\udf66", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pie: { + keywords: [ "food", "dessert", "pastry" ], + "char": "\ud83e\udd67", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cake: { + keywords: [ "food", "dessert" ], + "char": "\ud83c\udf70", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cupcake: { + keywords: [ "food", "dessert", "bakery", "sweet" ], + "char": "\ud83e\uddc1", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + moon_cake: { + keywords: [ "food", "autumn" ], + "char": "\ud83e\udd6e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + birthday: { + keywords: [ "food", "dessert", "cake" ], + "char": "\ud83c\udf82", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + custard: { + keywords: [ "dessert", "food" ], + "char": "\ud83c\udf6e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + candy: { + keywords: [ "snack", "dessert", "sweet", "lolly" ], + "char": "\ud83c\udf6c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lollipop: { + keywords: [ "food", "snack", "candy", "sweet" ], + "char": "\ud83c\udf6d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chocolate_bar: { + keywords: [ "food", "snack", "dessert", "sweet" ], + "char": "\ud83c\udf6b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + popcorn: { + keywords: [ "food", "movie theater", "films", "snack" ], + "char": "\ud83c\udf7f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dumpling: { + keywords: [ "food", "empanada", "pierogi", "potsticker" ], + "char": "\ud83e\udd5f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + doughnut: { + keywords: [ "food", "dessert", "snack", "sweet", "donut" ], + "char": "\ud83c\udf69", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cookie: { + keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], + "char": "\ud83c\udf6a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + milk_glass: { + keywords: [ "beverage", "drink", "cow" ], + "char": "\ud83e\udd5b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beer: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + "char": "\ud83c\udf7a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beers: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + "char": "\ud83c\udf7b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + clinking_glasses: { + keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], + "char": "\ud83e\udd42", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + wine_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], + "char": "\ud83c\udf77", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tumbler_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], + "char": "\ud83e\udd43", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cocktail: { + keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], + "char": "\ud83c\udf78", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tropical_drink: { + keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], + "char": "\ud83c\udf79", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + champagne: { + keywords: [ "drink", "wine", "bottle", "celebration" ], + "char": "\ud83c\udf7e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sake: { + keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], + "char": "\ud83c\udf76", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tea: { + keywords: [ "drink", "bowl", "breakfast", "green", "british" ], + "char": "\ud83c\udf75", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cup_with_straw: { + keywords: [ "drink", "soda" ], + "char": "\ud83e\udd64", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coffee: { + keywords: [ "beverage", "caffeine", "latte", "espresso" ], + "char": "\u2615", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baby_bottle: { + keywords: [ "food", "container", "milk" ], + "char": "\ud83c\udf7c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + salt: { + keywords: [ "condiment", "shaker" ], + "char": "\ud83e\uddc2", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spoon: { + keywords: [ "cutlery", "kitchen", "tableware" ], + "char": "\ud83e\udd44", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fork_and_knife: { + keywords: [ "cutlery", "kitchen" ], + "char": "\ud83c\udf74", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + plate_with_cutlery: { + keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], + "char": "\ud83c\udf7d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bowl_with_spoon: { + keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], + "char": "\ud83e\udd63", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + takeout_box: { + keywords: [ "food", "leftovers" ], + "char": "\ud83e\udd61", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chopsticks: { + keywords: [ "food" ], + "char": "\ud83e\udd62", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + soccer: { + keywords: [ "sports", "football" ], + "char": "\u26bd", + fitzpatrick_scale: false, + category: "activity" + }, + basketball: { + keywords: [ "sports", "balls", "NBA" ], + "char": "\ud83c\udfc0", + fitzpatrick_scale: false, + category: "activity" + }, + football: { + keywords: [ "sports", "balls", "NFL" ], + "char": "\ud83c\udfc8", + fitzpatrick_scale: false, + category: "activity" + }, + baseball: { + keywords: [ "sports", "balls" ], + "char": "\u26be", + fitzpatrick_scale: false, + category: "activity" + }, + softball: { + keywords: [ "sports", "balls" ], + "char": "\ud83e\udd4e", + fitzpatrick_scale: false, + category: "activity" + }, + tennis: { + keywords: [ "sports", "balls", "green" ], + "char": "\ud83c\udfbe", + fitzpatrick_scale: false, + category: "activity" + }, + volleyball: { + keywords: [ "sports", "balls" ], + "char": "\ud83c\udfd0", + fitzpatrick_scale: false, + category: "activity" + }, + rugby_football: { + keywords: [ "sports", "team" ], + "char": "\ud83c\udfc9", + fitzpatrick_scale: false, + category: "activity" + }, + flying_disc: { + keywords: [ "sports", "frisbee", "ultimate" ], + "char": "\ud83e\udd4f", + fitzpatrick_scale: false, + category: "activity" + }, + "8ball": { + keywords: [ "pool", "hobby", "game", "luck", "magic" ], + "char": "\ud83c\udfb1", + fitzpatrick_scale: false, + category: "activity" + }, + golf: { + keywords: [ "sports", "business", "flag", "hole", "summer" ], + "char": "\u26f3", + fitzpatrick_scale: false, + category: "activity" + }, + golfing_woman: { + keywords: [ "sports", "business", "woman", "female" ], + "char": "\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + golfing_man: { + keywords: [ "sports", "business" ], + "char": "\ud83c\udfcc", + fitzpatrick_scale: true, + category: "activity" + }, + ping_pong: { + keywords: [ "sports", "pingpong" ], + "char": "\ud83c\udfd3", + fitzpatrick_scale: false, + category: "activity" + }, + badminton: { + keywords: [ "sports" ], + "char": "\ud83c\udff8", + fitzpatrick_scale: false, + category: "activity" + }, + goal_net: { + keywords: [ "sports" ], + "char": "\ud83e\udd45", + fitzpatrick_scale: false, + category: "activity" + }, + ice_hockey: { + keywords: [ "sports" ], + "char": "\ud83c\udfd2", + fitzpatrick_scale: false, + category: "activity" + }, + field_hockey: { + keywords: [ "sports" ], + "char": "\ud83c\udfd1", + fitzpatrick_scale: false, + category: "activity" + }, + lacrosse: { + keywords: [ "sports", "ball", "stick" ], + "char": "\ud83e\udd4d", + fitzpatrick_scale: false, + category: "activity" + }, + cricket: { + keywords: [ "sports" ], + "char": "\ud83c\udfcf", + fitzpatrick_scale: false, + category: "activity" + }, + ski: { + keywords: [ "sports", "winter", "cold", "snow" ], + "char": "\ud83c\udfbf", + fitzpatrick_scale: false, + category: "activity" + }, + skier: { + keywords: [ "sports", "winter", "snow" ], + "char": "\u26f7", + fitzpatrick_scale: false, + category: "activity" + }, + snowboarder: { + keywords: [ "sports", "winter" ], + "char": "\ud83c\udfc2", + fitzpatrick_scale: true, + category: "activity" + }, + person_fencing: { + keywords: [ "sports", "fencing", "sword" ], + "char": "\ud83e\udd3a", + fitzpatrick_scale: false, + category: "activity" + }, + women_wrestling: { + keywords: [ "sports", "wrestlers" ], + "char": "\ud83e\udd3c\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + men_wrestling: { + keywords: [ "sports", "wrestlers" ], + "char": "\ud83e\udd3c\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + woman_cartwheeling: { + keywords: [ "gymnastics" ], + "char": "\ud83e\udd38\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_cartwheeling: { + keywords: [ "gymnastics" ], + "char": "\ud83e\udd38\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_handball: { + keywords: [ "sports" ], + "char": "\ud83e\udd3e\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_handball: { + keywords: [ "sports" ], + "char": "\ud83e\udd3e\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + ice_skate: { + keywords: [ "sports" ], + "char": "\u26f8", + fitzpatrick_scale: false, + category: "activity" + }, + curling_stone: { + keywords: [ "sports" ], + "char": "\ud83e\udd4c", + fitzpatrick_scale: false, + category: "activity" + }, + skateboard: { + keywords: [ "board" ], + "char": "\ud83d\udef9", + fitzpatrick_scale: false, + category: "activity" + }, + sled: { + keywords: [ "sleigh", "luge", "toboggan" ], + "char": "\ud83d\udef7", + fitzpatrick_scale: false, + category: "activity" + }, + bow_and_arrow: { + keywords: [ "sports" ], + "char": "\ud83c\udff9", + fitzpatrick_scale: false, + category: "activity" + }, + fishing_pole_and_fish: { + keywords: [ "food", "hobby", "summer" ], + "char": "\ud83c\udfa3", + fitzpatrick_scale: false, + category: "activity" + }, + boxing_glove: { + keywords: [ "sports", "fighting" ], + "char": "\ud83e\udd4a", + fitzpatrick_scale: false, + category: "activity" + }, + martial_arts_uniform: { + keywords: [ "judo", "karate", "taekwondo" ], + "char": "\ud83e\udd4b", + fitzpatrick_scale: false, + category: "activity" + }, + rowing_woman: { + keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], + "char": "\ud83d\udea3\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + rowing_man: { + keywords: [ "sports", "hobby", "water", "ship" ], + "char": "\ud83d\udea3", + fitzpatrick_scale: true, + category: "activity" + }, + climbing_woman: { + keywords: [ "sports", "hobby", "woman", "female", "rock" ], + "char": "\ud83e\uddd7\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + climbing_man: { + keywords: [ "sports", "hobby", "man", "male", "rock" ], + "char": "\ud83e\uddd7\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + swimming_woman: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], + "char": "\ud83c\udfca\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + swimming_man: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], + "char": "\ud83c\udfca", + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_water_polo: { + keywords: [ "sports", "pool" ], + "char": "\ud83e\udd3d\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_water_polo: { + keywords: [ "sports", "pool" ], + "char": "\ud83e\udd3d\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + woman_in_lotus_position: { + keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + "char": "\ud83e\uddd8\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_in_lotus_position: { + keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + "char": "\ud83e\uddd8\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + surfing_woman: { + keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], + "char": "\ud83c\udfc4\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + surfing_man: { + keywords: [ "sports", "ocean", "sea", "summer", "beach" ], + "char": "\ud83c\udfc4", + fitzpatrick_scale: true, + category: "activity" + }, + bath: { + keywords: [ "clean", "shower", "bathroom" ], + "char": "\ud83d\udec0", + fitzpatrick_scale: true, + category: "activity" + }, + basketball_woman: { + keywords: [ "sports", "human", "woman", "female" ], + "char": "\u26f9\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + basketball_man: { + keywords: [ "sports", "human" ], + "char": "\u26f9", + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_woman: { + keywords: [ "sports", "training", "exercise", "woman", "female" ], + "char": "\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_man: { + keywords: [ "sports", "training", "exercise" ], + "char": "\ud83c\udfcb", + fitzpatrick_scale: true, + category: "activity" + }, + biking_woman: { + keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], + "char": "\ud83d\udeb4\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + biking_man: { + keywords: [ "sports", "bike", "exercise", "hipster" ], + "char": "\ud83d\udeb4", + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_woman: { + keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], + "char": "\ud83d\udeb5\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_man: { + keywords: [ "transportation", "sports", "human", "race", "bike" ], + "char": "\ud83d\udeb5", + fitzpatrick_scale: true, + category: "activity" + }, + horse_racing: { + keywords: [ "animal", "betting", "competition", "gambling", "luck" ], + "char": "\ud83c\udfc7", + fitzpatrick_scale: true, + category: "activity" + }, + business_suit_levitating: { + keywords: [ "suit", "business", "levitate", "hover", "jump" ], + "char": "\ud83d\udd74", + fitzpatrick_scale: true, + category: "activity" + }, + trophy: { + keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], + "char": "\ud83c\udfc6", + fitzpatrick_scale: false, + category: "activity" + }, + running_shirt_with_sash: { + keywords: [ "play", "pageant" ], + "char": "\ud83c\udfbd", + fitzpatrick_scale: false, + category: "activity" + }, + medal_sports: { + keywords: [ "award", "winning" ], + "char": "\ud83c\udfc5", + fitzpatrick_scale: false, + category: "activity" + }, + medal_military: { + keywords: [ "award", "winning", "army" ], + "char": "\ud83c\udf96", + fitzpatrick_scale: false, + category: "activity" + }, + "1st_place_medal": { + keywords: [ "award", "winning", "first" ], + "char": "\ud83e\udd47", + fitzpatrick_scale: false, + category: "activity" + }, + "2nd_place_medal": { + keywords: [ "award", "second" ], + "char": "\ud83e\udd48", + fitzpatrick_scale: false, + category: "activity" + }, + "3rd_place_medal": { + keywords: [ "award", "third" ], + "char": "\ud83e\udd49", + fitzpatrick_scale: false, + category: "activity" + }, + reminder_ribbon: { + keywords: [ "sports", "cause", "support", "awareness" ], + "char": "\ud83c\udf97", + fitzpatrick_scale: false, + category: "activity" + }, + rosette: { + keywords: [ "flower", "decoration", "military" ], + "char": "\ud83c\udff5", + fitzpatrick_scale: false, + category: "activity" + }, + ticket: { + keywords: [ "event", "concert", "pass" ], + "char": "\ud83c\udfab", + fitzpatrick_scale: false, + category: "activity" + }, + tickets: { + keywords: [ "sports", "concert", "entrance" ], + "char": "\ud83c\udf9f", + fitzpatrick_scale: false, + category: "activity" + }, + performing_arts: { + keywords: [ "acting", "theater", "drama" ], + "char": "\ud83c\udfad", + fitzpatrick_scale: false, + category: "activity" + }, + art: { + keywords: [ "design", "paint", "draw", "colors" ], + "char": "\ud83c\udfa8", + fitzpatrick_scale: false, + category: "activity" + }, + circus_tent: { + keywords: [ "festival", "carnival", "party" ], + "char": "\ud83c\udfaa", + fitzpatrick_scale: false, + category: "activity" + }, + woman_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + "char": "\ud83e\udd39\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + "char": "\ud83e\udd39\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + microphone: { + keywords: [ "sound", "music", "PA", "sing", "talkshow" ], + "char": "\ud83c\udfa4", + fitzpatrick_scale: false, + category: "activity" + }, + headphones: { + keywords: [ "music", "score", "gadgets" ], + "char": "\ud83c\udfa7", + fitzpatrick_scale: false, + category: "activity" + }, + musical_score: { + keywords: [ "treble", "clef", "compose" ], + "char": "\ud83c\udfbc", + fitzpatrick_scale: false, + category: "activity" + }, + musical_keyboard: { + keywords: [ "piano", "instrument", "compose" ], + "char": "\ud83c\udfb9", + fitzpatrick_scale: false, + category: "activity" + }, + drum: { + keywords: [ "music", "instrument", "drumsticks", "snare" ], + "char": "\ud83e\udd41", + fitzpatrick_scale: false, + category: "activity" + }, + saxophone: { + keywords: [ "music", "instrument", "jazz", "blues" ], + "char": "\ud83c\udfb7", + fitzpatrick_scale: false, + category: "activity" + }, + trumpet: { + keywords: [ "music", "brass" ], + "char": "\ud83c\udfba", + fitzpatrick_scale: false, + category: "activity" + }, + guitar: { + keywords: [ "music", "instrument" ], + "char": "\ud83c\udfb8", + fitzpatrick_scale: false, + category: "activity" + }, + violin: { + keywords: [ "music", "instrument", "orchestra", "symphony" ], + "char": "\ud83c\udfbb", + fitzpatrick_scale: false, + category: "activity" + }, + clapper: { + keywords: [ "movie", "film", "record" ], + "char": "\ud83c\udfac", + fitzpatrick_scale: false, + category: "activity" + }, + video_game: { + keywords: [ "play", "console", "PS4", "controller" ], + "char": "\ud83c\udfae", + fitzpatrick_scale: false, + category: "activity" + }, + space_invader: { + keywords: [ "game", "arcade", "play" ], + "char": "\ud83d\udc7e", + fitzpatrick_scale: false, + category: "activity" + }, + dart: { + keywords: [ "game", "play", "bar", "target", "bullseye" ], + "char": "\ud83c\udfaf", + fitzpatrick_scale: false, + category: "activity" + }, + game_die: { + keywords: [ "dice", "random", "tabletop", "play", "luck" ], + "char": "\ud83c\udfb2", + fitzpatrick_scale: false, + category: "activity" + }, + chess_pawn: { + keywords: [ "expendable" ], + "char": "\u265f", + fitzpatrick_scale: false, + category: "activity" + }, + slot_machine: { + keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], + "char": "\ud83c\udfb0", + fitzpatrick_scale: false, + category: "activity" + }, + jigsaw: { + keywords: [ "interlocking", "puzzle", "piece" ], + "char": "\ud83e\udde9", + fitzpatrick_scale: false, + category: "activity" + }, + bowling: { + keywords: [ "sports", "fun", "play" ], + "char": "\ud83c\udfb3", + fitzpatrick_scale: false, + category: "activity" + }, + red_car: { + keywords: [ "red", "transportation", "vehicle" ], + "char": "\ud83d\ude97", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + taxi: { + keywords: [ "uber", "vehicle", "cars", "transportation" ], + "char": "\ud83d\ude95", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + blue_car: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude99", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bus: { + keywords: [ "car", "vehicle", "transportation" ], + "char": "\ud83d\ude8c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + trolleybus: { + keywords: [ "bart", "transportation", "vehicle" ], + "char": "\ud83d\ude8e", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + racing_car: { + keywords: [ "sports", "race", "fast", "formula", "f1" ], + "char": "\ud83c\udfce", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + police_car: { + keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], + "char": "\ud83d\ude93", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ambulance: { + keywords: [ "health", "911", "hospital" ], + "char": "\ud83d\ude91", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fire_engine: { + keywords: [ "transportation", "cars", "vehicle" ], + "char": "\ud83d\ude92", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + minibus: { + keywords: [ "vehicle", "car", "transportation" ], + "char": "\ud83d\ude90", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + truck: { + keywords: [ "cars", "transportation" ], + "char": "\ud83d\ude9a", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + articulated_lorry: { + keywords: [ "vehicle", "cars", "transportation", "express" ], + "char": "\ud83d\ude9b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tractor: { + keywords: [ "vehicle", "car", "farming", "agriculture" ], + "char": "\ud83d\ude9c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kick_scooter: { + keywords: [ "vehicle", "kick", "razor" ], + "char": "\ud83d\udef4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorcycle: { + keywords: [ "race", "sports", "fast" ], + "char": "\ud83c\udfcd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bike: { + keywords: [ "sports", "bicycle", "exercise", "hipster" ], + "char": "\ud83d\udeb2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_scooter: { + keywords: [ "vehicle", "vespa", "sasha" ], + "char": "\ud83d\udef5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rotating_light: { + keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], + "char": "\ud83d\udea8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_police_car: { + keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], + "char": "\ud83d\ude94", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_bus: { + keywords: [ "vehicle", "transportation" ], + "char": "\ud83d\ude8d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_automobile: { + keywords: [ "car", "vehicle", "transportation" ], + "char": "\ud83d\ude98", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_taxi: { + keywords: [ "vehicle", "cars", "uber" ], + "char": "\ud83d\ude96", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + aerial_tramway: { + keywords: [ "transportation", "vehicle", "ski" ], + "char": "\ud83d\udea1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_cableway: { + keywords: [ "transportation", "vehicle", "ski" ], + "char": "\ud83d\udea0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + suspension_railway: { + keywords: [ "vehicle", "transportation" ], + "char": "\ud83d\ude9f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_car: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude83", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train: { + keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], + "char": "\ud83d\ude8b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + monorail: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude9d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_side: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude84", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_front: { + keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], + "char": "\ud83d\ude85", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + light_rail: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude88", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_railway: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude9e", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + steam_locomotive: { + keywords: [ "transportation", "vehicle", "train" ], + "char": "\ud83d\ude82", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train2: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude86", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + metro: { + keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], + "char": "\ud83d\ude87", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tram: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude8a", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + station: { + keywords: [ "transportation", "vehicle", "public" ], + "char": "\ud83d\ude89", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flying_saucer: { + keywords: [ "transportation", "vehicle", "ufo" ], + "char": "\ud83d\udef8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + helicopter: { + keywords: [ "transportation", "vehicle", "fly" ], + "char": "\ud83d\ude81", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + small_airplane: { + keywords: [ "flight", "transportation", "fly", "vehicle" ], + "char": "\ud83d\udee9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + airplane: { + keywords: [ "vehicle", "transportation", "flight", "fly" ], + "char": "\u2708\ufe0f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_departure: { + keywords: [ "airport", "flight", "landing" ], + "char": "\ud83d\udeeb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_arrival: { + keywords: [ "airport", "flight", "boarding" ], + "char": "\ud83d\udeec", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sailboat: { + keywords: [ "ship", "summer", "transportation", "water", "sailing" ], + "char": "\u26f5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_boat: { + keywords: [ "ship" ], + "char": "\ud83d\udee5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + speedboat: { + keywords: [ "ship", "transportation", "vehicle", "summer" ], + "char": "\ud83d\udea4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferry: { + keywords: [ "boat", "ship", "yacht" ], + "char": "\u26f4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + passenger_ship: { + keywords: [ "yacht", "cruise", "ferry" ], + "char": "\ud83d\udef3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rocket: { + keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], + "char": "\ud83d\ude80", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + artificial_satellite: { + keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], + "char": "\ud83d\udef0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + seat: { + keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], + "char": "\ud83d\udcba", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + canoe: { + keywords: [ "boat", "paddle", "water", "ship" ], + "char": "\ud83d\udef6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + anchor: { + keywords: [ "ship", "ferry", "sea", "boat" ], + "char": "\u2693", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + construction: { + keywords: [ "wip", "progress", "caution", "warning" ], + "char": "\ud83d\udea7", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fuelpump: { + keywords: [ "gas station", "petroleum" ], + "char": "\u26fd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + busstop: { + keywords: [ "transportation", "wait" ], + "char": "\ud83d\ude8f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + vertical_traffic_light: { + keywords: [ "transportation", "driving" ], + "char": "\ud83d\udea6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + traffic_light: { + keywords: [ "transportation", "signal" ], + "char": "\ud83d\udea5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + checkered_flag: { + keywords: [ "contest", "finishline", "race", "gokart" ], + "char": "\ud83c\udfc1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ship: { + keywords: [ "transportation", "titanic", "deploy" ], + "char": "\ud83d\udea2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferris_wheel: { + keywords: [ "photo", "carnival", "londoneye" ], + "char": "\ud83c\udfa1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + roller_coaster: { + keywords: [ "carnival", "playground", "photo", "fun" ], + "char": "\ud83c\udfa2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + carousel_horse: { + keywords: [ "photo", "carnival" ], + "char": "\ud83c\udfa0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + building_construction: { + keywords: [ "wip", "working", "progress" ], + "char": "\ud83c\udfd7", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + foggy: { + keywords: [ "photo", "mountain" ], + "char": "\ud83c\udf01", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tokyo_tower: { + keywords: [ "photo", "japanese" ], + "char": "\ud83d\uddfc", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + factory: { + keywords: [ "building", "industry", "pollution", "smoke" ], + "char": "\ud83c\udfed", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fountain: { + keywords: [ "photo", "summer", "water", "fresh" ], + "char": "\u26f2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rice_scene: { + keywords: [ "photo", "japan", "asia", "tsukimi" ], + "char": "\ud83c\udf91", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain: { + keywords: [ "photo", "nature", "environment" ], + "char": "\u26f0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_snow: { + keywords: [ "photo", "nature", "environment", "winter", "cold" ], + "char": "\ud83c\udfd4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mount_fuji: { + keywords: [ "photo", "mountain", "nature", "japanese" ], + "char": "\ud83d\uddfb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + volcano: { + keywords: [ "photo", "nature", "disaster" ], + "char": "\ud83c\udf0b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japan: { + keywords: [ "nation", "country", "japanese", "asia" ], + "char": "\ud83d\uddfe", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + camping: { + keywords: [ "photo", "outdoors", "tent" ], + "char": "\ud83c\udfd5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tent: { + keywords: [ "photo", "camping", "outdoors" ], + "char": "\u26fa", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + national_park: { + keywords: [ "photo", "environment", "nature" ], + "char": "\ud83c\udfde", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorway: { + keywords: [ "road", "cupertino", "interstate", "highway" ], + "char": "\ud83d\udee3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_track: { + keywords: [ "train", "transportation" ], + "char": "\ud83d\udee4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise: { + keywords: [ "morning", "view", "vacation", "photo" ], + "char": "\ud83c\udf05", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise_over_mountains: { + keywords: [ "view", "vacation", "photo" ], + "char": "\ud83c\udf04", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert: { + keywords: [ "photo", "warm", "saharah" ], + "char": "\ud83c\udfdc", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + beach_umbrella: { + keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], + "char": "\ud83c\udfd6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert_island: { + keywords: [ "photo", "tropical", "mojito" ], + "char": "\ud83c\udfdd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunrise: { + keywords: [ "photo", "good morning", "dawn" ], + "char": "\ud83c\udf07", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunset: { + keywords: [ "photo", "evening", "sky", "buildings" ], + "char": "\ud83c\udf06", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + cityscape: { + keywords: [ "photo", "night life", "urban" ], + "char": "\ud83c\udfd9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + night_with_stars: { + keywords: [ "evening", "city", "downtown" ], + "char": "\ud83c\udf03", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bridge_at_night: { + keywords: [ "photo", "sanfrancisco" ], + "char": "\ud83c\udf09", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + milky_way: { + keywords: [ "photo", "space", "stars" ], + "char": "\ud83c\udf0c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stars: { + keywords: [ "night", "photo" ], + "char": "\ud83c\udf20", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sparkler: { + keywords: [ "stars", "night", "shine" ], + "char": "\ud83c\udf87", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fireworks: { + keywords: [ "photo", "festival", "carnival", "congratulations" ], + "char": "\ud83c\udf86", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rainbow: { + keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], + "char": "\ud83c\udf08", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + houses: { + keywords: [ "buildings", "photo" ], + "char": "\ud83c\udfd8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_castle: { + keywords: [ "building", "royalty", "history" ], + "char": "\ud83c\udff0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japanese_castle: { + keywords: [ "photo", "building" ], + "char": "\ud83c\udfef", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stadium: { + keywords: [ "photo", "place", "sports", "concert", "venue" ], + "char": "\ud83c\udfdf", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + statue_of_liberty: { + keywords: [ "american", "newyork" ], + "char": "\ud83d\uddfd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house: { + keywords: [ "building", "home" ], + "char": "\ud83c\udfe0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house_with_garden: { + keywords: [ "home", "plant", "nature" ], + "char": "\ud83c\udfe1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + derelict_house: { + keywords: [ "abandon", "evict", "broken", "building" ], + "char": "\ud83c\udfda", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + office: { + keywords: [ "building", "bureau", "work" ], + "char": "\ud83c\udfe2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + department_store: { + keywords: [ "building", "shopping", "mall" ], + "char": "\ud83c\udfec", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + post_office: { + keywords: [ "building", "envelope", "communication" ], + "char": "\ud83c\udfe3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_post_office: { + keywords: [ "building", "email" ], + "char": "\ud83c\udfe4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hospital: { + keywords: [ "building", "health", "surgery", "doctor" ], + "char": "\ud83c\udfe5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bank: { + keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], + "char": "\ud83c\udfe6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hotel: { + keywords: [ "building", "accomodation", "checkin" ], + "char": "\ud83c\udfe8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + convenience_store: { + keywords: [ "building", "shopping", "groceries" ], + "char": "\ud83c\udfea", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + school: { + keywords: [ "building", "student", "education", "learn", "teach" ], + "char": "\ud83c\udfeb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + love_hotel: { + keywords: [ "like", "affection", "dating" ], + "char": "\ud83c\udfe9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + wedding: { + keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], + "char": "\ud83d\udc92", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + classical_building: { + keywords: [ "art", "culture", "history" ], + "char": "\ud83c\udfdb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + church: { + keywords: [ "building", "religion", "christ" ], + "char": "\u26ea", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mosque: { + keywords: [ "islam", "worship", "minaret" ], + "char": "\ud83d\udd4c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + synagogue: { + keywords: [ "judaism", "worship", "temple", "jewish" ], + "char": "\ud83d\udd4d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kaaba: { + keywords: [ "mecca", "mosque", "islam" ], + "char": "\ud83d\udd4b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + shinto_shrine: { + keywords: [ "temple", "japan", "kyoto" ], + "char": "\u26e9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + watch: { + keywords: [ "time", "accessories" ], + "char": "\u231a", + fitzpatrick_scale: false, + category: "objects" + }, + iphone: { + keywords: [ "technology", "apple", "gadgets", "dial" ], + "char": "\ud83d\udcf1", + fitzpatrick_scale: false, + category: "objects" + }, + calling: { + keywords: [ "iphone", "incoming" ], + "char": "\ud83d\udcf2", + fitzpatrick_scale: false, + category: "objects" + }, + computer: { + keywords: [ "technology", "laptop", "screen", "display", "monitor" ], + "char": "\ud83d\udcbb", + fitzpatrick_scale: false, + category: "objects" + }, + keyboard: { + keywords: [ "technology", "computer", "type", "input", "text" ], + "char": "\u2328", + fitzpatrick_scale: false, + category: "objects" + }, + desktop_computer: { + keywords: [ "technology", "computing", "screen" ], + "char": "\ud83d\udda5", + fitzpatrick_scale: false, + category: "objects" + }, + printer: { + keywords: [ "paper", "ink" ], + "char": "\ud83d\udda8", + fitzpatrick_scale: false, + category: "objects" + }, + computer_mouse: { + keywords: [ "click" ], + "char": "\ud83d\uddb1", + fitzpatrick_scale: false, + category: "objects" + }, + trackball: { + keywords: [ "technology", "trackpad" ], + "char": "\ud83d\uddb2", + fitzpatrick_scale: false, + category: "objects" + }, + joystick: { + keywords: [ "game", "play" ], + "char": "\ud83d\udd79", + fitzpatrick_scale: false, + category: "objects" + }, + clamp: { + keywords: [ "tool" ], + "char": "\ud83d\udddc", + fitzpatrick_scale: false, + category: "objects" + }, + minidisc: { + keywords: [ "technology", "record", "data", "disk", "90s" ], + "char": "\ud83d\udcbd", + fitzpatrick_scale: false, + category: "objects" + }, + floppy_disk: { + keywords: [ "oldschool", "technology", "save", "90s", "80s" ], + "char": "\ud83d\udcbe", + fitzpatrick_scale: false, + category: "objects" + }, + cd: { + keywords: [ "technology", "dvd", "disk", "disc", "90s" ], + "char": "\ud83d\udcbf", + fitzpatrick_scale: false, + category: "objects" + }, + dvd: { + keywords: [ "cd", "disk", "disc" ], + "char": "\ud83d\udcc0", + fitzpatrick_scale: false, + category: "objects" + }, + vhs: { + keywords: [ "record", "video", "oldschool", "90s", "80s" ], + "char": "\ud83d\udcfc", + fitzpatrick_scale: false, + category: "objects" + }, + camera: { + keywords: [ "gadgets", "photography" ], + "char": "\ud83d\udcf7", + fitzpatrick_scale: false, + category: "objects" + }, + camera_flash: { + keywords: [ "photography", "gadgets" ], + "char": "\ud83d\udcf8", + fitzpatrick_scale: false, + category: "objects" + }, + video_camera: { + keywords: [ "film", "record" ], + "char": "\ud83d\udcf9", + fitzpatrick_scale: false, + category: "objects" + }, + movie_camera: { + keywords: [ "film", "record" ], + "char": "\ud83c\udfa5", + fitzpatrick_scale: false, + category: "objects" + }, + film_projector: { + keywords: [ "video", "tape", "record", "movie" ], + "char": "\ud83d\udcfd", + fitzpatrick_scale: false, + category: "objects" + }, + film_strip: { + keywords: [ "movie" ], + "char": "\ud83c\udf9e", + fitzpatrick_scale: false, + category: "objects" + }, + telephone_receiver: { + keywords: [ "technology", "communication", "dial" ], + "char": "\ud83d\udcde", + fitzpatrick_scale: false, + category: "objects" + }, + phone: { + keywords: [ "technology", "communication", "dial", "telephone" ], + "char": "\u260e\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + pager: { + keywords: [ "bbcall", "oldschool", "90s" ], + "char": "\ud83d\udcdf", + fitzpatrick_scale: false, + category: "objects" + }, + fax: { + keywords: [ "communication", "technology" ], + "char": "\ud83d\udce0", + fitzpatrick_scale: false, + category: "objects" + }, + tv: { + keywords: [ "technology", "program", "oldschool", "show", "television" ], + "char": "\ud83d\udcfa", + fitzpatrick_scale: false, + category: "objects" + }, + radio: { + keywords: [ "communication", "music", "podcast", "program" ], + "char": "\ud83d\udcfb", + fitzpatrick_scale: false, + category: "objects" + }, + studio_microphone: { + keywords: [ "sing", "recording", "artist", "talkshow" ], + "char": "\ud83c\udf99", + fitzpatrick_scale: false, + category: "objects" + }, + level_slider: { + keywords: [ "scale" ], + "char": "\ud83c\udf9a", + fitzpatrick_scale: false, + category: "objects" + }, + control_knobs: { + keywords: [ "dial" ], + "char": "\ud83c\udf9b", + fitzpatrick_scale: false, + category: "objects" + }, + compass: { + keywords: [ "magnetic", "navigation", "orienteering" ], + "char": "\ud83e\udded", + fitzpatrick_scale: false, + category: "objects" + }, + stopwatch: { + keywords: [ "time", "deadline" ], + "char": "\u23f1", + fitzpatrick_scale: false, + category: "objects" + }, + timer_clock: { + keywords: [ "alarm" ], + "char": "\u23f2", + fitzpatrick_scale: false, + category: "objects" + }, + alarm_clock: { + keywords: [ "time", "wake" ], + "char": "\u23f0", + fitzpatrick_scale: false, + category: "objects" + }, + mantelpiece_clock: { + keywords: [ "time" ], + "char": "\ud83d\udd70", + fitzpatrick_scale: false, + category: "objects" + }, + hourglass_flowing_sand: { + keywords: [ "oldschool", "time", "countdown" ], + "char": "\u23f3", + fitzpatrick_scale: false, + category: "objects" + }, + hourglass: { + keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], + "char": "\u231b", + fitzpatrick_scale: false, + category: "objects" + }, + satellite: { + keywords: [ "communication", "future", "radio", "space" ], + "char": "\ud83d\udce1", + fitzpatrick_scale: false, + category: "objects" + }, + battery: { + keywords: [ "power", "energy", "sustain" ], + "char": "\ud83d\udd0b", + fitzpatrick_scale: false, + category: "objects" + }, + electric_plug: { + keywords: [ "charger", "power" ], + "char": "\ud83d\udd0c", + fitzpatrick_scale: false, + category: "objects" + }, + bulb: { + keywords: [ "light", "electricity", "idea" ], + "char": "\ud83d\udca1", + fitzpatrick_scale: false, + category: "objects" + }, + flashlight: { + keywords: [ "dark", "camping", "sight", "night" ], + "char": "\ud83d\udd26", + fitzpatrick_scale: false, + category: "objects" + }, + candle: { + keywords: [ "fire", "wax" ], + "char": "\ud83d\udd6f", + fitzpatrick_scale: false, + category: "objects" + }, + fire_extinguisher: { + keywords: [ "quench" ], + "char": "\ud83e\uddef", + fitzpatrick_scale: false, + category: "objects" + }, + wastebasket: { + keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], + "char": "\ud83d\uddd1", + fitzpatrick_scale: false, + category: "objects" + }, + oil_drum: { + keywords: [ "barrell" ], + "char": "\ud83d\udee2", + fitzpatrick_scale: false, + category: "objects" + }, + money_with_wings: { + keywords: [ "dollar", "bills", "payment", "sale" ], + "char": "\ud83d\udcb8", + fitzpatrick_scale: false, + category: "objects" + }, + dollar: { + keywords: [ "money", "sales", "bill", "currency" ], + "char": "\ud83d\udcb5", + fitzpatrick_scale: false, + category: "objects" + }, + yen: { + keywords: [ "money", "sales", "japanese", "dollar", "currency" ], + "char": "\ud83d\udcb4", + fitzpatrick_scale: false, + category: "objects" + }, + euro: { + keywords: [ "money", "sales", "dollar", "currency" ], + "char": "\ud83d\udcb6", + fitzpatrick_scale: false, + category: "objects" + }, + pound: { + keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], + "char": "\ud83d\udcb7", + fitzpatrick_scale: false, + category: "objects" + }, + moneybag: { + keywords: [ "dollar", "payment", "coins", "sale" ], + "char": "\ud83d\udcb0", + fitzpatrick_scale: false, + category: "objects" + }, + credit_card: { + keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], + "char": "\ud83d\udcb3", + fitzpatrick_scale: false, + category: "objects" + }, + gem: { + keywords: [ "blue", "ruby", "diamond", "jewelry" ], + "char": "\ud83d\udc8e", + fitzpatrick_scale: false, + category: "objects" + }, + balance_scale: { + keywords: [ "law", "fairness", "weight" ], + "char": "\u2696", + fitzpatrick_scale: false, + category: "objects" + }, + toolbox: { + keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], + "char": "\ud83e\uddf0", + fitzpatrick_scale: false, + category: "objects" + }, + wrench: { + keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], + "char": "\ud83d\udd27", + fitzpatrick_scale: false, + category: "objects" + }, + hammer: { + keywords: [ "tools", "build", "create" ], + "char": "\ud83d\udd28", + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_pick: { + keywords: [ "tools", "build", "create" ], + "char": "\u2692", + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_wrench: { + keywords: [ "tools", "build", "create" ], + "char": "\ud83d\udee0", + fitzpatrick_scale: false, + category: "objects" + }, + pick: { + keywords: [ "tools", "dig" ], + "char": "\u26cf", + fitzpatrick_scale: false, + category: "objects" + }, + nut_and_bolt: { + keywords: [ "handy", "tools", "fix" ], + "char": "\ud83d\udd29", + fitzpatrick_scale: false, + category: "objects" + }, + gear: { + keywords: [ "cog" ], + "char": "\u2699", + fitzpatrick_scale: false, + category: "objects" + }, + brick: { + keywords: [ "bricks" ], + "char": "\ud83e\uddf1", + fitzpatrick_scale: false, + category: "objects" + }, + chains: { + keywords: [ "lock", "arrest" ], + "char": "\u26d3", + fitzpatrick_scale: false, + category: "objects" + }, + magnet: { + keywords: [ "attraction", "magnetic" ], + "char": "\ud83e\uddf2", + fitzpatrick_scale: false, + category: "objects" + }, + gun: { + keywords: [ "violence", "weapon", "pistol", "revolver" ], + "char": "\ud83d\udd2b", + fitzpatrick_scale: false, + category: "objects" + }, + bomb: { + keywords: [ "boom", "explode", "explosion", "terrorism" ], + "char": "\ud83d\udca3", + fitzpatrick_scale: false, + category: "objects" + }, + firecracker: { + keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], + "char": "\ud83e\udde8", + fitzpatrick_scale: false, + category: "objects" + }, + hocho: { + keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], + "char": "\ud83d\udd2a", + fitzpatrick_scale: false, + category: "objects" + }, + dagger: { + keywords: [ "weapon" ], + "char": "\ud83d\udde1", + fitzpatrick_scale: false, + category: "objects" + }, + crossed_swords: { + keywords: [ "weapon" ], + "char": "\u2694", + fitzpatrick_scale: false, + category: "objects" + }, + shield: { + keywords: [ "protection", "security" ], + "char": "\ud83d\udee1", + fitzpatrick_scale: false, + category: "objects" + }, + smoking: { + keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], + "char": "\ud83d\udeac", + fitzpatrick_scale: false, + category: "objects" + }, + skull_and_crossbones: { + keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], + "char": "\u2620", + fitzpatrick_scale: false, + category: "objects" + }, + coffin: { + keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], + "char": "\u26b0", + fitzpatrick_scale: false, + category: "objects" + }, + funeral_urn: { + keywords: [ "dead", "die", "death", "rip", "ashes" ], + "char": "\u26b1", + fitzpatrick_scale: false, + category: "objects" + }, + amphora: { + keywords: [ "vase", "jar" ], + "char": "\ud83c\udffa", + fitzpatrick_scale: false, + category: "objects" + }, + crystal_ball: { + keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], + "char": "\ud83d\udd2e", + fitzpatrick_scale: false, + category: "objects" + }, + prayer_beads: { + keywords: [ "dhikr", "religious" ], + "char": "\ud83d\udcff", + fitzpatrick_scale: false, + category: "objects" + }, + nazar_amulet: { + keywords: [ "bead", "charm" ], + "char": "\ud83e\uddff", + fitzpatrick_scale: false, + category: "objects" + }, + barber: { + keywords: [ "hair", "salon", "style" ], + "char": "\ud83d\udc88", + fitzpatrick_scale: false, + category: "objects" + }, + alembic: { + keywords: [ "distilling", "science", "experiment", "chemistry" ], + "char": "\u2697", + fitzpatrick_scale: false, + category: "objects" + }, + telescope: { + keywords: [ "stars", "space", "zoom", "science", "astronomy" ], + "char": "\ud83d\udd2d", + fitzpatrick_scale: false, + category: "objects" + }, + microscope: { + keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], + "char": "\ud83d\udd2c", + fitzpatrick_scale: false, + category: "objects" + }, + hole: { + keywords: [ "embarrassing" ], + "char": "\ud83d\udd73", + fitzpatrick_scale: false, + category: "objects" + }, + pill: { + keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], + "char": "\ud83d\udc8a", + fitzpatrick_scale: false, + category: "objects" + }, + syringe: { + keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], + "char": "\ud83d\udc89", + fitzpatrick_scale: false, + category: "objects" + }, + dna: { + keywords: [ "biologist", "genetics", "life" ], + "char": "\ud83e\uddec", + fitzpatrick_scale: false, + category: "objects" + }, + microbe: { + keywords: [ "amoeba", "bacteria", "germs" ], + "char": "\ud83e\udda0", + fitzpatrick_scale: false, + category: "objects" + }, + petri_dish: { + keywords: [ "bacteria", "biology", "culture", "lab" ], + "char": "\ud83e\uddeb", + fitzpatrick_scale: false, + category: "objects" + }, + test_tube: { + keywords: [ "chemistry", "experiment", "lab", "science" ], + "char": "\ud83e\uddea", + fitzpatrick_scale: false, + category: "objects" + }, + thermometer: { + keywords: [ "weather", "temperature", "hot", "cold" ], + "char": "\ud83c\udf21", + fitzpatrick_scale: false, + category: "objects" + }, + broom: { + keywords: [ "cleaning", "sweeping", "witch" ], + "char": "\ud83e\uddf9", + fitzpatrick_scale: false, + category: "objects" + }, + basket: { + keywords: [ "laundry" ], + "char": "\ud83e\uddfa", + fitzpatrick_scale: false, + category: "objects" + }, + toilet_paper: { + keywords: [ "roll" ], + "char": "\ud83e\uddfb", + fitzpatrick_scale: false, + category: "objects" + }, + label: { + keywords: [ "sale", "tag" ], + "char": "\ud83c\udff7", + fitzpatrick_scale: false, + category: "objects" + }, + bookmark: { + keywords: [ "favorite", "label", "save" ], + "char": "\ud83d\udd16", + fitzpatrick_scale: false, + category: "objects" + }, + toilet: { + keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], + "char": "\ud83d\udebd", + fitzpatrick_scale: false, + category: "objects" + }, + shower: { + keywords: [ "clean", "water", "bathroom" ], + "char": "\ud83d\udebf", + fitzpatrick_scale: false, + category: "objects" + }, + bathtub: { + keywords: [ "clean", "shower", "bathroom" ], + "char": "\ud83d\udec1", + fitzpatrick_scale: false, + category: "objects" + }, + soap: { + keywords: [ "bar", "bathing", "cleaning", "lather" ], + "char": "\ud83e\uddfc", + fitzpatrick_scale: false, + category: "objects" + }, + sponge: { + keywords: [ "absorbing", "cleaning", "porous" ], + "char": "\ud83e\uddfd", + fitzpatrick_scale: false, + category: "objects" + }, + lotion_bottle: { + keywords: [ "moisturizer", "sunscreen" ], + "char": "\ud83e\uddf4", + fitzpatrick_scale: false, + category: "objects" + }, + key: { + keywords: [ "lock", "door", "password" ], + "char": "\ud83d\udd11", + fitzpatrick_scale: false, + category: "objects" + }, + old_key: { + keywords: [ "lock", "door", "password" ], + "char": "\ud83d\udddd", + fitzpatrick_scale: false, + category: "objects" + }, + couch_and_lamp: { + keywords: [ "read", "chill" ], + "char": "\ud83d\udecb", + fitzpatrick_scale: false, + category: "objects" + }, + sleeping_bed: { + keywords: [ "bed", "rest" ], + "char": "\ud83d\udecc", + fitzpatrick_scale: true, + category: "objects" + }, + bed: { + keywords: [ "sleep", "rest" ], + "char": "\ud83d\udecf", + fitzpatrick_scale: false, + category: "objects" + }, + door: { + keywords: [ "house", "entry", "exit" ], + "char": "\ud83d\udeaa", + fitzpatrick_scale: false, + category: "objects" + }, + bellhop_bell: { + keywords: [ "service" ], + "char": "\ud83d\udece", + fitzpatrick_scale: false, + category: "objects" + }, + teddy_bear: { + keywords: [ "plush", "stuffed" ], + "char": "\ud83e\uddf8", + fitzpatrick_scale: false, + category: "objects" + }, + framed_picture: { + keywords: [ "photography" ], + "char": "\ud83d\uddbc", + fitzpatrick_scale: false, + category: "objects" + }, + world_map: { + keywords: [ "location", "direction" ], + "char": "\ud83d\uddfa", + fitzpatrick_scale: false, + category: "objects" + }, + parasol_on_ground: { + keywords: [ "weather", "summer" ], + "char": "\u26f1", + fitzpatrick_scale: false, + category: "objects" + }, + moyai: { + keywords: [ "rock", "easter island", "moai" ], + "char": "\ud83d\uddff", + fitzpatrick_scale: false, + category: "objects" + }, + shopping: { + keywords: [ "mall", "buy", "purchase" ], + "char": "\ud83d\udecd", + fitzpatrick_scale: false, + category: "objects" + }, + shopping_cart: { + keywords: [ "trolley" ], + "char": "\ud83d\uded2", + fitzpatrick_scale: false, + category: "objects" + }, + balloon: { + keywords: [ "party", "celebration", "birthday", "circus" ], + "char": "\ud83c\udf88", + fitzpatrick_scale: false, + category: "objects" + }, + flags: { + keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], + "char": "\ud83c\udf8f", + fitzpatrick_scale: false, + category: "objects" + }, + ribbon: { + keywords: [ "decoration", "pink", "girl", "bowtie" ], + "char": "\ud83c\udf80", + fitzpatrick_scale: false, + category: "objects" + }, + gift: { + keywords: [ "present", "birthday", "christmas", "xmas" ], + "char": "\ud83c\udf81", + fitzpatrick_scale: false, + category: "objects" + }, + confetti_ball: { + keywords: [ "festival", "party", "birthday", "circus" ], + "char": "\ud83c\udf8a", + fitzpatrick_scale: false, + category: "objects" + }, + tada: { + keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], + "char": "\ud83c\udf89", + fitzpatrick_scale: false, + category: "objects" + }, + dolls: { + keywords: [ "japanese", "toy", "kimono" ], + "char": "\ud83c\udf8e", + fitzpatrick_scale: false, + category: "objects" + }, + wind_chime: { + keywords: [ "nature", "ding", "spring", "bell" ], + "char": "\ud83c\udf90", + fitzpatrick_scale: false, + category: "objects" + }, + crossed_flags: { + keywords: [ "japanese", "nation", "country", "border" ], + "char": "\ud83c\udf8c", + fitzpatrick_scale: false, + category: "objects" + }, + izakaya_lantern: { + keywords: [ "light", "paper", "halloween", "spooky" ], + "char": "\ud83c\udfee", + fitzpatrick_scale: false, + category: "objects" + }, + red_envelope: { + keywords: [ "gift" ], + "char": "\ud83e\udde7", + fitzpatrick_scale: false, + category: "objects" + }, + email: { + keywords: [ "letter", "postal", "inbox", "communication" ], + "char": "\u2709\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + envelope_with_arrow: { + keywords: [ "email", "communication" ], + "char": "\ud83d\udce9", + fitzpatrick_scale: false, + category: "objects" + }, + incoming_envelope: { + keywords: [ "email", "inbox" ], + "char": "\ud83d\udce8", + fitzpatrick_scale: false, + category: "objects" + }, + "e-mail": { + keywords: [ "communication", "inbox" ], + "char": "\ud83d\udce7", + fitzpatrick_scale: false, + category: "objects" + }, + love_letter: { + keywords: [ "email", "like", "affection", "envelope", "valentines" ], + "char": "\ud83d\udc8c", + fitzpatrick_scale: false, + category: "objects" + }, + postbox: { + keywords: [ "email", "letter", "envelope" ], + "char": "\ud83d\udcee", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_closed: { + keywords: [ "email", "communication", "inbox" ], + "char": "\ud83d\udcea", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox: { + keywords: [ "email", "inbox", "communication" ], + "char": "\ud83d\udceb", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_mail: { + keywords: [ "email", "inbox", "communication" ], + "char": "\ud83d\udcec", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_no_mail: { + keywords: [ "email", "inbox" ], + "char": "\ud83d\udced", + fitzpatrick_scale: false, + category: "objects" + }, + "package": { + keywords: [ "mail", "gift", "cardboard", "box", "moving" ], + "char": "\ud83d\udce6", + fitzpatrick_scale: false, + category: "objects" + }, + postal_horn: { + keywords: [ "instrument", "music" ], + "char": "\ud83d\udcef", + fitzpatrick_scale: false, + category: "objects" + }, + inbox_tray: { + keywords: [ "email", "documents" ], + "char": "\ud83d\udce5", + fitzpatrick_scale: false, + category: "objects" + }, + outbox_tray: { + keywords: [ "inbox", "email" ], + "char": "\ud83d\udce4", + fitzpatrick_scale: false, + category: "objects" + }, + scroll: { + keywords: [ "documents", "ancient", "history", "paper" ], + "char": "\ud83d\udcdc", + fitzpatrick_scale: false, + category: "objects" + }, + page_with_curl: { + keywords: [ "documents", "office", "paper" ], + "char": "\ud83d\udcc3", + fitzpatrick_scale: false, + category: "objects" + }, + bookmark_tabs: { + keywords: [ "favorite", "save", "order", "tidy" ], + "char": "\ud83d\udcd1", + fitzpatrick_scale: false, + category: "objects" + }, + receipt: { + keywords: [ "accounting", "expenses" ], + "char": "\ud83e\uddfe", + fitzpatrick_scale: false, + category: "objects" + }, + bar_chart: { + keywords: [ "graph", "presentation", "stats" ], + "char": "\ud83d\udcca", + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_upwards_trend: { + keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], + "char": "\ud83d\udcc8", + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_downwards_trend: { + keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], + "char": "\ud83d\udcc9", + fitzpatrick_scale: false, + category: "objects" + }, + page_facing_up: { + keywords: [ "documents", "office", "paper", "information" ], + "char": "\ud83d\udcc4", + fitzpatrick_scale: false, + category: "objects" + }, + date: { + keywords: [ "calendar", "schedule" ], + "char": "\ud83d\udcc5", + fitzpatrick_scale: false, + category: "objects" + }, + calendar: { + keywords: [ "schedule", "date", "planning" ], + "char": "\ud83d\udcc6", + fitzpatrick_scale: false, + category: "objects" + }, + spiral_calendar: { + keywords: [ "date", "schedule", "planning" ], + "char": "\ud83d\uddd3", + fitzpatrick_scale: false, + category: "objects" + }, + card_index: { + keywords: [ "business", "stationery" ], + "char": "\ud83d\udcc7", + fitzpatrick_scale: false, + category: "objects" + }, + card_file_box: { + keywords: [ "business", "stationery" ], + "char": "\ud83d\uddc3", + fitzpatrick_scale: false, + category: "objects" + }, + ballot_box: { + keywords: [ "election", "vote" ], + "char": "\ud83d\uddf3", + fitzpatrick_scale: false, + category: "objects" + }, + file_cabinet: { + keywords: [ "filing", "organizing" ], + "char": "\ud83d\uddc4", + fitzpatrick_scale: false, + category: "objects" + }, + clipboard: { + keywords: [ "stationery", "documents" ], + "char": "\ud83d\udccb", + fitzpatrick_scale: false, + category: "objects" + }, + spiral_notepad: { + keywords: [ "memo", "stationery" ], + "char": "\ud83d\uddd2", + fitzpatrick_scale: false, + category: "objects" + }, + file_folder: { + keywords: [ "documents", "business", "office" ], + "char": "\ud83d\udcc1", + fitzpatrick_scale: false, + category: "objects" + }, + open_file_folder: { + keywords: [ "documents", "load" ], + "char": "\ud83d\udcc2", + fitzpatrick_scale: false, + category: "objects" + }, + card_index_dividers: { + keywords: [ "organizing", "business", "stationery" ], + "char": "\ud83d\uddc2", + fitzpatrick_scale: false, + category: "objects" + }, + newspaper_roll: { + keywords: [ "press", "headline" ], + "char": "\ud83d\uddde", + fitzpatrick_scale: false, + category: "objects" + }, + newspaper: { + keywords: [ "press", "headline" ], + "char": "\ud83d\udcf0", + fitzpatrick_scale: false, + category: "objects" + }, + notebook: { + keywords: [ "stationery", "record", "notes", "paper", "study" ], + "char": "\ud83d\udcd3", + fitzpatrick_scale: false, + category: "objects" + }, + closed_book: { + keywords: [ "read", "library", "knowledge", "textbook", "learn" ], + "char": "\ud83d\udcd5", + fitzpatrick_scale: false, + category: "objects" + }, + green_book: { + keywords: [ "read", "library", "knowledge", "study" ], + "char": "\ud83d\udcd7", + fitzpatrick_scale: false, + category: "objects" + }, + blue_book: { + keywords: [ "read", "library", "knowledge", "learn", "study" ], + "char": "\ud83d\udcd8", + fitzpatrick_scale: false, + category: "objects" + }, + orange_book: { + keywords: [ "read", "library", "knowledge", "textbook", "study" ], + "char": "\ud83d\udcd9", + fitzpatrick_scale: false, + category: "objects" + }, + notebook_with_decorative_cover: { + keywords: [ "classroom", "notes", "record", "paper", "study" ], + "char": "\ud83d\udcd4", + fitzpatrick_scale: false, + category: "objects" + }, + ledger: { + keywords: [ "notes", "paper" ], + "char": "\ud83d\udcd2", + fitzpatrick_scale: false, + category: "objects" + }, + books: { + keywords: [ "literature", "library", "study" ], + "char": "\ud83d\udcda", + fitzpatrick_scale: false, + category: "objects" + }, + open_book: { + keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], + "char": "\ud83d\udcd6", + fitzpatrick_scale: false, + category: "objects" + }, + safety_pin: { + keywords: [ "diaper" ], + "char": "\ud83e\uddf7", + fitzpatrick_scale: false, + category: "objects" + }, + link: { + keywords: [ "rings", "url" ], + "char": "\ud83d\udd17", + fitzpatrick_scale: false, + category: "objects" + }, + paperclip: { + keywords: [ "documents", "stationery" ], + "char": "\ud83d\udcce", + fitzpatrick_scale: false, + category: "objects" + }, + paperclips: { + keywords: [ "documents", "stationery" ], + "char": "\ud83d\udd87", + fitzpatrick_scale: false, + category: "objects" + }, + scissors: { + keywords: [ "stationery", "cut" ], + "char": "\u2702\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + triangular_ruler: { + keywords: [ "stationery", "math", "architect", "sketch" ], + "char": "\ud83d\udcd0", + fitzpatrick_scale: false, + category: "objects" + }, + straight_ruler: { + keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], + "char": "\ud83d\udccf", + fitzpatrick_scale: false, + category: "objects" + }, + abacus: { + keywords: [ "calculation" ], + "char": "\ud83e\uddee", + fitzpatrick_scale: false, + category: "objects" + }, + pushpin: { + keywords: [ "stationery", "mark", "here" ], + "char": "\ud83d\udccc", + fitzpatrick_scale: false, + category: "objects" + }, + round_pushpin: { + keywords: [ "stationery", "location", "map", "here" ], + "char": "\ud83d\udccd", + fitzpatrick_scale: false, + category: "objects" + }, + triangular_flag_on_post: { + keywords: [ "mark", "milestone", "place" ], + "char": "\ud83d\udea9", + fitzpatrick_scale: false, + category: "objects" + }, + white_flag: { + keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], + "char": "\ud83c\udff3", + fitzpatrick_scale: false, + category: "objects" + }, + black_flag: { + keywords: [ "pirate" ], + "char": "\ud83c\udff4", + fitzpatrick_scale: false, + category: "objects" + }, + rainbow_flag: { + keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], + "char": "\ud83c\udff3\ufe0f\u200d\ud83c\udf08", + fitzpatrick_scale: false, + category: "objects" + }, + closed_lock_with_key: { + keywords: [ "security", "privacy" ], + "char": "\ud83d\udd10", + fitzpatrick_scale: false, + category: "objects" + }, + lock: { + keywords: [ "security", "password", "padlock" ], + "char": "\ud83d\udd12", + fitzpatrick_scale: false, + category: "objects" + }, + unlock: { + keywords: [ "privacy", "security" ], + "char": "\ud83d\udd13", + fitzpatrick_scale: false, + category: "objects" + }, + lock_with_ink_pen: { + keywords: [ "security", "secret" ], + "char": "\ud83d\udd0f", + fitzpatrick_scale: false, + category: "objects" + }, + pen: { + keywords: [ "stationery", "writing", "write" ], + "char": "\ud83d\udd8a", + fitzpatrick_scale: false, + category: "objects" + }, + fountain_pen: { + keywords: [ "stationery", "writing", "write" ], + "char": "\ud83d\udd8b", + fitzpatrick_scale: false, + category: "objects" + }, + black_nib: { + keywords: [ "pen", "stationery", "writing", "write" ], + "char": "\u2712\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + memo: { + keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], + "char": "\ud83d\udcdd", + fitzpatrick_scale: false, + category: "objects" + }, + pencil2: { + keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], + "char": "\u270f\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + crayon: { + keywords: [ "drawing", "creativity" ], + "char": "\ud83d\udd8d", + fitzpatrick_scale: false, + category: "objects" + }, + paintbrush: { + keywords: [ "drawing", "creativity", "art" ], + "char": "\ud83d\udd8c", + fitzpatrick_scale: false, + category: "objects" + }, + mag: { + keywords: [ "search", "zoom", "find", "detective" ], + "char": "\ud83d\udd0d", + fitzpatrick_scale: false, + category: "objects" + }, + mag_right: { + keywords: [ "search", "zoom", "find", "detective" ], + "char": "\ud83d\udd0e", + fitzpatrick_scale: false, + category: "objects" + }, + heart: { + keywords: [ "love", "like", "valentines" ], + "char": "\u2764\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + orange_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83e\udde1", + fitzpatrick_scale: false, + category: "symbols" + }, + yellow_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc9b", + fitzpatrick_scale: false, + category: "symbols" + }, + green_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc9a", + fitzpatrick_scale: false, + category: "symbols" + }, + blue_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc99", + fitzpatrick_scale: false, + category: "symbols" + }, + purple_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc9c", + fitzpatrick_scale: false, + category: "symbols" + }, + black_heart: { + keywords: [ "evil" ], + "char": "\ud83d\udda4", + fitzpatrick_scale: false, + category: "symbols" + }, + broken_heart: { + keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], + "char": "\ud83d\udc94", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_heart_exclamation: { + keywords: [ "decoration", "love" ], + "char": "\u2763", + fitzpatrick_scale: false, + category: "symbols" + }, + two_hearts: { + keywords: [ "love", "like", "affection", "valentines", "heart" ], + "char": "\ud83d\udc95", + fitzpatrick_scale: false, + category: "symbols" + }, + revolving_hearts: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc9e", + fitzpatrick_scale: false, + category: "symbols" + }, + heartbeat: { + keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], + "char": "\ud83d\udc93", + fitzpatrick_scale: false, + category: "symbols" + }, + heartpulse: { + keywords: [ "like", "love", "affection", "valentines", "pink" ], + "char": "\ud83d\udc97", + fitzpatrick_scale: false, + category: "symbols" + }, + sparkling_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc96", + fitzpatrick_scale: false, + category: "symbols" + }, + cupid: { + keywords: [ "love", "like", "heart", "affection", "valentines" ], + "char": "\ud83d\udc98", + fitzpatrick_scale: false, + category: "symbols" + }, + gift_heart: { + keywords: [ "love", "valentines" ], + "char": "\ud83d\udc9d", + fitzpatrick_scale: false, + category: "symbols" + }, + heart_decoration: { + keywords: [ "purple-square", "love", "like" ], + "char": "\ud83d\udc9f", + fitzpatrick_scale: false, + category: "symbols" + }, + peace_symbol: { + keywords: [ "hippie" ], + "char": "\u262e", + fitzpatrick_scale: false, + category: "symbols" + }, + latin_cross: { + keywords: [ "christianity" ], + "char": "\u271d", + fitzpatrick_scale: false, + category: "symbols" + }, + star_and_crescent: { + keywords: [ "islam" ], + "char": "\u262a", + fitzpatrick_scale: false, + category: "symbols" + }, + om: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + "char": "\ud83d\udd49", + fitzpatrick_scale: false, + category: "symbols" + }, + wheel_of_dharma: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + "char": "\u2638", + fitzpatrick_scale: false, + category: "symbols" + }, + star_of_david: { + keywords: [ "judaism" ], + "char": "\u2721", + fitzpatrick_scale: false, + category: "symbols" + }, + six_pointed_star: { + keywords: [ "purple-square", "religion", "jewish", "hexagram" ], + "char": "\ud83d\udd2f", + fitzpatrick_scale: false, + category: "symbols" + }, + menorah: { + keywords: [ "hanukkah", "candles", "jewish" ], + "char": "\ud83d\udd4e", + fitzpatrick_scale: false, + category: "symbols" + }, + yin_yang: { + keywords: [ "balance" ], + "char": "\u262f", + fitzpatrick_scale: false, + category: "symbols" + }, + orthodox_cross: { + keywords: [ "suppedaneum", "religion" ], + "char": "\u2626", + fitzpatrick_scale: false, + category: "symbols" + }, + place_of_worship: { + keywords: [ "religion", "church", "temple", "prayer" ], + "char": "\ud83d\uded0", + fitzpatrick_scale: false, + category: "symbols" + }, + ophiuchus: { + keywords: [ "sign", "purple-square", "constellation", "astrology" ], + "char": "\u26ce", + fitzpatrick_scale: false, + category: "symbols" + }, + aries: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": "\u2648", + fitzpatrick_scale: false, + category: "symbols" + }, + taurus: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + "char": "\u2649", + fitzpatrick_scale: false, + category: "symbols" + }, + gemini: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u264a", + fitzpatrick_scale: false, + category: "symbols" + }, + cancer: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u264b", + fitzpatrick_scale: false, + category: "symbols" + }, + leo: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": "\u264c", + fitzpatrick_scale: false, + category: "symbols" + }, + virgo: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u264d", + fitzpatrick_scale: false, + category: "symbols" + }, + libra: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": "\u264e", + fitzpatrick_scale: false, + category: "symbols" + }, + scorpius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], + "char": "\u264f", + fitzpatrick_scale: false, + category: "symbols" + }, + sagittarius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u2650", + fitzpatrick_scale: false, + category: "symbols" + }, + capricorn: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u2651", + fitzpatrick_scale: false, + category: "symbols" + }, + aquarius: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": "\u2652", + fitzpatrick_scale: false, + category: "symbols" + }, + pisces: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + "char": "\u2653", + fitzpatrick_scale: false, + category: "symbols" + }, + id: { + keywords: [ "purple-square", "words" ], + "char": "\ud83c\udd94", + fitzpatrick_scale: false, + category: "symbols" + }, + atom_symbol: { + keywords: [ "science", "physics", "chemistry" ], + "char": "\u269b", + fitzpatrick_scale: false, + category: "symbols" + }, + u7a7a: { + keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], + "char": "\ud83c\ude33", + fitzpatrick_scale: false, + category: "symbols" + }, + u5272: { + keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], + "char": "\ud83c\ude39", + fitzpatrick_scale: false, + category: "symbols" + }, + radioactive: { + keywords: [ "nuclear", "danger" ], + "char": "\u2622", + fitzpatrick_scale: false, + category: "symbols" + }, + biohazard: { + keywords: [ "danger" ], + "char": "\u2623", + fitzpatrick_scale: false, + category: "symbols" + }, + mobile_phone_off: { + keywords: [ "mute", "orange-square", "silence", "quiet" ], + "char": "\ud83d\udcf4", + fitzpatrick_scale: false, + category: "symbols" + }, + vibration_mode: { + keywords: [ "orange-square", "phone" ], + "char": "\ud83d\udcf3", + fitzpatrick_scale: false, + category: "symbols" + }, + u6709: { + keywords: [ "orange-square", "chinese", "have", "kanji" ], + "char": "\ud83c\ude36", + fitzpatrick_scale: false, + category: "symbols" + }, + u7121: { + keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], + "char": "\ud83c\ude1a", + fitzpatrick_scale: false, + category: "symbols" + }, + u7533: { + keywords: [ "chinese", "japanese", "kanji", "orange-square" ], + "char": "\ud83c\ude38", + fitzpatrick_scale: false, + category: "symbols" + }, + u55b6: { + keywords: [ "japanese", "opening hours", "orange-square" ], + "char": "\ud83c\ude3a", + fitzpatrick_scale: false, + category: "symbols" + }, + u6708: { + keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], + "char": "\ud83c\ude37\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + eight_pointed_black_star: { + keywords: [ "orange-square", "shape", "polygon" ], + "char": "\u2734\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + vs: { + keywords: [ "words", "orange-square" ], + "char": "\ud83c\udd9a", + fitzpatrick_scale: false, + category: "symbols" + }, + accept: { + keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], + "char": "\ud83c\ude51", + fitzpatrick_scale: false, + category: "symbols" + }, + white_flower: { + keywords: [ "japanese", "spring" ], + "char": "\ud83d\udcae", + fitzpatrick_scale: false, + category: "symbols" + }, + ideograph_advantage: { + keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], + "char": "\ud83c\ude50", + fitzpatrick_scale: false, + category: "symbols" + }, + secret: { + keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], + "char": "\u3299\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + congratulations: { + keywords: [ "chinese", "kanji", "japanese", "red-circle" ], + "char": "\u3297\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + u5408: { + keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], + "char": "\ud83c\ude34", + fitzpatrick_scale: false, + category: "symbols" + }, + u6e80: { + keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], + "char": "\ud83c\ude35", + fitzpatrick_scale: false, + category: "symbols" + }, + u7981: { + keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], + "char": "\ud83c\ude32", + fitzpatrick_scale: false, + category: "symbols" + }, + a: { + keywords: [ "red-square", "alphabet", "letter" ], + "char": "\ud83c\udd70\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + b: { + keywords: [ "red-square", "alphabet", "letter" ], + "char": "\ud83c\udd71\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + ab: { + keywords: [ "red-square", "alphabet" ], + "char": "\ud83c\udd8e", + fitzpatrick_scale: false, + category: "symbols" + }, + cl: { + keywords: [ "alphabet", "words", "red-square" ], + "char": "\ud83c\udd91", + fitzpatrick_scale: false, + category: "symbols" + }, + o2: { + keywords: [ "alphabet", "red-square", "letter" ], + "char": "\ud83c\udd7e\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + sos: { + keywords: [ "help", "red-square", "words", "emergency", "911" ], + "char": "\ud83c\udd98", + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry: { + keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], + "char": "\u26d4", + fitzpatrick_scale: false, + category: "symbols" + }, + name_badge: { + keywords: [ "fire", "forbid" ], + "char": "\ud83d\udcdb", + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry_sign: { + keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], + "char": "\ud83d\udeab", + fitzpatrick_scale: false, + category: "symbols" + }, + x: { + keywords: [ "no", "delete", "remove", "cancel", "red" ], + "char": "\u274c", + fitzpatrick_scale: false, + category: "symbols" + }, + o: { + keywords: [ "circle", "round" ], + "char": "\u2b55", + fitzpatrick_scale: false, + category: "symbols" + }, + stop_sign: { + keywords: [ "stop" ], + "char": "\ud83d\uded1", + fitzpatrick_scale: false, + category: "symbols" + }, + anger: { + keywords: [ "angry", "mad" ], + "char": "\ud83d\udca2", + fitzpatrick_scale: false, + category: "symbols" + }, + hotsprings: { + keywords: [ "bath", "warm", "relax" ], + "char": "\u2668\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + no_pedestrians: { + keywords: [ "rules", "crossing", "walking", "circle" ], + "char": "\ud83d\udeb7", + fitzpatrick_scale: false, + category: "symbols" + }, + do_not_litter: { + keywords: [ "trash", "bin", "garbage", "circle" ], + "char": "\ud83d\udeaf", + fitzpatrick_scale: false, + category: "symbols" + }, + no_bicycles: { + keywords: [ "cyclist", "prohibited", "circle" ], + "char": "\ud83d\udeb3", + fitzpatrick_scale: false, + category: "symbols" + }, + "non-potable_water": { + keywords: [ "drink", "faucet", "tap", "circle" ], + "char": "\ud83d\udeb1", + fitzpatrick_scale: false, + category: "symbols" + }, + underage: { + keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], + "char": "\ud83d\udd1e", + fitzpatrick_scale: false, + category: "symbols" + }, + no_mobile_phones: { + keywords: [ "iphone", "mute", "circle" ], + "char": "\ud83d\udcf5", + fitzpatrick_scale: false, + category: "symbols" + }, + exclamation: { + keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], + "char": "\u2757", + fitzpatrick_scale: false, + category: "symbols" + }, + grey_exclamation: { + keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], + "char": "\u2755", + fitzpatrick_scale: false, + category: "symbols" + }, + question: { + keywords: [ "doubt", "confused" ], + "char": "\u2753", + fitzpatrick_scale: false, + category: "symbols" + }, + grey_question: { + keywords: [ "doubts", "gray", "huh", "confused" ], + "char": "\u2754", + fitzpatrick_scale: false, + category: "symbols" + }, + bangbang: { + keywords: [ "exclamation", "surprise" ], + "char": "\u203c\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + interrobang: { + keywords: [ "wat", "punctuation", "surprise" ], + "char": "\u2049\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + 100: { + keywords: [ "score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred" ], + "char": "\ud83d\udcaf", + fitzpatrick_scale: false, + category: "symbols" + }, + low_brightness: { + keywords: [ "sun", "afternoon", "warm", "summer" ], + "char": "\ud83d\udd05", + fitzpatrick_scale: false, + category: "symbols" + }, + high_brightness: { + keywords: [ "sun", "light" ], + "char": "\ud83d\udd06", + fitzpatrick_scale: false, + category: "symbols" + }, + trident: { + keywords: [ "weapon", "spear" ], + "char": "\ud83d\udd31", + fitzpatrick_scale: false, + category: "symbols" + }, + fleur_de_lis: { + keywords: [ "decorative", "scout" ], + "char": "\u269c", + fitzpatrick_scale: false, + category: "symbols" + }, + part_alternation_mark: { + keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], + "char": "\u303d\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + warning: { + keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], + "char": "\u26a0\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + children_crossing: { + keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], + "char": "\ud83d\udeb8", + fitzpatrick_scale: false, + category: "symbols" + }, + beginner: { + keywords: [ "badge", "shield" ], + "char": "\ud83d\udd30", + fitzpatrick_scale: false, + category: "symbols" + }, + recycle: { + keywords: [ "arrow", "environment", "garbage", "trash" ], + "char": "\u267b\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + u6307: { + keywords: [ "chinese", "point", "green-square", "kanji" ], + "char": "\ud83c\ude2f", + fitzpatrick_scale: false, + category: "symbols" + }, + chart: { + keywords: [ "green-square", "graph", "presentation", "stats" ], + "char": "\ud83d\udcb9", + fitzpatrick_scale: false, + category: "symbols" + }, + sparkle: { + keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], + "char": "\u2747\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + eight_spoked_asterisk: { + keywords: [ "star", "sparkle", "green-square" ], + "char": "\u2733\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + negative_squared_cross_mark: { + keywords: [ "x", "green-square", "no", "deny" ], + "char": "\u274e", + fitzpatrick_scale: false, + category: "symbols" + }, + white_check_mark: { + keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], + "char": "\u2705", + fitzpatrick_scale: false, + category: "symbols" + }, + diamond_shape_with_a_dot_inside: { + keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], + "char": "\ud83d\udca0", + fitzpatrick_scale: false, + category: "symbols" + }, + cyclone: { + keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], + "char": "\ud83c\udf00", + fitzpatrick_scale: false, + category: "symbols" + }, + loop: { + keywords: [ "tape", "cassette" ], + "char": "\u27bf", + fitzpatrick_scale: false, + category: "symbols" + }, + globe_with_meridians: { + keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], + "char": "\ud83c\udf10", + fitzpatrick_scale: false, + category: "symbols" + }, + m: { + keywords: [ "alphabet", "blue-circle", "letter" ], + "char": "\u24c2\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + atm: { + keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], + "char": "\ud83c\udfe7", + fitzpatrick_scale: false, + category: "symbols" + }, + sa: { + keywords: [ "japanese", "blue-square", "katakana" ], + "char": "\ud83c\ude02\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + passport_control: { + keywords: [ "custom", "blue-square" ], + "char": "\ud83d\udec2", + fitzpatrick_scale: false, + category: "symbols" + }, + customs: { + keywords: [ "passport", "border", "blue-square" ], + "char": "\ud83d\udec3", + fitzpatrick_scale: false, + category: "symbols" + }, + baggage_claim: { + keywords: [ "blue-square", "airport", "transport" ], + "char": "\ud83d\udec4", + fitzpatrick_scale: false, + category: "symbols" + }, + left_luggage: { + keywords: [ "blue-square", "travel" ], + "char": "\ud83d\udec5", + fitzpatrick_scale: false, + category: "symbols" + }, + wheelchair: { + keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], + "char": "\u267f", + fitzpatrick_scale: false, + category: "symbols" + }, + no_smoking: { + keywords: [ "cigarette", "blue-square", "smell", "smoke" ], + "char": "\ud83d\udead", + fitzpatrick_scale: false, + category: "symbols" + }, + wc: { + keywords: [ "toilet", "restroom", "blue-square" ], + "char": "\ud83d\udebe", + fitzpatrick_scale: false, + category: "symbols" + }, + parking: { + keywords: [ "cars", "blue-square", "alphabet", "letter" ], + "char": "\ud83c\udd7f\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + potable_water: { + keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], + "char": "\ud83d\udeb0", + fitzpatrick_scale: false, + category: "symbols" + }, + mens: { + keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], + "char": "\ud83d\udeb9", + fitzpatrick_scale: false, + category: "symbols" + }, + womens: { + keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], + "char": "\ud83d\udeba", + fitzpatrick_scale: false, + category: "symbols" + }, + baby_symbol: { + keywords: [ "orange-square", "child" ], + "char": "\ud83d\udebc", + fitzpatrick_scale: false, + category: "symbols" + }, + restroom: { + keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], + "char": "\ud83d\udebb", + fitzpatrick_scale: false, + category: "symbols" + }, + put_litter_in_its_place: { + keywords: [ "blue-square", "sign", "human", "info" ], + "char": "\ud83d\udeae", + fitzpatrick_scale: false, + category: "symbols" + }, + cinema: { + keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], + "char": "\ud83c\udfa6", + fitzpatrick_scale: false, + category: "symbols" + }, + signal_strength: { + keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], + "char": "\ud83d\udcf6", + fitzpatrick_scale: false, + category: "symbols" + }, + koko: { + keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], + "char": "\ud83c\ude01", + fitzpatrick_scale: false, + category: "symbols" + }, + ng: { + keywords: [ "blue-square", "words", "shape", "icon" ], + "char": "\ud83c\udd96", + fitzpatrick_scale: false, + category: "symbols" + }, + ok: { + keywords: [ "good", "agree", "yes", "blue-square" ], + "char": "\ud83c\udd97", + fitzpatrick_scale: false, + category: "symbols" + }, + up: { + keywords: [ "blue-square", "above", "high" ], + "char": "\ud83c\udd99", + fitzpatrick_scale: false, + category: "symbols" + }, + cool: { + keywords: [ "words", "blue-square" ], + "char": "\ud83c\udd92", + fitzpatrick_scale: false, + category: "symbols" + }, + "new": { + keywords: [ "blue-square", "words", "start" ], + "char": "\ud83c\udd95", + fitzpatrick_scale: false, + category: "symbols" + }, + free: { + keywords: [ "blue-square", "words" ], + "char": "\ud83c\udd93", + fitzpatrick_scale: false, + category: "symbols" + }, + zero: { + keywords: [ "0", "numbers", "blue-square", "null" ], + "char": "0\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + one: { + keywords: [ "blue-square", "numbers", "1" ], + "char": "1\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + two: { + keywords: [ "numbers", "2", "prime", "blue-square" ], + "char": "2\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + three: { + keywords: [ "3", "numbers", "prime", "blue-square" ], + "char": "3\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + four: { + keywords: [ "4", "numbers", "blue-square" ], + "char": "4\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + five: { + keywords: [ "5", "numbers", "blue-square", "prime" ], + "char": "5\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + six: { + keywords: [ "6", "numbers", "blue-square" ], + "char": "6\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + seven: { + keywords: [ "7", "numbers", "blue-square", "prime" ], + "char": "7\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + eight: { + keywords: [ "8", "blue-square", "numbers" ], + "char": "8\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + nine: { + keywords: [ "blue-square", "numbers", "9" ], + "char": "9\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + keycap_ten: { + keywords: [ "numbers", "10", "blue-square" ], + "char": "\ud83d\udd1f", + fitzpatrick_scale: false, + category: "symbols" + }, + asterisk: { + keywords: [ "star", "keycap" ], + "char": "*\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + 1234: { + keywords: [ "numbers", "blue-square" ], + "char": "\ud83d\udd22", + fitzpatrick_scale: false, + category: "symbols" + }, + eject_button: { + keywords: [ "blue-square" ], + "char": "\u23cf\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_forward: { + keywords: [ "blue-square", "right", "direction", "play" ], + "char": "\u25b6\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + pause_button: { + keywords: [ "pause", "blue-square" ], + "char": "\u23f8", + fitzpatrick_scale: false, + category: "symbols" + }, + next_track_button: { + keywords: [ "forward", "next", "blue-square" ], + "char": "\u23ed", + fitzpatrick_scale: false, + category: "symbols" + }, + stop_button: { + keywords: [ "blue-square" ], + "char": "\u23f9", + fitzpatrick_scale: false, + category: "symbols" + }, + record_button: { + keywords: [ "blue-square" ], + "char": "\u23fa", + fitzpatrick_scale: false, + category: "symbols" + }, + play_or_pause_button: { + keywords: [ "blue-square", "play", "pause" ], + "char": "\u23ef", + fitzpatrick_scale: false, + category: "symbols" + }, + previous_track_button: { + keywords: [ "backward" ], + "char": "\u23ee", + fitzpatrick_scale: false, + category: "symbols" + }, + fast_forward: { + keywords: [ "blue-square", "play", "speed", "continue" ], + "char": "\u23e9", + fitzpatrick_scale: false, + category: "symbols" + }, + rewind: { + keywords: [ "play", "blue-square" ], + "char": "\u23ea", + fitzpatrick_scale: false, + category: "symbols" + }, + twisted_rightwards_arrows: { + keywords: [ "blue-square", "shuffle", "music", "random" ], + "char": "\ud83d\udd00", + fitzpatrick_scale: false, + category: "symbols" + }, + repeat: { + keywords: [ "loop", "record" ], + "char": "\ud83d\udd01", + fitzpatrick_scale: false, + category: "symbols" + }, + repeat_one: { + keywords: [ "blue-square", "loop" ], + "char": "\ud83d\udd02", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_backward: { + keywords: [ "blue-square", "left", "direction" ], + "char": "\u25c0\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_small: { + keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], + "char": "\ud83d\udd3c", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down_small: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": "\ud83d\udd3d", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_up: { + keywords: [ "blue-square", "direction", "top" ], + "char": "\u23eb", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": "\u23ec", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right: { + keywords: [ "blue-square", "next" ], + "char": "\u27a1\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_left: { + keywords: [ "blue-square", "previous", "back" ], + "char": "\u2b05\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up: { + keywords: [ "blue-square", "continue", "top", "direction" ], + "char": "\u2b06\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": "\u2b07\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_right: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], + "char": "\u2197\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_right: { + keywords: [ "blue-square", "direction", "diagonal", "southeast" ], + "char": "\u2198\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_left: { + keywords: [ "blue-square", "direction", "diagonal", "southwest" ], + "char": "\u2199\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_left: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], + "char": "\u2196\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_down: { + keywords: [ "blue-square", "direction", "way", "vertical" ], + "char": "\u2195\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + left_right_arrow: { + keywords: [ "shape", "direction", "horizontal", "sideways" ], + "char": "\u2194\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_counterclockwise: { + keywords: [ "blue-square", "sync", "cycle" ], + "char": "\ud83d\udd04", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right_hook: { + keywords: [ "blue-square", "return", "rotate", "direction" ], + "char": "\u21aa\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + leftwards_arrow_with_hook: { + keywords: [ "back", "return", "blue-square", "undo", "enter" ], + "char": "\u21a9\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_up: { + keywords: [ "blue-square", "direction", "top" ], + "char": "\u2934\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": "\u2935\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + hash: { + keywords: [ "symbol", "blue-square", "twitter" ], + "char": "#\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + information_source: { + keywords: [ "blue-square", "alphabet", "letter" ], + "char": "\u2139\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + abc: { + keywords: [ "blue-square", "alphabet" ], + "char": "\ud83d\udd24", + fitzpatrick_scale: false, + category: "symbols" + }, + abcd: { + keywords: [ "blue-square", "alphabet" ], + "char": "\ud83d\udd21", + fitzpatrick_scale: false, + category: "symbols" + }, + capital_abcd: { + keywords: [ "alphabet", "words", "blue-square" ], + "char": "\ud83d\udd20", + fitzpatrick_scale: false, + category: "symbols" + }, + symbols: { + keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], + "char": "\ud83d\udd23", + fitzpatrick_scale: false, + category: "symbols" + }, + musical_note: { + keywords: [ "score", "tone", "sound" ], + "char": "\ud83c\udfb5", + fitzpatrick_scale: false, + category: "symbols" + }, + notes: { + keywords: [ "music", "score" ], + "char": "\ud83c\udfb6", + fitzpatrick_scale: false, + category: "symbols" + }, + wavy_dash: { + keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], + "char": "\u3030\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + curly_loop: { + keywords: [ "scribble", "draw", "shape", "squiggle" ], + "char": "\u27b0", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_check_mark: { + keywords: [ "ok", "nike", "answer", "yes", "tick" ], + "char": "\u2714\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_clockwise: { + keywords: [ "sync", "cycle", "round", "repeat" ], + "char": "\ud83d\udd03", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_plus_sign: { + keywords: [ "math", "calculation", "addition", "more", "increase" ], + "char": "\u2795", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_minus_sign: { + keywords: [ "math", "calculation", "subtract", "less" ], + "char": "\u2796", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_division_sign: { + keywords: [ "divide", "math", "calculation" ], + "char": "\u2797", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_multiplication_x: { + keywords: [ "math", "calculation" ], + "char": "\u2716\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + infinity: { + keywords: [ "forever" ], + "char": "\u267e", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_dollar_sign: { + keywords: [ "money", "sales", "payment", "currency", "buck" ], + "char": "\ud83d\udcb2", + fitzpatrick_scale: false, + category: "symbols" + }, + currency_exchange: { + keywords: [ "money", "sales", "dollar", "travel" ], + "char": "\ud83d\udcb1", + fitzpatrick_scale: false, + category: "symbols" + }, + copyright: { + keywords: [ "ip", "license", "circle", "law", "legal" ], + "char": "\xa9\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + registered: { + keywords: [ "alphabet", "circle" ], + "char": "\xae\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + tm: { + keywords: [ "trademark", "brand", "law", "legal" ], + "char": "\u2122\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + end: { + keywords: [ "words", "arrow" ], + "char": "\ud83d\udd1a", + fitzpatrick_scale: false, + category: "symbols" + }, + back: { + keywords: [ "arrow", "words", "return" ], + "char": "\ud83d\udd19", + fitzpatrick_scale: false, + category: "symbols" + }, + on: { + keywords: [ "arrow", "words" ], + "char": "\ud83d\udd1b", + fitzpatrick_scale: false, + category: "symbols" + }, + top: { + keywords: [ "words", "blue-square" ], + "char": "\ud83d\udd1d", + fitzpatrick_scale: false, + category: "symbols" + }, + soon: { + keywords: [ "arrow", "words" ], + "char": "\ud83d\udd1c", + fitzpatrick_scale: false, + category: "symbols" + }, + ballot_box_with_check: { + keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], + "char": "\u2611\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + radio_button: { + keywords: [ "input", "old", "music", "circle" ], + "char": "\ud83d\udd18", + fitzpatrick_scale: false, + category: "symbols" + }, + white_circle: { + keywords: [ "shape", "round" ], + "char": "\u26aa", + fitzpatrick_scale: false, + category: "symbols" + }, + black_circle: { + keywords: [ "shape", "button", "round" ], + "char": "\u26ab", + fitzpatrick_scale: false, + category: "symbols" + }, + red_circle: { + keywords: [ "shape", "error", "danger" ], + "char": "\ud83d\udd34", + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_circle: { + keywords: [ "shape", "icon", "button" ], + "char": "\ud83d\udd35", + fitzpatrick_scale: false, + category: "symbols" + }, + small_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": "\ud83d\udd38", + fitzpatrick_scale: false, + category: "symbols" + }, + small_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": "\ud83d\udd39", + fitzpatrick_scale: false, + category: "symbols" + }, + large_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": "\ud83d\udd36", + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": "\ud83d\udd37", + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle: { + keywords: [ "shape", "direction", "up", "top" ], + "char": "\ud83d\udd3a", + fitzpatrick_scale: false, + category: "symbols" + }, + black_small_square: { + keywords: [ "shape", "icon" ], + "char": "\u25aa\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + white_small_square: { + keywords: [ "shape", "icon" ], + "char": "\u25ab\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + black_large_square: { + keywords: [ "shape", "icon", "button" ], + "char": "\u2b1b", + fitzpatrick_scale: false, + category: "symbols" + }, + white_large_square: { + keywords: [ "shape", "icon", "stone", "button" ], + "char": "\u2b1c", + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle_down: { + keywords: [ "shape", "direction", "bottom" ], + "char": "\ud83d\udd3b", + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_square: { + keywords: [ "shape", "button", "icon" ], + "char": "\u25fc\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_square: { + keywords: [ "shape", "stone", "icon" ], + "char": "\u25fb\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_small_square: { + keywords: [ "icon", "shape", "button" ], + "char": "\u25fe", + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_small_square: { + keywords: [ "shape", "stone", "icon", "button" ], + "char": "\u25fd", + fitzpatrick_scale: false, + category: "symbols" + }, + black_square_button: { + keywords: [ "shape", "input", "frame" ], + "char": "\ud83d\udd32", + fitzpatrick_scale: false, + category: "symbols" + }, + white_square_button: { + keywords: [ "shape", "input" ], + "char": "\ud83d\udd33", + fitzpatrick_scale: false, + category: "symbols" + }, + speaker: { + keywords: [ "sound", "volume", "silence", "broadcast" ], + "char": "\ud83d\udd08", + fitzpatrick_scale: false, + category: "symbols" + }, + sound: { + keywords: [ "volume", "speaker", "broadcast" ], + "char": "\ud83d\udd09", + fitzpatrick_scale: false, + category: "symbols" + }, + loud_sound: { + keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], + "char": "\ud83d\udd0a", + fitzpatrick_scale: false, + category: "symbols" + }, + mute: { + keywords: [ "sound", "volume", "silence", "quiet" ], + "char": "\ud83d\udd07", + fitzpatrick_scale: false, + category: "symbols" + }, + mega: { + keywords: [ "sound", "speaker", "volume" ], + "char": "\ud83d\udce3", + fitzpatrick_scale: false, + category: "symbols" + }, + loudspeaker: { + keywords: [ "volume", "sound" ], + "char": "\ud83d\udce2", + fitzpatrick_scale: false, + category: "symbols" + }, + bell: { + keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], + "char": "\ud83d\udd14", + fitzpatrick_scale: false, + category: "symbols" + }, + no_bell: { + keywords: [ "sound", "volume", "mute", "quiet", "silent" ], + "char": "\ud83d\udd15", + fitzpatrick_scale: false, + category: "symbols" + }, + black_joker: { + keywords: [ "poker", "cards", "game", "play", "magic" ], + "char": "\ud83c\udccf", + fitzpatrick_scale: false, + category: "symbols" + }, + mahjong: { + keywords: [ "game", "play", "chinese", "kanji" ], + "char": "\ud83c\udc04", + fitzpatrick_scale: false, + category: "symbols" + }, + spades: { + keywords: [ "poker", "cards", "suits", "magic" ], + "char": "\u2660\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + clubs: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": "\u2663\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + hearts: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": "\u2665\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + diamonds: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": "\u2666\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + flower_playing_cards: { + keywords: [ "game", "sunset", "red" ], + "char": "\ud83c\udfb4", + fitzpatrick_scale: false, + category: "symbols" + }, + thought_balloon: { + keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], + "char": "\ud83d\udcad", + fitzpatrick_scale: false, + category: "symbols" + }, + right_anger_bubble: { + keywords: [ "caption", "speech", "thinking", "mad" ], + "char": "\ud83d\uddef", + fitzpatrick_scale: false, + category: "symbols" + }, + speech_balloon: { + keywords: [ "bubble", "words", "message", "talk", "chatting" ], + "char": "\ud83d\udcac", + fitzpatrick_scale: false, + category: "symbols" + }, + left_speech_bubble: { + keywords: [ "words", "message", "talk", "chatting" ], + "char": "\ud83d\udde8", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd50", + fitzpatrick_scale: false, + category: "symbols" + }, + clock2: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd51", + fitzpatrick_scale: false, + category: "symbols" + }, + clock3: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd52", + fitzpatrick_scale: false, + category: "symbols" + }, + clock4: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd53", + fitzpatrick_scale: false, + category: "symbols" + }, + clock5: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd54", + fitzpatrick_scale: false, + category: "symbols" + }, + clock6: { + keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], + "char": "\ud83d\udd55", + fitzpatrick_scale: false, + category: "symbols" + }, + clock7: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd56", + fitzpatrick_scale: false, + category: "symbols" + }, + clock8: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd57", + fitzpatrick_scale: false, + category: "symbols" + }, + clock9: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd58", + fitzpatrick_scale: false, + category: "symbols" + }, + clock10: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd59", + fitzpatrick_scale: false, + category: "symbols" + }, + clock11: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5a", + fitzpatrick_scale: false, + category: "symbols" + }, + clock12: { + keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], + "char": "\ud83d\udd5b", + fitzpatrick_scale: false, + category: "symbols" + }, + clock130: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5c", + fitzpatrick_scale: false, + category: "symbols" + }, + clock230: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5d", + fitzpatrick_scale: false, + category: "symbols" + }, + clock330: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5e", + fitzpatrick_scale: false, + category: "symbols" + }, + clock430: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5f", + fitzpatrick_scale: false, + category: "symbols" + }, + clock530: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd60", + fitzpatrick_scale: false, + category: "symbols" + }, + clock630: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd61", + fitzpatrick_scale: false, + category: "symbols" + }, + clock730: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd62", + fitzpatrick_scale: false, + category: "symbols" + }, + clock830: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd63", + fitzpatrick_scale: false, + category: "symbols" + }, + clock930: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd64", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1030: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd65", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1130: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd66", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1230: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd67", + fitzpatrick_scale: false, + category: "symbols" + }, + afghanistan: { + keywords: [ "af", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + aland_islands: { + keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + albania: { + keywords: [ "al", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + algeria: { + keywords: [ "dz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + american_samoa: { + keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + andorra: { + keywords: [ "ad", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + angola: { + keywords: [ "ao", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + anguilla: { + keywords: [ "ai", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + antarctica: { + keywords: [ "aq", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + antigua_barbuda: { + keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + argentina: { + keywords: [ "ar", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + armenia: { + keywords: [ "am", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + aruba: { + keywords: [ "aw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + australia: { + keywords: [ "au", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + austria: { + keywords: [ "at", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + azerbaijan: { + keywords: [ "az", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + bahamas: { + keywords: [ "bs", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + bahrain: { + keywords: [ "bh", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + bangladesh: { + keywords: [ "bd", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + barbados: { + keywords: [ "bb", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + belarus: { + keywords: [ "by", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + belgium: { + keywords: [ "be", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + belize: { + keywords: [ "bz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + benin: { + keywords: [ "bj", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + bermuda: { + keywords: [ "bm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + bhutan: { + keywords: [ "bt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + bolivia: { + keywords: [ "bo", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + caribbean_netherlands: { + keywords: [ "bonaire", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + bosnia_herzegovina: { + keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + botswana: { + keywords: [ "bw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + brazil: { + keywords: [ "br", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + british_indian_ocean_territory: { + keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + british_virgin_islands: { + keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + brunei: { + keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + bulgaria: { + keywords: [ "bg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + burkina_faso: { + keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + burundi: { + keywords: [ "bi", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + cape_verde: { + keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + cambodia: { + keywords: [ "kh", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + cameroon: { + keywords: [ "cm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + canada: { + keywords: [ "ca", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + canary_islands: { + keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + cayman_islands: { + keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + central_african_republic: { + keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + chad: { + keywords: [ "td", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + chile: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + cn: { + keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + christmas_island: { + keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + cocos_islands: { + keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + colombia: { + keywords: [ "co", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + comoros: { + keywords: [ "km", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + congo_brazzaville: { + keywords: [ "congo", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + congo_kinshasa: { + keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + cook_islands: { + keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + costa_rica: { + keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + croatia: { + keywords: [ "hr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + cuba: { + keywords: [ "cu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + curacao: { + keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + cyprus: { + keywords: [ "cy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + czech_republic: { + keywords: [ "cz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + denmark: { + keywords: [ "dk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + djibouti: { + keywords: [ "dj", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + dominica: { + keywords: [ "dm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + dominican_republic: { + keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + ecuador: { + keywords: [ "ec", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + egypt: { + keywords: [ "eg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + el_salvador: { + keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + equatorial_guinea: { + keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + eritrea: { + keywords: [ "er", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + estonia: { + keywords: [ "ee", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + ethiopia: { + keywords: [ "et", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + eu: { + keywords: [ "european", "union", "flag", "banner" ], + "char": "\ud83c\uddea\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + falkland_islands: { + keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + faroe_islands: { + keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + fiji: { + keywords: [ "fj", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + finland: { + keywords: [ "fi", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + fr: { + keywords: [ "banner", "flag", "nation", "france", "french", "country" ], + "char": "\ud83c\uddeb\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + french_guiana: { + keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + french_polynesia: { + keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + french_southern_territories: { + keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + gabon: { + keywords: [ "ga", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + gambia: { + keywords: [ "gm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + georgia: { + keywords: [ "ge", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + de: { + keywords: [ "german", "nation", "flag", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + ghana: { + keywords: [ "gh", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + gibraltar: { + keywords: [ "gi", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + greece: { + keywords: [ "gr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + greenland: { + keywords: [ "gl", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + grenada: { + keywords: [ "gd", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + guadeloupe: { + keywords: [ "gp", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + guam: { + keywords: [ "gu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + guatemala: { + keywords: [ "gt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + guernsey: { + keywords: [ "gg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + guinea: { + keywords: [ "gn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + guinea_bissau: { + keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + guyana: { + keywords: [ "gy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + haiti: { + keywords: [ "ht", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + honduras: { + keywords: [ "hn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + hong_kong: { + keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + hungary: { + keywords: [ "hu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + iceland: { + keywords: [ "is", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + india: { + keywords: [ "in", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + indonesia: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + iran: { + keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + iraq: { + keywords: [ "iq", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + ireland: { + keywords: [ "ie", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + isle_of_man: { + keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + israel: { + keywords: [ "il", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + it: { + keywords: [ "italy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + cote_divoire: { + keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + jamaica: { + keywords: [ "jm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddef\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + jp: { + keywords: [ "japanese", "nation", "flag", "country", "banner" ], + "char": "\ud83c\uddef\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + jersey: { + keywords: [ "je", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddef\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + jordan: { + keywords: [ "jo", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddef\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + kazakhstan: { + keywords: [ "kz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + kenya: { + keywords: [ "ke", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + kiribati: { + keywords: [ "ki", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + kosovo: { + keywords: [ "xk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfd\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + kuwait: { + keywords: [ "kw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + kyrgyzstan: { + keywords: [ "kg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + laos: { + keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + latvia: { + keywords: [ "lv", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + lebanon: { + keywords: [ "lb", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + lesotho: { + keywords: [ "ls", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + liberia: { + keywords: [ "lr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + libya: { + keywords: [ "ly", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + liechtenstein: { + keywords: [ "li", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + lithuania: { + keywords: [ "lt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + luxembourg: { + keywords: [ "lu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + macau: { + keywords: [ "macao", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + macedonia: { + keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + madagascar: { + keywords: [ "mg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + malawi: { + keywords: [ "mw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + malaysia: { + keywords: [ "my", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + maldives: { + keywords: [ "mv", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + mali: { + keywords: [ "ml", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + malta: { + keywords: [ "mt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + marshall_islands: { + keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + martinique: { + keywords: [ "mq", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + mauritania: { + keywords: [ "mr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + mauritius: { + keywords: [ "mu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + mayotte: { + keywords: [ "yt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfe\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + mexico: { + keywords: [ "mx", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + micronesia: { + keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + moldova: { + keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + monaco: { + keywords: [ "mc", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + mongolia: { + keywords: [ "mn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + montenegro: { + keywords: [ "me", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + montserrat: { + keywords: [ "ms", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + morocco: { + keywords: [ "ma", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + mozambique: { + keywords: [ "mz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + myanmar: { + keywords: [ "mm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + namibia: { + keywords: [ "na", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + nauru: { + keywords: [ "nr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + nepal: { + keywords: [ "np", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + netherlands: { + keywords: [ "nl", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + new_caledonia: { + keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + new_zealand: { + keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + nicaragua: { + keywords: [ "ni", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + niger: { + keywords: [ "ne", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + nigeria: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + niue: { + keywords: [ "nu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + norfolk_island: { + keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + northern_mariana_islands: { + keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + north_korea: { + keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + norway: { + keywords: [ "no", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + oman: { + keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf4\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + pakistan: { + keywords: [ "pk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + palau: { + keywords: [ "pw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + palestinian_territories: { + keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + panama: { + keywords: [ "pa", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + papua_new_guinea: { + keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + paraguay: { + keywords: [ "py", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + peru: { + keywords: [ "pe", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + philippines: { + keywords: [ "ph", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + pitcairn_islands: { + keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + poland: { + keywords: [ "pl", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + portugal: { + keywords: [ "pt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + puerto_rico: { + keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + qatar: { + keywords: [ "qa", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf6\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + reunion: { + keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + romania: { + keywords: [ "ro", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + ru: { + keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + rwanda: { + keywords: [ "rw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + st_barthelemy: { + keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + st_helena: { + keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + st_kitts_nevis: { + keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + st_lucia: { + keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + st_pierre_miquelon: { + keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + st_vincent_grenadines: { + keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + samoa: { + keywords: [ "ws", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfc\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + san_marino: { + keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + sao_tome_principe: { + keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + saudi_arabia: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + senegal: { + keywords: [ "sn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + serbia: { + keywords: [ "rs", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + seychelles: { + keywords: [ "sc", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + sierra_leone: { + keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + singapore: { + keywords: [ "sg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + sint_maarten: { + keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + slovakia: { + keywords: [ "sk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + slovenia: { + keywords: [ "si", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + solomon_islands: { + keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + somalia: { + keywords: [ "so", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + south_africa: { + keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddff\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + south_georgia_south_sandwich_islands: { + keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + kr: { + keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + south_sudan: { + keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + es: { + keywords: [ "spain", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + sri_lanka: { + keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + sudan: { + keywords: [ "sd", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + suriname: { + keywords: [ "sr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + swaziland: { + keywords: [ "sz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + sweden: { + keywords: [ "se", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + switzerland: { + keywords: [ "ch", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + syria: { + keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + taiwan: { + keywords: [ "tw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + tajikistan: { + keywords: [ "tj", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + tanzania: { + keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + thailand: { + keywords: [ "th", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + timor_leste: { + keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + togo: { + keywords: [ "tg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + tokelau: { + keywords: [ "tk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + tonga: { + keywords: [ "to", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + trinidad_tobago: { + keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + tunisia: { + keywords: [ "tn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + tr: { + keywords: [ "turkey", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + turkmenistan: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + turks_caicos_islands: { + keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + tuvalu: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + uganda: { + keywords: [ "ug", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + ukraine: { + keywords: [ "ua", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + united_arab_emirates: { + keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + uk: { + keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], + "char": "\ud83c\uddec\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + england: { + keywords: [ "flag", "english" ], + "char": "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + scotland: { + keywords: [ "flag", "scottish" ], + "char": "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + wales: { + keywords: [ "flag", "welsh" ], + "char": "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + us: { + keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + us_virgin_islands: { + keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + uruguay: { + keywords: [ "uy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + uzbekistan: { + keywords: [ "uz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + vanuatu: { + keywords: [ "vu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + vatican_city: { + keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + venezuela: { + keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + vietnam: { + keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + wallis_futuna: { + keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfc\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + western_sahara: { + keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + yemen: { + keywords: [ "ye", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfe\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + zambia: { + keywords: [ "zm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddff\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + zimbabwe: { + keywords: [ "zw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddff\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + united_nations: { + keywords: [ "un", "flag", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + pirate_flag: { + keywords: [ "skull", "crossbones", "flag", "banner" ], + "char": "\ud83c\udff4\u200d\u2620\ufe0f", + fitzpatrick_scale: false, + category: "flags" + } +}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojis.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojis.min.js new file mode 100644 index 0000000..8295d5a --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/js/emojis.min.js @@ -0,0 +1,2 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],"char":"\ud83d\ude00",fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],"char":"\ud83d\ude2c",fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],"char":"\ud83d\ude01",fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],"char":"\ud83d\ude02",fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],"char":"\ud83e\udd23",fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],"char":"\ud83e\udd73",fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],"char":"\ud83d\ude03",fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],"char":"\ud83d\ude04",fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],"char":"\ud83d\ude05",fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],"char":"\ud83d\ude06",fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],"char":"\ud83d\ude07",fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],"char":"\ud83d\ude09",fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],"char":"\ud83d\ude0a",fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],"char":"\ud83d\ude42",fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],"char":"\ud83d\ude43",fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],"char":"\u263a\ufe0f",fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],"char":"\ud83d\ude0b",fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],"char":"\ud83d\ude0c",fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],"char":"\ud83d\ude0d",fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],"char":"\ud83e\udd70",fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],"char":"\ud83d\ude18",fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],"char":"\ud83d\ude17",fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],"char":"\ud83d\ude19",fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],"char":"\ud83d\ude1a",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],"char":"\ud83d\ude1c",fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],"char":"\ud83e\udd2a",fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],"char":"\ud83e\udd28",fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],"char":"\ud83e\uddd0",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],"char":"\ud83d\ude1d",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],"char":"\ud83d\ude1b",fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],"char":"\ud83e\udd11",fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],"char":"\ud83e\udd13",fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],"char":"\ud83d\ude0e",fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],"char":"\ud83e\udd29",fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],"char":"\ud83e\udd21",fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],"char":"\ud83e\udd20",fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],"char":"\ud83e\udd17",fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],"char":"\ud83d\ude0f",fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],"char":"\ud83d\ude36",fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],"char":"\ud83d\ude10",fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],"char":"\ud83d\ude11",fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],"char":"\ud83d\ude12",fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],"char":"\ud83d\ude44",fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],"char":"\ud83e\udd14",fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],"char":"\ud83e\udd25",fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],"char":"\ud83e\udd2d",fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],"char":"\ud83e\udd2b",fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],"char":"\ud83e\udd2c",fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],"char":"\ud83e\udd2f",fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],"char":"\ud83d\ude33",fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],"char":"\ud83d\ude1e",fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],"char":"\ud83d\ude1f",fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],"char":"\ud83d\ude20",fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],"char":"\ud83d\ude21",fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],"char":"\ud83d\ude14",fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],"char":"\ud83d\ude15",fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],"char":"\ud83d\ude41",fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],"char":"\u2639",fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],"char":"\ud83d\ude23",fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],"char":"\ud83d\ude16",fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],"char":"\ud83d\ude2b",fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],"char":"\ud83d\ude29",fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],"char":"\ud83e\udd7a",fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],"char":"\ud83d\ude24",fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],"char":"\ud83d\ude2e",fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],"char":"\ud83d\ude31",fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],"char":"\ud83d\ude28",fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],"char":"\ud83d\ude30",fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],"char":"\ud83d\ude2f",fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],"char":"\ud83d\ude26",fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],"char":"\ud83d\ude27",fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],"char":"\ud83d\ude22",fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],"char":"\ud83d\ude25",fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],"char":"\ud83e\udd24",fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],"char":"\ud83d\ude2a",fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],"char":"\ud83d\ude13",fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],"char":"\ud83e\udd75",fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],"char":"\ud83e\udd76",fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],"char":"\ud83d\ude2d",fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],"char":"\ud83d\ude35",fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],"char":"\ud83d\ude32",fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],"char":"\ud83e\udd10",fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],"char":"\ud83e\udd22",fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],"char":"\ud83e\udd27",fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],"char":"\ud83e\udd2e",fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],"char":"\ud83d\ude37",fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],"char":"\ud83e\udd12",fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],"char":"\ud83e\udd15",fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],"char":"\ud83e\udd74",fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],"char":"\ud83d\ude34",fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],"char":"\ud83d\udca4",fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],"char":"\ud83d\udca9",fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],"char":"\ud83d\ude08",fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],"char":"\ud83d\udc7f",fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],"char":"\ud83d\udc79",fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],"char":"\ud83d\udc7a",fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],"char":"\ud83d\udc80",fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],"char":"\ud83d\udc7b",fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],"char":"\ud83d\udc7d",fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],"char":"\ud83e\udd16",fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],"char":"\ud83d\ude3a",fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],"char":"\ud83d\ude38",fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],"char":"\ud83d\ude39",fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],"char":"\ud83d\ude3b",fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],"char":"\ud83d\ude3c",fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],"char":"\ud83d\ude3d",fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],"char":"\ud83d\ude40",fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],"char":"\ud83d\ude3f",fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],"char":"\ud83d\ude3e",fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],"char":"\ud83e\udd32",fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],"char":"\ud83d\ude4c",fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],"char":"\ud83d\udc4f",fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],"char":"\ud83d\udc4b",fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],"char":"\ud83e\udd19",fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],"char":"\ud83d\udc4d",fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],"char":"\ud83d\udc4e",fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],"char":"\ud83d\udc4a",fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],"char":"\u270a",fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],"char":"\ud83e\udd1b",fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],"char":"\ud83e\udd1c",fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],"char":"\u270c",fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],"char":"\ud83d\udc4c",fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],"char":"\u270b",fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],"char":"\ud83e\udd1a",fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],"char":"\ud83d\udc50",fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],"char":"\ud83d\udcaa",fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],"char":"\ud83d\ude4f",fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],"char":"\ud83e\uddb6",fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],"char":"\ud83e\uddb5",fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],"char":"\ud83e\udd1d",fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],"char":"\u261d",fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],"char":"\ud83d\udc46",fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],"char":"\ud83d\udc47",fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],"char":"\ud83d\udc48",fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],"char":"\ud83d\udc49",fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],"char":"\ud83d\udd95",fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],"char":"\ud83d\udd90",fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],"char":"\ud83e\udd1f",fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],"char":"\ud83e\udd18",fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],"char":"\ud83e\udd1e",fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],"char":"\ud83d\udd96",fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],"char":"\u270d",fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],"char":"\ud83e\udd33",fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],"char":"\ud83d\udc85",fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],"char":"\ud83d\udc44",fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],"char":"\ud83e\uddb7",fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],"char":"\ud83d\udc45",fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],"char":"\ud83d\udc42",fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],"char":"\ud83d\udc43",fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],"char":"\ud83d\udc41",fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],"char":"\ud83d\udc40",fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],"char":"\ud83e\udde0",fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],"char":"\ud83d\udc64",fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],"char":"\ud83d\udc65",fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],"char":"\ud83d\udde3",fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],"char":"\ud83d\udc76",fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],"char":"\ud83e\uddd2",fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],"char":"\ud83d\udc66",fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],"char":"\ud83d\udc67",fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],"char":"\ud83e\uddd1",fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],"char":"\ud83d\udc68",fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],"char":"\ud83d\udc69",fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],"char":"\ud83d\udc71\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],"char":"\ud83d\udc71",fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],"char":"\ud83e\uddd4",fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],"char":"\ud83e\uddd3",fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],"char":"\ud83d\udc74",fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],"char":"\ud83d\udc75",fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],"char":"\ud83d\udc72",fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],"char":"\ud83e\uddd5",fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],"char":"\ud83d\udc73\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],"char":"\ud83d\udc73",fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],"char":"\ud83d\udc6e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],"char":"\ud83d\udc6e",fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],"char":"\ud83d\udc77\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],"char":"\ud83d\udc77",fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],"char":"\ud83d\udc82\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],"char":"\ud83d\udc82",fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],"char":"\ud83d\udd75\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],"char":"\ud83d\udd75",fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],"char":"\ud83d\udc69\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],"char":"\ud83d\udc68\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],"char":"\ud83d\udc69\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],"char":"\ud83d\udc68\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],"char":"\ud83d\udc69\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],"char":"\ud83d\udc68\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],"char":"\ud83d\udc69\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],"char":"\ud83d\udc68\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],"char":"\ud83d\udc69\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],"char":"\ud83d\udc68\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],"char":"\ud83d\udc69\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],"char":"\ud83d\udc68\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],"char":"\ud83d\udc69\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],"char":"\ud83d\udc68\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],"char":"\ud83d\udc69\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],"char":"\ud83d\udc68\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],"char":"\ud83d\udc69\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],"char":"\ud83d\udc68\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],"char":"\ud83e\uddb8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],"char":"\ud83e\uddb8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],"char":"\ud83e\uddb9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],"char":"\ud83e\uddb9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],"char":"\ud83e\udd36",fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],"char":"\ud83c\udf85",fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],"char":"\ud83e\uddd9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],"char":"\ud83e\uddd9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],"char":"\ud83e\udddd\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],"char":"\ud83e\udddd\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],"char":"\ud83e\udddb\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],"char":"\ud83e\udddb\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],"char":"\ud83e\udddf\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],"char":"\ud83e\udddf\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],"char":"\ud83e\uddde\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],"char":"\ud83e\uddde\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],"char":"\ud83e\udddc\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],"char":"\ud83e\udddc\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],"char":"\ud83e\uddda\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],"char":"\ud83e\uddda\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],"char":"\ud83d\udc7c",fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],"char":"\ud83e\udd30",fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],"char":"\ud83e\udd31",fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],"char":"\ud83d\udc78",fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],"char":"\ud83e\udd34",fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],"char":"\ud83d\udc70",fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],"char":"\ud83e\udd35",fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],"char":"\ud83c\udfc3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],"char":"\ud83c\udfc3",fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],"char":"\ud83d\udeb6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],"char":"\ud83d\udeb6",fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],"char":"\ud83d\udc83",fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],"char":"\ud83d\udd7a",fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],"char":"\ud83d\udc6f",fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],"char":"\ud83d\udc6f\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],"char":"\ud83d\udc6b",fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],"char":"\ud83d\udc6c",fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],"char":"\ud83d\udc6d",fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],"char":"\ud83d\ude47\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],"char":"\ud83d\ude47",fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],"char":"\ud83e\udd26\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],"char":"\ud83e\udd26\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],"char":"\ud83e\udd37",fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],"char":"\ud83e\udd37\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],"char":"\ud83d\udc81",fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],"char":"\ud83d\udc81\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],"char":"\ud83d\ude45",fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],"char":"\ud83d\ude45\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],"char":"\ud83d\ude46",fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],"char":"\ud83d\ude46\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],"char":"\ud83d\ude4b",fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],"char":"\ud83d\ude4b\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],"char":"\ud83d\ude4e",fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],"char":"\ud83d\ude4e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],"char":"\ud83d\ude4d",fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],"char":"\ud83d\ude4d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],"char":"\ud83d\udc87",fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],"char":"\ud83d\udc87\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],"char":"\ud83d\udc86",fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],"char":"\ud83d\udc86\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],"char":"\ud83e\uddd6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],"char":"\ud83e\uddd6\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":"\ud83d\udc91",fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],"char":"\ud83d\udc8f",fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],"char":"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],"char":"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],"char":"\ud83d\udc6a",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],"char":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],"char":"\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],"char":"\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],"char":"\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],"char":"\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],"char":"\ud83e\uddf6",fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],"char":"\ud83e\uddf5",fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],"char":"\ud83e\udde5",fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],"char":"\ud83e\udd7c",fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],"char":"\ud83d\udc5a",fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],"char":"\ud83d\udc55",fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],"char":"\ud83d\udc56",fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],"char":"\ud83d\udc54",fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],"char":"\ud83d\udc57",fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],"char":"\ud83d\udc59",fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],"char":"\ud83d\udc58",fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],"char":"\ud83d\udc84",fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],"char":"\ud83d\udc8b",fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],"char":"\ud83d\udc63",fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],"char":"\ud83e\udd7f",fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],"char":"\ud83d\udc60",fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],"char":"\ud83d\udc61",fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],"char":"\ud83d\udc62",fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],"char":"\ud83d\udc5e",fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],"char":"\ud83d\udc5f",fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],"char":"\ud83e\udd7e",fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],"char":"\ud83e\udde6",fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],"char":"\ud83e\udde4",fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],"char":"\ud83e\udde3",fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],"char":"\ud83d\udc52",fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],"char":"\ud83c\udfa9",fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],"char":"\ud83e\udde2",fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],"char":"\u26d1",fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],"char":"\ud83c\udf93",fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],"char":"\ud83d\udc51",fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],"char":"\ud83c\udf92",fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],"char":"\ud83e\uddf3",fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],"char":"\ud83d\udc5d",fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],"char":"\ud83d\udc5b",fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],"char":"\ud83d\udc5c",fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],"char":"\ud83d\udcbc",fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],"char":"\ud83d\udc53",fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],"char":"\ud83d\udd76",fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],"char":"\ud83e\udd7d",fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],"char":"\ud83d\udc8d",fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],"char":"\ud83c\udf02",fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],"char":"\ud83d\udc36",fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],"char":"\ud83d\udc31",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],"char":"\ud83d\udc2d",fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],"char":"\ud83d\udc39",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],"char":"\ud83d\udc30",fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],"char":"\ud83e\udd8a",fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],"char":"\ud83d\udc3b",fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],"char":"\ud83d\udc3c",fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],"char":"\ud83d\udc28",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],"char":"\ud83d\udc2f",fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],"char":"\ud83e\udd81",fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],"char":"\ud83d\udc2e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],"char":"\ud83d\udc37",fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],"char":"\ud83d\udc3d",fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],"char":"\ud83d\udc38",fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],"char":"\ud83e\udd91",fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],"char":"\ud83d\udc19",fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],"char":"\ud83e\udd90",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],"char":"\ud83d\udc35",fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],"char":"\ud83e\udd8d",fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],"char":"\ud83d\ude48",fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],"char":"\ud83d\ude49",fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],"char":"\ud83d\ude4a",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],"char":"\ud83d\udc12",fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],"char":"\ud83d\udc14",fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],"char":"\ud83d\udc27",fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],"char":"\ud83d\udc26",fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],"char":"\ud83d\udc24",fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],"char":"\ud83d\udc23",fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],"char":"\ud83d\udc25",fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],"char":"\ud83e\udd86",fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],"char":"\ud83e\udd85",fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],"char":"\ud83e\udd89",fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],"char":"\ud83e\udd87",fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],"char":"\ud83d\udc3a",fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],"char":"\ud83d\udc17",fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],"char":"\ud83d\udc34",fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],"char":"\ud83e\udd84",fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],"char":"\ud83d\udc1d",fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],"char":"\ud83d\udc1b",fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],"char":"\ud83e\udd8b",fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],"char":"\ud83d\udc0c",fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],"char":"\ud83d\udc1e",fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],"char":"\ud83d\udc1c",fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],"char":"\ud83e\udd97",fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],"char":"\ud83d\udd77",fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],"char":"\ud83e\udd82",fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],"char":"\ud83e\udd80",fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],"char":"\ud83d\udc0d",fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],"char":"\ud83e\udd8e",fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],"char":"\ud83e\udd96",fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],"char":"\ud83e\udd95",fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],"char":"\ud83d\udc22",fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],"char":"\ud83d\udc20",fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],"char":"\ud83d\udc1f",fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],"char":"\ud83d\udc21",fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],"char":"\ud83d\udc2c",fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],"char":"\ud83e\udd88",fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],"char":"\ud83d\udc33",fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],"char":"\ud83d\udc0b",fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],"char":"\ud83d\udc0a",fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],"char":"\ud83d\udc06",fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],"char":"\ud83e\udd93",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],"char":"\ud83d\udc05",fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],"char":"\ud83d\udc03",fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],"char":"\ud83d\udc02",fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],"char":"\ud83d\udc04",fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],"char":"\ud83e\udd8c",fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],"char":"\ud83d\udc2a",fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],"char":"\ud83d\udc2b",fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],"char":"\ud83e\udd92",fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],"char":"\ud83d\udc18",fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],"char":"\ud83e\udd8f",fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],"char":"\ud83d\udc10",fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],"char":"\ud83d\udc0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],"char":"\ud83d\udc11",fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],"char":"\ud83d\udc0e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],"char":"\ud83d\udc16",fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],"char":"\ud83d\udc00",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],"char":"\ud83d\udc01",fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],"char":"\ud83d\udc13",fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],"char":"\ud83e\udd83",fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],"char":"\ud83d\udd4a",fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],"char":"\ud83d\udc15",fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],"char":"\ud83d\udc29",fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],"char":"\ud83d\udc08",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],"char":"\ud83d\udc07",fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],"char":"\ud83d\udc3f",fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],"char":"\ud83e\udd94",fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],"char":"\ud83e\udd9d",fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],"char":"\ud83e\udd99",fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],"char":"\ud83e\udd9b",fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],"char":"\ud83e\udd98",fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],"char":"\ud83e\udda1",fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],"char":"\ud83e\udda2",fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],"char":"\ud83e\udd9a",fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],"char":"\ud83e\udd9c",fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],"char":"\ud83e\udd9e",fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],"char":"\ud83e\udd9f",fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],"char":"\ud83d\udc3e",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],"char":"\ud83d\udc09",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],"char":"\ud83d\udc32",fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],"char":"\ud83c\udf35",fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],"char":"\ud83c\udf84",fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],"char":"\ud83c\udf32",fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],"char":"\ud83c\udf33",fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],"char":"\ud83c\udf34",fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],"char":"\ud83c\udf31",fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],"char":"\ud83c\udf3f",fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],"char":"\u2618",fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],"char":"\ud83c\udf40",fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],"char":"\ud83c\udf8d",fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],"char":"\ud83c\udf8b",fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],"char":"\ud83c\udf43",fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],"char":"\ud83c\udf42",fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],"char":"\ud83c\udf41",fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],"char":"\ud83c\udf3e",fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],"char":"\ud83c\udf3a",fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],"char":"\ud83c\udf3b",fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],"char":"\ud83c\udf39",fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],"char":"\ud83e\udd40",fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],"char":"\ud83c\udf37",fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],"char":"\ud83c\udf3c",fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],"char":"\ud83c\udf38",fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],"char":"\ud83d\udc90",fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],"char":"\ud83c\udf44",fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],"char":"\ud83c\udf30",fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],"char":"\ud83c\udf83",fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],"char":"\ud83d\udc1a",fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],"char":"\ud83d\udd78",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],"char":"\ud83c\udf0e",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],"char":"\ud83c\udf0d",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],"char":"\ud83c\udf0f",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf15",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],"char":"\ud83c\udf16",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf17",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf18",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf11",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf12",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf13",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],"char":"\ud83c\udf14",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf1a",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf1d",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf1b",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf1c",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],"char":"\ud83c\udf1e",fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],"char":"\ud83c\udf19",fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],"char":"\u2b50",fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],"char":"\ud83c\udf1f",fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],"char":"\ud83d\udcab",fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],"char":"\u2728",fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],"char":"\u2604",fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],"char":"\u2600\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],"char":"\ud83c\udf24",fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],"char":"\u26c5",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],"char":"\ud83c\udf25",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],"char":"\ud83c\udf26",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],"char":"\u2601\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],"char":"\ud83c\udf27",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],"char":"\u26c8",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],"char":"\ud83c\udf29",fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],"char":"\u26a1",fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],"char":"\ud83d\udd25",fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],"char":"\ud83d\udca5",fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],"char":"\u2744\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],"char":"\ud83c\udf28",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],"char":"\u26c4",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],"char":"\u2603",fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],"char":"\ud83c\udf2c",fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],"char":"\ud83d\udca8",fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],"char":"\ud83c\udf2a",fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],"char":"\ud83c\udf2b",fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],"char":"\u2602",fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],"char":"\u2614",fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],"char":"\ud83d\udca7",fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],"char":"\ud83d\udca6",fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],"char":"\ud83c\udf0a",fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],"char":"\ud83c\udf4f",fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],"char":"\ud83c\udf4e",fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],"char":"\ud83c\udf50",fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],"char":"\ud83c\udf4a",fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],"char":"\ud83c\udf4b",fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],"char":"\ud83c\udf4c",fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],"char":"\ud83c\udf49",fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],"char":"\ud83c\udf47",fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],"char":"\ud83c\udf53",fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],"char":"\ud83c\udf48",fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],"char":"\ud83c\udf52",fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],"char":"\ud83c\udf51",fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],"char":"\ud83c\udf4d",fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],"char":"\ud83e\udd65",fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],"char":"\ud83e\udd5d",fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],"char":"\ud83e\udd6d",fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],"char":"\ud83e\udd51",fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],"char":"\ud83e\udd66",fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],"char":"\ud83c\udf45",fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],"char":"\ud83c\udf46",fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],"char":"\ud83e\udd52",fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],"char":"\ud83e\udd55",fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],"char":"\ud83c\udf36",fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],"char":"\ud83e\udd54",fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],"char":"\ud83c\udf3d",fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],"char":"\ud83e\udd6c",fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],"char":"\ud83c\udf60",fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],"char":"\ud83e\udd5c",fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],"char":"\ud83c\udf6f",fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],"char":"\ud83e\udd50",fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],"char":"\ud83c\udf5e",fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],"char":"\ud83e\udd56",fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],"char":"\ud83e\udd6f",fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],"char":"\ud83e\udd68",fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],"char":"\ud83e\uddc0",fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],"char":"\ud83e\udd5a",fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],"char":"\ud83e\udd53",fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],"char":"\ud83e\udd69",fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],"char":"\ud83e\udd5e",fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],"char":"\ud83c\udf57",fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],"char":"\ud83c\udf56",fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],"char":"\ud83e\uddb4",fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],"char":"\ud83c\udf64",fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],"char":"\ud83c\udf73",fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],"char":"\ud83c\udf54",fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],"char":"\ud83c\udf5f",fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],"char":"\ud83e\udd59",fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],"char":"\ud83c\udf2d",fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],"char":"\ud83c\udf55",fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],"char":"\ud83e\udd6a",fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],"char":"\ud83e\udd6b",fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],"char":"\ud83c\udf5d",fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],"char":"\ud83c\udf2e",fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],"char":"\ud83c\udf2f",fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],"char":"\ud83e\udd57",fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],"char":"\ud83e\udd58",fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],"char":"\ud83c\udf5c",fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],"char":"\ud83c\udf72",fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],"char":"\ud83c\udf65",fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],"char":"\ud83e\udd60",fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],"char":"\ud83c\udf63",fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],"char":"\ud83c\udf71",fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],"char":"\ud83c\udf5b",fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],"char":"\ud83c\udf59",fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],"char":"\ud83c\udf5a",fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],"char":"\ud83c\udf58",fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],"char":"\ud83c\udf62",fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],"char":"\ud83c\udf61",fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],"char":"\ud83c\udf67",fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],"char":"\ud83c\udf68",fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],"char":"\ud83c\udf66",fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],"char":"\ud83e\udd67",fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],"char":"\ud83c\udf70",fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],"char":"\ud83e\uddc1",fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],"char":"\ud83e\udd6e",fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],"char":"\ud83c\udf82",fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],"char":"\ud83c\udf6e",fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],"char":"\ud83c\udf6c",fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],"char":"\ud83c\udf6d",fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],"char":"\ud83c\udf6b",fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],"char":"\ud83c\udf7f",fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],"char":"\ud83e\udd5f",fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],"char":"\ud83c\udf69",fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],"char":"\ud83c\udf6a",fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],"char":"\ud83e\udd5b",fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"char":"\ud83c\udf7a",fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"char":"\ud83c\udf7b",fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],"char":"\ud83e\udd42",fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],"char":"\ud83c\udf77",fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],"char":"\ud83e\udd43",fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],"char":"\ud83c\udf78",fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],"char":"\ud83c\udf79",fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],"char":"\ud83c\udf7e",fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],"char":"\ud83c\udf76",fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],"char":"\ud83c\udf75",fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],"char":"\ud83e\udd64",fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],"char":"\u2615",fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],"char":"\ud83c\udf7c",fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],"char":"\ud83e\uddc2",fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],"char":"\ud83e\udd44",fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],"char":"\ud83c\udf74",fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],"char":"\ud83c\udf7d",fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],"char":"\ud83e\udd63",fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],"char":"\ud83e\udd61",fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],"char":"\ud83e\udd62",fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],"char":"\u26bd",fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],"char":"\ud83c\udfc0",fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],"char":"\ud83c\udfc8",fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],"char":"\u26be",fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],"char":"\ud83e\udd4e",fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],"char":"\ud83c\udfbe",fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],"char":"\ud83c\udfd0",fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],"char":"\ud83c\udfc9",fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],"char":"\ud83e\udd4f",fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],"char":"\ud83c\udfb1",fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],"char":"\u26f3",fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],"char":"\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],"char":"\ud83c\udfcc",fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],"char":"\ud83c\udfd3",fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],"char":"\ud83c\udff8",fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],"char":"\ud83e\udd45",fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],"char":"\ud83c\udfd2",fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],"char":"\ud83c\udfd1",fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],"char":"\ud83e\udd4d",fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],"char":"\ud83c\udfcf",fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],"char":"\ud83c\udfbf",fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],"char":"\u26f7",fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],"char":"\ud83c\udfc2",fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],"char":"\ud83e\udd3a",fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],"char":"\ud83e\udd3c\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],"char":"\ud83e\udd3c\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],"char":"\ud83e\udd38\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],"char":"\ud83e\udd38\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],"char":"\ud83e\udd3e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],"char":"\ud83e\udd3e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],"char":"\u26f8",fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],"char":"\ud83e\udd4c",fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],"char":"\ud83d\udef9",fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],"char":"\ud83d\udef7",fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],"char":"\ud83c\udff9",fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],"char":"\ud83c\udfa3",fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],"char":"\ud83e\udd4a",fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],"char":"\ud83e\udd4b",fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],"char":"\ud83d\udea3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],"char":"\ud83d\udea3",fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],"char":"\ud83e\uddd7\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],"char":"\ud83e\uddd7\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],"char":"\ud83c\udfca\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],"char":"\ud83c\udfca",fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],"char":"\ud83e\udd3d\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],"char":"\ud83e\udd3d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],"char":"\ud83e\uddd8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],"char":"\ud83e\uddd8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],"char":"\ud83c\udfc4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],"char":"\ud83c\udfc4",fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],"char":"\ud83d\udec0",fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],"char":"\u26f9\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],"char":"\u26f9",fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],"char":"\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],"char":"\ud83c\udfcb",fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],"char":"\ud83d\udeb4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],"char":"\ud83d\udeb4",fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],"char":"\ud83d\udeb5\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],"char":"\ud83d\udeb5",fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],"char":"\ud83c\udfc7",fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],"char":"\ud83d\udd74",fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],"char":"\ud83c\udfc6",fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],"char":"\ud83c\udfbd",fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],"char":"\ud83c\udfc5",fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],"char":"\ud83c\udf96",fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],"char":"\ud83e\udd47",fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],"char":"\ud83e\udd48",fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],"char":"\ud83e\udd49",fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],"char":"\ud83c\udf97",fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],"char":"\ud83c\udff5",fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],"char":"\ud83c\udfab",fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],"char":"\ud83c\udf9f",fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],"char":"\ud83c\udfad",fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],"char":"\ud83c\udfa8",fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],"char":"\ud83c\udfaa",fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],"char":"\ud83e\udd39\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],"char":"\ud83e\udd39\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],"char":"\ud83c\udfa4",fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],"char":"\ud83c\udfa7",fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],"char":"\ud83c\udfbc",fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],"char":"\ud83c\udfb9",fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],"char":"\ud83e\udd41",fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],"char":"\ud83c\udfb7",fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],"char":"\ud83c\udfba",fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],"char":"\ud83c\udfb8",fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],"char":"\ud83c\udfbb",fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],"char":"\ud83c\udfac",fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],"char":"\ud83c\udfae",fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],"char":"\ud83d\udc7e",fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],"char":"\ud83c\udfaf",fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],"char":"\ud83c\udfb2",fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],"char":"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],"char":"\ud83c\udfb0",fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],"char":"\ud83e\udde9",fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],"char":"\ud83c\udfb3",fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],"char":"\ud83d\ude97",fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],"char":"\ud83d\ude95",fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],"char":"\ud83d\ude99",fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],"char":"\ud83d\ude8c",fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],"char":"\ud83d\ude8e",fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],"char":"\ud83c\udfce",fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],"char":"\ud83d\ude93",fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],"char":"\ud83d\ude91",fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],"char":"\ud83d\ude92",fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],"char":"\ud83d\ude90",fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],"char":"\ud83d\ude9a",fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],"char":"\ud83d\ude9b",fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],"char":"\ud83d\ude9c",fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],"char":"\ud83d\udef4",fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],"char":"\ud83c\udfcd",fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],"char":"\ud83d\udeb2",fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],"char":"\ud83d\udef5",fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],"char":"\ud83d\udea8",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],"char":"\ud83d\ude94",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],"char":"\ud83d\ude8d",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],"char":"\ud83d\ude98",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],"char":"\ud83d\ude96",fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],"char":"\ud83d\udea1",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],"char":"\ud83d\udea0",fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],"char":"\ud83d\ude9f",fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],"char":"\ud83d\ude83",fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],"char":"\ud83d\ude8b",fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],"char":"\ud83d\ude9d",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],"char":"\ud83d\ude84",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],"char":"\ud83d\ude85",fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],"char":"\ud83d\ude88",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],"char":"\ud83d\ude9e",fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],"char":"\ud83d\ude82",fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],"char":"\ud83d\ude86",fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],"char":"\ud83d\ude87",fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],"char":"\ud83d\ude8a",fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],"char":"\ud83d\ude89",fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],"char":"\ud83d\udef8",fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],"char":"\ud83d\ude81",fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],"char":"\ud83d\udee9",fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],"char":"\u2708\ufe0f",fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],"char":"\ud83d\udeeb",fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],"char":"\ud83d\udeec",fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],"char":"\u26f5",fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],"char":"\ud83d\udee5",fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],"char":"\ud83d\udea4",fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],"char":"\u26f4",fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],"char":"\ud83d\udef3",fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],"char":"\ud83d\ude80",fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],"char":"\ud83d\udef0",fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],"char":"\ud83d\udcba",fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],"char":"\ud83d\udef6",fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],"char":"\u2693",fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],"char":"\ud83d\udea7",fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],"char":"\u26fd",fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],"char":"\ud83d\ude8f",fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],"char":"\ud83d\udea6",fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],"char":"\ud83d\udea5",fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],"char":"\ud83c\udfc1",fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],"char":"\ud83d\udea2",fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],"char":"\ud83c\udfa1",fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],"char":"\ud83c\udfa2",fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],"char":"\ud83c\udfa0",fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],"char":"\ud83c\udfd7",fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],"char":"\ud83c\udf01",fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],"char":"\ud83d\uddfc",fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],"char":"\ud83c\udfed",fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],"char":"\u26f2",fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],"char":"\ud83c\udf91",fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],"char":"\u26f0",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],"char":"\ud83c\udfd4",fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],"char":"\ud83d\uddfb",fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],"char":"\ud83c\udf0b",fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],"char":"\ud83d\uddfe",fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],"char":"\ud83c\udfd5",fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],"char":"\u26fa",fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],"char":"\ud83c\udfde",fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],"char":"\ud83d\udee3",fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],"char":"\ud83d\udee4",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],"char":"\ud83c\udf05",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],"char":"\ud83c\udf04",fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],"char":"\ud83c\udfdc",fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],"char":"\ud83c\udfd6",fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],"char":"\ud83c\udfdd",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],"char":"\ud83c\udf07",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],"char":"\ud83c\udf06",fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],"char":"\ud83c\udfd9",fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],"char":"\ud83c\udf03",fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],"char":"\ud83c\udf09",fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],"char":"\ud83c\udf0c",fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],"char":"\ud83c\udf20",fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],"char":"\ud83c\udf87",fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],"char":"\ud83c\udf86",fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],"char":"\ud83c\udf08",fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],"char":"\ud83c\udfd8",fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],"char":"\ud83c\udff0",fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],"char":"\ud83c\udfef",fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],"char":"\ud83c\udfdf",fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],"char":"\ud83d\uddfd",fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],"char":"\ud83c\udfe0",fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],"char":"\ud83c\udfe1",fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],"char":"\ud83c\udfda",fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],"char":"\ud83c\udfe2",fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],"char":"\ud83c\udfec",fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],"char":"\ud83c\udfe3",fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],"char":"\ud83c\udfe4",fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],"char":"\ud83c\udfe5",fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],"char":"\ud83c\udfe6",fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],"char":"\ud83c\udfe8",fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],"char":"\ud83c\udfea",fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],"char":"\ud83c\udfeb",fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],"char":"\ud83c\udfe9",fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],"char":"\ud83d\udc92",fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],"char":"\ud83c\udfdb",fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],"char":"\u26ea",fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],"char":"\ud83d\udd4c",fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],"char":"\ud83d\udd4d",fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],"char":"\ud83d\udd4b",fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],"char":"\u26e9",fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],"char":"\u231a",fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],"char":"\ud83d\udcf1",fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],"char":"\ud83d\udcf2",fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],"char":"\ud83d\udcbb",fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],"char":"\u2328",fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],"char":"\ud83d\udda5",fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],"char":"\ud83d\udda8",fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],"char":"\ud83d\uddb1",fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],"char":"\ud83d\uddb2",fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],"char":"\ud83d\udd79",fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],"char":"\ud83d\udddc",fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],"char":"\ud83d\udcbd",fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],"char":"\ud83d\udcbe",fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],"char":"\ud83d\udcbf",fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],"char":"\ud83d\udcc0",fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],"char":"\ud83d\udcfc",fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],"char":"\ud83d\udcf7",fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],"char":"\ud83d\udcf8",fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],"char":"\ud83d\udcf9",fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],"char":"\ud83c\udfa5",fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],"char":"\ud83d\udcfd",fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],"char":"\ud83c\udf9e",fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],"char":"\ud83d\udcde",fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],"char":"\u260e\ufe0f",fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],"char":"\ud83d\udcdf",fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],"char":"\ud83d\udce0",fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],"char":"\ud83d\udcfa",fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],"char":"\ud83d\udcfb",fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],"char":"\ud83c\udf99",fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],"char":"\ud83c\udf9a",fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],"char":"\ud83c\udf9b",fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],"char":"\ud83e\udded",fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],"char":"\u23f1",fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],"char":"\u23f2",fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],"char":"\u23f0",fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],"char":"\ud83d\udd70",fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],"char":"\u23f3",fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],"char":"\u231b",fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],"char":"\ud83d\udce1",fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],"char":"\ud83d\udd0b",fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],"char":"\ud83d\udd0c",fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],"char":"\ud83d\udca1",fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],"char":"\ud83d\udd26",fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],"char":"\ud83d\udd6f",fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],"char":"\ud83e\uddef",fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],"char":"\ud83d\uddd1",fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],"char":"\ud83d\udee2",fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],"char":"\ud83d\udcb8",fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],"char":"\ud83d\udcb5",fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],"char":"\ud83d\udcb4",fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],"char":"\ud83d\udcb6",fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],"char":"\ud83d\udcb7",fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],"char":"\ud83d\udcb0",fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],"char":"\ud83d\udcb3",fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],"char":"\ud83d\udc8e",fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],"char":"\u2696",fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],"char":"\ud83e\uddf0",fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],"char":"\ud83d\udd27",fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],"char":"\ud83d\udd28",fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],"char":"\u2692",fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],"char":"\ud83d\udee0",fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],"char":"\u26cf",fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],"char":"\ud83d\udd29",fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],"char":"\u2699",fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],"char":"\ud83e\uddf1",fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],"char":"\u26d3",fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],"char":"\ud83e\uddf2",fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],"char":"\ud83d\udd2b",fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],"char":"\ud83d\udca3",fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],"char":"\ud83e\udde8",fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],"char":"\ud83d\udd2a",fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],"char":"\ud83d\udde1",fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],"char":"\u2694",fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],"char":"\ud83d\udee1",fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],"char":"\ud83d\udeac",fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],"char":"\u2620",fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],"char":"\u26b0",fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],"char":"\u26b1",fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],"char":"\ud83c\udffa",fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],"char":"\ud83d\udd2e",fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],"char":"\ud83d\udcff",fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],"char":"\ud83e\uddff",fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],"char":"\ud83d\udc88",fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],"char":"\u2697",fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],"char":"\ud83d\udd2d",fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],"char":"\ud83d\udd2c",fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],"char":"\ud83d\udd73",fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],"char":"\ud83d\udc8a",fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],"char":"\ud83d\udc89",fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],"char":"\ud83e\uddec",fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],"char":"\ud83e\udda0",fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],"char":"\ud83e\uddeb",fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],"char":"\ud83e\uddea",fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],"char":"\ud83c\udf21",fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],"char":"\ud83e\uddf9",fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],"char":"\ud83e\uddfa",fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],"char":"\ud83e\uddfb",fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],"char":"\ud83c\udff7",fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],"char":"\ud83d\udd16",fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],"char":"\ud83d\udebd",fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],"char":"\ud83d\udebf",fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],"char":"\ud83d\udec1",fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],"char":"\ud83e\uddfc",fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],"char":"\ud83e\uddfd",fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],"char":"\ud83e\uddf4",fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],"char":"\ud83d\udd11",fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],"char":"\ud83d\udddd",fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],"char":"\ud83d\udecb",fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],"char":"\ud83d\udecc",fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],"char":"\ud83d\udecf",fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],"char":"\ud83d\udeaa",fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],"char":"\ud83d\udece",fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],"char":"\ud83e\uddf8",fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],"char":"\ud83d\uddbc",fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],"char":"\ud83d\uddfa",fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],"char":"\u26f1",fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],"char":"\ud83d\uddff",fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],"char":"\ud83d\udecd",fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],"char":"\ud83d\uded2",fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],"char":"\ud83c\udf88",fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],"char":"\ud83c\udf8f",fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],"char":"\ud83c\udf80",fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],"char":"\ud83c\udf81",fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],"char":"\ud83c\udf8a",fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],"char":"\ud83c\udf89",fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],"char":"\ud83c\udf8e",fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],"char":"\ud83c\udf90",fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],"char":"\ud83c\udf8c",fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],"char":"\ud83c\udfee",fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],"char":"\ud83e\udde7",fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],"char":"\u2709\ufe0f",fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],"char":"\ud83d\udce9",fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],"char":"\ud83d\udce8",fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],"char":"\ud83d\udce7",fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],"char":"\ud83d\udc8c",fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],"char":"\ud83d\udcee",fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],"char":"\ud83d\udcea",fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],"char":"\ud83d\udceb",fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],"char":"\ud83d\udcec",fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],"char":"\ud83d\udced",fitzpatrick_scale:!1,category:"objects"},"package":{keywords:["mail","gift","cardboard","box","moving"],"char":"\ud83d\udce6",fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],"char":"\ud83d\udcef",fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],"char":"\ud83d\udce5",fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],"char":"\ud83d\udce4",fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],"char":"\ud83d\udcdc",fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],"char":"\ud83d\udcc3",fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],"char":"\ud83d\udcd1",fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],"char":"\ud83e\uddfe",fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],"char":"\ud83d\udcca",fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],"char":"\ud83d\udcc8",fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],"char":"\ud83d\udcc9",fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],"char":"\ud83d\udcc4",fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],"char":"\ud83d\udcc5",fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],"char":"\ud83d\udcc6",fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],"char":"\ud83d\uddd3",fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],"char":"\ud83d\udcc7",fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],"char":"\ud83d\uddc3",fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],"char":"\ud83d\uddf3",fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],"char":"\ud83d\uddc4",fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],"char":"\ud83d\udccb",fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],"char":"\ud83d\uddd2",fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],"char":"\ud83d\udcc1",fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],"char":"\ud83d\udcc2",fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],"char":"\ud83d\uddc2",fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],"char":"\ud83d\uddde",fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],"char":"\ud83d\udcf0",fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],"char":"\ud83d\udcd3",fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],"char":"\ud83d\udcd5",fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],"char":"\ud83d\udcd7",fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],"char":"\ud83d\udcd8",fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],"char":"\ud83d\udcd9",fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],"char":"\ud83d\udcd4",fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],"char":"\ud83d\udcd2",fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],"char":"\ud83d\udcda",fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],"char":"\ud83d\udcd6",fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],"char":"\ud83e\uddf7",fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],"char":"\ud83d\udd17",fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],"char":"\ud83d\udcce",fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],"char":"\ud83d\udd87",fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],"char":"\u2702\ufe0f",fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],"char":"\ud83d\udcd0",fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],"char":"\ud83d\udccf",fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],"char":"\ud83e\uddee",fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],"char":"\ud83d\udccc",fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],"char":"\ud83d\udccd",fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],"char":"\ud83d\udea9",fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],"char":"\ud83c\udff3",fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],"char":"\ud83c\udff4",fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],"char":"\ud83c\udff3\ufe0f\u200d\ud83c\udf08",fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],"char":"\ud83d\udd10",fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],"char":"\ud83d\udd12",fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],"char":"\ud83d\udd13",fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],"char":"\ud83d\udd0f",fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],"char":"\ud83d\udd8a",fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],"char":"\ud83d\udd8b",fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],"char":"\u2712\ufe0f",fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],"char":"\ud83d\udcdd",fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],"char":"\u270f\ufe0f",fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],"char":"\ud83d\udd8d",fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],"char":"\ud83d\udd8c",fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],"char":"\ud83d\udd0d",fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],"char":"\ud83d\udd0e",fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],"char":"\u2764\ufe0f",fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83e\udde1",fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc9b",fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc9a",fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc99",fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc9c",fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],"char":"\ud83d\udda4",fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],"char":"\ud83d\udc94",fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],"char":"\u2763",fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],"char":"\ud83d\udc95",fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc9e",fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],"char":"\ud83d\udc93",fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],"char":"\ud83d\udc97",fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc96",fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],"char":"\ud83d\udc98",fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],"char":"\ud83d\udc9d",fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],"char":"\ud83d\udc9f",fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],"char":"\u262e",fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],"char":"\u271d",fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],"char":"\u262a",fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],"char":"\ud83d\udd49",fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],"char":"\u2638",fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],"char":"\u2721",fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],"char":"\ud83d\udd2f",fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],"char":"\ud83d\udd4e",fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],"char":"\u262f",fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],"char":"\u2626",fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],"char":"\ud83d\uded0",fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],"char":"\u26ce",fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],"char":"\u2648",fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],"char":"\u2649",fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u264a",fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u264b",fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],"char":"\u264c",fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u264d",fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],"char":"\u264e",fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],"char":"\u264f",fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u2650",fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u2651",fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],"char":"\u2652",fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],"char":"\u2653",fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],"char":"\ud83c\udd94",fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],"char":"\u269b",fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],"char":"\ud83c\ude33",fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],"char":"\ud83c\ude39",fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],"char":"\u2622",fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],"char":"\u2623",fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],"char":"\ud83d\udcf4",fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],"char":"\ud83d\udcf3",fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],"char":"\ud83c\ude36",fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],"char":"\ud83c\ude1a",fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],"char":"\ud83c\ude38",fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],"char":"\ud83c\ude3a",fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],"char":"\ud83c\ude37\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],"char":"\u2734\ufe0f",fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],"char":"\ud83c\udd9a",fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],"char":"\ud83c\ude51",fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],"char":"\ud83d\udcae",fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],"char":"\ud83c\ude50",fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],"char":"\u3299\ufe0f",fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],"char":"\u3297\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],"char":"\ud83c\ude34",fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],"char":"\ud83c\ude35",fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],"char":"\ud83c\ude32",fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],"char":"\ud83c\udd70\ufe0f",fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],"char":"\ud83c\udd71\ufe0f",fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],"char":"\ud83c\udd8e",fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],"char":"\ud83c\udd91",fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],"char":"\ud83c\udd7e\ufe0f",fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],"char":"\ud83c\udd98",fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],"char":"\u26d4",fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],"char":"\ud83d\udcdb",fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],"char":"\ud83d\udeab",fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],"char":"\u274c",fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],"char":"\u2b55",fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],"char":"\ud83d\uded1",fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],"char":"\ud83d\udca2",fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],"char":"\u2668\ufe0f",fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],"char":"\ud83d\udeb7",fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],"char":"\ud83d\udeaf",fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],"char":"\ud83d\udeb3",fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],"char":"\ud83d\udeb1",fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],"char":"\ud83d\udd1e",fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],"char":"\ud83d\udcf5",fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],"char":"\u2757",fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],"char":"\u2755",fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],"char":"\u2753",fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],"char":"\u2754",fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],"char":"\u203c\ufe0f",fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],"char":"\u2049\ufe0f",fitzpatrick_scale:!1,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],"char":"\ud83d\udcaf",fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],"char":"\ud83d\udd05",fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],"char":"\ud83d\udd06",fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],"char":"\ud83d\udd31",fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],"char":"\u269c",fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],"char":"\u303d\ufe0f",fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],"char":"\u26a0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],"char":"\ud83d\udeb8",fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],"char":"\ud83d\udd30",fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],"char":"\u267b\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],"char":"\ud83c\ude2f",fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],"char":"\ud83d\udcb9",fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],"char":"\u2747\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],"char":"\u2733\ufe0f",fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],"char":"\u274e",fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],"char":"\u2705",fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],"char":"\ud83d\udca0",fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],"char":"\ud83c\udf00",fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],"char":"\u27bf",fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],"char":"\ud83c\udf10",fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],"char":"\u24c2\ufe0f",fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],"char":"\ud83c\udfe7",fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],"char":"\ud83c\ude02\ufe0f",fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],"char":"\ud83d\udec2",fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],"char":"\ud83d\udec3",fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],"char":"\ud83d\udec4",fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],"char":"\ud83d\udec5",fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],"char":"\u267f",fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],"char":"\ud83d\udead",fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],"char":"\ud83d\udebe",fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],"char":"\ud83c\udd7f\ufe0f",fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],"char":"\ud83d\udeb0",fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],"char":"\ud83d\udeb9",fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],"char":"\ud83d\udeba",fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],"char":"\ud83d\udebc",fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],"char":"\ud83d\udebb",fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],"char":"\ud83d\udeae",fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],"char":"\ud83c\udfa6",fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],"char":"\ud83d\udcf6",fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],"char":"\ud83c\ude01",fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],"char":"\ud83c\udd96",fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],"char":"\ud83c\udd97",fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],"char":"\ud83c\udd99",fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],"char":"\ud83c\udd92",fitzpatrick_scale:!1,category:"symbols"},"new":{keywords:["blue-square","words","start"],"char":"\ud83c\udd95",fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],"char":"\ud83c\udd93",fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],"char":"0\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],"char":"1\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],"char":"2\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],"char":"3\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],"char":"4\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],"char":"5\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],"char":"6\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],"char":"7\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],"char":"8\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],"char":"9\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],"char":"\ud83d\udd1f",fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],"char":"*\u20e3",fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],"char":"\ud83d\udd22",fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],"char":"\u23cf\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],"char":"\u25b6\ufe0f",fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],"char":"\u23f8",fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],"char":"\u23ed",fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],"char":"\u23f9",fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],"char":"\u23fa",fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],"char":"\u23ef",fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],"char":"\u23ee",fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],"char":"\u23e9",fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],"char":"\u23ea",fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],"char":"\ud83d\udd00",fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],"char":"\ud83d\udd01",fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],"char":"\ud83d\udd02",fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],"char":"\u25c0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],"char":"\ud83d\udd3c",fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],"char":"\ud83d\udd3d",fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],"char":"\u23eb",fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],"char":"\u23ec",fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],"char":"\u27a1\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],"char":"\u2b05\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],"char":"\u2b06\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],"char":"\u2b07\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],"char":"\u2197\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],"char":"\u2198\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],"char":"\u2199\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],"char":"\u2196\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],"char":"\u2195\ufe0f",fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],"char":"\u2194\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],"char":"\ud83d\udd04",fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],"char":"\u21aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],"char":"\u21a9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],"char":"\u2934\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],"char":"\u2935\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],"char":"#\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],"char":"\u2139\ufe0f",fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],"char":"\ud83d\udd24",fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],"char":"\ud83d\udd21",fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],"char":"\ud83d\udd20",fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],"char":"\ud83d\udd23",fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],"char":"\ud83c\udfb5",fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],"char":"\ud83c\udfb6",fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],"char":"\u3030\ufe0f",fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],"char":"\u27b0",fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],"char":"\u2714\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],"char":"\ud83d\udd03",fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],"char":"\u2795",fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],"char":"\u2796",fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],"char":"\u2797",fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],"char":"\u2716\ufe0f",fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],"char":"\u267e",fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],"char":"\ud83d\udcb2",fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],"char":"\ud83d\udcb1",fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],"char":"\xa9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],"char":"\xae\ufe0f",fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],"char":"\u2122\ufe0f",fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],"char":"\ud83d\udd1a",fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],"char":"\ud83d\udd19",fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],"char":"\ud83d\udd1b",fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],"char":"\ud83d\udd1d",fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],"char":"\ud83d\udd1c",fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],"char":"\u2611\ufe0f",fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],"char":"\ud83d\udd18",fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],"char":"\u26aa",fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],"char":"\u26ab",fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],"char":"\ud83d\udd34",fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],"char":"\ud83d\udd35",fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],"char":"\ud83d\udd38",fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],"char":"\ud83d\udd39",fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],"char":"\ud83d\udd36",fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],"char":"\ud83d\udd37",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],"char":"\ud83d\udd3a",fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],"char":"\u25aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],"char":"\u25ab\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],"char":"\u2b1b",fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],"char":"\u2b1c",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],"char":"\ud83d\udd3b",fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],"char":"\u25fc\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],"char":"\u25fb\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],"char":"\u25fe",fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],"char":"\u25fd",fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],"char":"\ud83d\udd32",fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],"char":"\ud83d\udd33",fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],"char":"\ud83d\udd08",fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],"char":"\ud83d\udd09",fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],"char":"\ud83d\udd0a",fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],"char":"\ud83d\udd07",fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],"char":"\ud83d\udce3",fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],"char":"\ud83d\udce2",fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],"char":"\ud83d\udd14",fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],"char":"\ud83d\udd15",fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],"char":"\ud83c\udccf",fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],"char":"\ud83c\udc04",fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],"char":"\u2660\ufe0f",fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],"char":"\u2663\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],"char":"\u2665\ufe0f",fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],"char":"\u2666\ufe0f",fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],"char":"\ud83c\udfb4",fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],"char":"\ud83d\udcad",fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],"char":"\ud83d\uddef",fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],"char":"\ud83d\udcac",fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],"char":"\ud83d\udde8",fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd50",fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd51",fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd52",fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd53",fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd54",fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],"char":"\ud83d\udd55",fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd56",fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd57",fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd58",fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd59",fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5a",fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],"char":"\ud83d\udd5b",fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5c",fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5d",fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5e",fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5f",fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd60",fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd61",fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd62",fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd63",fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd64",fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd65",fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd66",fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd67",fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],"char":"\ud83c\udde8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],"char":"\ud83c\uddea\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],"char":"\ud83c\uddeb\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],"char":"\ud83c\udde9\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],"char":"\ud83c\uddef\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],"char":"\ud83c\uddef\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],"char":"\ud83c\uddef\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],"char":"\ud83c\uddef\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],"char":"\ud83c\uddfd\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],"char":"\ud83c\uddfe\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],"char":"\ud83c\uddf0\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],"char":"\ud83c\uddf4\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],"char":"\ud83c\uddf6\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],"char":"\ud83c\uddfc\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],"char":"\ud83c\uddff\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],"char":"\ud83c\uddf0\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],"char":"\ud83c\uddec\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],"char":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],"char":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],"char":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],"char":"\ud83c\uddfc\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],"char":"\ud83c\uddfe\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],"char":"\ud83c\uddff\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],"char":"\ud83c\uddff\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],"char":"\ud83c\uddfa\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],"char":"\ud83c\udff4\u200d\u2620\ufe0f",fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/plugin.js new file mode 100644 index 0000000..e939611 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/plugin.js @@ -0,0 +1,605 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var DEFAULT_ID = 'tinymce.plugins.emoticons'; + var getEmoticonDatabase = function (editor) { + return editor.getParam('emoticons_database', 'emojis', 'string'); + }; + var getEmoticonDatabaseUrl = function (editor, pluginUrl) { + var database = getEmoticonDatabase(editor); + return editor.getParam('emoticons_database_url', pluginUrl + '/js/' + database + editor.suffix + '.js', 'string'); + }; + var getEmoticonDatabaseId = function (editor) { + return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string'); + }; + var getAppendedEmoticons = function (editor) { + return editor.getParam('emoticons_append', {}, 'object'); + }; + var getEmotionsImageUrl = function (editor) { + return editor.getParam('emoticons_images_url', 'https://twemoji.maxcdn.com/v/13.0.1/72x72/', 'string'); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var shallow = function (old, nu) { + return nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var merge = baseMerge(shallow); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var keys = Object.keys; + var hasOwnProperty$1 = Object.hasOwnProperty; + var each = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var map = function (obj, f) { + return tupleMap(obj, function (x, i) { + return { + k: i, + v: f(x, i) + }; + }); + }; + var tupleMap = function (obj, f) { + var r = {}; + each(obj, function (x, i) { + var tuple = f(x, i); + r[tuple.k] = tuple.v; + }); + return r; + }; + var has = function (obj, key) { + return hasOwnProperty$1.call(obj, key); + }; + + var checkRange = function (str, substr, start) { + return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; + }; + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + var startsWith = function (str, prefix) { + return checkRange(str, prefix, 0); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Resource'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var ALL_CATEGORY = 'All'; + var categoryNameMap = { + symbols: 'Symbols', + people: 'People', + animals_and_nature: 'Animals and Nature', + food_and_drink: 'Food and Drink', + activity: 'Activity', + travel_and_places: 'Travel and Places', + objects: 'Objects', + flags: 'Flags', + user: 'User Defined' + }; + var translateCategory = function (categories, name) { + return has(categories, name) ? categories[name] : name; + }; + var getUserDefinedEmoticons = function (editor) { + var userDefinedEmoticons = getAppendedEmoticons(editor); + return map(userDefinedEmoticons, function (value) { + return __assign({ + keywords: [], + category: 'user' + }, value); + }); + }; + var initDatabase = function (editor, databaseUrl, databaseId) { + var categories = Cell(Optional.none()); + var all = Cell(Optional.none()); + var emojiImagesUrl = getEmotionsImageUrl(editor); + var getEmoji = function (lib) { + if (startsWith(lib.char, '= max; + }; + }); + for (var i = 0; i < list.length; i++) { + if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { + matches.push({ + value: list[i].char, + text: list[i].title, + icon: list[i].char + }); + if (reachedLimit(matches.length)) { + break; + } + } + } + return matches; + }; + + var init = function (editor, database) { + editor.ui.registry.addAutocompleter('emoticons', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, maxResults) { + return database.waitForLoad().then(function () { + var candidates = database.listAll(); + return emojisFrom(candidates, pattern, Optional.some(maxResults)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + clearTimeout(timer); + } + timer = setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var insertEmoticon = function (editor, ch) { + editor.insertContent(ch); + }; + + var patternName = 'pattern'; + var open = function (editor, database) { + var initialState = { + pattern: '', + results: emojisFrom(database.listAll(), '', Optional.some(300)) + }; + var currentTab = Cell(ALL_CATEGORY); + var scan = function (dialogApi) { + var dialogData = dialogApi.getData(); + var category = currentTab.get(); + var candidates = database.listCategory(category); + var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Optional.some(300) : Optional.none()); + dialogApi.setData({ results: results }); + }; + var updateFilter = last(function (dialogApi) { + scan(dialogApi); + }, 200); + var searchField = { + label: 'Search', + type: 'input', + name: patternName + }; + var resultsField = { + type: 'collection', + name: 'results' + }; + var getInitialState = function () { + var body = { + type: 'tabpanel', + tabs: map$1(database.listCategories(), function (cat) { + return { + title: cat, + name: cat, + items: [ + searchField, + resultsField + ] + }; + }) + }; + return { + title: 'Emoticons', + size: 'normal', + body: body, + initialData: initialState, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: updateFilter.throttle, + onAction: function (dialogApi, actionData) { + if (actionData.name === 'results') { + insertEmoticon(editor, actionData.value); + dialogApi.close(); + } + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }] + }; + }; + var dialogApi = editor.windowManager.open(getInitialState()); + dialogApi.focus(patternName); + if (!database.hasLoaded()) { + dialogApi.block('Loading emoticons...'); + database.waitForLoad().then(function () { + dialogApi.redial(getInitialState()); + updateFilter.throttle(dialogApi); + dialogApi.focus(patternName); + dialogApi.unblock(); + }).catch(function (_err) { + dialogApi.redial({ + title: 'Emoticons', + body: { + type: 'panel', + items: [{ + type: 'alertbanner', + level: 'error', + icon: 'warning', + text: '

                                  Could not load emoticons

                                  ' + }] + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }], + initialData: { + pattern: '', + results: [] + } + }); + dialogApi.focus(patternName); + dialogApi.unblock(); + }); + } + }; + + var register = function (editor, database) { + var onAction = function () { + return open(editor, database); + }; + editor.ui.registry.addButton('emoticons', { + tooltip: 'Emoticons', + icon: 'emoji', + onAction: onAction + }); + editor.ui.registry.addMenuItem('emoticons', { + text: 'Emoticons...', + icon: 'emoji', + onAction: onAction + }); + }; + + function Plugin () { + global.add('emoticons', function (editor, pluginUrl) { + var databaseUrl = getEmoticonDatabaseUrl(editor, pluginUrl); + var databaseId = getEmoticonDatabaseId(editor); + var database = initDatabase(editor, databaseUrl, databaseId); + register(editor, database); + init(editor, database); + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 0000000..250d786 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var u,t,n,e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=function(){return(o=Object.assign||function(t){for(var n,e=1,r=arguments.length;e=i.length&&o.substr(u,u+i.length)===i?e["char"].replace(/src="([^"]+)"/,function(t,n){return'src="'+f+n+'"'}):e["char"]),category:_(A,t.category)},c=l[a.category]!==undefined?l[a.category]:[];l[a.category]=c.concat([a]),s.push(a)}),r.set(h.some(l)),n.set(h.some(s))};e.on("init",function(){O.load(t,o).then(function(t){var n=T(e);i(c(t,n))},function(t){console.log("Failed to load emoticons: "+t),r.set(h.some({})),n.set(h.some([]))})});var u=function(){return n.get().getOr([])},a=function(){return r.get().isSome()&&n.get().isSome()};return{listCategories:function(){return[k].concat(y(r.get().getOr({})))},hasLoaded:a,waitForLoad:function(){return a()?j.resolve(!0):new j(function(t,n){var e=15,r=C.setInterval(function(){a()?(C.clearInterval(r),t(!0)):--e<0&&(console.log("Could not load emojis from url: "+o),C.clearInterval(r),n(!1))},100)})},listAll:u,listCategory:function(n){return n===k?u():r.get().bind(function(t){return h.from(t[n])}).getOr([])}}},x=function(t,n,e){for(var r=[],o=n.toLowerCase(),i=e.fold(function(){return l},function(n){return function(t){return n<=t}}),u=0;uCould not load emoticons

                                  "}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(D),f.unblock()}))};r.add("emoticons",function(t,n){var e,r,o,i,u,a,c,l,s,f=(r=n,o=(e=t).getParam("emoticons_database","emojis","string"),e.getParam("emoticons_database_url",r+"/js/"+o+e.suffix+".js","string")),m=t.getParam("emoticons_database_id","tinymce.plugins.emoticons","string"),g=P(t,f,m);u=g,a=function(){return L(i,u)},(i=t).ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:a}),i.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:a}),l=g,(c=t).ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(n,e){return l.waitForLoad().then(function(){var t=l.listAll();return x(t,n,h.some(e))})},onAction:function(t,n,e){c.selection.setRng(n),c.insertContent(e),t.hide()}}),(s=t).on("PreInit",function(){s.parser.addAttributeFilter("data-emoticon",function(t){!function(t,n){for(var e=0,r=t.length;e'); + }; + var getProtect = function (editor) { + return editor.getParam('protect'); + }; + + var parseHeader = function (head) { + return global$2({ + validate: false, + root_name: '#document' + }).parse(head, { format: 'xhtml' }); + }; + var htmlToData = function (editor, head) { + var headerFragment = parseHeader(head); + var data = {}; + var elm, matches; + function getAttr(elm, name) { + var value = elm.attr(name); + return value || ''; + } + data.fontface = getDefaultFontFamily(editor); + data.fontsize = getDefaultFontSize(editor); + elm = headerFragment.firstChild; + if (elm.type === 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) { + data.docencoding = matches[1]; + } + } + elm = headerFragment.getAll('#doctype')[0]; + if (elm) { + data.doctype = ''; + } + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.title = elm.firstChild.value; + } + global$1.each(headerFragment.getAll('meta'), function (meta) { + var name = meta.attr('name'); + var httpEquiv = meta.attr('http-equiv'); + var matches; + if (name) { + data[name.toLowerCase()] = meta.attr('content'); + } else if (httpEquiv === 'Content-Type') { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + if (matches) { + data.docencoding = matches[1]; + } + } + }); + elm = headerFragment.getAll('html')[0]; + if (elm) { + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + } + data.stylesheets = []; + global$1.each(headerFragment.getAll('link'), function (link) { + if (link.attr('rel') === 'stylesheet') { + data.stylesheets.push(link.attr('href')); + } + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); + } + return data; + }; + var dataToHtml = function (editor, data, head) { + var headElement, elm, value; + var dom = editor.dom; + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + } + function addHeadNode(node) { + if (headElement.firstChild) { + headElement.insert(node, headElement.firstChild); + } else { + headElement.append(node); + } + } + var headerFragment = parseHeader(head); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new global$3('head', 1); + if (elm.firstChild) { + elm.insert(headElement, elm.firstChild, true); + } else { + elm.append(headElement); + } + } + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + if (data.docencoding) { + value += ' encoding="' + data.docencoding + '"'; + } + if (elm.type !== 7) { + elm = new global$3('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + elm.value = value; + } else if (elm && elm.type === 7) { + elm.remove(); + } + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new global$3('#doctype', 10); + if (data.xml_pi) { + headerFragment.insert(elm, headerFragment.firstChild); + } else { + addHeadNode(elm); + } + } + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) { + elm.remove(); + } + elm = null; + global$1.each(headerFragment.getAll('meta'), function (meta) { + if (meta.attr('http-equiv') === 'Content-Type') { + elm = meta; + } + }); + if (data.docencoding) { + if (!elm) { + elm = new global$3('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + elm.attr('content', 'text/html; charset=' + data.docencoding); + } else if (elm) { + elm.remove(); + } + elm = headerFragment.getAll('title')[0]; + if (data.title) { + if (!elm) { + elm = new global$3('title', 1); + addHeadNode(elm); + } else { + elm.empty(); + } + elm.append(new global$3('#text', 3)).value = data.title; + } else if (elm) { + elm.remove(); + } + global$1.each('keywords,description,author,copyright,robots'.split(','), function (name) { + var nodes = headerFragment.getAll('meta'); + var i, meta; + var value = data[name]; + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + if (meta.attr('name') === name) { + if (value) { + meta.attr('content', value); + } else { + meta.remove(); + } + return; + } + } + if (value) { + elm = new global$3('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + addHeadNode(elm); + } + }); + var currentStyleSheetsMap = {}; + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + if (stylesheet.attr('rel') === 'stylesheet') { + currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet; + } + }); + global$1.each(data.stylesheets, function (stylesheet) { + if (!currentStyleSheetsMap[stylesheet]) { + elm = new global$3('link', 1); + elm.attr({ + rel: 'stylesheet', + text: 'text/css', + href: stylesheet + }); + elm.shortEnded = true; + addHeadNode(elm); + } + delete currentStyleSheetsMap[stylesheet]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.remove(); + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + dom.setAttribs(editor.getBody(), { + style: data.style, + dir: data.dir, + vLink: data.visited_color, + link: data.link_color, + aLink: data.active_color + }); + } + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + if (!headElement.firstChild) { + headElement.remove(); + } + var html = global$4({ + validate: false, + indent: true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + return html.substring(0, html.indexOf('')); + }; + + var open = function (editor, headState) { + var data = htmlToData(editor, headState.get()); + var defaultData = { + title: '', + keywords: '', + description: '', + robots: '', + author: '', + docencoding: '' + }; + var initialData = __assign(__assign({}, defaultData), data); + editor.windowManager.open({ + title: 'Metadata and Document Properties', + size: 'normal', + body: { + type: 'panel', + items: [ + { + name: 'title', + type: 'input', + label: 'Title' + }, + { + name: 'keywords', + type: 'input', + label: 'Keywords' + }, + { + name: 'description', + type: 'input', + label: 'Description' + }, + { + name: 'robots', + type: 'input', + label: 'Robots' + }, + { + name: 'author', + type: 'input', + label: 'Author' + }, + { + name: 'docencoding', + type: 'input', + label: 'Encoding' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onSubmit: function (api) { + var nuData = api.getData(); + var headHtml = dataToHtml(editor, global$1.extend(data, nuData), headState.get()); + headState.set(headHtml); + api.close(); + } + }); + }; + + var register = function (editor, headState) { + editor.addCommand('mceFullPageProperties', function () { + open(editor, headState); + }); + }; + + var protectHtml = function (protect, html) { + global$1.each(protect, function (pattern) { + html = html.replace(pattern, function (str) { + return ''; + }); + }); + return html; + }; + var unprotectHtml = function (html) { + return html.replace(//g, function (a, m) { + return unescape(m); + }); + }; + + var each = global$1.each; + var low = function (s) { + return s.replace(/<\/?[A-Z]+/g, function (a) { + return a.toLowerCase(); + }); + }; + var handleSetContent = function (editor, headState, footState, evt) { + var startPos, endPos, content, styles = ''; + var dom = editor.dom; + if (evt.selection) { + return; + } + content = protectHtml(getProtect(editor), evt.content); + if (evt.format === 'raw' && headState.get()) { + return; + } + if (evt.source_view && shouldHideInSourceView(editor)) { + return; + } + if (content.length === 0 && !evt.source_view) { + content = global$1.trim(headState.get()) + '\n' + global$1.trim(content) + '\n' + global$1.trim(footState.get()); + } + content = content.replace(/<(\/?)BODY/gi, '<$1body'); + startPos = content.indexOf('', startPos); + headState.set(low(content.substring(0, startPos + 1))); + endPos = content.indexOf('\n'); + } + var headerFragment = parseHeader(headState.get()); + each(headerFragment.getAll('style'), function (node) { + if (node.firstChild) { + styles += node.firstChild.value; + } + }); + var bodyElm = headerFragment.getAll('body')[0]; + if (bodyElm) { + dom.setAttribs(editor.getBody(), { + style: bodyElm.attr('style') || '', + dir: bodyElm.attr('dir') || '', + vLink: bodyElm.attr('vlink') || '', + link: bodyElm.attr('link') || '', + aLink: bodyElm.attr('alink') || '' + }); + } + dom.remove('fullpage_styles'); + var headElm = editor.getDoc().getElementsByTagName('head')[0]; + if (styles) { + var styleElm = dom.add(headElm, 'style', { id: 'fullpage_styles' }); + styleElm.appendChild(document.createTextNode(styles)); + } + var currentStyleSheetsMap = {}; + global$1.each(headElm.getElementsByTagName('link'), function (stylesheet) { + if (stylesheet.rel === 'stylesheet' && stylesheet.getAttribute('data-mce-fullpage')) { + currentStyleSheetsMap[stylesheet.href] = stylesheet; + } + }); + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + var href = stylesheet.attr('href'); + if (!href) { + return true; + } + if (!currentStyleSheetsMap[href] && stylesheet.attr('rel') === 'stylesheet') { + dom.add(headElm, 'link', { + 'rel': 'stylesheet', + 'text': 'text/css', + href: href, + 'data-mce-fullpage': '1' + }); + } + delete currentStyleSheetsMap[href]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.parentNode.removeChild(stylesheet); + }); + }; + var getDefaultHeader = function (editor) { + var header = '', value, styles = ''; + if (getDefaultXmlPi(editor)) { + var piEncoding = getDefaultEncoding(editor); + header += '\n'; + } + header += getDefaultDocType(editor); + header += '\n\n\n'; + if (value = getDefaultTitle(editor)) { + header += '' + value + '\n'; + } + if (value = getDefaultEncoding(editor)) { + header += '\n'; + } + if (value = getDefaultFontFamily(editor)) { + styles += 'font-family: ' + value + ';'; + } + if (value = getDefaultFontSize(editor)) { + styles += 'font-size: ' + value + ';'; + } + if (value = getDefaultTextColor(editor)) { + styles += 'color: ' + value + ';'; + } + header += '\n\n'; + return header; + }; + var handleGetContent = function (editor, head, foot, evt) { + if (evt.format === 'html' && !evt.selection && (!evt.source_view || !shouldHideInSourceView(editor))) { + evt.content = unprotectHtml(global$1.trim(head) + '\n' + global$1.trim(evt.content) + '\n' + global$1.trim(foot)); + } + }; + var setup = function (editor, headState, footState) { + editor.on('BeforeSetContent', function (evt) { + handleSetContent(editor, headState, footState, evt); + }); + editor.on('GetContent', function (evt) { + handleGetContent(editor, headState.get(), footState.get(), evt); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('fullpage', { + tooltip: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + editor.ui.registry.addMenuItem('fullpage', { + text: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + }; + + function Plugin () { + global.add('fullpage', function (editor) { + var headState = Cell(''), footState = Cell(''); + register(editor, headState); + register$1(editor); + setup(editor, headState, footState); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/fullpage/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/fullpage/plugin.min.js new file mode 100644 index 0000000..2592f73 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/fullpage/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var s=function(e){var t=e;return{get:function(){return t},set:function(e){t=e}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(){return(u=Object.assign||function(e){for(var t,n=1,l=arguments.length;n"),(n=r.getAll("title")[0])&&n.firstChild&&(a.title=n.firstChild.value),p.each(r.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?a[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(a.docencoding=t[1])}),(n=r.getAll("html")[0])&&(a.langcode=s(n,"lang")||s(n,"xml:lang")),a.stylesheets=[],p.each(r.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&a.stylesheets.push(e.attr("href"))}),(n=r.getAll("body")[0])&&(a.langdir=s(n,"dir"),a.style=s(n,"style"),a.visited_color=s(n,"vlink"),a.link_color=s(n,"link"),a.active_color=s(n,"alink")),a);function s(e,t){return e.attr(t)||""}var d=u(u({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),c);l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:d,onSubmit:function(e){var t=e.getData(),n=function(e,o,t){var r,n,l=e.dom;function i(e,t,n){e.attr(t,n||undefined)}function a(e){c.firstChild?c.insert(e,c.firstChild):c.append(e)}var c,s=v(t);(c=s.getAll("head")[0])||(r=s.getAll("html")[0],c=new m("head",1),r.firstChild?r.insert(c,r.firstChild,!0):r.append(c)),r=s.firstChild,o.xml_pi?(n='version="1.0"',o.docencoding&&(n+=' encoding="'+o.docencoding+'"'),7!==r.type&&(r=new m("xml",7),s.insert(r,s.firstChild,!0)),r.value=n):r&&7===r.type&&r.remove(),r=s.getAll("#doctype")[0],o.doctype?(r||(r=new m("#doctype",10),o.xml_pi?s.insert(r,s.firstChild):a(r)),r.value=o.doctype.substring(9,o.doctype.length-1)):r&&r.remove(),r=null,p.each(s.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(r=e)}),o.docencoding?(r||((r=new m("meta",1)).attr("http-equiv","Content-Type"),r.shortEnded=!0,a(r)),r.attr("content","text/html; charset="+o.docencoding)):r&&r.remove(),r=s.getAll("title")[0],o.title?(r?r.empty():a(r=new m("title",1)),r.append(new m("#text",3)).value=o.title):r&&r.remove(),p.each("keywords,description,author,copyright,robots".split(","),function(e){for(var t,n=s.getAll("meta"),l=o[e],i=0;i"))}(l,p.extend(c,t),i.get());i.set(n),e.close()}})},_=p.each,b=function(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})},x=function(e,t,n,l){var i,o,r,a,c,s,d,u,m,f="",g=e.dom;l.selection||(a=e.getParam("protect"),c=l.content,p.each(a,function(e){c=c.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),r=c,"raw"===l.format&&t.get()||l.source_view&&h(e)||(0!==r.length||l.source_view||(r=p.trim(t.get())+"\n"+p.trim(r)+"\n"+p.trim(n.get())),-1!==(i=(r=r.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(b(r.substring(0,i+1))),-1===(o=r.indexOf("\n")),s=v(t.get()),_(s.getAll("style"),function(e){e.firstChild&&(f+=e.firstChild.value)}),(d=s.getAll("body")[0])&&g.setAttribs(e.getBody(),{style:d.attr("style")||"",dir:d.attr("dir")||"",vLink:d.attr("vlink")||"",link:d.attr("link")||"",aLink:d.attr("alink")||""}),g.remove("fullpage_styles"),u=e.getDoc().getElementsByTagName("head")[0],f&&g.add(u,"style",{id:"fullpage_styles"}).appendChild(document.createTextNode(f)),m={},p.each(u.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),p.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||g.add(u,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),p.each(m,function(e){e.parentNode.removeChild(e)})))},k=function(e){var t,n="",l="";return e.getParam("fullpage_default_xml_pi")&&(n+='\n'),n+=e.getParam("fullpage_default_doctype",""),n+="\n\n\n",(t=e.getParam("fullpage_default_title"))&&(n+=""+t+"\n"),(t=i(e))&&(n+='\n'),(t=g(e))&&(l+="font-family: "+t+";"),(t=y(e))&&(l+="font-size: "+t+";"),(t=e.getParam("fullpage_default_text_color"))&&(l+="color: "+t+";"),n+="\n\n"},C=function(e,t,n,l){"html"!==l.format||l.selection||l.source_view&&h(e)||(l.content=(p.trim(t)+"\n"+p.trim(l.content)+"\n"+p.trim(n)).replace(//g,function(e,t){return unescape(t)}))};e.add("fullpage",function(e){var t,n,l,i,o,r,a=s(""),c=s("");n=a,(t=e).addCommand("mceFullPageProperties",function(){d(t,n)}),(l=e).ui.registry.addButton("fullpage",{tooltip:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),l.ui.registry.addMenuItem("fullpage",{text:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),o=a,r=c,(i=e).on("BeforeSetContent",function(e){x(i,o,r,e)}),i.on("GetContent",function(e){C(i,o.get(),r.get(),e)})})}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/fullscreen/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/fullscreen/plugin.js new file mode 100644 index 0000000..deb9dde --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/fullscreen/plugin.js @@ -0,0 +1,979 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var get = function (fullscreenState) { + return { + isFullscreen: function () { + return fullscreenState.get() !== null; + } + }; + }; + + var noop = function () { + }; + var compose = function (fa, fb) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return fa(fb.apply(null, args)); + }; + }; + var compose1 = function (fbc, fab) { + return function (a) { + return fbc(fab(a)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + function curry(fn) { + var initialArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + initialArgs[_i - 1] = arguments[_i]; + } + return function () { + var restArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + restArgs[_i] = arguments[_i]; + } + var all = initialArgs.concat(restArgs); + return fn.apply(null, all); + }; + } + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var revocable = function (doRevoke) { + var subject = Cell(Optional.none()); + var revoke = function () { + return subject.get().each(doRevoke); + }; + var clear = function () { + revoke(); + subject.set(Optional.none()); + }; + var isSet = function () { + return subject.get().isSome(); + }; + var set = function (s) { + revoke(); + subject.set(Optional.some(s)); + }; + return { + clear: clear, + isSet: isSet, + set: set + }; + }; + var unbindable = function () { + return revocable(function (s) { + return s.unbind(); + }); + }; + var value = function () { + var subject = Cell(Optional.none()); + var clear = function () { + return subject.set(Optional.none()); + }; + var set = function (s) { + return subject.set(Optional.some(s)); + }; + var isSet = function () { + return subject.get().isSome(); + }; + var on = function (f) { + return subject.get().each(f); + }; + return { + clear: clear, + set: set, + isSet: isSet, + on: on + }; + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isString = isType('string'); + var isArray = isType('array'); + var isBoolean = isSimpleType('boolean'); + var isNullable = function (a) { + return a === null || a === undefined; + }; + var isNonNullable = function (a) { + return !isNullable(a); + }; + var isFunction = isSimpleType('function'); + var isNumber = isSimpleType('number'); + + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var get$1 = function (xs, i) { + return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + }; + var head = function (xs) { + return get$1(xs, 0); + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var fromHtml = function (html, scope) { + var doc = scope || document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var DOCUMENT = 9; + var DOCUMENT_FRAGMENT = 11; + var ELEMENT = 1; + var TEXT = 3; + + var type = function (element) { + return element.dom.nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + var isText = isType$1(TEXT); + var isDocument = isType$1(DOCUMENT); + var isDocumentFragment = isType$1(DOCUMENT_FRAGMENT); + + var is = function (element, selector) { + var dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + var bypassSelector = function (dom) { + return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; + }; + var all = function (selector, scope) { + var base = scope === undefined ? document : scope.dom; + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom); + }; + + var eq = function (e1, e2) { + return e1.dom === e2.dom; + }; + + var owner = function (element) { + return SugarElement.fromDom(element.dom.ownerDocument); + }; + var documentOrOwner = function (dos) { + return isDocument(dos) ? dos : owner(dos); + }; + var parent = function (element) { + return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + }; + var parents = function (element, isRoot) { + var stop = isFunction(isRoot) ? isRoot : never; + var dom = element.dom; + var ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + var rawParent = dom.parentNode; + var p = SugarElement.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; + } + } + return ret; + }; + var siblings = function (element) { + var filterSelf = function (elements) { + return filter(elements, function (x) { + return !eq(element, x); + }); + }; + return parent(element).map(children).map(filterSelf).getOr([]); + }; + var children = function (element) { + return map(element.dom.childNodes, SugarElement.fromDom); + }; + + var isShadowRoot = function (dos) { + return isDocumentFragment(dos); + }; + var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); + var isSupported$1 = constant(supported); + var getRootNode = supported ? function (e) { + return SugarElement.fromDom(e.dom.getRootNode()); + } : documentOrOwner; + var getShadowRoot = function (e) { + var r = getRootNode(e); + return isShadowRoot(r) ? Optional.some(r) : Optional.none(); + }; + var getShadowHost = function (e) { + return SugarElement.fromDom(e.dom.host); + }; + var getOriginalEventTarget = function (event) { + if (isSupported$1() && isNonNullable(event.target)) { + var el = SugarElement.fromDom(event.target); + if (isElement(el) && isOpenShadowHost(el)) { + if (event.composed && event.composedPath) { + var composedPath = event.composedPath(); + if (composedPath) { + return head(composedPath); + } + } + } + } + return Optional.from(event.target); + }; + var isOpenShadowHost = function (element) { + return isNonNullable(element.dom.shadowRoot); + }; + + var inBody = function (element) { + var dom = isText(element) ? element.dom.parentNode : element.dom; + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + var doc = dom.ownerDocument; + return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { + return doc.body.contains(dom); + }, compose1(inBody, getShadowHost)); + }; + var getBody = function (doc) { + var b = doc.dom.body; + if (b === null || b === undefined) { + throw new Error('Body is not available yet'); + } + return SugarElement.fromDom(b); + }; + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom, key, value); + }; + var get$2 = function (element, key) { + var v = element.dom.getAttribute(key); + return v === null ? undefined : v; + }; + var remove = function (element, key) { + element.dom.removeAttribute(key); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var setAll = function (element, css) { + var dom = element.dom; + each$1(css, function (v, k) { + internalSet(dom, k, v); + }); + }; + var get$3 = function (element, property) { + var dom = element.dom; + var styles = window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var mkEvent = function (target, x, y, stop, prevent, kill, raw) { + return { + target: target, + x: x, + y: y, + stop: stop, + prevent: prevent, + kill: kill, + raw: raw + }; + }; + var fromRawEvent = function (rawEvent) { + var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); + var stop = function () { + return rawEvent.stopPropagation(); + }; + var prevent = function () { + return rawEvent.preventDefault(); + }; + var kill = compose(prevent, stop); + return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); + }; + var handle = function (filter, handler) { + return function (rawEvent) { + if (filter(rawEvent)) { + handler(fromRawEvent(rawEvent)); + } + }; + }; + var binder = function (element, event, filter, handler, useCapture) { + var wrapped = handle(filter, handler); + element.dom.addEventListener(event, wrapped, useCapture); + return { unbind: curry(unbind, element, event, wrapped, useCapture) }; + }; + var bind$1 = function (element, event, filter, handler) { + return binder(element, event, filter, handler, false); + }; + var unbind = function (element, event, handler, useCapture) { + element.dom.removeEventListener(event, handler, useCapture); + }; + + var filter$1 = always; + var bind$2 = function (element, event, handler) { + return bind$1(element, event, filter$1, handler); + }; + + var r = function (left, top) { + var translate = function (x, y) { + return r(left + x, top + y); + }; + return { + left: left, + top: top, + translate: translate + }; + }; + var SugarPosition = r; + + var get$4 = function (_DOC) { + var doc = _DOC !== undefined ? _DOC.dom : document; + var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; + var y = doc.body.scrollTop || doc.documentElement.scrollTop; + return SugarPosition(x, y); + }; + + var get$5 = function (_win) { + var win = _win === undefined ? window : _win; + return Optional.from(win['visualViewport']); + }; + var bounds = function (x, y, width, height) { + return { + x: x, + y: y, + width: width, + height: height, + right: x + width, + bottom: y + height + }; + }; + var getBounds = function (_win) { + var win = _win === undefined ? window : _win; + var doc = win.document; + var scroll = get$4(SugarElement.fromDom(doc)); + return get$5(win).fold(function () { + var html = win.document.documentElement; + var width = html.clientWidth; + var height = html.clientHeight; + return bounds(scroll.left, scroll.top, width, height); + }, function (visualViewport) { + return bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height); + }); + }; + var bind$3 = function (name, callback, _win) { + return get$5(_win).map(function (visualViewport) { + var handler = function (e) { + return callback(fromRawEvent(e)); + }; + visualViewport.addEventListener(name, handler); + return { + unbind: function () { + return visualViewport.removeEventListener(name, handler); + } + }; + }).getOrThunk(function () { + return { unbind: noop }; + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var fireFullscreenStateChanged = function (editor, state) { + editor.fire('FullscreenStateChanged', { state: state }); + }; + + var getFullscreenNative = function (editor) { + return editor.getParam('fullscreen_native', false, 'boolean'); + }; + + var getFullscreenRoot = function (editor) { + var elem = SugarElement.fromDom(editor.getElement()); + return getShadowRoot(elem).map(getShadowHost).getOrThunk(function () { + return getBody(owner(elem)); + }); + }; + var getFullscreenElement = function (root) { + if (root.fullscreenElement !== undefined) { + return root.fullscreenElement; + } else if (root.msFullscreenElement !== undefined) { + return root.msFullscreenElement; + } else if (root.webkitFullscreenElement !== undefined) { + return root.webkitFullscreenElement; + } else { + return null; + } + }; + var getFullscreenchangeEventName = function () { + if (document.fullscreenElement !== undefined) { + return 'fullscreenchange'; + } else if (document.msFullscreenElement !== undefined) { + return 'MSFullscreenChange'; + } else if (document.webkitFullscreenElement !== undefined) { + return 'webkitfullscreenchange'; + } else { + return 'fullscreenchange'; + } + }; + var requestFullscreen = function (sugarElem) { + var elem = sugarElem.dom; + if (elem.requestFullscreen) { + elem.requestFullscreen(); + } else if (elem.msRequestFullscreen) { + elem.msRequestFullscreen(); + } else if (elem.webkitRequestFullScreen) { + elem.webkitRequestFullScreen(); + } + }; + var exitFullscreen = function (sugarDoc) { + var doc = sugarDoc.dom; + if (doc.exitFullscreen) { + doc.exitFullscreen(); + } else if (doc.msExitFullscreen) { + doc.msExitFullscreen(); + } else if (doc.webkitCancelFullScreen) { + doc.webkitCancelFullScreen(); + } + }; + var isFullscreenElement = function (elem) { + return elem.dom === getFullscreenElement(owner(elem).dom); + }; + + var ancestors = function (scope, predicate, isRoot) { + return filter(parents(scope, isRoot), predicate); + }; + var siblings$1 = function (scope, predicate) { + return filter(siblings(scope), predicate); + }; + + var all$1 = function (selector) { + return all(selector); + }; + var ancestors$1 = function (scope, selector, isRoot) { + return ancestors(scope, function (e) { + return is(e, selector); + }, isRoot); + }; + var siblings$2 = function (scope, selector) { + return siblings$1(scope, function (e) { + return is(e, selector); + }); + }; + + var attr = 'data-ephox-mobile-fullscreen-style'; + var siblingStyles = 'display:none!important;'; + var ancestorPosition = 'position:absolute!important;'; + var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; + var bgFallback = 'background-color:rgb(255,255,255)!important;'; + var isAndroid = global$2.os.isAndroid(); + var matchColor = function (editorBody) { + var color = get$3(editorBody, 'background-color'); + return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; + }; + var clobberStyles = function (dom, container, editorBody) { + var gatherSiblings = function (element) { + return siblings$2(element, '*:not(.tox-silver-sink)'); + }; + var clobber = function (clobberStyle) { + return function (element) { + var styles = get$2(element, 'style'); + var backup = styles === undefined ? 'no-styles' : styles.trim(); + if (backup === clobberStyle) { + return; + } else { + set(element, attr, backup); + setAll(element, dom.parseStyle(clobberStyle)); + } + }; + }; + var ancestors = ancestors$1(container, '*'); + var siblings = bind(ancestors, gatherSiblings); + var bgColor = matchColor(editorBody); + each(siblings, clobber(siblingStyles)); + each(ancestors, clobber(ancestorPosition + ancestorStyles + bgColor)); + var containerStyles = isAndroid === true ? '' : ancestorPosition; + clobber(containerStyles + ancestorStyles + bgColor)(container); + }; + var restoreStyles = function (dom) { + var clobberedEls = all$1('[' + attr + ']'); + each(clobberedEls, function (element) { + var restore = get$2(element, attr); + if (restore !== 'no-styles') { + setAll(element, dom.parseStyle(restore)); + } else { + remove(element, 'style'); + } + remove(element, attr); + }); + }; + + var DOM = global$1.DOM; + var getScrollPos = function () { + var vp = getBounds(window); + return { + x: vp.x, + y: vp.y + }; + }; + var setScrollPos = function (pos) { + window.scrollTo(pos.x, pos.y); + }; + var viewportUpdate = get$5().fold(function () { + return { + bind: noop, + unbind: noop + }; + }, function (visualViewport) { + var editorContainer = value(); + var resizeBinder = unbindable(); + var scrollBinder = unbindable(); + var refreshScroll = function () { + document.body.scrollTop = 0; + document.documentElement.scrollTop = 0; + }; + var refreshVisualViewport = function () { + window.requestAnimationFrame(function () { + editorContainer.on(function (container) { + return setAll(container, { + top: visualViewport.offsetTop + 'px', + left: visualViewport.offsetLeft + 'px', + height: visualViewport.height + 'px', + width: visualViewport.width + 'px' + }); + }); + }); + }; + var update = global$3.throttle(function () { + refreshScroll(); + refreshVisualViewport(); + }, 50); + var bind = function (element) { + editorContainer.set(element); + update(); + resizeBinder.set(bind$3('resize', update)); + scrollBinder.set(bind$3('scroll', update)); + }; + var unbind = function () { + editorContainer.on(function () { + resizeBinder.clear(); + scrollBinder.clear(); + }); + editorContainer.clear(); + }; + return { + bind: bind, + unbind: unbind + }; + }); + var toggleFullscreen = function (editor, fullscreenState) { + var body = document.body; + var documentElement = document.documentElement; + var editorContainer = editor.getContainer(); + var editorContainerS = SugarElement.fromDom(editorContainer); + var fullscreenRoot = getFullscreenRoot(editor); + var fullscreenInfo = fullscreenState.get(); + var editorBody = SugarElement.fromDom(editor.getBody()); + var isTouch = global$2.deviceType.isTouch(); + var editorContainerStyle = editorContainer.style; + var iframe = editor.iframeElement; + var iframeStyle = iframe.style; + var handleClasses = function (handler) { + handler(body, 'tox-fullscreen'); + handler(documentElement, 'tox-fullscreen'); + handler(editorContainer, 'tox-fullscreen'); + getShadowRoot(editorContainerS).map(function (root) { + return getShadowHost(root).dom; + }).each(function (host) { + handler(host, 'tox-fullscreen'); + handler(host, 'tox-shadowhost'); + }); + }; + var cleanup = function () { + if (isTouch) { + restoreStyles(editor.dom); + } + handleClasses(DOM.removeClass); + viewportUpdate.unbind(); + Optional.from(fullscreenState.get()).each(function (info) { + return info.fullscreenChangeHandler.unbind(); + }); + }; + if (!fullscreenInfo) { + var fullscreenChangeHandler = bind$2(owner(fullscreenRoot), getFullscreenchangeEventName(), function (_evt) { + if (getFullscreenNative(editor)) { + if (!isFullscreenElement(fullscreenRoot) && fullscreenState.get() !== null) { + toggleFullscreen(editor, fullscreenState); + } + } + }); + var newFullScreenInfo = { + scrollPos: getScrollPos(), + containerWidth: editorContainerStyle.width, + containerHeight: editorContainerStyle.height, + containerTop: editorContainerStyle.top, + containerLeft: editorContainerStyle.left, + iframeWidth: iframeStyle.width, + iframeHeight: iframeStyle.height, + fullscreenChangeHandler: fullscreenChangeHandler + }; + if (isTouch) { + clobberStyles(editor.dom, editorContainerS, editorBody); + } + iframeStyle.width = iframeStyle.height = '100%'; + editorContainerStyle.width = editorContainerStyle.height = ''; + handleClasses(DOM.addClass); + viewportUpdate.bind(editorContainerS); + editor.on('remove', cleanup); + fullscreenState.set(newFullScreenInfo); + if (getFullscreenNative(editor)) { + requestFullscreen(fullscreenRoot); + } + fireFullscreenStateChanged(editor, true); + } else { + fullscreenInfo.fullscreenChangeHandler.unbind(); + if (getFullscreenNative(editor) && isFullscreenElement(fullscreenRoot)) { + exitFullscreen(owner(fullscreenRoot)); + } + iframeStyle.width = fullscreenInfo.iframeWidth; + iframeStyle.height = fullscreenInfo.iframeHeight; + editorContainerStyle.width = fullscreenInfo.containerWidth; + editorContainerStyle.height = fullscreenInfo.containerHeight; + editorContainerStyle.top = fullscreenInfo.containerTop; + editorContainerStyle.left = fullscreenInfo.containerLeft; + setScrollPos(fullscreenInfo.scrollPos); + fullscreenState.set(null); + fireFullscreenStateChanged(editor, false); + cleanup(); + editor.off('remove', cleanup); + } + }; + + var register = function (editor, fullscreenState) { + editor.addCommand('mceFullScreen', function () { + toggleFullscreen(editor, fullscreenState); + }); + }; + + var makeSetupHandler = function (editor, fullscreenState) { + return function (api) { + api.setActive(fullscreenState.get() !== null); + var editorEventCallback = function (e) { + return api.setActive(e.state); + }; + editor.on('FullscreenStateChanged', editorEventCallback); + return function () { + return editor.off('FullscreenStateChanged', editorEventCallback); + }; + }; + }; + var register$1 = function (editor, fullscreenState) { + editor.ui.registry.addToggleMenuItem('fullscreen', { + text: 'Fullscreen', + icon: 'fullscreen', + shortcut: 'Meta+Shift+F', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + editor.ui.registry.addToggleButton('fullscreen', { + tooltip: 'Fullscreen', + icon: 'fullscreen', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + }; + + function Plugin () { + global.add('fullscreen', function (editor) { + var fullscreenState = Cell(null); + if (editor.inline) { + return get(fullscreenState); + } + register(editor, fullscreenState); + register$1(editor, fullscreenState); + editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen'); + return get(fullscreenState); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/fullscreen/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 0000000..7dee35d --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var c=function(n){var e=n;return{get:function(){return e},set:function(n){e=n}}},n=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return{isFullscreen:function(){return null!==n.get()}}},e=function(){},u=function(n){return function(){return n}};var t,r,o,l=u(!1),f=u(!0),a=function(){return d},d=(t=function(n){return n.isNone()},{fold:function(n,e){return n()},is:l,isSome:l,isNone:f,getOr:o=function(n){return n},getOrThunk:r=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(undefined),or:o,orThunk:r,map:a,each:e,bind:a,exists:l,forall:f,filter:a,equals:t,equals_:t,toArray:function(){return[]},toString:u("none()")}),s=function(t){var n=u(t),e=function(){return o},r=function(n){return n(t)},o={fold:function(n,e){return e(t)},is:function(n){return t===n},isSome:f,isNone:l,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(n){return s(n(t))},each:function(n){n(t)},bind:r,exists:r,forall:r,filter:function(n){return n(t)?o:d},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(n){return n.is(t)},equals_:function(n,e){return n.fold(l,function(n){return e(t,n)})}};return o},S={some:s,none:a,from:function(n){return null===n||n===undefined?d:s(n)}},m=function(){return n=function(n){return n.unbind()},e=c(S.none()),t=function(){return e.get().each(n)},{clear:function(){t(),e.set(S.none())},isSet:function(){return e.get().isSome()},set:function(n){t(),e.set(S.some(n))}};var n,e,t},h=function(r){return function(n){return t=typeof(e=n),(null===e?"null":"object"==t&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":t)===r;var e,t}},g=function(e){return function(n){return typeof n===e}},p=h("string"),v=h("array"),y=g("boolean"),w=function(n){return!(null===(e=n)||e===undefined);var e},b=g("function"),E=g("number"),F=Array.prototype.push,T=function(n,e){for(var t=n.length,r=new Array(t),o=0;o -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var findUntil = function (xs, pred, until) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Optional.some(x); + } else if (until(x, i)) { + break; + } + } + return Optional.none(); + }; + var find = function (xs, pred) { + return findUntil(xs, pred, never); + }; + + var keys = Object.keys; + var hasOwnProperty = Object.hasOwnProperty; + var get$1 = function (obj, key) { + return has(obj, key) ? Optional.from(obj[key]) : Optional.none(); + }; + var has = function (obj, key) { + return hasOwnProperty.call(obj, key); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getHelpTabs = function (editor) { + return Optional.from(editor.getParam('help_tabs')); + }; + var getForcedPlugins = function (editor) { + return editor.getParam('forced_plugins'); + }; + + var description = '

                                  Editor UI keyboard navigation

                                  \n\n

                                  Activating keyboard navigation

                                  \n\n

                                  The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

                                  \n
                                    \n
                                  • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
                                  • \n
                                  • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
                                  • \n
                                  • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
                                  • \n
                                  \n\n

                                  Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

                                  \n\n

                                  Moving between UI sections

                                  \n\n

                                  When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

                                  \n
                                    \n
                                  • the menubar
                                  • \n
                                  • each group of the toolbar
                                  • \n
                                  • the sidebar
                                  • \n
                                  • the element path in the footer
                                  • \n
                                  • the wordcount toggle button in the footer
                                  • \n
                                  • the branding link in the footer
                                  • \n
                                  \n\n

                                  Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

                                  \n\n

                                  Moving within UI sections

                                  \n\n

                                  Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

                                  \n
                                    \n
                                  • moving between menus in the menubar
                                  • \n
                                  • moving between buttons in a toolbar group
                                  • \n
                                  • moving between items in the element path
                                  • \n
                                  \n\n

                                  In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

                                  \n\n

                                  Executing buttons

                                  \n\n

                                  To execute a button, navigate the selection to the desired button and hit space or enter.

                                  \n\n

                                  Opening, navigating and closing menus

                                  \n\n

                                  When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

                                  \n\n

                                  To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

                                  \n\n

                                  Context toolbars and menus

                                  \n\n

                                  To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

                                  \n\n

                                  Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

                                  \n\n

                                  Dialog navigation

                                  \n\n

                                  There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

                                  \n\n

                                  When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

                                  \n\n

                                  When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

                                  '; + var tab = function () { + var body = { + type: 'htmlpanel', + presets: 'document', + html: description + }; + return { + name: 'keyboardnav', + title: 'Keyboard Navigation', + items: [body] + }; + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + + var convertText = function (source) { + var mac = { + alt: '⌥', + ctrl: '⌃', + shift: '⇧', + meta: '⌘', + access: '⌃⌥' + }; + var other = { + meta: 'Ctrl ', + access: 'Shift + Alt ' + }; + var replace = global$1.mac ? mac : other; + var shortcut = source.split('+'); + var updated = map(shortcut, function (segment) { + var search = segment.toLowerCase().trim(); + return has(replace, search) ? replace[search] : segment; + }); + return global$1.mac ? updated.join('').replace(/\s/, '') : updated.join('+'); + }; + + var shortcuts = [ + { + shortcuts: ['Meta + B'], + action: 'Bold' + }, + { + shortcuts: ['Meta + I'], + action: 'Italic' + }, + { + shortcuts: ['Meta + U'], + action: 'Underline' + }, + { + shortcuts: ['Meta + A'], + action: 'Select all' + }, + { + shortcuts: [ + 'Meta + Y', + 'Meta + Shift + Z' + ], + action: 'Redo' + }, + { + shortcuts: ['Meta + Z'], + action: 'Undo' + }, + { + shortcuts: ['Access + 1'], + action: 'Heading 1' + }, + { + shortcuts: ['Access + 2'], + action: 'Heading 2' + }, + { + shortcuts: ['Access + 3'], + action: 'Heading 3' + }, + { + shortcuts: ['Access + 4'], + action: 'Heading 4' + }, + { + shortcuts: ['Access + 5'], + action: 'Heading 5' + }, + { + shortcuts: ['Access + 6'], + action: 'Heading 6' + }, + { + shortcuts: ['Access + 7'], + action: 'Paragraph' + }, + { + shortcuts: ['Access + 8'], + action: 'Div' + }, + { + shortcuts: ['Access + 9'], + action: 'Address' + }, + { + shortcuts: ['Alt + 0'], + action: 'Open help dialog' + }, + { + shortcuts: ['Alt + F9'], + action: 'Focus to menubar' + }, + { + shortcuts: ['Alt + F10'], + action: 'Focus to toolbar' + }, + { + shortcuts: ['Alt + F11'], + action: 'Focus to element path' + }, + { + shortcuts: ['Ctrl + F9'], + action: 'Focus to contextual toolbar' + }, + { + shortcuts: ['Shift + Enter'], + action: 'Open popup menu for split buttons' + }, + { + shortcuts: ['Meta + K'], + action: 'Insert link (if link plugin activated)' + }, + { + shortcuts: ['Meta + S'], + action: 'Save (if save plugin activated)' + }, + { + shortcuts: ['Meta + F'], + action: 'Find (if searchreplace plugin activated)' + }, + { + shortcuts: ['Meta + Shift + F'], + action: 'Switch to or from fullscreen mode' + } + ]; + + var tab$1 = function () { + var shortcutList = map(shortcuts, function (shortcut) { + var shortcutText = map(shortcut.shortcuts, convertText).join(' or '); + return [ + shortcut.action, + shortcutText + ]; + }); + var tablePanel = { + type: 'table', + header: [ + 'Action', + 'Shortcut' + ], + cells: shortcutList + }; + return { + name: 'shortcuts', + title: 'Handy Shortcuts', + items: [tablePanel] + }; + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n'); + + var urls = [ + { + key: 'advlist', + name: 'Advanced List' + }, + { + key: 'anchor', + name: 'Anchor' + }, + { + key: 'autolink', + name: 'Autolink' + }, + { + key: 'autoresize', + name: 'Autoresize' + }, + { + key: 'autosave', + name: 'Autosave' + }, + { + key: 'bbcode', + name: 'BBCode' + }, + { + key: 'charmap', + name: 'Character Map' + }, + { + key: 'code', + name: 'Code' + }, + { + key: 'codesample', + name: 'Code Sample' + }, + { + key: 'colorpicker', + name: 'Color Picker' + }, + { + key: 'directionality', + name: 'Directionality' + }, + { + key: 'emoticons', + name: 'Emoticons' + }, + { + key: 'fullpage', + name: 'Full Page' + }, + { + key: 'fullscreen', + name: 'Full Screen' + }, + { + key: 'help', + name: 'Help' + }, + { + key: 'hr', + name: 'Horizontal Rule' + }, + { + key: 'image', + name: 'Image' + }, + { + key: 'imagetools', + name: 'Image Tools' + }, + { + key: 'importcss', + name: 'Import CSS' + }, + { + key: 'insertdatetime', + name: 'Insert Date/Time' + }, + { + key: 'legacyoutput', + name: 'Legacy Output' + }, + { + key: 'link', + name: 'Link' + }, + { + key: 'lists', + name: 'Lists' + }, + { + key: 'media', + name: 'Media' + }, + { + key: 'nonbreaking', + name: 'Nonbreaking' + }, + { + key: 'noneditable', + name: 'Noneditable' + }, + { + key: 'pagebreak', + name: 'Page Break' + }, + { + key: 'paste', + name: 'Paste' + }, + { + key: 'preview', + name: 'Preview' + }, + { + key: 'print', + name: 'Print' + }, + { + key: 'save', + name: 'Save' + }, + { + key: 'searchreplace', + name: 'Search and Replace' + }, + { + key: 'spellchecker', + name: 'Spell Checker' + }, + { + key: 'tabfocus', + name: 'Tab Focus' + }, + { + key: 'table', + name: 'Table' + }, + { + key: 'template', + name: 'Template' + }, + { + key: 'textcolor', + name: 'Text Color' + }, + { + key: 'textpattern', + name: 'Text Pattern' + }, + { + key: 'toc', + name: 'Table of Contents' + }, + { + key: 'visualblocks', + name: 'Visual Blocks' + }, + { + key: 'visualchars', + name: 'Visual Characters' + }, + { + key: 'wordcount', + name: 'Word Count' + }, + { + key: 'advcode', + name: 'Advanced Code Editor*' + }, + { + key: 'formatpainter', + name: 'Format Painter*' + }, + { + key: 'powerpaste', + name: 'PowerPaste*' + }, + { + key: 'tinydrive', + name: 'Tiny Drive*', + slug: 'drive' + }, + { + key: 'tinymcespellchecker', + name: 'Spell Checker Pro*' + }, + { + key: 'a11ychecker', + name: 'Accessibility Checker*' + }, + { + key: 'linkchecker', + name: 'Link Checker*' + }, + { + key: 'mentions', + name: 'Mentions*' + }, + { + key: 'mediaembed', + name: 'Enhanced Media Embed*' + }, + { + key: 'checklist', + name: 'Checklist*' + }, + { + key: 'casechange', + name: 'Case Change*' + }, + { + key: 'permanentpen', + name: 'Permanent Pen*' + }, + { + key: 'pageembed', + name: 'Page Embed*' + }, + { + key: 'tinycomments', + name: 'Tiny Comments*', + slug: 'comments' + }, + { + key: 'advtable', + name: 'Advanced Tables*' + }, + { + key: 'autocorrect', + name: 'Autocorrect*' + } + ]; + + var tab$2 = function (editor) { + var availablePlugins = function () { + var premiumPlugins = [ + 'Accessibility Checker', + 'Advanced Code Editor', + 'Advanced Tables', + 'Case Change', + 'Checklist', + 'Tiny Comments', + 'Tiny Drive', + 'Enhanced Media Embed', + 'Format Painter', + 'Link Checker', + 'Mentions', + 'MoxieManager', + 'Page Embed', + 'Permanent Pen', + 'PowerPaste', + 'Spell Checker Pro' + ]; + var premiumPluginList = map(premiumPlugins, function (plugin) { + return '
                                • ' + global$2.translate(plugin) + '
                                • '; + }).join(''); + return '
                                  ' + '

                                  ' + global$2.translate('Premium plugins:') + '

                                  ' + '' + '
                                  '; + }; + var makeLink = function (p) { + return '' + p.name + ''; + }; + var maybeUrlize = function (editor, key) { + return find(urls, function (x) { + return x.key === key; + }).fold(function () { + var getMetadata = editor.plugins[key].getMetadata; + return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key; + }, function (x) { + var urlSlug = x.slug || x.key; + return makeLink({ + name: x.name, + url: 'https://www.tiny.cloud/docs/plugins/' + urlSlug + }); + }); + }; + var getPluginKeys = function (editor) { + var keys$1 = keys(editor.plugins); + var forced_plugins = getForcedPlugins(editor); + return forced_plugins === undefined ? keys$1 : filter(keys$1, function (k) { + return !contains(forced_plugins, k); + }); + }; + var pluginLister = function (editor) { + var pluginKeys = getPluginKeys(editor); + var pluginLis = map(pluginKeys, function (key) { + return '
                                • ' + maybeUrlize(editor, key) + '
                                • '; + }); + var count = pluginLis.length; + var pluginsString = pluginLis.join(''); + var html = '

                                  ' + global$2.translate([ + 'Plugins installed ({0}):', + count + ]) + '

                                  ' + '
                                    ' + pluginsString + '
                                  '; + return html; + }; + var installedPlugins = function (editor) { + if (editor == null) { + return ''; + } + return '
                                  ' + pluginLister(editor) + '
                                  '; + }; + var htmlPanel = { + type: 'htmlpanel', + presets: 'document', + html: [ + installedPlugins(editor), + availablePlugins() + ].join('') + }; + return { + name: 'plugins', + title: 'Plugins', + items: [htmlPanel] + }; + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var tab$3 = function () { + var getVersion = function (major, minor) { + return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; + }; + var version = getVersion(global$3.majorVersion, global$3.minorVersion); + var changeLogLink = 'TinyMCE ' + version + ''; + var htmlPanel = { + type: 'htmlpanel', + html: '

                                  ' + global$2.translate([ + 'You are using {0}', + changeLogLink + ]) + '

                                  ', + presets: 'document' + }; + return { + name: 'versions', + title: 'Version', + items: [htmlPanel] + }; + }; + + var parseHelpTabsSetting = function (tabsFromSettings, tabs) { + var newTabs = {}; + var names = map(tabsFromSettings, function (t) { + if (typeof t === 'string') { + if (has(tabs, t)) { + newTabs[t] = tabs[t]; + } + return t; + } else { + newTabs[t.name] = t; + return t.name; + } + }); + return { + tabs: newTabs, + names: names + }; + }; + var getNamesFromTabs = function (tabs) { + var names = keys(tabs); + var idx = names.indexOf('versions'); + if (idx !== -1) { + names.splice(idx, 1); + names.push('versions'); + } + return { + tabs: tabs, + names: names + }; + }; + var parseCustomTabs = function (editor, customTabs) { + var _a; + var shortcuts = tab$1(); + var nav = tab(); + var plugins = tab$2(editor); + var versions = tab$3(); + var tabs = __assign((_a = {}, _a[shortcuts.name] = shortcuts, _a[nav.name] = nav, _a[plugins.name] = plugins, _a[versions.name] = versions, _a), customTabs.get()); + return getHelpTabs(editor).fold(function () { + return getNamesFromTabs(tabs); + }, function (tabsFromSettings) { + return parseHelpTabsSetting(tabsFromSettings, tabs); + }); + }; + var init = function (editor, customTabs) { + return function () { + var _a = parseCustomTabs(editor, customTabs), tabs = _a.tabs, names = _a.names; + var foundTabs = map(names, function (name) { + return get$1(tabs, name); + }); + var dialogTabs = cat(foundTabs); + var body = { + type: 'tabpanel', + tabs: dialogTabs + }; + editor.windowManager.open({ + title: 'Help', + size: 'medium', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: {} + }); + }; + }; + + function Plugin () { + global.add('help', function (editor) { + var customTabs = Cell({}); + var api = get(customTabs); + var dialogOpener = init(editor, customTabs); + register$1(editor, dialogOpener); + register(editor, dialogOpener); + editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); + return api; + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/help/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/help/plugin.min.js new file mode 100644 index 0000000..6b4b414 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/help/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,t,n,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=function(){return(m=Object.assign||function(e){for(var t,n=1,a=arguments.length;n'+e.name+""};return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==(n=e)?"":'
                                  '+function(a){var e,t,n,o=(t=f((e=a).plugins),(n=e.getParam("forced_plugins"))===undefined?t:function(e,t){for(var n=[],a=0,o=e.length;a"+(t=a,n=e,g(C,function(e){return e.key===n}).fold(function(){var e=t.plugins[n].getMetadata;return"function"==typeof e?l(e()):n},function(e){var t=e.slug||e.key;return l({name:e.name,url:"https://www.tiny.cloud/docs/plugins/"+t})}))+"";var t,n}),r=i.length,s=i.join("");return"

                                  "+A.translate(["Plugins installed ({0}):",r])+"

                                    "+s+"
                                  "}(n)+"
                                  ",(t=p(["Accessibility Checker","Advanced Code Editor","Advanced Tables","Case Change","Checklist","Tiny Comments","Tiny Drive","Enhanced Media Embed","Format Painter","Link Checker","Mentions","MoxieManager","Page Embed","Permanent Pen","PowerPaste","Spell Checker Pro"],function(e){return"
                                • "+A.translate(e)+"
                                • "}).join(""),'

                                  '+A.translate("Premium plugins:")+"

                                  ")].join("")}]}},x=tinymce.util.Tools.resolve("tinymce.EditorManager"),P=function(e,t){var n,a,o,i,r,s={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:p(w,function(e){var t=p(e.shortcuts,v).join(" or ");return[e.action,t]})}]},l={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

                                  Editor UI keyboard navigation

                                  \n\n

                                  Activating keyboard navigation

                                  \n\n

                                  The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

                                  \n
                                    \n
                                  • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
                                  • \n
                                  • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
                                  • \n
                                  • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
                                  • \n
                                  \n\n

                                  Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

                                  \n\n

                                  Moving between UI sections

                                  \n\n

                                  When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

                                  \n
                                    \n
                                  • the menubar
                                  • \n
                                  • each group of the toolbar
                                  • \n
                                  • the sidebar
                                  • \n
                                  • the element path in the footer
                                  • \n
                                  • the wordcount toggle button in the footer
                                  • \n
                                  • the branding link in the footer
                                  • \n
                                  \n\n

                                  Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

                                  \n\n

                                  Moving within UI sections

                                  \n\n

                                  Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

                                  \n
                                    \n
                                  • moving between menus in the menubar
                                  • \n
                                  • moving between buttons in a toolbar group
                                  • \n
                                  • moving between items in the element path
                                  • \n
                                  \n\n

                                  In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

                                  \n\n

                                  Executing buttons

                                  \n\n

                                  To execute a button, navigate the selection to the desired button and hit space or enter.

                                  \n\n

                                  Opening, navigating and closing menus

                                  \n\n

                                  When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

                                  \n\n

                                  To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

                                  \n\n

                                  Context toolbars and menus

                                  \n\n

                                  To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

                                  \n\n

                                  Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

                                  \n\n

                                  Dialog navigation

                                  \n\n

                                  There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

                                  \n\n

                                  When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

                                  \n\n

                                  When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

                                  "}]},c=T(e),u=(i='TinyMCE '+(a=x.majorVersion,o=x.minorVersion,0===a.indexOf("@")?"X.X.X":a+"."+o)+"",{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

                                  "+A.translate(["You are using {0}",i])+"

                                  ",presets:"document"}]}),h=m(((n={})[s.name]=s,n[l.name]=l,n[c.name]=c,n[u.name]=u,n),t.get());return r=e,d.from(r.getParam("help_tabs")).fold(function(){return t=f(e=h),-1!==(n=t.indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=h,n={},a=p(e,function(e){return"string"==typeof e?(y(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})},M=function(o,i){return function(){var e=P(o,i),a=e.tabs,t=e.names,n={type:"tabpanel",tabs:function(e){for(var t=[],n=function(e){t.push(e)},a=0;a'); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('hr', { + icon: 'horizontal-rule', + tooltip: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + editor.ui.registry.addMenuItem('hr', { + icon: 'horizontal-rule', + text: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + }; + + function Plugin () { + global.add('hr', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/hr/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/hr/plugin.min.js new file mode 100644 index 0000000..dfeca9e --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/hr/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");n.add("hr",function(n){var o,t;(o=n).addCommand("InsertHorizontalRule",function(){o.execCommand("mceInsertContent",!1,"
                                  ")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}})})}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/image/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/image/plugin.js new file mode 100644 index 0000000..d7b1cf1 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/image/plugin.js @@ -0,0 +1,1664 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var eq = function (t) { + return function (a) { + return t === a; + }; + }; + var isString = isType('string'); + var isObject = isType('object'); + var isArray = isType('array'); + var isNull = eq(null); + var isBoolean = isSimpleType('boolean'); + var isNumber = isSimpleType('number'); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var nativePush = Array.prototype.push; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var get = function (xs, i) { + return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + }; + var head = function (xs) { + return get(xs, 0); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Optional.none(); + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom, key, value); + }; + var remove = function (element, key) { + element.dom.removeAttribute(key); + }; + + var fromHtml = function (html, scope) { + var doc = scope || document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var hasDimensions = function (editor) { + return editor.getParam('image_dimensions', true, 'boolean'); + }; + var hasAdvTab = function (editor) { + return editor.getParam('image_advtab', false, 'boolean'); + }; + var hasUploadTab = function (editor) { + return editor.getParam('image_uploadtab', true, 'boolean'); + }; + var getPrependUrl = function (editor) { + return editor.getParam('image_prepend_url', '', 'string'); + }; + var getClassList = function (editor) { + return editor.getParam('image_class_list'); + }; + var hasDescription = function (editor) { + return editor.getParam('image_description', true, 'boolean'); + }; + var hasImageTitle = function (editor) { + return editor.getParam('image_title', false, 'boolean'); + }; + var hasImageCaption = function (editor) { + return editor.getParam('image_caption', false, 'boolean'); + }; + var getImageList = function (editor) { + return editor.getParam('image_list', false); + }; + var hasUploadUrl = function (editor) { + return !!getUploadUrl(editor); + }; + var hasUploadHandler = function (editor) { + return !!getUploadHandler(editor); + }; + var getUploadUrl = function (editor) { + return editor.getParam('images_upload_url', '', 'string'); + }; + var getUploadHandler = function (editor) { + return editor.getParam('images_upload_handler', undefined, 'function'); + }; + var getUploadBasePath = function (editor) { + return editor.getParam('images_upload_base_path', undefined, 'string'); + }; + var getUploadCredentials = function (editor) { + return editor.getParam('images_upload_credentials', false, 'boolean'); + }; + var showAccessibilityOptions = function (editor) { + return editor.getParam('a11y_advanced_options', false, 'boolean'); + }; + var isAutomaticUploadsEnabled = function (editor) { + return editor.getParam('automatic_uploads', true, 'boolean'); + }; + + var parseIntAndGetMax = function (val1, val2) { + return Math.max(parseInt(val1, 10), parseInt(val2, 10)); + }; + var getImageSize = function (url) { + return new global$2(function (callback) { + var img = document.createElement('img'); + var done = function (dimensions) { + if (img.parentNode) { + img.parentNode.removeChild(img); + } + callback(dimensions); + }; + img.onload = function () { + var width = parseIntAndGetMax(img.width, img.clientWidth); + var height = parseIntAndGetMax(img.height, img.clientHeight); + var dimensions = { + width: width, + height: height + }; + done(global$2.resolve(dimensions)); + }; + img.onerror = function () { + done(global$2.reject('Failed to get image dimensions for: ' + url)); + }; + var style = img.style; + style.visibility = 'hidden'; + style.position = 'fixed'; + style.bottom = style.left = '0px'; + style.width = style.height = 'auto'; + document.body.appendChild(img); + img.src = url; + }); + }; + var removePixelSuffix = function (value) { + if (value) { + value = value.replace(/px$/, ''); + } + return value; + }; + var addPixelSuffix = function (value) { + if (value.length > 0 && /^[0-9]+$/.test(value)) { + value += 'px'; + } + return value; + }; + var mergeMargins = function (css) { + if (css.margin) { + var splitMargin = String(css.margin).split(' '); + switch (splitMargin.length) { + case 1: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[0]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[0]; + break; + case 2: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 3: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 4: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[3]; + } + delete css.margin; + } + return css; + }; + var createImageList = function (editor, callback) { + var imageList = getImageList(editor); + if (typeof imageList === 'string') { + global$3.send({ + url: imageList, + success: function (text) { + callback(JSON.parse(text)); + } + }); + } else if (typeof imageList === 'function') { + imageList(callback); + } else { + callback(imageList); + } + }; + var waitLoadImage = function (editor, data, imgElm) { + var selectImage = function () { + imgElm.onload = imgElm.onerror = null; + if (editor.selection) { + editor.selection.select(imgElm); + editor.nodeChanged(); + } + }; + imgElm.onload = function () { + if (!data.width && !data.height && hasDimensions(editor)) { + editor.dom.setAttribs(imgElm, { + width: String(imgElm.clientWidth), + height: String(imgElm.clientHeight) + }); + } + selectImage(); + }; + imgElm.onerror = selectImage; + }; + var blobToDataUri = function (blob) { + return new global$2(function (resolve, reject) { + var reader = new FileReader(); + reader.onload = function () { + resolve(reader.result); + }; + reader.onerror = function () { + reject(reader.error.message); + }; + reader.readAsDataURL(blob); + }); + }; + var isPlaceholderImage = function (imgElm) { + return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder')); + }; + + var DOM = global$1.DOM; + var getHspace = function (image) { + if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) { + return removePixelSuffix(image.style.marginLeft); + } else { + return ''; + } + }; + var getVspace = function (image) { + if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) { + return removePixelSuffix(image.style.marginTop); + } else { + return ''; + } + }; + var getBorder = function (image) { + if (image.style.borderWidth) { + return removePixelSuffix(image.style.borderWidth); + } else { + return ''; + } + }; + var getAttrib = function (image, name) { + if (image.hasAttribute(name)) { + return image.getAttribute(name); + } else { + return ''; + } + }; + var getStyle = function (image, name) { + return image.style[name] ? image.style[name] : ''; + }; + var hasCaption = function (image) { + return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; + }; + var updateAttrib = function (image, name, value) { + if (value === '') { + image.removeAttribute(name); + } else { + image.setAttribute(name, value); + } + }; + var wrapInFigure = function (image) { + var figureElm = DOM.create('figure', { class: 'image' }); + DOM.insertAfter(figureElm, image); + figureElm.appendChild(image); + figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figureElm.contentEditable = 'false'; + }; + var removeFigure = function (image) { + var figureElm = image.parentNode; + DOM.insertAfter(image, figureElm); + DOM.remove(figureElm); + }; + var toggleCaption = function (image) { + if (hasCaption(image)) { + removeFigure(image); + } else { + wrapInFigure(image); + } + }; + var normalizeStyle = function (image, normalizeCss) { + var attrValue = image.getAttribute('style'); + var value = normalizeCss(attrValue !== null ? attrValue : ''); + if (value.length > 0) { + image.setAttribute('style', value); + image.setAttribute('data-mce-style', value); + } else { + image.removeAttribute('style'); + } + }; + var setSize = function (name, normalizeCss) { + return function (image, name, value) { + if (image.style[name]) { + image.style[name] = addPixelSuffix(value); + normalizeStyle(image, normalizeCss); + } else { + updateAttrib(image, name, value); + } + }; + }; + var getSize = function (image, name) { + if (image.style[name]) { + return removePixelSuffix(image.style[name]); + } else { + return getAttrib(image, name); + } + }; + var setHspace = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.marginLeft = pxValue; + image.style.marginRight = pxValue; + }; + var setVspace = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.marginTop = pxValue; + image.style.marginBottom = pxValue; + }; + var setBorder = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.borderWidth = pxValue; + }; + var setBorderStyle = function (image, value) { + image.style.borderStyle = value; + }; + var getBorderStyle = function (image) { + return getStyle(image, 'borderStyle'); + }; + var isFigure = function (elm) { + return elm.nodeName === 'FIGURE'; + }; + var isImage = function (elm) { + return elm.nodeName === 'IMG'; + }; + var getIsDecorative = function (image) { + return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation'; + }; + var getAlt = function (image) { + if (getIsDecorative(image)) { + return ''; + } else { + return getAttrib(image, 'alt'); + } + }; + var defaultData = function () { + return { + src: '', + alt: '', + title: '', + width: '', + height: '', + class: '', + style: '', + caption: false, + hspace: '', + vspace: '', + border: '', + borderStyle: '', + isDecorative: false + }; + }; + var getStyleValue = function (normalizeCss, data) { + var image = document.createElement('img'); + updateAttrib(image, 'style', data.style); + if (getHspace(image) || data.hspace !== '') { + setHspace(image, data.hspace); + } + if (getVspace(image) || data.vspace !== '') { + setVspace(image, data.vspace); + } + if (getBorder(image) || data.border !== '') { + setBorder(image, data.border); + } + if (getBorderStyle(image) || data.borderStyle !== '') { + setBorderStyle(image, data.borderStyle); + } + return normalizeCss(image.getAttribute('style')); + }; + var create = function (normalizeCss, data) { + var image = document.createElement('img'); + write(normalizeCss, __assign(__assign({}, data), { caption: false }), image); + setAlt(image, data.alt, data.isDecorative); + if (data.caption) { + var figure = DOM.create('figure', { class: 'image' }); + figure.appendChild(image); + figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figure.contentEditable = 'false'; + return figure; + } else { + return image; + } + }; + var read = function (normalizeCss, image) { + return { + src: getAttrib(image, 'src'), + alt: getAlt(image), + title: getAttrib(image, 'title'), + width: getSize(image, 'width'), + height: getSize(image, 'height'), + class: getAttrib(image, 'class'), + style: normalizeCss(getAttrib(image, 'style')), + caption: hasCaption(image), + hspace: getHspace(image), + vspace: getVspace(image), + border: getBorder(image), + borderStyle: getStyle(image, 'borderStyle'), + isDecorative: getIsDecorative(image) + }; + }; + var updateProp = function (image, oldData, newData, name, set) { + if (newData[name] !== oldData[name]) { + set(image, name, newData[name]); + } + }; + var setAlt = function (image, alt, isDecorative) { + if (isDecorative) { + DOM.setAttrib(image, 'role', 'presentation'); + var sugarImage = SugarElement.fromDom(image); + set(sugarImage, 'alt', ''); + } else { + if (isNull(alt)) { + var sugarImage = SugarElement.fromDom(image); + remove(sugarImage, 'alt'); + } else { + var sugarImage = SugarElement.fromDom(image); + set(sugarImage, 'alt', alt); + } + if (DOM.getAttrib(image, 'role') === 'presentation') { + DOM.setAttrib(image, 'role', ''); + } + } + }; + var updateAlt = function (image, oldData, newData) { + if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) { + setAlt(image, newData.alt, newData.isDecorative); + } + }; + var normalized = function (set, normalizeCss) { + return function (image, name, value) { + set(image, value); + normalizeStyle(image, normalizeCss); + }; + }; + var write = function (normalizeCss, newData, image) { + var oldData = read(normalizeCss, image); + updateProp(image, oldData, newData, 'caption', function (image, _name, _value) { + return toggleCaption(image); + }); + updateProp(image, oldData, newData, 'src', updateAttrib); + updateProp(image, oldData, newData, 'title', updateAttrib); + updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss)); + updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss)); + updateProp(image, oldData, newData, 'class', updateAttrib); + updateProp(image, oldData, newData, 'style', normalized(function (image, value) { + return updateAttrib(image, 'style', value); + }, normalizeCss)); + updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss)); + updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss)); + updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss)); + updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss)); + updateAlt(image, oldData, newData); + }; + + var normalizeCss = function (editor, cssText) { + var css = editor.dom.styles.parse(cssText); + var mergedCss = mergeMargins(css); + var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); + return editor.dom.styles.serialize(compressed); + }; + var getSelectedImage = function (editor) { + var imgElm = editor.selection.getNode(); + var figureElm = editor.dom.getParent(imgElm, 'figure.image'); + if (figureElm) { + return editor.dom.select('img', figureElm)[0]; + } + if (imgElm && (imgElm.nodeName !== 'IMG' || isPlaceholderImage(imgElm))) { + return null; + } + return imgElm; + }; + var splitTextBlock = function (editor, figure) { + var dom = editor.dom; + var textBlock = dom.getParent(figure.parentNode, function (node) { + return !!editor.schema.getTextBlockElements()[node.nodeName]; + }, editor.getBody()); + if (textBlock) { + return dom.split(textBlock, figure); + } else { + return figure; + } + }; + var readImageDataFromSelection = function (editor) { + var image = getSelectedImage(editor); + return image ? read(function (css) { + return normalizeCss(editor, css); + }, image) : defaultData(); + }; + var insertImageAtCaret = function (editor, data) { + var elm = create(function (css) { + return normalizeCss(editor, css); + }, data); + editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew'); + editor.focus(); + editor.selection.setContent(elm.outerHTML); + var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; + editor.dom.setAttrib(insertedElm, 'data-mce-id', null); + if (isFigure(insertedElm)) { + var figure = splitTextBlock(editor, insertedElm); + editor.selection.select(figure); + } else { + editor.selection.select(insertedElm); + } + }; + var syncSrcAttr = function (editor, image) { + editor.dom.setAttrib(image, 'src', image.getAttribute('src')); + }; + var deleteImage = function (editor, image) { + if (image) { + var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; + editor.dom.remove(elm); + editor.focus(); + editor.nodeChanged(); + if (editor.dom.isEmpty(editor.getBody())) { + editor.setContent(''); + editor.selection.setCursorLocation(); + } + } + }; + var writeImageDataToSelection = function (editor, data) { + var image = getSelectedImage(editor); + write(function (css) { + return normalizeCss(editor, css); + }, data, image); + syncSrcAttr(editor, image); + if (isFigure(image.parentNode)) { + var figure = image.parentNode; + splitTextBlock(editor, figure); + editor.selection.select(image.parentNode); + } else { + editor.selection.select(image); + waitLoadImage(editor, data, image); + } + }; + var insertOrUpdateImage = function (editor, partialData) { + var image = getSelectedImage(editor); + if (image) { + var selectedImageData = read(function (css) { + return normalizeCss(editor, css); + }, image); + var data = __assign(__assign({}, selectedImageData), partialData); + if (data.src) { + writeImageDataToSelection(editor, data); + } else { + deleteImage(editor, image); + } + } else if (partialData.src) { + insertImageAtCaret(editor, __assign(__assign({}, defaultData()), partialData)); + } + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var deep = function (old, nu) { + var bothObjects = isObject(old) && isObject(nu); + return bothObjects ? deepMerge(old, nu) : nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var deepMerge = baseMerge(deep); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var getText = function (item) { + if (isString(item.text)) { + return item.text; + } else if (isString(item.title)) { + return item.title; + } else { + return ''; + } + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$4.each(list, function (item) { + var text = getText(item); + if (item.menu !== undefined) { + var items = sanitizeList(item.menu, extractValue); + out.push({ + text: text, + items: items + }); + } else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizer = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + if (list) { + return Optional.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + } else { + return Optional.none(); + } + }; + }; + var sanitize = function (list) { + return sanitizer(getValue)(list); + }; + var isGroup = function (item) { + return Object.prototype.hasOwnProperty.call(item, 'items'); + }; + var findEntryDelegate = function (list, value) { + return findMap(list, function (item) { + if (isGroup(item)) { + return findEntryDelegate(item.items, value); + } else if (item.value === value) { + return Optional.some(item); + } else { + return Optional.none(); + } + }); + }; + var findEntry = function (optList, value) { + return optList.bind(function (list) { + return findEntryDelegate(list, value); + }); + }; + var ListUtils = { + sanitizer: sanitizer, + sanitize: sanitize, + findEntry: findEntry + }; + + var pathJoin = function (path1, path2) { + if (path1) { + return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, ''); + } + return path2; + }; + function Uploader (settings) { + var defaultHandler = function (blobInfo, success, failure, progress) { + var xhr = new XMLHttpRequest(); + xhr.open('POST', settings.url); + xhr.withCredentials = settings.credentials; + xhr.upload.onprogress = function (e) { + progress(e.loaded / e.total * 100); + }; + xhr.onerror = function () { + failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status); + }; + xhr.onload = function () { + if (xhr.status < 200 || xhr.status >= 300) { + failure('HTTP Error: ' + xhr.status); + return; + } + var json = JSON.parse(xhr.responseText); + if (!json || typeof json.location !== 'string') { + failure('Invalid JSON: ' + xhr.responseText); + return; + } + success(pathJoin(settings.basePath, json.location)); + }; + var formData = new FormData(); + formData.append('file', blobInfo.blob(), blobInfo.filename()); + xhr.send(formData); + }; + var uploadBlob = function (blobInfo, handler) { + return new global$2(function (resolve, reject) { + try { + handler(blobInfo, resolve, reject, noop); + } catch (ex) { + reject(ex.message); + } + }); + }; + var isDefaultHandler = function (handler) { + return handler === defaultHandler; + }; + var upload = function (blobInfo) { + return !settings.url && isDefaultHandler(settings.handler) ? global$2.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler); + }; + settings = global$4.extend({ + credentials: false, + handler: defaultHandler + }, settings); + return { upload: upload }; + } + + var makeTab = function (_info) { + return { + title: 'Advanced', + name: 'advanced', + items: [ + { + type: 'input', + label: 'Style', + name: 'style' + }, + { + type: 'grid', + columns: 2, + items: [ + { + type: 'input', + label: 'Vertical space', + name: 'vspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Horizontal space', + name: 'hspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Border width', + name: 'border', + inputMode: 'numeric' + }, + { + type: 'listbox', + name: 'borderstyle', + label: 'Border style', + items: [ + { + text: 'Select...', + value: '' + }, + { + text: 'Solid', + value: 'solid' + }, + { + text: 'Dotted', + value: 'dotted' + }, + { + text: 'Dashed', + value: 'dashed' + }, + { + text: 'Double', + value: 'double' + }, + { + text: 'Groove', + value: 'groove' + }, + { + text: 'Ridge', + value: 'ridge' + }, + { + text: 'Inset', + value: 'inset' + }, + { + text: 'Outset', + value: 'outset' + }, + { + text: 'None', + value: 'none' + }, + { + text: 'Hidden', + value: 'hidden' + } + ] + } + ] + } + ] + }; + }; + var AdvTab = { makeTab: makeTab }; + + var collect = function (editor) { + var urlListSanitizer = ListUtils.sanitizer(function (item) { + return editor.convertURL(item.value || item.url, 'src'); + }); + var futureImageList = new global$2(function (completer) { + createImageList(editor, function (imageList) { + completer(urlListSanitizer(imageList).map(function (items) { + return flatten([ + [{ + text: 'None', + value: '' + }], + items + ]); + })); + }); + }); + var classList = ListUtils.sanitize(getClassList(editor)); + var hasAdvTab$1 = hasAdvTab(editor); + var hasUploadTab$1 = hasUploadTab(editor); + var hasUploadUrl$1 = hasUploadUrl(editor); + var hasUploadHandler$1 = hasUploadHandler(editor); + var image = readImageDataFromSelection(editor); + var hasDescription$1 = hasDescription(editor); + var hasImageTitle$1 = hasImageTitle(editor); + var hasDimensions$1 = hasDimensions(editor); + var hasImageCaption$1 = hasImageCaption(editor); + var hasAccessibilityOptions = showAccessibilityOptions(editor); + var url = getUploadUrl(editor); + var basePath = getUploadBasePath(editor); + var credentials = getUploadCredentials(editor); + var handler = getUploadHandler(editor); + var automaticUploads = isAutomaticUploadsEnabled(editor); + var prependURL = Optional.some(getPrependUrl(editor)).filter(function (preUrl) { + return isString(preUrl) && preUrl.length > 0; + }); + return futureImageList.then(function (imageList) { + return { + image: image, + imageList: imageList, + classList: classList, + hasAdvTab: hasAdvTab$1, + hasUploadTab: hasUploadTab$1, + hasUploadUrl: hasUploadUrl$1, + hasUploadHandler: hasUploadHandler$1, + hasDescription: hasDescription$1, + hasImageTitle: hasImageTitle$1, + hasDimensions: hasDimensions$1, + hasImageCaption: hasImageCaption$1, + url: url, + basePath: basePath, + credentials: credentials, + handler: handler, + prependURL: prependURL, + hasAccessibilityOptions: hasAccessibilityOptions, + automaticUploads: automaticUploads + }; + }); + }; + + var makeItems = function (info) { + var imageUrl = { + name: 'src', + type: 'urlinput', + filetype: 'image', + label: 'Source' + }; + var imageList = info.imageList.map(function (items) { + return { + name: 'images', + type: 'listbox', + label: 'Image list', + items: items + }; + }); + var imageDescription = { + name: 'alt', + type: 'input', + label: 'Alternative description', + disabled: info.hasAccessibilityOptions && info.image.isDecorative + }; + var imageTitle = { + name: 'title', + type: 'input', + label: 'Image title' + }; + var imageDimensions = { + name: 'dimensions', + type: 'sizeinput' + }; + var isDecorative = { + type: 'label', + label: 'Accessibility', + items: [{ + name: 'isDecorative', + type: 'checkbox', + label: 'Image is decorative' + }] + }; + var classList = info.classList.map(function (items) { + return { + name: 'classes', + type: 'listbox', + label: 'Class', + items: items + }; + }); + var caption = { + type: 'label', + label: 'Caption', + items: [{ + type: 'checkbox', + name: 'caption', + label: 'Show caption' + }] + }; + return flatten([ + [imageUrl], + imageList.toArray(), + info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [], + info.hasDescription ? [imageDescription] : [], + info.hasImageTitle ? [imageTitle] : [], + info.hasDimensions ? [imageDimensions] : [], + [{ + type: 'grid', + columns: 2, + items: flatten([ + classList.toArray(), + info.hasImageCaption ? [caption] : [] + ]) + }] + ]); + }; + var makeTab$1 = function (info) { + return { + title: 'General', + name: 'general', + items: makeItems(info) + }; + }; + var MainTab = { + makeTab: makeTab$1, + makeItems: makeItems + }; + + var makeTab$2 = function (_info) { + var items = [{ + type: 'dropzone', + name: 'fileinput' + }]; + return { + title: 'Upload', + name: 'upload', + items: items + }; + }; + var UploadTab = { makeTab: makeTab$2 }; + + var createState = function (info) { + return { + prevImage: ListUtils.findEntry(info.imageList, info.image.src), + prevAlt: info.image.alt, + open: true + }; + }; + var fromImageData = function (image) { + return { + src: { + value: image.src, + meta: {} + }, + images: image.src, + alt: image.alt, + title: image.title, + dimensions: { + width: image.width, + height: image.height + }, + classes: image.class, + caption: image.caption, + style: image.style, + vspace: image.vspace, + border: image.border, + hspace: image.hspace, + borderstyle: image.borderStyle, + fileinput: [], + isDecorative: image.isDecorative + }; + }; + var toImageData = function (data, removeEmptyAlt) { + return { + src: data.src.value, + alt: data.alt.length === 0 && removeEmptyAlt ? null : data.alt, + title: data.title, + width: data.dimensions.width, + height: data.dimensions.height, + class: data.classes, + style: data.style, + caption: data.caption, + hspace: data.hspace, + vspace: data.vspace, + border: data.border, + borderStyle: data.borderstyle, + isDecorative: data.isDecorative + }; + }; + var addPrependUrl2 = function (info, srcURL) { + if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) { + return info.prependURL.bind(function (prependUrl) { + if (srcURL.substring(0, prependUrl.length) !== prependUrl) { + return Optional.some(prependUrl + srcURL); + } + return Optional.none(); + }); + } + return Optional.none(); + }; + var addPrependUrl = function (info, api) { + var data = api.getData(); + addPrependUrl2(info, data.src.value).each(function (srcURL) { + api.setData({ + src: { + value: srcURL, + meta: data.src.meta + } + }); + }); + }; + var formFillFromMeta2 = function (info, data, meta) { + if (info.hasDescription && isString(meta.alt)) { + data.alt = meta.alt; + } + if (info.hasAccessibilityOptions) { + data.isDecorative = meta.isDecorative || data.isDecorative || false; + } + if (info.hasImageTitle && isString(meta.title)) { + data.title = meta.title; + } + if (info.hasDimensions) { + if (isString(meta.width)) { + data.dimensions.width = meta.width; + } + if (isString(meta.height)) { + data.dimensions.height = meta.height; + } + } + if (isString(meta.class)) { + ListUtils.findEntry(info.classList, meta.class).each(function (entry) { + data.classes = entry.value; + }); + } + if (info.hasImageCaption) { + if (isBoolean(meta.caption)) { + data.caption = meta.caption; + } + } + if (info.hasAdvTab) { + if (isString(meta.style)) { + data.style = meta.style; + } + if (isString(meta.vspace)) { + data.vspace = meta.vspace; + } + if (isString(meta.border)) { + data.border = meta.border; + } + if (isString(meta.hspace)) { + data.hspace = meta.hspace; + } + if (isString(meta.borderstyle)) { + data.borderstyle = meta.borderstyle; + } + } + }; + var formFillFromMeta = function (info, api) { + var data = api.getData(); + var meta = data.src.meta; + if (meta !== undefined) { + var newData = deepMerge({}, data); + formFillFromMeta2(info, newData, meta); + api.setData(newData); + } + }; + var calculateImageSize = function (helpers, info, state, api) { + var data = api.getData(); + var url = data.src.value; + var meta = data.src.meta || {}; + if (!meta.width && !meta.height && info.hasDimensions) { + helpers.imageSize(url).then(function (size) { + if (state.open) { + api.setData({ dimensions: size }); + } + }); + } + }; + var updateImagesDropdown = function (info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.src.value); + state.prevImage = image; + api.setData({ + images: image.map(function (entry) { + return entry.value; + }).getOr('') + }); + }; + var changeSrc = function (helpers, info, state, api) { + addPrependUrl(info, api); + formFillFromMeta(info, api); + calculateImageSize(helpers, info, state, api); + updateImagesDropdown(info, state, api); + }; + var changeImages = function (helpers, info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.images); + image.each(function (img) { + var updateAlt = data.alt === '' || state.prevImage.map(function (image) { + return image.text === data.alt; + }).getOr(false); + if (updateAlt) { + if (img.value === '') { + api.setData({ + src: img, + alt: state.prevAlt + }); + } else { + api.setData({ + src: img, + alt: img.text + }); + } + } else { + api.setData({ src: img }); + } + }); + state.prevImage = image; + changeSrc(helpers, info, state, api); + }; + var calcVSpace = function (css) { + var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom']; + return matchingTopBottom ? removePixelSuffix(String(css['margin-top'])) : ''; + }; + var calcHSpace = function (css) { + var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left']; + return matchingLeftRight ? removePixelSuffix(String(css['margin-right'])) : ''; + }; + var calcBorderWidth = function (css) { + return css['border-width'] ? removePixelSuffix(String(css['border-width'])) : ''; + }; + var calcBorderStyle = function (css) { + return css['border-style'] ? String(css['border-style']) : ''; + }; + var calcStyle = function (parseStyle, serializeStyle, css) { + return serializeStyle(parseStyle(serializeStyle(css))); + }; + var changeStyle2 = function (parseStyle, serializeStyle, data) { + var css = mergeMargins(parseStyle(data.style)); + var dataCopy = deepMerge({}, data); + dataCopy.vspace = calcVSpace(css); + dataCopy.hspace = calcHSpace(css); + dataCopy.border = calcBorderWidth(css); + dataCopy.borderstyle = calcBorderStyle(css); + dataCopy.style = calcStyle(parseStyle, serializeStyle, css); + return dataCopy; + }; + var changeStyle = function (helpers, api) { + var data = api.getData(); + var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data); + api.setData(newData); + }; + var changeAStyle = function (helpers, info, api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + var style = getStyleValue(helpers.normalizeCss, toImageData(data, false)); + api.setData({ style: style }); + }; + var changeFileInput = function (helpers, info, state, api) { + var data = api.getData(); + api.block('Uploading image'); + head(data.fileinput).fold(function () { + api.unblock(); + }, function (file) { + var blobUri = URL.createObjectURL(file); + var uploader = Uploader({ + url: info.url, + basePath: info.basePath, + credentials: info.credentials, + handler: info.handler + }); + var finalize = function () { + api.unblock(); + URL.revokeObjectURL(blobUri); + }; + var updateSrcAndSwitchTab = function (url) { + api.setData({ + src: { + value: url, + meta: {} + } + }); + api.showTab('general'); + changeSrc(helpers, info, state, api); + }; + blobToDataUri(file).then(function (dataUrl) { + var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl); + if (info.automaticUploads) { + uploader.upload(blobInfo).then(function (url) { + updateSrcAndSwitchTab(url); + finalize(); + }).catch(function (err) { + finalize(); + helpers.alertErr(err); + }); + } else { + helpers.addToBlobCache(blobInfo); + updateSrcAndSwitchTab(blobInfo.blobUri()); + api.unblock(); + } + }); + }); + }; + var changeHandler = function (helpers, info, state) { + return function (api, evt) { + if (evt.name === 'src') { + changeSrc(helpers, info, state, api); + } else if (evt.name === 'images') { + changeImages(helpers, info, state, api); + } else if (evt.name === 'alt') { + state.prevAlt = api.getData().alt; + } else if (evt.name === 'style') { + changeStyle(helpers, api); + } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') { + changeAStyle(helpers, info, api); + } else if (evt.name === 'fileinput') { + changeFileInput(helpers, info, state, api); + } else if (evt.name === 'isDecorative') { + if (api.getData().isDecorative) { + api.disable('alt'); + } else { + api.enable('alt'); + } + } + }; + }; + var closeHandler = function (state) { + return function () { + state.open = false; + }; + }; + var makeDialogBody = function (info) { + if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) { + var tabPanel = { + type: 'tabpanel', + tabs: flatten([ + [MainTab.makeTab(info)], + info.hasAdvTab ? [AdvTab.makeTab(info)] : [], + info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : [] + ]) + }; + return tabPanel; + } else { + var panel = { + type: 'panel', + items: MainTab.makeItems(info) + }; + return panel; + } + }; + var makeDialog = function (helpers) { + return function (info) { + var state = createState(info); + return { + title: 'Insert/Edit Image', + size: 'normal', + body: makeDialogBody(info), + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: fromImageData(info.image), + onSubmit: helpers.onSubmit(info), + onChange: changeHandler(helpers, info, state), + onClose: closeHandler(state) + }; + }; + }; + var submitHandler = function (editor) { + return function (info) { + return function (api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + editor.execCommand('mceUpdateImage', false, toImageData(data, info.hasAccessibilityOptions)); + editor.editorUpload.uploadImagesAuto(); + api.close(); + }; + }; + }; + var imageSize = function (editor) { + return function (url) { + return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(function (dimensions) { + return { + width: String(dimensions.width), + height: String(dimensions.height) + }; + }); + }; + }; + var createBlobCache = function (editor) { + return function (file, blobUri, dataUrl) { + return editor.editorUpload.blobCache.create({ + blob: file, + blobUri: blobUri, + name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null, + filename: file.name, + base64: dataUrl.split(',')[1] + }); + }; + }; + var addToBlobCache = function (editor) { + return function (blobInfo) { + editor.editorUpload.blobCache.add(blobInfo); + }; + }; + var alertErr = function (editor) { + return function (message) { + editor.windowManager.alert(message); + }; + }; + var normalizeCss$1 = function (editor) { + return function (cssText) { + return normalizeCss(editor, cssText); + }; + }; + var parseStyle = function (editor) { + return function (cssText) { + return editor.dom.parseStyle(cssText); + }; + }; + var serializeStyle = function (editor) { + return function (stylesArg, name) { + return editor.dom.serializeStyle(stylesArg, name); + }; + }; + var Dialog = function (editor) { + var helpers = { + onSubmit: submitHandler(editor), + imageSize: imageSize(editor), + addToBlobCache: addToBlobCache(editor), + createBlobCache: createBlobCache(editor), + alertErr: alertErr(editor), + normalizeCss: normalizeCss$1(editor), + parseStyle: parseStyle(editor), + serializeStyle: serializeStyle(editor) + }; + var open = function () { + collect(editor).then(makeDialog(helpers)).then(editor.windowManager.open); + }; + return { open: open }; + }; + + var register = function (editor) { + editor.addCommand('mceImage', Dialog(editor).open); + editor.addCommand('mceUpdateImage', function (_ui, data) { + editor.undoManager.transact(function () { + return insertOrUpdateImage(editor, data); + }); + }); + }; + + var hasImageClass = function (node) { + var className = node.attr('class'); + return className && /\bimage\b/.test(className); + }; + var toggleContentEditableState = function (state) { + return function (nodes) { + var i = nodes.length; + var toggleContentEditable = function (node) { + node.attr('contenteditable', state ? 'true' : null); + }; + while (i--) { + var node = nodes[i]; + if (hasImageClass(node)) { + node.attr('contenteditable', state ? 'false' : null); + global$4.each(node.getAll('figcaption'), toggleContentEditable); + } + } + }; + }; + var setup = function (editor) { + editor.on('PreInit', function () { + editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); + editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('image', { + icon: 'image', + tooltip: 'Insert/edit image', + onAction: Dialog(editor).open, + onSetup: function (buttonApi) { + return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind; + } + }); + editor.ui.registry.addMenuItem('image', { + icon: 'image', + text: 'Image...', + onAction: Dialog(editor).open + }); + editor.ui.registry.addContextMenu('image', { + update: function (element) { + return isFigure(element) || isImage(element) && !isPlaceholderImage(element) ? ['image'] : []; + } + }); + }; + + function Plugin () { + global.add('image', function (editor) { + setup(editor); + register$1(editor); + register(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/image/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/image/plugin.min.js new file mode 100644 index 0000000..7b45436 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var t,e,n,r,o,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=function(){return(c=Object.assign||function(e){for(var t,n=1,r=arguments.length;n 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var is = function (element, selector) { + var dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var child = function (scope, predicate) { + var pred = function (node) { + return predicate(SugarElement.fromDom(node)); + }; + var result = find(scope.dom.childNodes, pred); + return result.map(SugarElement.fromDom); + }; + + var child$1 = function (scope, selector) { + return child(scope, function (e) { + return is(e, selector); + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.URI'); + + var getToolbarItems = function (editor) { + return editor.getParam('imagetools_toolbar', 'rotateleft rotateright flipv fliph editimage imageoptions'); + }; + var getProxyUrl = function (editor) { + return editor.getParam('imagetools_proxy'); + }; + var getCorsHosts = function (editor) { + return editor.getParam('imagetools_cors_hosts', [], 'string[]'); + }; + var getCredentialsHosts = function (editor) { + return editor.getParam('imagetools_credentials_hosts', [], 'string[]'); + }; + var getFetchImage = function (editor) { + return Optional.from(editor.getParam('imagetools_fetch_image', null, 'function')); + }; + var getApiKey = function (editor) { + return editor.getParam('api_key', editor.getParam('imagetools_api_key', '', 'string'), 'string'); + }; + var getUploadTimeout = function (editor) { + return editor.getParam('images_upload_timeout', 30000, 'number'); + }; + var shouldReuseFilename = function (editor) { + return editor.getParam('images_reuse_filename', false, 'boolean'); + }; + + function getImageSize(img) { + var width, height; + function isPxValue(value) { + return /^[0-9\.]+px$/.test(value); + } + width = img.style.width; + height = img.style.height; + if (width || height) { + if (isPxValue(width) && isPxValue(height)) { + return { + w: parseInt(width, 10), + h: parseInt(height, 10) + }; + } + return null; + } + width = img.width; + height = img.height; + if (width && height) { + return { + w: parseInt(width, 10), + h: parseInt(height, 10) + }; + } + return null; + } + function setImageSize(img, size) { + var width, height; + if (size) { + width = img.style.width; + height = img.style.height; + if (width || height) { + img.style.width = size.w + 'px'; + img.style.height = size.h + 'px'; + img.removeAttribute('data-mce-style'); + } + width = img.width; + height = img.height; + if (width || height) { + img.setAttribute('width', String(size.w)); + img.setAttribute('height', String(size.h)); + } + } + } + function getNaturalImageSize(img) { + return { + w: img.naturalWidth, + h: img.naturalHeight + }; + } + + var count = 0; + var getFigureImg = function (elem) { + return child$1(SugarElement.fromDom(elem), 'img'); + }; + var isFigure = function (editor, elem) { + return editor.dom.is(elem, 'figure'); + }; + var isImage = function (editor, imgNode) { + return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])'); + }; + var getEditableImage = function (editor, node) { + var isEditable = function (imgNode) { + return isImage(editor, imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || isNonNullable(getProxyUrl(editor))); + }; + if (isFigure(editor, node)) { + return getFigureImg(node).bind(function (img) { + return isEditable(img.dom) ? Optional.some(img.dom) : Optional.none(); + }); + } else { + return isEditable(node) ? Optional.some(node) : Optional.none(); + } + }; + var displayError = function (editor, error) { + editor.notificationManager.open({ + text: error, + type: 'error' + }); + }; + var getSelectedImage = function (editor) { + var elem = editor.selection.getNode(); + var figureElm = editor.dom.getParent(elem, 'figure.image'); + if (figureElm !== null && isFigure(editor, figureElm)) { + return getFigureImg(figureElm); + } else if (isImage(editor, elem)) { + return Optional.some(SugarElement.fromDom(elem)); + } else { + return Optional.none(); + } + }; + var extractFilename = function (editor, url, group) { + var m = url.match(/(?:\/|^)(([^\/\?]+)\.(?:[a-z0-9.]+))(?:\?|$)/i); + return isNonNullable(m) ? editor.dom.encode(m[group]) : null; + }; + var createId = function () { + return 'imagetools' + count++; + }; + var isLocalImage = function (editor, img) { + var url = img.src; + return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$4(url).host === editor.documentBaseURI.host; + }; + var isCorsImage = function (editor, img) { + return global$1.inArray(getCorsHosts(editor), new global$4(img.src).host) !== -1; + }; + var isCorsWithCredentialsImage = function (editor, img) { + return global$1.inArray(getCredentialsHosts(editor), new global$4(img.src).host) !== -1; + }; + var defaultFetchImage = function (editor, img) { + if (isCorsImage(editor, img)) { + return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img)); + } + if (!isLocalImage(editor, img)) { + var proxyUrl = getProxyUrl(editor); + var src = proxyUrl + (proxyUrl.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src); + var apiKey = getApiKey(editor); + return getUrl(src, apiKey, false); + } + return imageToBlob$1(img); + }; + var imageToBlob$2 = function (editor, img) { + return getFetchImage(editor).fold(function () { + return defaultFetchImage(editor, img); + }, function (customFetchImage) { + return customFetchImage(img); + }); + }; + var findBlob = function (editor, img) { + var blobInfo = editor.editorUpload.blobCache.getByUri(img.src); + if (blobInfo) { + return global$3.resolve(blobInfo.blob()); + } + return imageToBlob$2(editor, img); + }; + var startTimedUpload = function (editor, imageUploadTimerState) { + var imageUploadTimer = global$2.setEditorTimeout(editor, function () { + editor.editorUpload.uploadImagesAuto(); + }, getUploadTimeout(editor)); + imageUploadTimerState.set(imageUploadTimer); + }; + var cancelTimedUpload = function (imageUploadTimerState) { + global$2.clearTimeout(imageUploadTimerState.get()); + }; + var updateSelectedImage = function (editor, origBlob, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) { + return ir.toBlob().then(function (blob) { + var uri, name, filename, blobInfo; + var blobCache = editor.editorUpload.blobCache; + uri = selectedImage.src; + var useFilename = origBlob.type === blob.type; + if (shouldReuseFilename(editor)) { + blobInfo = blobCache.getByUri(uri); + if (isNonNullable(blobInfo)) { + uri = blobInfo.uri(); + name = blobInfo.name(); + filename = blobInfo.filename(); + } else { + name = extractFilename(editor, uri, 2); + filename = extractFilename(editor, uri, 1); + } + } + blobInfo = blobCache.create({ + id: createId(), + blob: blob, + base64: ir.toBase64(), + uri: uri, + name: name, + filename: useFilename ? filename : undefined + }); + blobCache.add(blobInfo); + editor.undoManager.transact(function () { + function imageLoadedHandler() { + editor.$(selectedImage).off('load', imageLoadedHandler); + editor.nodeChanged(); + if (uploadImmediately) { + editor.editorUpload.uploadImagesAuto(); + } else { + cancelTimedUpload(imageUploadTimerState); + startTimedUpload(editor, imageUploadTimerState); + } + } + editor.$(selectedImage).on('load', imageLoadedHandler); + if (size) { + editor.$(selectedImage).attr({ + width: size.w, + height: size.h + }); + } + editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src'); + }); + return blobInfo; + }); + }; + var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) { + return function () { + var imgOpt = getSelectedImage(editor); + return imgOpt.fold(function () { + displayError(editor, 'Could not find selected image'); + }, function (img) { + return editor._scanForImages().then(function () { + return findBlob(editor, img.dom); + }).then(function (blob) { + return blobToImageResult(blob).then(fn).then(function (imageResult) { + return updateSelectedImage(editor, blob, imageResult, false, imageUploadTimerState, img.dom, size); + }); + }).catch(function (error) { + displayError(editor, error); + }); + }); + }; + }; + var rotate$2 = function (editor, imageUploadTimerState, angle) { + return function () { + var imgOpt = getSelectedImage(editor); + var flippedSize = imgOpt.fold(function () { + return null; + }, function (img) { + var size = getImageSize(img.dom); + return size ? { + w: size.h, + h: size.w + } : null; + }); + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return rotate$1(imageResult, angle); + }, flippedSize)(); + }; + }; + var flip$2 = function (editor, imageUploadTimerState, axis) { + return function () { + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return flip$1(imageResult, axis); + })(); + }; + }; + var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) { + return blobToImage$1(blob).then(function (newImage) { + var newSize = getNaturalImageSize(newImage); + if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) { + if (getImageSize(img)) { + setImageSize(img, newSize); + } + } + URL.revokeObjectURL(newImage.src); + return blob; + }).then(blobToImageResult).then(function (imageResult) { + return updateSelectedImage(editor, blob, imageResult, true, imageUploadTimerState, img); + }).catch(function () { + }); + }; + + var saveState = 'save-state'; + var disable = 'disable'; + var enable = 'enable'; + + var createState = function (blob) { + return { + blob: blob, + url: URL.createObjectURL(blob) + }; + }; + var makeOpen = function (editor, imageUploadTimerState) { + return function () { + var getLoadedSpec = function (currentState) { + return { + title: 'Edit Image', + size: 'large', + body: { + type: 'panel', + items: [{ + type: 'imagetools', + name: 'imagetools', + label: 'Edit Image', + currentState: currentState + }] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true, + disabled: true + } + ], + onSubmit: function (api) { + var blob = api.getData().imagetools.blob; + originalImgOpt.each(function (originalImg) { + originalSizeOpt.each(function (originalSize) { + handleDialogBlob(editor, imageUploadTimerState, originalImg.dom, originalSize, blob); + }); + }); + api.close(); + }, + onCancel: function () { + }, + onAction: function (api, details) { + switch (details.name) { + case saveState: + if (details.value) { + api.enable('save'); + } else { + api.disable('save'); + } + break; + case disable: + api.disable('save'); + api.disable('cancel'); + break; + case enable: + api.enable('cancel'); + break; + } + } + }; + }; + var originalImgOpt = getSelectedImage(editor); + var originalSizeOpt = originalImgOpt.map(function (origImg) { + return getNaturalImageSize(origImg.dom); + }); + originalImgOpt.each(function (img) { + getEditableImage(editor, img.dom).each(function (_) { + findBlob(editor, img.dom).then(function (blob) { + var state = createState(blob); + editor.windowManager.open(getLoadedSpec(state)); + }); + }); + }); + }; + }; + + var register = function (editor, imageUploadTimerState) { + global$1.each({ + mceImageRotateLeft: rotate$2(editor, imageUploadTimerState, -90), + mceImageRotateRight: rotate$2(editor, imageUploadTimerState, 90), + mceImageFlipVertical: flip$2(editor, imageUploadTimerState, 'v'), + mceImageFlipHorizontal: flip$2(editor, imageUploadTimerState, 'h'), + mceEditImage: makeOpen(editor, imageUploadTimerState) + }, function (fn, cmd) { + editor.addCommand(cmd, fn); + }); + }; + + var setup = function (editor, imageUploadTimerState, lastSelectedImageState) { + editor.on('NodeChange', function (e) { + var lastSelectedImage = lastSelectedImageState.get(); + var selectedImage = getEditableImage(editor, e.element); + if (lastSelectedImage && !selectedImage.exists(function (img) { + return lastSelectedImage.src === img.src; + })) { + cancelTimedUpload(imageUploadTimerState); + editor.editorUpload.uploadImagesAuto(); + lastSelectedImageState.set(null); + } + selectedImage.each(lastSelectedImageState.set); + }); + }; + + var register$1 = function (editor) { + var cmd = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + editor.ui.registry.addButton('rotateleft', { + tooltip: 'Rotate counterclockwise', + icon: 'rotate-left', + onAction: cmd('mceImageRotateLeft') + }); + editor.ui.registry.addButton('rotateright', { + tooltip: 'Rotate clockwise', + icon: 'rotate-right', + onAction: cmd('mceImageRotateRight') + }); + editor.ui.registry.addButton('flipv', { + tooltip: 'Flip vertically', + icon: 'flip-vertically', + onAction: cmd('mceImageFlipVertical') + }); + editor.ui.registry.addButton('fliph', { + tooltip: 'Flip horizontally', + icon: 'flip-horizontally', + onAction: cmd('mceImageFlipHorizontal') + }); + editor.ui.registry.addButton('editimage', { + tooltip: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage'), + onSetup: function (buttonApi) { + var setDisabled = function () { + var disabled = getSelectedImage(editor).forall(function (element) { + return getEditableImage(editor, element.dom).isNone(); + }); + buttonApi.setDisabled(disabled); + }; + editor.on('NodeChange', setDisabled); + return function () { + editor.off('NodeChange', setDisabled); + }; + } + }); + editor.ui.registry.addButton('imageoptions', { + tooltip: 'Image options', + icon: 'image', + onAction: cmd('mceImage') + }); + editor.ui.registry.addContextMenu('imagetools', { + update: function (element) { + return getEditableImage(editor, element).fold(function () { + return []; + }, function (_) { + return [{ + text: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage') + }]; + }); + } + }); + }; + + var register$2 = function (editor) { + editor.ui.registry.addContextToolbar('imagetools', { + items: getToolbarItems(editor), + predicate: function (elem) { + return getEditableImage(editor, elem).isSome(); + }, + position: 'node', + scope: 'node' + }); + }; + + function Plugin () { + global.add('imagetools', function (editor) { + var imageUploadTimerState = Cell(0); + var lastSelectedImageState = Cell(null); + register(editor, imageUploadTimerState); + register$1(editor); + register$2(editor); + setup(editor, imageUploadTimerState, lastSelectedImageState); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/imagetools/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/imagetools/plugin.min.js new file mode 100644 index 0000000..8e4fb25 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/imagetools/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var t,e,n,r,l=function(t){var e=t;return{get:function(){return e},set:function(t){e=t}}},o=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(){},u=function(t){return function(){return t}},a=u(!1),c=u(!0),f=function(){return s},s=(t=function(t){return t.isNone()},{fold:function(t,e){return t()},is:a,isSome:a,isNone:c,getOr:n=function(t){return t},getOrThunk:e=function(t){return t()},getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(undefined),or:n,orThunk:e,map:f,each:i,bind:f,exists:a,forall:c,filter:f,equals:t,equals_:t,toArray:function(){return[]},toString:u("none()")}),m=function(n){var t=u(n),e=function(){return o},r=function(t){return t(n)},o={fold:function(t,e){return e(n)},is:function(t){return n===t},isSome:c,isNone:a,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:e,orThunk:e,map:function(t){return m(t(n))},each:function(t){t(n)},bind:r,exists:r,forall:r,filter:function(t){return t(n)?o:s},toArray:function(){return[n]},toString:function(){return"some("+n+")"},equals:function(t){return t.is(n)},equals_:function(t,e){return t.fold(a,function(t){return e(n,t)})}};return o},g={some:m,none:f,from:function(t){return null===t||t===undefined?s:m(t)}},h=function(t){return!(null===(e=t)||e===undefined);var e},v=(r="function",function(t){return typeof t===r});function p(t,e){return b(document.createElement("canvas"),t,e)}function y(t){var e=p(t.width,t.height);return w(e).drawImage(t,0,0),e}function w(t){return t.getContext("2d")}function b(t,e,n){return t.width=e,t.height=n,t}var I,T,_,R,U=window.Promise?window.Promise:(I=function(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],C(t,A(E,this),A(L,this))},T=window,_=I.immediateFn||"function"==typeof T.setImmediate&&T.setImmediate||function(t){setTimeout(t,1)},R=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},I.prototype["catch"]=function(t){return this.then(null,t)},I.prototype.then=function(n,r){var o=this;return new I(function(t,e){x.call(o,new k(n,r,t,e))})},I.all=function(){for(var t=[],e=0;e 0) { + global$4.each(selectorGroups, function (group) { + var menuItem = processSelector(selector, group); + if (menuItem) { + model.addItemToGroup(group.title, menuItem); + } + }); + } else { + var menuItem = processSelector(selector, null); + if (menuItem) { + model.addItem(menuItem); + } + } + } + } + }); + var items = model.toFormats(); + editor.fire('addStyleModifications', { + items: items, + replace: !shouldAppend(editor) + }); + }); + }; + + var get = function (editor) { + var convertSelectorToFormat = function (selectorText) { + return defaultConvertSelectorToFormat(editor, selectorText); + }; + return { convertSelectorToFormat: convertSelectorToFormat }; + }; + + function Plugin () { + global.add('importcss', function (editor) { + setup(editor); + return get(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/importcss/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/importcss/plugin.min.js new file mode 100644 index 0000000..1c9dab9 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/importcss/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),f=tinymce.util.Tools.resolve("tinymce.EditorManager"),m=tinymce.util.Tools.resolve("tinymce.Env"),h=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=function(t){return t.getParam("importcss_selector_converter")},o=(n="array",function(t){return r=typeof(e=t),(null===e?"null":"object"==r&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":r)===n;var e,r}),i=Array.prototype.push,l=function(t,e){return function(t){for(var e=[],r=0,n=t.length;r'); + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + + editor.ui.registry.addToggleButton('indent2em', { + icon: 'indent2em', + tooltip: pluginName, + onAction: function () { + doAct(); + }, + onSetup: stateSelectorAdapter(editor, [ + '*[style*="text-indent"]', + '*[data-mce-style*="text-indent"]', + ]) + }); + + editor.ui.registry.addMenuItem('indent2em', { + text: pluginName, + onAction: function() { + doAct(); + } + }); + + editor.addCommand('indent2em', doAct ); + + return { + getMetadata: function () { + return { + name: pluginName, + url: "http://tinymce.ax-z.cn/more-plugins/indent2em.php", + }; + } + }; +}); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/indent2em/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/indent2em/plugin.min.js new file mode 100644 index 0000000..b9d8382 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/indent2em/plugin.min.js @@ -0,0 +1,62 @@ +tinymce.PluginManager.add('indent2em', function(editor, url) { + var pluginName='首行缩进'; + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + var indent2em_val = editor.getParam('indent2em_val', '2em'); + var doAct = function () { + var dom = editor.dom; + var blocks = editor.selection.getSelectedBlocks(); + var act = ''; + global$1.each(blocks, function (block) { + if(act==''){ + act = dom.getStyle(block,'text-indent')==indent2em_val ? 'remove' : 'add'; + } + if( act=='add' ){ + dom.setStyle(block, 'text-indent', indent2em_val); + }else{ + var style=dom.getAttrib(block,'style'); + var reg = new RegExp('text-indent:[\\s]*' + indent2em_val + ';', 'ig'); + style = style.replace(reg, ''); + dom.setAttrib(block,'style',style); + } + + }); + }; + + editor.ui.registry.getAll().icons.indent2em || editor.ui.registry.addIcon('indent2em',''); + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + + editor.ui.registry.addToggleButton('indent2em', { + icon: 'indent2em', + tooltip: pluginName, + onAction: function () { + doAct(); + }, + onSetup: stateSelectorAdapter(editor, [ + '*[style*="text-indent"]', + '*[data-mce-style*="text-indent"]', + ]) + }); + + editor.ui.registry.addMenuItem('indent2em', { + text: pluginName, + onAction: function() { + doAct(); + } + }); + + editor.addCommand('indent2em', doAct ); + + return { + getMetadata: function () { + return { + name: pluginName, + url: "http://tinymce.ax-z.cn/more-plugins/indent2em.php", + }; + } + }; +}); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/insertdatetime/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/insertdatetime/plugin.js new file mode 100644 index 0000000..b8ae4bc --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/insertdatetime/plugin.js @@ -0,0 +1,177 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var getDateFormat = function (editor) { + return editor.getParam('insertdatetime_dateformat', editor.translate('%Y-%m-%d')); + }; + var getTimeFormat = function (editor) { + return editor.getParam('insertdatetime_timeformat', editor.translate('%H:%M:%S')); + }; + var getFormats = function (editor) { + return editor.getParam('insertdatetime_formats', [ + '%H:%M:%S', + '%Y-%m-%d', + '%I:%M:%S %p', + '%D' + ]); + }; + var getDefaultDateTime = function (editor) { + var formats = getFormats(editor); + return formats.length > 0 ? formats[0] : getTimeFormat(editor); + }; + var shouldInsertTimeElement = function (editor) { + return editor.getParam('insertdatetime_element', false); + }; + + var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); + var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); + var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); + var monthsLong = 'January February March April May June July August September October November December'.split(' '); + var addZeros = function (value, len) { + value = '' + value; + if (value.length < len) { + for (var i = 0; i < len - value.length; i++) { + value = '0' + value; + } + } + return value; + }; + var getDateTime = function (editor, fmt, date) { + date = date || new Date(); + fmt = fmt.replace('%D', '%m/%d/%Y'); + fmt = fmt.replace('%r', '%I:%M:%S %p'); + fmt = fmt.replace('%Y', '' + date.getFullYear()); + fmt = fmt.replace('%y', '' + date.getYear()); + fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2)); + fmt = fmt.replace('%d', addZeros(date.getDate(), 2)); + fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2)); + fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2)); + fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2)); + fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1)); + fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM')); + fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()])); + fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()])); + fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()])); + fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()])); + fmt = fmt.replace('%%', '%'); + return fmt; + }; + var updateElement = function (editor, timeElm, computerTime, userTime) { + var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); + timeElm.parentNode.insertBefore(newTimeElm, timeElm); + editor.dom.remove(timeElm); + editor.selection.select(newTimeElm, true); + editor.selection.collapse(false); + }; + var insertDateTime = function (editor, format) { + if (shouldInsertTimeElement(editor)) { + var userTime = getDateTime(editor, format); + var computerTime = void 0; + if (/%[HMSIp]/.test(format)) { + computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M'); + } else { + computerTime = getDateTime(editor, '%Y-%m-%d'); + } + var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); + if (timeElm) { + updateElement(editor, timeElm, computerTime, userTime); + } else { + editor.insertContent(''); + } + } else { + editor.insertContent(getDateTime(editor, format)); + } + }; + + var register = function (editor) { + editor.addCommand('mceInsertDate', function () { + insertDateTime(editor, getDateFormat(editor)); + }); + editor.addCommand('mceInsertTime', function () { + insertDateTime(editor, getTimeFormat(editor)); + }); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var register$1 = function (editor) { + var formats = getFormats(editor); + var defaultFormat = Cell(getDefaultDateTime(editor)); + editor.ui.registry.addSplitButton('insertdatetime', { + icon: 'insert-time', + tooltip: 'Insert date/time', + select: function (value) { + return value === defaultFormat.get(); + }, + fetch: function (done) { + done(global$1.map(formats, function (format) { + return { + type: 'choiceitem', + text: getDateTime(editor, format), + value: format + }; + })); + }, + onAction: function (_api) { + insertDateTime(editor, defaultFormat.get()); + }, + onItemAction: function (_api, value) { + defaultFormat.set(value); + insertDateTime(editor, value); + } + }); + var makeMenuItemHandler = function (format) { + return function () { + defaultFormat.set(format); + insertDateTime(editor, format); + }; + }; + editor.ui.registry.addNestedMenuItem('insertdatetime', { + icon: 'insert-time', + text: 'Date/time', + getSubmenuItems: function () { + return global$1.map(formats, function (format) { + return { + type: 'menuitem', + text: getDateTime(editor, format), + onAction: makeMenuItemHandler(format) + }; + }); + } + }); + }; + + function Plugin () { + global.add('insertdatetime', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/insertdatetime/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/insertdatetime/plugin.min.js new file mode 100644 index 0000000..478f4a3 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/insertdatetime/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))},c=function(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])},r="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),a="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),i="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),o="January February March April May June July August September October November December".split(" "),m=function(e,t){if((e=""+e).length'+n+"")):e.insertContent(s(e,t))},t=function(t){t.addCommand("mceInsertDate",function(){var e;l(t,(e=t).getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d")))}),t.addCommand("mceInsertTime",function(){l(t,u(t))})},d=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(n){var e,t,r,a,i=c(n),o=(a=c(r=n),e=0 + + \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityFormula.html b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityFormula.html new file mode 100644 index 0000000..f5f25b5 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityFormula.html @@ -0,0 +1,111 @@ + + + + + + + + + + + + +
                                  +
                                  + sorry! Beta版本仅支持IE9及以上版本的浏览器,正式版本将会支持低版本浏览器,谢谢您的关注! +
                                  +
                                  + + + + + + + + + \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar-bg.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9dedcc678245832448f459c712e72039d36a2d03 GIT binary patch literal 925 zcmaJ=J#W)M7&fg0RizFrNHCo)3zdk!61&YQrfTejTEbCCA~hq9eMwHKedc_@PDU04 z{{SKW0y_c;Rwj1Df8Z~0PUDn;aI$@0&-1*We$(qdIXZlBC`rrkNt4@;yZ3i(mo`^5g&O^Q9vWvFEDZ*C4wzU z&9gl5gE{74jHe{F;P200At0dzFAY!i5*yFR#fssSg4a%sydJPA!@!Vh)j-uWV4AX4H%wD|1awu?6;(WDRjVVz zMEVKX3@EIzaDw_yXJbq3EI8vlL5h-PnVi*R%BG6eXfz59U9Sp6HC@Ks&#Q4-DHR-? z28<+}&=?eo{+KSf1%;>AAwi1cuC@rX6f-7?|I0LQ|`wB zb{z`}1(}c#)#|54-7y@eqlwY3weB&L~A;|0;BOB)X?qZrfIDwvCTt(d|sM u^^g4hYw=6mb)EBJ{&W263$gZZO9!fS{B7^vr)O`AOUZ3_osX^Oul@jSrWpJH literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..f98ded737e1ec99b2daf3b72dd53012f84a6439d GIT binary patch literal 1067 zcmaJ=&ui0A9M2pM9h6mNuuafs=H}G3Y1%bw!@3_$nyp~U))m&9rpenHw&Z2W+nNoL zO++Vx>>qGmJc@eoq=$iQ2l3!R5%H$rS&QHhM1ASn>R~k`dEfW=d_Lcw@AhP7+}GOG zN>P+AJt1bvdW?KSM_R~#?ef%dvUK899#5lLTvBXEjcKR=LE2E}U=}Lc%Hm5nL{ZJO zp3CFBe2G_)5mY=(&^0W=CSoJ5rKs}|g94n>%>@1B`8Ex7EkVyj<&bO%u&7V0+HiU` zlT%mc)wo8F41*z;Cjth<3UG}D)8X9&UD4%4 zWX~~dJRbKn!r=fx1e_HUD{jDax@!s|bW~fnu#QaNDJliDgcCH0bUy{ds>_;AwM?X7 zjH_4-8w`0V)qt}6f2d*9(GJeSzwsU@?BrG~$Yh~|mTZ+YZnoQVW$}Uy6^!g0LJPGj zP8JbHP7zr^nC3v=jBaYE5xFS-Q3~1sSSF3a5p@v*<6by@a7NM;#Lrt=g0V*l;dgEBchI&=5 z)-aY>sv(yl!7yH9|7mpXh)j=X*2k7?>VpqWGVL}Q>xnJlGr1D?)8bgp{ZRP%`}asQ z_XK`x@%J?Cyjg#Lcw>)R?DcPdE&E2NUcFd5xj~iHvr%wwc(niM4%%!Fe`Fu{?(~3b z=bk06-V{Ii+q!rCrwY5}&g4KxRC~KQB}l%`gACyNk$e~%7T%q>c=z>Y0sOkv`@QW# s=INQo>-nyY!9(TKeSzlo@g}ONh0=C9ZtN{@@!s`Kr!wNB*X!WnmBXq@IQ>f`ZLQ(`N0^xMZ8u223e!VSCdwnYN)#CQha%ErOsI z_vS$a|A8kj-t^$vzp!Ty;>C+6L2=S;st0RGG9Nt8^S<-G&zyGJclY|SL5AH`T>!&PbyXb+EQ;t<5?9v&iK1f2MenNFd;Qju94(xl-#ev{t z7$FTJ#^$*CQ5re!6j3llV?WgRZy!GL!1px%q-slc)IbxzwIrywZ1>&e)UA2^(H&4v zArlA?bwC=-!WgC+ztV+lo^6XfSV8DiRwC8_ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bottom.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e3df3d1c4a4291c9f812ac4a35ad4592e1cc671e GIT binary patch literal 1003 zcmaJ=&ui0A98Vq0F&yHMvAGG4H`EC>Y0@@p!{XeU%mtb;y5f2ewlsNN!QQ9ijv~nZ0GTgc+j+2tB<}~G&*%Gn-|y#b&(7TJ z>Auj-Fiej&trX~Zj((k8r|AFHw}Xdt7$9ni%;5^D89rhrEL=uFbBrZaK!&xkx`)OX zrUTl=5-I6<$;1w8L>M-7Jj!O6vGLF|%wgv&{=Tiz0sw2nk-`67&`0d`e1-k}wJy52Vq2t0EPYsYWcil3|q)PvW>*t;W`p zEcTZ;KAX)(8iEj~hrHwp@-T!$pn#tI^FZ>YixYvMpV-jE`LEcAwgM|Kiif^hzvf%0w~zTE6r9$M*e~ zsgB<8@aN&t(a|Hde_-I!3+wys%bjO-_dY#fKW@V<^(^QFf6)77Xz1CE yD=`fWj%>ZYdoMP)Sg!P)??bz>C;ii>nOG;Yu-g6h^ZJKd(e=~R8RgC7;?^H97C9jR literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/btn.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/btn.png new file mode 100644 index 0000000000000000000000000000000000000000..31c0b52f0662a08b3265963960c222f5e72ddda5 GIT binary patch literal 926 zcmaJ=J#W)M7fW^I=Z$e3jw#X>V6BMj`wo8Uh7g2l6Q+z^E8FdVwfb)F!fM50$< z#5_tkTM!z@dE)sq%)kgw!q|X6KYxKB3=DW$cVs6q@iaVHQao68hyHTr>j6A|2pT!! z0ug2&$fL73MY#c2x`@wI1NTAdg0aG3r~Lbu7Lz;FPfhNm7<&VpbCgok)tV>xG7@Rym@YE@I~8 z)i~WR6)c?kG)!1XVo)f0BQj?O5DVsAc;Qmf2Lzw%#nc7V+m1j#~`1s(0cmn E57{#v_5c6? literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/down.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/down.png new file mode 100644 index 0000000000000000000000000000000000000000..31c0b52f0662a08b3265963960c222f5e72ddda5 GIT binary patch literal 926 zcmaJ=J#W)M7fW^I=Z$e3jw#X>V6BMj`wo8Uh7g2l6Q+z^E8FdVwfb)F!fM50$< z#5_tkTM!z@dE)sq%)kgw!q|X6KYxKB3=DW$cVs6q@iaVHQao68hyHTr>j6A|2pT!! z0ug2&$fL73MY#c2x`@wI1NTAdg0aG3r~Lbu7Lz;FPfhNm7<&VpbCgok)tV>xG7@Rym@YE@I~8 z)i~WR6)c?kG)!1XVo)f0BQj?O5DVsAc;Qmf2Lzw%#nc7V+m1j#~`1s(0cmn E57{#v_5c6? literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/top.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/top.png new file mode 100644 index 0000000000000000000000000000000000000000..ecda0704e84186b1f8088cc3a81f0050780b663f GIT binary patch literal 996 zcmaJ=PiWIn9L}7ZGTlKhGI#Ltc2TfNleTX*EE~0HU9lOXE3D#SrpfCXw&ca+&1OZY zI24AU;z1PAfkzMGT~Nf+@Zwp-!A>Gb^(vG3(zTrjYe@3`@O|I!_kO?ctkxmX{4;^LmKk1KVY6j+>YYT-{j06qNCz}xGg}?g3u)e?j=>yWG7$o>u#E6O_ zK!_LP353M6K#Gcz5M?ilh;ccAWN93)_pQec%*R~Cd?t;W}4Jn;%t>r z;#Y|a(sKx$p0^y6)ci9oyr#)H$EUhu;GC*Jroda4DN9k5kPwPxP)riVOe`7Crq7}A zR8~x+;_2~NhpQ4}#l{ZpaLs*gyeBubg6*=%D)y{v*vxvw2CXB@R_|QIo_cMr**h1h zCs$y}2w`LYYIJ9dxhI@2?X&BpP*BmL+{ zb8G9~sV}=bKi8hFt!*saUw=Gu>EXbW+YMo3>ej2q_1!^r`+=0t=iPz)qxxjy*NugP pcb+x3-fW+E_x#Y;i#w3(8|03TmOccd_V@7KfW^I=Z$e3jw#X>V6BMj`wo8Uh7g2l6Q+z^E8FdVwfb)F!fM50$< z#5_tkTM!z@dE)sq%)kgw!q|X6KYxKB3=DW$cVs6q@iaVHQao68hyHTr>j6A|2pT!! z0ug2&$fL73MY#c2x`@wI1NTAdg0aG3r~Lbu7Lz;FPfhNm7<&VpbCgok)tV>xG7@Rym@YE@I~8 z)i~WR6)c?kG)!1XVo)f0BQj?O5DVsAc;Qmf2Lzw%#nc7V+m1j#~`1s(0cmn E57{#v_5c6? literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-bg.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9db6bee66f6ae920fbb433cc772c840a723437 GIT binary patch literal 938 zcmaJ=yN=U96g8wET4^N^6hMJSvkgeZ&)6uVm?#@3tR);piKV2(u_uX@wa3^K?4+Pr zBqaWTf`Sgw@B+O}YzY zQIZ9by;?=8B2`23J+OHoixztm)HgbtSZt-k8Kn^tgfvb0RN+ZH6{K3NmTSmzg&``* zGNevc36q0D!N7?d`w{g?2y#VdOcqp!EYtHN1kqMDOg3d=1rstS5+q*Ck5m9H>;KRo z*rF5K$A9wur*L8~BP{fBLKd;h8aFw}Lq(_+V~3L1CgixNVsAz$NoFJht$_w^5B<<1 zX>wg$g-*$qFitd;w}Ol z(t_)4xth3>n_D4>SY!jo{uAtVViJJ$k&(YU7h|X1hU@LjMQ!io3M?5RZ|q-6yX6w^uFKu=uZka~Y&OVQSoSikUmP)0)r@y{md4Bzx^7`$ivd9fz Vl~2EZdb7xHkJ;`T?+zcG{07G#ARYh! literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-left.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-left.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8c46ee09d0ff24cf64b524f9ad08792278bfa1 GIT binary patch literal 982 zcmaJ=O=#0l91nKrm<+u6fv`vBLBZyuU9;uUY_>`3DrStXbG^AVd0j)7yqLV%Y$5|e zL=eQ2HxGUuMDgN94?BDC;7wE*vdeCjfr3M+FJ0Stu!bb>gWvD>|G)qL_ioS5oF5)K zF~l&;aA8_2((w@ejtm~4|M{(*XLLADa%D1ytE6H0h{;&Ef~Kbe;X=owY=%isg`Q#75djsnWV;I6e7nH{+fvwtlrHF=ifZ=snvdqz zW=iH--IOhMY7(SFNCg~33=lfYZU94tZR~LfuzN|B^;w`|AAuB?jGKZe z0!iY;v6Lis$y z#EY^lM;eJloFd}Es!NP8?gpb>1q}tJZ+pbXE{GJ33SJ=!OEcX&g5&jM-Jnw@S};B| zJYM94=ty0luKyqEI6ZVgifBLIe+mbsRS)q+6yO!#q>ZbNMxi{Y`p6*IFJZjgt>SDA z6CBjA2h=$UoL;b93pau@ZM?3-f*TOSHBmuRSgOF;wgoe4HZzeQ&*r3LQWSH^tUMuS zgp@cTnhYN`_OC{Fx2SufY0tKF(K9}BsoQ;O>sL>7-uMF|l0NeQ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-right.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-right.png new file mode 100644 index 0000000000000000000000000000000000000000..9772c54a68519446ef3c4a307c7c6477f390086c GIT binary patch literal 994 zcmaJ=KTOn69Ik?3NI(okBa1J+0Zq96z3bVAis!Y!B^L2G~n~S4^qfr(Y7Y7yw4GtzI8Vw-69(SjMXVdom$@hJ~-~0W(cYAtjqPJ(L zhoY$7;-pq0V>kKwj~*uft6N{6k>M29D|iOYdHIS4j;+$OS%WkD0<1ZcYXO{D zn<`stiX_<$=CiWS ziNZNCCrEN$Z*nzcExXXeO|ISIX1TW9#0suYB5N>kR-io|AQ#k+tT^p+(c0=YxOUrI zGJ0DsOOj!e#{Sjl<`!{JGHuzGELz5g9&vj>Z0+t0eI{4pT2afF;}6x{{r$0yuDPcV zKfM?}mLE)|hEL|$$JD^Uz`c#m`<>fAzJJ@;_;~r(-p-x=TQ~2X-n5SI{oLw4ab=~i qZ{*4D?)rrXN45vcxp!}0Q-`{!N7vc+(FD7h+`6JZr9HnmxBeS?8#|N$ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-bg.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..450faa2763dc0392583e797081f2ddb2be0c94c3 GIT binary patch literal 941 zcmaJ=O^ee&7|w2?E{h8*qM)ZS1yR`Mqitr}&{*0ebpxi9Ze@EkO{Q(=CKHpXNsA|M z{tEpC!k#>M@Fs|Q7W@-}KfpTaHeCpdOr5Pd*S@rcA$h?u5>hX@#+HAX#TIrHbAQJrCOtlJ-uf%!zXvBy~{ zhD*GFvKgk{NCL~AA_9hJ?D`7(^TS6LxQ@b}Nv2>1Dw?<_ix8bII(>UFwQCOBcm(Q+ zOa(kdERcBTek3OfyV8~EJl*D5u!4}O!d@mdFuOp-Ap#OtF4}@90th*=B0(q~fs!DW zc!9pKC{|<%%B5qlepnhUbVhPdYp-L`mBLO431ps+%P-KU0KwRvDRM8sZ8Bti8>E#i;U?b~C>oU=T@rf1iA}6Fr%7CW%f2ike z&=KjOt9<_{9QEe`;(I8~7Dcyj5?_b++eH*~;ZYvAH(0vWg~Ypclh?k*ZZIH%L@bS<&PFSyVsd` V_u9qNa^YoqfegK)y=y&t^#_8)AY1?d literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-left.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-left.png new file mode 100644 index 0000000000000000000000000000000000000000..01b9255a2b102faaf4f70ff8a54aad65b71bcfae GIT binary patch literal 983 zcmaJ=J8aWH7`FOSsZ>-61_}cwmjR^4j-A9IrG6 zctVndWgtcck&n_>iU@I-kf4|ZgNLQjJhKLiYJL!lu4J}BhzohX)9G-X7>B(&FQihb zP(u_W6cO>e4$*^%<1Y;rROB0;V0@svyud}n zBMpI?_J62tkI+6TqSJi;DeRZJF5-*G$8FD`jjJt%pe2CWdJ*1*jZY5^d>WXw|D-1sW)DTsnWHDS52t3M Y%>Cb2T6gx>FN9aEklRpStyX$}0Ls}k`2YX_ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-right.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f74673a3a57b3b421d8c0310a992e3f73e804980 GIT binary patch literal 988 zcmaJ=PiWIn9L_cz+hnkVhdB>EG8hwV{&k7#W3g+K&K1lkU12>gOe$ z5A)zjP{ErF@uVmy6Az+zk!>e$9z1yRCc6vsrE5D6){x}A-{bqf-`{tyuySL3Y-)^Q znDP9wUZm?e`b~@s)Bkt!=7=sANv=#*ag{X905KUGR}jd%<_0Pv({A1Rf)*HNh;>S3 zQZ{Zv3%i^dW4OrmDVt#y(vfdkbwoe~Z8)CF{(Ap`1&*zYOWw^mBl zR^3Y3Z2CG_h#(bk5ivpJZh9e%RJN@P={`Q@SD^1YXu3 z18r3SvuloL<7RlJjW-OK_d;TN7Ru`?OBFcBv0+A#<<$I=o>SzEDCUy$x~6MlR?jA> zDW;?@SI1VvMIPyL?K5t!FE<_q*QcI!6gan$y%b;DBu zoL&!24f z!VNxYd%kCU4&Rq^#!yP}o3i1T^#ObU&1Umkzgn%Ts`?gz{#%>PhGCd*Lw>)%(P+>& z^a^k~odDG9_2*C|5&^K^?^RVb51^Em%Vhx5>D1uwb~^x0r}KP1TLMr@jKQ@a{z)MXs?w@g%Hy3_uX!HEEfBLqvCeE0dP1Ry3_0R^7;H= zFi0koR*wow>2Np%FdB^vzPA16;V@HVZ6C5MKbnf71Ofp7m&?T}pw(&t2!%ohUzTON z-5w5ytpX%T(hF_~Efxy^+wIo;BrA%tUaz%hpU-EAX0zE~F!=00ih1#0bUYs0?Y7tJ x^>{pmLLrezJg-?Umzhk)B;a%De*k|3@CD!kB;@88S<(Oi002ovPDHLkV1m@;_M!j) literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/bbbk.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/bbbk.png new file mode 100644 index 0000000000000000000000000000000000000000..a793366065a08f1d8e1e50ff1f2a7b20e3e8d94f GIT binary patch literal 519 zcmV+i0{H!jP)6ov1^C~9FL z1cTTJ0l|oZNWfkTi(nyQD}vbC+4=x>mih#-5m7;`t!xAXX+#@;ili5fdbikRSy)_G z9oa2%%3+v~Ip@w{2qMBO#lVYY0sbDq-rS+RskaJgJKj=P(HKWekt0D#x)6-CkI zat((=yi+$U^85X&s!Ecis%ouPGYo@%20YKN*J}Vcolb-h`hX{&`ahVW?>Zij<#O3H zO+;i__Iy6K+ikboP3;B_ha(sa?)Q65(1N!pO2bFgpkAGplO;YigvqwI-LrF zKp_J{$k(`sfJyvcmW+jf>9`!(>JDx6%As)xyPBY|dQ4nx-&C%U@;c!F+N4~@JM2|hKovQ5y zA6euWwN0(WtZwI*MZ{b`EB0sF!~Oh?jBOqF=6>2c`zgbJUW>lPt5$V495A@HEjM!7 z>s@M|PFLUjp7*?R*0Lqsmo7y`AA7T_&&ZHbU}A9|vw%|oUt?w3{qI4i5+x*(^|>vc z`(D;L{pqAw}YeTu7O>WQx^yxs=GX`E!fhU7ppI@fAe!M>S7g7^PXe1?W!( MPgg&ebxsLQ0MLMa5C8xG literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/circleds.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/circleds.png new file mode 100644 index 0000000000000000000000000000000000000000..7f455e85c607d3634d43780d2c1ef6f6789364f9 GIT binary patch literal 874 zcmV-w1C{)VP) zI^D>~2!5gG=jVZefv&DDkH<4RJBtunU0ucVrcfwmW@d^4gu~(b`g&Zsxw%m)m5D^6 z@EVWDO(qin?C$P<`P|;#7Aj2`P*G8FaBzStYPEW6YYSJ>=`;ZB?d{=WZ*OlP5D);w z#cniwnY2uh$cR^Ye3xq6jy#lQ%avySuw_rO*Mx!^4E9&1S2tti%ceP zd3m|V<9T~~;{rN5Iu;fd_)>%r%IEWhD3wYxnatAClH2W8DwVlhZfxLmG$KL7olT(GmVv%$f^ zwzjsivNEYuT3uajG#Z1!Ab0w6jr#xV`0oQg0eA0$40-K#w68ju5&+~b%VHmoupUbvwB>=K41As6L z_kBN|Wmy7%<2Vukp63C;PeB9~ex77XDFATJe`%S1za2>_wQXA!01*X6ds8Ap$kmH3 zz~_LXD4M2`(5`*o2Y{~YRP`d|5*?Qne_1aBjtMgi!@YBwCIB!^Q$h|HW5>=Q2&$^8 z>pD%-!;|N^gn@&I5340f5|LOU__O1jGseboB!pO&700orX+mxB`a1r7zzt(gPYN&R RA>;r6002ovPDHLkV1fyKj{N`t literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/daleth.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/daleth.png new file mode 100644 index 0000000000000000000000000000000000000000..ac705c36d25fcf682b8c89de7e79535b0d49978b GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvcm7LGZJ;(0)!3!W~HAs)xyPP67~Q4nZj-@3tY<^K2kR~}qu zjug`@jlF)n@WHm1Hs^OV)ZQ;-jLQDvX?E-Z)3)5htR9;3|C*jJKVkX(hWy)erzW!` z^e{GT{if6MSFl~l&~xE?D4k)Ej z6d8sA0IgQ5kpC$vpzC@Z$9bHlX~`aJHk)3rC(AMbJRT24QA+jz0DRxi@YL$+81Ee3*PI5oL6^(lgAPi(BQh`vJ9QkxN2n?ucELCjYdz{F+=VP(h?RK;M2_D&0W4>V2VIIh?0$+9fVvSnF3&jT2ZMxnkUN7ZVz zQmK56G#ZV~W&= z03wk{D8O#F13;3b+lt5I0K6BGKftmqXUcAiAP4{q!-N8`EDOLiO}Awj27q?E9SR_d zA^=_2-PUTg0?_St!`_2ht>#X9y`sfJyvcmE~$^w-YbAYeV#6kAs)xyPBY|UR^V|J7Sz>Kk~`R4EtCIn-2*kN%;RO6 zT}KzH=Kp)B$r(7O_>iweOdE^69*5!@=g(87ObW`9wBFCC)MvQjqzc1>-xuc?C$DFo z8no?{+46hU=Pm2^C@$S{O^^HI58I5jlF3!?w^s#ZyShkS-Y=H1cK_XFhHig)1P)nl izxV2kz7iwn15Pd8Q<^XI3F@ArFe0(q%gt?qWa=lNEv1pt%D#C^Fpz(t&M0N89cq5wqH>2x$r z69^!pa5y{|3`c>Sj5+OtA8}Jev@A=KBvG9#%ktrH@YBiL?KYRo zS(fz}1_FWcc>J7pyC!77b1S0000l;a+3rssK|0sd0g zb@`t-j&)sUS@pyIwJ7;$6(0000< KMNUMnLSTYW{*!$G literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hbar.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hbar.png new file mode 100644 index 0000000000000000000000000000000000000000..8809ef3681740ad6cba9eaf95f4746247111061c GIT binary patch literal 516 zcmV+f0{i`mP)d?=6rY}-~2v_>_j_LgLKY1M14)ubqY;43W;379Iq$k|tyWVMC1?h!szxFa+qR3vVk(t# zU6=E>+btT6hL8afEtg9GyvFlg+%A27ygmZ|U*H?}=e;lWs))z{0000Z1Z@N>!PZyj1H?*EP_VH|{=h;-ajys*xfJIs z2M6a=yTk4d%{AcWvI@qu5)Ti_oEQ1>h9klZ079XV!mQWpLZQI({9>`t!6E>Y$pnDOWQxb*k|c?uSSpoRmVMQt z>-9LPiG&Ur5JDJ+ zp(skb6NtrPI`lx6<-_5S&1Ti)YPAC3^?G&4px^HU5ClO@b~+u!G#xTf0??2ym&<50 z>eB;;VKfbpWf?#&ms6&j&F1+GlmNb-AO+QG6+k|p2QVIwN2Ag67S-!@0Nrj^P5S+Q zmSvT(AP6rtx!3Cf2#3RJ(&O>aG_ABc8jZemi+ny`u~^iQ&1Tc#aAY!>%jJ?xCVxJ` g@cwwc1^&LkCl8Po`2kk;QUCw|07*qoM6N<$f*B(1djJ3c literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/im.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/im.png new file mode 100644 index 0000000000000000000000000000000000000000..201ec05e4bb3069cfc4cfb6853f389e5bb63bdbe GIT binary patch literal 571 zcmV-B0>u4^P)5et8S zR@x{jf~}Ph5MpD}CbfmyX<=n+C1Mf8Sc$!zwb~dE5fn_P1Vj*w5>WgWbZ#-Qg!LwO z&Go`A_;z#749_|9&J05!gy1Lj3w~H{!2bi#H0^%BzaF3{3d1nTWU^AJ@I3EyI<955@ zNW0zM@AuCENRqUuE1%B;0LO6%q2+SvcDv1HnwsqQ`xlFaSvHr;O{Y_z&nF0iD2l48 zn!agf-8ETG?`31 z9uELCo6VP9LEKN!E`#kTCKiZMZ7;=Z@|9~_yG6SF_sT%SX=-A002ov JPDHLkV1hqr{M-Nl literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/mho.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/mho.png new file mode 100644 index 0000000000000000000000000000000000000000..291f75054e0feea3b0bdb119589c534eca78aec0 GIT binary patch literal 573 zcmV-D0>b@?P);oVDL%dMx#-^US}8v!0mQxHk)R%S!GM5 z(sH>ZI1mWr^Lgzm%JWF4)A!2lc6-m-?e_1~p&ik5I#qS?c-&&K+_N0VscfN85Jgd6 z4>p@kI2A=6pUs(~xyisZ?H^gI22rAdyIDvSk18JpZFf9t;KmQmNF#{dT(zAeYP0(?7rb zBqftcMNz8Ns?Xx(^9g|EatR<7i{0q5ECVnM!zq9e zl1`^5lgWMG07#Pbgcf}V2JpB`?jOyZs;Y{jcs!nBvB2w0H-|wH`gVAUd3%;$4eRRQ>XKBqotG#caac)Q)YT<-<-dcAtR9tZ>gghC-lJ`hC_fUfH| z`fxb(`~3h`tJUuxd9&F7Xti4Rso88sQ=(0p=Xn5&#o|6S7z_YZDiue72Q}7ewd-8{ z9-wI&fJ`Ry^?U2>%9@f;czyarCcZWKFH;Ai9|wC6iw6m{XWaG-ENnDUokWvul0H@%kuGf3#n2ex8TtxtAjlLhzGP!4K;f@c#q8T|zlPp-?zJK8{AC)9G~C ze|>$;FpSx3rfHfWi0?~SDM1iou^2+A(P#ibybFwDjP%+PAJZ*OlRU@#a+ zat4C|4&B||t-M5TP1S1k)zy_C2%_ifQnuS|k|ZOMh}-R6eTn=MQxw(hc11Ij$?WXx zAcQm;&CAOR$8k=lv)OD?6t%X>b%AoZd~k5^{{FtZyDRxs^z_u@@#yvXuTia5`!^4fTnEx^0|0=2 zzmH9y&j$cJ&nxd>rHn@7@;a&2YUR)Ma5$8BtX8Xdw%Kd|@bK`U5P%;`p69Xo^z;M( zEX#@skB^T4V7J>90!WgqR4ScL2b;xW5dbbOF2n?f!vO%zW)t`7a=AV}J~kdQ%d**Q z79m8_bSjlv4!yp1wqa4u`#7ucWNSViAwW34%B~ kJCnJA`2Dl{1^lx<0meu{g?ijT^Z)<=07*qoM6N<$f{6`4UjP6A literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/wp.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/wp.png new file mode 100644 index 0000000000000000000000000000000000000000..23f6541296fc04941c3eb652a55349b9b7cd8a70 GIT binary patch literal 524 zcmV+n0`vWeP)f(q&E zM6j_4!6u+s36?&91Q9_jEW#ibO2Ed>#wYLrv=j?Ltn9oXsbgU}3$c)BVZ0DBTMP`# zdWlADmi*P3Gylm4;hdRqVT|FE`hpM30XTqv1W;8qolbAJ+h+l;M<#i>Tnd6PnM`PA zJRWyC9n&;5O{-KY;c)n7F@8XyP>9Bx%_fyf_4|FA@pwG5+3Z%WHK5z=7K=p^%d#wr z;vYk;R*OcX_5q1RVmh6grny)w3WdU@q0wmE`4iRvTAWNKuNn|SZvY^Kj>qFw1IKYJ z%ibz~s7;&AW*`u7yWN*tr_)JMlw2-nzl-AWH~<_D2eMQY#V`!ITd&vef5aNFTCD&e z7K@Q(Bofgyjl{aH1Hf=Nd9>`o7;k=kqxj43bz71cqUrJ?tz1vMh5PN8-U? z(ChWyd|Z3I-u-@0NG!|x{r)!tc%IjFT~*c5Xw+`EZCp4m=Vj*rUe*tN$eqU2O%6i< O0000`sfJyrpBE%uH`2RWe72TvEr5Rc<;rv>sJRuE{ruIa!eG@+sS(E=eqC)F6)0CrpU zD~^R1tQgq0vrn>J6Pb8+Rx0Or7e2lCe~;^&4xibs{kU$oh1LS5IyQ;6M497@7XR_I zc+TLU`E-u9&PnYL_oS0AMP;v@l6AXmUb@n+rl!=$U;FAknHY?tv)68oWOZ*4aJpXl z`;Uq5O4p7VZ?6h62s(2d|LS@6q;-cOmtvo_PD_Vj+zaNlTfhICKX*^=>?xmA6mH)a zIxy4l?)ldz4Sn65kCdN3wtFop00i_>zopr0K52ro&W#< literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowright.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..d29116286697f520bbbecf48c4710b0ef7a81164 GIT binary patch literal 351 zcmV-l0igbgP)`sfJyrpBO{oJ#^(;W4U!E?GAs)xyPCeM$rXbK-xVc=DQMz!2eJDza6liWM0GhK2@XdvBLW+?3J616qt<~CY*PFC-Hb& zZi~RVpJyjNdbUd9c%ekwCLKnFV;vo#p_)ru1jHvFpX$Wn#F6a7@$mW1@AHb+ZT0J) zeEK$H!mMS+%~OIjzgiuTxLg{0>$1sNoAc`#oH$Bj$hvv7)+X1{dQ^{;1Uo@yxm qw|W-mT*j_H>gf(_DF^HsY8Wql2sEs_&SeD*1qM%7KbLh*2~7a*^N4@| literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowright.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..265e1e018eba5388b2fce042a9b5ae1b271b7d9e GIT binary patch literal 338 zcmV-Y0j>UtP)HMzi5;sT*t|B~Ez&Y2pZ6e^6Xsl8y(Y*6K zhhYGKx~{FYSIRukxl@FQ+qMBf+M$$Uj9m^y?E5}`sfJyrpB0loK5Y}`Phd7dtgAs)xyPIKgCQRHz=>`h=~cV!YPV9;=25-V^BaFT6c zRw>~xzI``k2J=a|UwupL^;?#?3Qe>)=`GX7s`Epwr68=K;}4ro0wZ@_;@aG`wKC@{ zlY72TZZ?xhu6WOwu$GmWo8m66#^t#z~QMl-wQ^#we**3xg x6N6TL-xvRXNB5lKsMmk1PRi?x{n`J3*V0()xR;#7S)fZ9JYD@<);T3K0RUldQ}_S? literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downdownarrows.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downdownarrows.png new file mode 100644 index 0000000000000000000000000000000000000000..457598cdfa6d802453d64fe782bd0d52ec574524 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBWj4Jzrw;;!R(rZQhIkx*d+j3UVFdxUgv+ky1Z9p2-f?g*V7}{c_W*AR zi}}vm2kb<=JQi@8WX8X%|MT&Oz{7%>#a-5)1^&5V>m%Wx@!B#aTrJ{45np1=3 zuQTXRS}W?bWXe5WC7>S^9zFbF*wCTa;(IeHd+k}_$RFv)4_vQgdNc3oi`gOj8-dPd N@O1TaS?83{1OR1_W;Xx; literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonleft.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonleft.png new file mode 100644 index 0000000000000000000000000000000000000000..f1de8a25bcc216fa1f6ad507e3ec99e304071537 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB1>Q-?j$J^ZSWg$n5Rc<;uWjT!5WwLYST9yAB75-cKdrn4vu7x!&XN#t zs@Psvz$G0XdNGBam!08&t?_KuJF@0Ly$A9cL(iTuce2%1a!GlA_RQ7JsBFQRta^*L g##iiNsFAl|Ob=5u$~<_b9H^MV)78&qol`;+0F>i5VE_OC literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonright.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonright.png new file mode 100644 index 0000000000000000000000000000000000000000..b94a0b8643e221b70bf529188b36e5df8afd79be GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB1eFqBp>qSqV;+g&Y8qg*NPgg&ebxsLQ0J76UUH||9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/gets.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/gets.png new file mode 100644 index 0000000000000000000000000000000000000000..8d659f01a2c3ecc6e43c8a15337b137d15785a00 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBevv047uA76vproLLp+YZof63FtjObfKU$4}-6KO*gww)-+v@ChIvnmo8}lR<@qo$ ztlj#OCA{gLwNjfvMdRnYyZa2Q-cJp>cI%)~#|eqgMtl0VY%f`UT~zR5lB<2}r^!<$ w73VE(n7Q>@HS5wT@8_@FlP%cspr3_*!c~@k0R=wmfX-y_boFyt=akR{0KlMID*ylh literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftarrowtail.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftarrowtail.png new file mode 100644 index 0000000000000000000000000000000000000000..d36a75aaa41615c556991242053ac2fdcb60086f GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBRg0a=3*P{R7J0fjhIkx*J2jD$*^sAoeKM1ls*u)FJ}=QLPO2eJs&kr; zIBG5AGh#gL#%(R(e((H~iSHd13YCgtRvs_h$dkapd`H&c*o|3Bf7vr-t&MKDc8jf{ zHz3Ow8$9BlgpBbH<^?GHP>yz|)ClkdaP1k9y9h$0Jm%e9U z*z^5)rQR|Y28IiN`sfJyrpBS*748lU$%sq^FBxh{y4_R~>m73^`l^cePDuVNp?7IcY*eOC)p3WZ%Op zKd)E$+^54}bW{1Tpn^lg0nvs9-l6~B?WnfC%FJ*k=Y8+vCy&$8LQOeR(p+Siy7ebB dFfy4l=)YO(B`{0qaV*dh22WQ%mvv4FO#nCtI5PkM literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoonup.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoonup.png new file mode 100644 index 0000000000000000000000000000000000000000..d9fd9f2d0636c9af03a1c431494c0e13c2283411 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB8IyfeH`D@!qC8z3Lp+YZy&A}Sz<{IWVOiURCYB`)$~spWh4PrDnMQiZ zPrIYvpubaGt)XyJwoD%bBNNN715w&aQB2!bW`!=i$Y-$mjLZ6P2bX<)58s`)p3L74 dQu2@CPT1WK$tkV+H-WY=c)I$ztaD0e0syFuIq(1g literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftleftarrows.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftleftarrows.png new file mode 100644 index 0000000000000000000000000000000000000000..f4cd7c07b31aee31c45fe8438fdcea03acb4c3ed GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBMJwZ@SC0UN)_A%&hIkx*JI$AuMUkg9ajF6%r-cUJ3YH}g7*u$;CNS|G zaQto%?ooEwY_e~~b+sDK_g~$GCO)|0ZSb0b@4P-T8OMsp4%i2N*vv-}|{OzMud6SqGrI O89ZJ6T-G@yGywp3EMf%! literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4d8d86b40de8628cb7e90267bc2d6a2c529edab7 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBK?T8wQocZ;E1oWnAs)xyP6-rjHsEPXG-tGMaC*d`@?e3`gbRlqWgD6w zEh%N-3u3={JMNlUPKYX{SZd+vV~TRz*QGI_Hx z1nw{P(^Or?E&JwoU&loOrK`)@bfQP;ZZCv>bC z1TN|_7=N#=f4=x6!}A!gC1<|0n67=ki%ILjeg^$pS6QQfP280Y^dEz#tDnm{r-UW| D1#5J~ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrows.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrows.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0717c7237f5b2bec9a988fbfb65d0e326b2586 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBWtq$WjCKQsj(WN{hIkx*JIzt>hysu6>2q8wTD&@#3xZ@y0s=T6FmQVu zV6<2e8X%LxU(I@I%F_+Tf3zEq`#Z5Ubp-qGU3N~Yf$>NEfkGKsMz5894DV}uCK_Jj zP&gTx(j(|paPBq#qA6qw9JznS@yrR!?eDG4w4<3BW<0+cb^G+eaK)CQ18Yyu zF5jTzZOOpUV|ZTnO2%!o=P`MvcbCoi{MqL9=Qn$&2Q9n3>u%$+h84jc<(o`)US nweEVUDAS1_+jtHzd||I)*fAqjKVn5W$U_XCu6{1-oD!MN literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightharpoons.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightharpoons.png new file mode 100644 index 0000000000000000000000000000000000000000..10a057fd01d2a79f6b691eabe4126aeeac1bd24a GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBMV>$P4zWO?)t)YnAs)xyUb)E2A}GN2;O=R$1{+qSIX1Hmjr$$EG8Gfne!X{IZs9$ZV<#-v zU$&e*fA06VY+eSAh39&cdN>vLe>F?!k=)DawNhY_c*W%zac8v{rUbP~CH71W+RLzX z%l=Z1gHf;NNK0Qn_hgP_GCy}3qh@MPq2h--f4?n!`@V`q)akFCu=vGXy%D N!PC{xWt~$(699`lW7Yrw literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightsquigarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightsquigarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d515001e032b759a11508f71ca4c26085d3e2ac3 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB9p;;P%8fvwpPnv`As)xyPCdA`MM0n~@$(_kb z3h=ti#&dYW$zzk}6xZHgF2TT|c<=Y)Yt{Z7j18Ng#%x=ceS6!-?Qy~q$snkidcE{o z6vKikZ2|&LiY#853=!E|ubo`9)$Y`iDVI&&{yrz+J#ESS@0kKlzLz-^FCEiZ8kMcs z64WIy=}}1ifhj@9W?Wgg?zR2e7Z+^KhlW}{Kj(SQ^7)^jnX!Vq<{U4KnWlR0lC=@D q2mem?6HFfZ%Y);RGNZFyiIFnGH9xvX`sfJyrpBQR9!s^QHrZ)_A%&hIkx*JJnW@MUlsC`dnclb`J+8j{}TC2N=a1IE5xK zXfUwvd^BtC{JYv>yY_TRc1_ox%;0<^SM~Qc384uMEaFW9hh&)N9k4tu`6m6T_R=ub z7ki7(Rlg4ws^Ka+=hQLB*sn=;e)ihZ9zh0%2Y%r#0_S#K|5>=F;9Rd^RQ9!7)=k@g z?Q^bt-)p!z>PxlH(kYrtTbqKqrW8GtV{lkodP>UR*B4I*CZRviIcMnmteo|B85_{u N44$rjF6*2UngGhGU!MQ~ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftrightarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftrightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3141daa36519f3ffeec6c0adb5b1e11997cc2e GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBF^zy~mK{K$6P_-PAs)xyUUL*}Q4nBDxVfD%BY`E?fmParS^0<00^Ti* zCI(Gr2iTmO>-pa?TE0m=viHON8Ha1~+4wjZTu<%kI&#v1&FBMr!u@i;-H$EyeBaNo z)|7q2wWw@;RTjfzTXMPG<`jFa+)%{0YE{v>#_8)`_ZS*FxRl18|IAa?;i0*8-Rnvb zhH0siZH`_yP0s4-AFsCeoqTQA``_gy!rK|r=jU%PSSO-g^=guQ)iQ=to1QQ{ws5QN qYs|epLs%d%Lh$G9NsT;9*zG>fVaZUfn5GT%6N9I#pUXO@geCwXa%=ej literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longrightarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longrightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ec988e1dfdb85a9d4fbcd926301d305a6f431d43 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBF}|j}7A5^Z91Z`SV{b`i>Xg;mo>i<}&Ab<*a4XKQnr0 zDn6R47nwaZ==3HIMXvh|9c_sP=dNa5+_kRuzI1ZdRt|@KXa6st+iTfMEt_0 zuOsqD0RR!Dl+LL)T-0^l(kCkkA$IyL@z@*y+O|D=mHm8c?Nt@LTjj5ho$pll*fjhH e0T2N90z3iOGGMJo+Gmdd0000`sfJyrpBRi^sYE8>7cpFCY0Lp+YZop!PJumVq;=T*iNY&jEh4scYow5IeBcIqKC$$=welRy=t3BHrKkaDs z`YA@oJT&*uWK?2eFwS1<%)ua#{6~e=?}UW2OaD`w^N%e)6{<4&UbfNi^vM4EO+~O( zAn5xW(@4#!oqm@~ZZIzuQF@o2fBTzR)Y4<6J%S9ccIDmvw(aqp*Sqvu3(rMn|K4~1 z_Oc)^moNUiW>3qV#vJ=))s&NGYbP0l+XkKID&?5 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/multimap.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/multimap.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a0bb8acf9fd2ddd635b1fe25894f80cb369d41 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBZP^@!4ppGgTu&Fr5Rc<;ryk^GR^(yvonjZ$^pe4a&DX!MWVrq~Ec}C8D#nPbw_>UU$z!v-q6;w%@z&>|+WOKRJ;vOv!3t y%G#|{E=d#@oecggxLat?WXS^zY=0OZFfL}h%m3}P`sfJyrpB32QI6j2A$md!8!tIacdXdzcX`X}UCEY(`!X07Y;|*CkT|~a{qJqLy0(u}=RIGwYRQz#CXw806qy@> zvLxCRmS-$akKE>a=-%TuXLhao9psgn%Vk&V9XajvrV4?Gmo6zw_lwQBsISy?DW2ob z3xC#gU)-7a{>B|xa-ZYJ7wtyzUn>uY{|&id(kpHyxYOR^W4Ive|33^|3QlD*aXfxN PpE7v5`njxgN@xNA(oBCq literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nleftarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nleftarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..df714e174f027fa32dd9eefda881425fda6fc707 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBDU%oH#eV~ZHha1_hIkx*JJpewSy8}sdK&8k2F(WvItq;JEbJZ!7+*7R zMjT+YSkN9PwLs@~%4D^<`sfJyrpBX^wllqilgfdp%toLp+YZoqCb;hyqXB?Zw;{o`ubM4>dQ>16z?NE7o2(eCXiQdatB2?e%hRg1zoet}5l{2AXp~p1H^H^{!_-uFZO< z-D1#}%#rBNsc5P9mAAog*_2Z&i~EAAuG+-x_2GE9SO2x4o2IJMiKyA#x3?wsSU$gO zBKxa-SM}2p#UnQ7+ZW&6&St$}O5Lo@^kdIltG&JI$7DvJ djei&(@b0_wL-Z$$`(GfJ!PC{xWt~$(69AAHY)1e9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nwarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nwarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7b7d23d8897a32cec3900c15a438c4a85ced3b GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBNzDaMG#&zl9(%ethIkx*d+j1`vw{HIgUv4)@(x%s<~-8)8&3j%N+qq)h zYk{WXyvS*VGJ=NUD;D)W+nYbjE&Fb%EQ5fc;MA!a`UB5_IOy z_rE5-Iwuq_YIV!-Y*(UNMdk(`NvvZ7P%D4Vs{kv&5V__VFriJR0 TVx1R2?=pD0`njxgN@xNAIoEx5 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightarrowtail.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightarrowtail.png new file mode 100644 index 0000000000000000000000000000000000000000..27cdc5bf6850ee18e46d9717e72d5e82ba6d21b2 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBHGVDgb_Jl&Oivfb5Rc<;uWsaJR^(y5u=_<-Sc0fpBFkpR)fLQcmiZ0l z2GSO}Tn-9PgIxZpO3Y(8IcHUs&CKf`3wR6;H2i1n$jBB?yT>fBaqBidg+~`I#JQ*( zTXA~kmHCUyd|fn`3LJW**wHc5Tl3!U^B=SK<^0`VaPDjO{!&+l3v*vFGbkv%b~v~5 u+AhXB-`848zO}1P$rfdkNI1aXXs#|iJ5}t@ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoondown.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoondown.png new file mode 100644 index 0000000000000000000000000000000000000000..e384cf845a1a22e8d2297cc59074f3fd7091f31f GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBIc}??{|^C$5`Ysn7Q}h3f9G9Jy8Z(2Rk-2JhV4U z$j|p*W%={x&xqbbd5oS4_V)Gv{`}mLqRG36nVpY=gF{6{WrCQ?5$5{(|KH!=e;jzg kA}X~Hq<;mg@mdKI;Vst08G_DH~;_u literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoonup.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoonup.png new file mode 100644 index 0000000000000000000000000000000000000000..187e1eb24d08e9fdcf342cc78cd033850ce7741a GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBdB(%s>T`iY5uPrNAs)w*|NQ@N&#cQR%-nl$1?yt5o+yK?g9RHD6crmA zy8cgT{QLX+_3PIk2Rf|emywaNtNF1Z;ULqcnuPp(|5d&}fBuZVL dK<*U`4DIIASRXz6Dh9NJ!PC{xWt~$(696muJ)Qsn literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftarrows.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftarrows.png new file mode 100644 index 0000000000000000000000000000000000000000..cdec5d9e416f3e0e851b00cefcd52a767e51e9b8 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBWj$%lWNV<%R!o6Wyh*ymfW=y=fkkZoMYZv~^nXKigkUVP={?N`7tDjS`he4)XF~Jh*%FwMR@f-x?Ec+~pA$DmW&Q zobz$fm*iDbKHV!%{@x`sfJyrpBMdk2ywJboPEuJopAs)xyPI2UARuphuxRODohq;NVfI)*n)5GDA)d42I z1B@06+T~6MnWga0{;>YflhhyeY}>D0m|L}Q_Etve4UDfF=6sfSkDhF(w$#L64U?DV zoX?F9@5*W)>oA=6M|G`fvQ7&F!~XR=eM2r8h9(X9xxx2 Wo6oShW~nOB{S2P2elF{r5}E*SM`iK= literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightrightarrows.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightrightarrows.png new file mode 100644 index 0000000000000000000000000000000000000000..52a7f0f0f1769315be59ac067bd19238f51e4431 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBCDF~6yW@aDD?MEtLp+YZo#x2PqR8W#xY=n!facVO=0^-N3XI&3TdW+I z7Btwt5uJ3C*OvGHFXwo#Tk~HTwoSU?&H0*v?}224K$8vw!@Ac|x02gCG@jdR{i4+^ zuDXmD-X@e_sg%bIcTPa*77%WWUbW>ui^hzBPhsOme9k<@chn|+V%4k zld|6~H)Lg4Y4|t&;=9+gg*!B+x}MpyYTcAe&vPsrm?yB;Ff4u&wbdairV8k222WQ% Jmvv4FO#pe!UCICe literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightsquigarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightsquigarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f471054f45716f22ed94250302c27b14d2c2f3f1 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBU6we(_GF;Yc~2L|5Rc<;uO8%WHsE0m*#3$kO-O=KO~J>(EP+Mhp!5U5 zO^i7Yau}pjSgIVHR%8W*Y6bECJFc&-U&OaF_cmMjGd^*5MplskhJ@Jb*^Fu5?k!i_ z=CNy?vx}hRbfu;amlD0(+jtd^oU7aux^`=ah3{m;W0v6}tPB>`sfJyrpBDURa{vTJ}scRXDjLp+YZz2?i?Vj#f!AhDTIq@nqsW1)lW0!G$|1DvH7 z7A&w}VDD*uS6Uyn&F6Gx<@L&$`o6Qa%-kxr?hLcuIo?0I3QJWMnKYFil~8WE@%^qF zdrfl)o6MO>5(PGW<`2@9FEvaE>S1iO-NyJZbROgKTRhC?G*Go_OeaPiGY~UN5^x$g7?Xc{(Z(R1Wm&W!#)>vxu;>nx0r#GGX?Bn7ZsIj!h z=UnvN@3oQBd@n035?~VCo?AT4_}KC8j*b`sfJyrpBDLLbkd%8fO!=5gVAs)xyUNaOts=(8bSiu*-AXFfr@_<1`fs=D>i&duT z5yxHoo2LogI5BJYe`$#h6(z&sx};A!35;)rllQF4786J=IVYLSWu4^Dq4+%JcGt>M zy$@08jJjXz7Hqu7x#fCwga6m_2d-C%TAVNT*vpl%_J7a5D$x^`%cuPKy4;+Bq3$o| zg{aT3^%?g2xooP~rm!gJRMhLe;!YON84{kf7t6SFC@y7TVAzm5du!SK?|cqsa&a9U l9Z&UBIX0~8V!iU5O+;MBaffaA7NB<+JYD@<);T3K0RSgMX`sfJyrpB0S4nK+(&>y+dN$yLp+YZo#M#LtSI1GKAY=q1~ z9t^BK%vBlrxe;ZYp8S7a|9O)7?EIOy?7L~NHu_#;(mBA?1GIdpiQt5wOHuQGziQA} zx^&96bdCpm!@aiJIxBK3G8~Ay{o#%M{jJ4%&+l{^9y2)B_xQn_`tbR^IaZAGBjaB! zh!65=nP8Z9YGJFuJ>^+jmq|RnY`XWpW6wmxHi4|$@6v%Tb>NuE8u7l0QS3oIgMQcM WutO#v`sfJyrpB9f@G>SGho;m7Xq+As)xyUcJb9M1hAb!8WfUFU9=@+pZ?z7i^_d@-7I@ z;yuHb)_kXVj?D3`{Fj^_ezIphQX}MOYP?$ebAY%z10%~1W(L7%M;CQw&82KdB-#@# zfR-vr9pC76Zs$J1m-Ekm-K2Bx_bm}Y#)MhR9=jczQ8jD5&37|{;;ldDo{N4qH|MsP z(~7S)=U?wC3cqsjR(gE)+n)@^&*wx3dc9=W^5-NIhr$8g2J!!X0Uv`tKLh!L!PC{x JWt~$(69AE2VnhG{ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadrightarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadrightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9242bc210394005cb0fe00eedc55db71bc428cbe GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB9gWgUw+;e@mU_B4hIkx*JM|(bv!Z~@^#axm^=%29VGHJFaF#8QjpfW@ zy>;-Jvjvln|;O? zkA|}_Bu@}%`aZAt-$^#h=gLLrD)Z95s0%kRu>4>=Aj><`Gx$f+e-@yF89ZJ6T-G@y GGywpu23%JF literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-downarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b2264cbfb669bc614780abe35eb65829ba425b92 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBVZ9^yp(lVsdpunnLp+YZo#x1UL_xqckyn9HCWM)51&hiRN8J!6zX=Yq z3XO#yzF$b;pPeRosm%Yg-(*gEekV0aUI*Kg-nKm)E+4`VZqix)HMgnuzJK;lX2FgJ zyB>V^DOF#m@1c42vyV%Btza#S`$ zRQ9nML0sx5L}lJ{C^B#;7QCxl(0*;2#Ny(rr)@ps~ dX5oXW_b#k|&b(G`sfJyrpB6DyVi;|oBcO`a}}As)xyPP@y?A}HeaJde4=iG4)_pN3;PkWsRL<@bh@ zcD?gw%uLz*(Y9iu#mRDh#;w;LpWM^ezL`;a1LI_d_qFFLCkD7{E){Tkm355aSOiC+ zB*Wk1=OmaJj?Jj!)ZMyX0r$U4Eg*l5q6c9 SZHz$IGkCiCxvXtB=r literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftrightarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftrightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..288dcc11f9b080ae207cc642d315848fb0e14d9e GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB5tZ!UT7p2KFP<)rAs)xyPCJ;}YQWR>cvbZT-a~AO%?DUEFv=+^Z(vlO zz{?}Oq48!z&ICEFuK}MXUD{W^@{|1E)BmR2=wni3`RKK`Q+zc8*8+w*j)HTs&98UK z9iQmWXKA=O=#`YZ(%MopTYiIM0)bav{jQ6gR`RR*SIuP;Mh1qQ+hwJ@*Ezdrrp8|H z*K&AdD%*CjdcMcMEH`sfJyrpBAsNxdrkp^bEuJopAs)xyPCLlStSI1GeyO2sk?fAJ1+p2OWy|Jfu-|G_ zo#Cu7J?GBBRK=E`?EFSQ9{gX=k=*mv&vx5vR|X~l27V9Ct=Gahm>1sLEs&(c$r|AG zbk22#f?qc(-!mSlwwF)t@zk{cp574T#gTZwyyt3=SGKNMv&7=9*DS-cWv_qP>bkd_ zVMpBM;_fZiW;C}5w2Lits#`Byc#hxM?dlbY%`unn@5opmx7L*FMYtma(;vnMoZoaJ V?8;tsy$8CV!PC{xWt~$(69DhOW3m7M literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lleftarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lleftarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6bed12114c738d03186804fb5a466c7e6d4ffb67 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB3!e1)m##pe3!W~HAs)xyPEF)JtRT>OJC$id0DC!~1Cz#r&;ZY)jHN*` zAxsuKI3-?hEYmrC=(p#I-;=73FIHc)ZdqPzs;L8W4Znbsh35jMx4-!qO1xYdvfpmf zdCp)PEvm?p+*ADShZF;c;=J>c4ql#`OSh)E+x9&+;CY`aknG~}-ZnO%{DI!mJum(l zHJ8RN&kXWXOnPW`?(>|p56-R2@2tKy>*RxAJzhVGt4rl!X>1aG>Qc74l>g_&z_ zwzqZsRLKfInmNmHh-(>jDU%`-fwJ}G*Y{L_v-xxey{an^LB{Ts5`sfJyrpBaY>1NriXz-J3L(+Lp+YZopzA-umX?kV?7762HphbNt}n+44llGeG{5f znEM_0C$5NUl}lRWCHg<1@X^8V$C--G9iCgoW4@Z%Y60^;W+#r{`+_-lD!EJvO53!G zVQp#8M81a0iO=USGd#az8ZMFSwKDlHr-$a+*H*s5N6QqCye@dEcdt6RXKUH*ZFl_g zHJw}-GNdmTcR#CKmUGHdUo3QX%q!O3#}Tt)dS7nR@lE=*yS?m5*F23E`@8sFG}trP ZFupkuVJDM))CK4V22WQ%mvv4FO#tpWX1o9Z literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftrightarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftrightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..def0c9ee946544160a53d1c1e7984b11d7f6fa3b GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB2`M)Hifurlm!2+;As)xyPCL!pq9D*V^Q_nc(FFFzq7hBH7aA`&mMxIY zV87A0klE@0-v;Jy8^j+gPc)4&`*WP}S#lgp!MTkSsx}_zYT)Q-&^}<|8y7b%b*IfE zKBHp_i#|`>I;}Wwt*zc%hE=O(J-=D$&1WfSg(AyWngFsI;HKMIZJElu|g52 zoVOcleOm=y?|N4Guh?_zHP=8B-_7d}8t`;zEG_B3T6*_d=n6C6Nl$EC878FOoGdam z)zjs`sfJyrpBajRW7T{Z%R_ItWGhIkx*JMExgivo}9*>hqEoMj5K0bSFk@NHoBZs1$c zQZgaJ@!JDe*{=!}Hy_G>POmVw=VVxQYtKsm&zrOsFljB|Xy^#?n!YWqd*<(b>Cb|< zGdP4kuas+hc%|uWs<;zFL%O44((P^Mb~@LxJGcl|-r*5cRC0N`sfJyrpBHKU^V(}qBy*`6+rAs)xyPI2UAQRH#8o-NqWVx_^ip@Bsvfsyk82dBjf zR+*A~;k?UdbgExj|C_MKWa)na!5b&p&61gf|M(j`f3r7V2)MLov3I=KTmP-w;flfM vb)4%g*J$~Ca6VXdHGlVsvIHjKJ`sfJyrpBX*sR@_c=hJzn(6RAs)xyPPyCLsvyvsxS91vV+li;f@}hNP?Ky1`!s{H z2PI0fJwWDW{@D^m;o&~t>~aoOK6p6c!$f2INi&aHe^tDz)=upI{QLL4-}AqQc*TnTbewJX>KuD<0Z-KZ?+hQl tGo;OXKC?s4)c@6jr=@clB|qph#9P>kEX&e$otxQ1&iQqBaHTBElu~=Rt}DiPyC;OWr9*xD z@sv`85JG60rY)njPSbP?8DoqwAw-fSXD6Vux2d(ZX&L~C41?Q5UDr}d&ycUzbl=5!p3Aa4EO~SdFvbu<0HCTWckD{3E&p2p u0Bq;BZR;kLQip5vBozKC0w4hX0pI~TeHrM5{#JPa0000l1z-ibl-`S4t%b);r<7FN$ItS5;+pu$8Hz~&UuvV zx{fhcmgP1@M6LCCDTe@SZ3tnXM8xPwLI^|z0H3y~X&SBdKHvAflu{|>oZGM7a1jv^ z(c2{eIO@b9z*@U3%WGzy=eBM4uJzuZwCL=RBX=sLBI6?>B3}6Qt~;NRXwxKsF(%r} vIVYt|(Wc(ys1KVpQ-nPKDl#Ag{sG_@p!K|`sfJyrpBA+vK5f9?Z?4tu&dhIkx*JMAp*VFjMn!mHJLJWsH!Im98Ss9e#K(`4>p zrl4#gd?7njbAr8|==)Q`^WUT^D=baPdX=iRno(*2<2weIl*nnD^kYMNHopJ8i1*zd z*E2aiii>)l&&_9INZ~nbARwqz_5QofPOce|q1~k`UhP_U*+lWtWXT%smIre_-#h>L zPw|%`sfJyrpB4N=c)!B>DnH$7b(Lp+YZoqABPMS;h)^f=QSl`;pb143_HtPNBHm}EWJ zFEoiZh;Cp{-!n6{^ro%O&Pg-b?SIaAIWB&9P0$v=6Yg4Q882OHE z(#b#Xpt*Hj_NiGd0#kwx8}vNBu`Tx%PuW+Y?-R1m=>~pNG(R)zv)zrqHs_14mxk9g zbnM~p@bLP1h$X(Gt2@!%rS^V0k9GFi@BhMXOx54a@Q>pI%Y{2PPgQ=2kOz8_!PC{x JWt~$(69BqDd>Q}% literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rsh.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rsh.png new file mode 100644 index 0000000000000000000000000000000000000000..05e8974d689ec6b008136cc9ad3d43c6309be6d0 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBb>6#5*L{IP^E_P~Lp+YZo#xHUqR7+MepbqX(Sw2Y0gLw30QLw6CZSgh zoKp|nJ2A&B)+j~)ufIv==dYqc#?SZoy(*QR#w7AV-r@aUi-wLR_lmujilj}e*wH|JVj_Wvo?vWYl@WQrxLxjjQI;uW8SMx(o`^PjqlF@bmwSJ1F72 ykI!1P;{Dgv0SDL~EI+&R^oyH|7+B}9*Dx@#8*|3({W%BdQU*^~KbLh*2~7Z#K3K;9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-uparrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e539f6517c5518046effd7267c2912b3faf608fe GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBVe#2ncMkxCc6z!vhIkx*JMALxVFex+PjLn53A_o+>nHIZ;^;Y~mcqQL zadYF%1Am=ES7}{P3$m}7pFVe9$q6xL<^E*O0OiQM$*?MfoD~aSa zTQ!$*Go0SUz#z!zV7mJ8-v6Qjt1TG#F8f>6r#!!NJ$R=plYoQ%gVN=G-&bc%=%3E; cPyPeTQ?V<;tgX6BfSzFRboFyt=akR{0A(X*AOHXW literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-updownarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-updownarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa9faa2793f21f080054d1849dc7574deda8119 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBQK7w2eJ6oJA3a?hLp+YZopv$zr~;4c+*QpfEM^-vJDN54Oc4CQmeQQk z(sO_$SO4IaT-RrC&9rxw)7gsVQ-#dy*q2N>#S$f?#KfRf z6n9BvtEQk}pjT$>_1E4<&K#3S%e!3`Ij!6K$=-T99)`;%a|Qp^G)p93FJ)-x=vPsC z_uJ3K@Ywx(2coL?XerrEIv(Y+X6yQ=tg&B23w%5CR_|b}XLvB@v}OJ7sl{?_54ZmL z%X7f8e8*As_uYm@#k!lh73TA-JYv$ gb^lKM@&Eik7#8$$J^d;g4GJ{|Pgg&ebxsLQ06C+Bd;kCd literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/uparrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8f571aed79db6f7609092ff43a3117d91d4f45 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpB0jYD}KJ5bv&GK|{4DmSr_S!*C7DXP`fOP2%B5xmTPhihtotD7qr@l`sfJyrpBLDL$Wf6IVEXFXjULp+YZopzA7MM1!|PRKDVOxh0!?*2HjO|Mg z$5buLy?sw3G&JPEZU)5`>7^_O40vkqzqfYeNR)A3`&CoHvFz9k4eKe|P)r3vUU22WQ%mvv4FO#txcc-sH~ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonleft.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonleft.png new file mode 100644 index 0000000000000000000000000000000000000000..72d093d219db4183e4f06a8ac1ff25b5476f00a8 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBc`=6@i=u!+(Vi}jAs)xyUfalfz=6X#FkUUGS(-J!F6R-?1T_(l&L{E8 zwo)q7RD8-3EtuKnO_X8r2)oJ=5UR5KHFLwgsWYF;cvk0^Hq9z!yx+*k%vQ(g;*wqW f^P|y++6QdYf1PAyR&%KYTEpP!>gTe~DWM4fBD^=H literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonright.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonright.png new file mode 100644 index 0000000000000000000000000000000000000000..76c7335543e8cbc93d1e41d6c4ea90941c510d07 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBd1LN7WwJn_bWaz@5Rc<;uN~xMFyvryC>CAH9PO#Taq^TT?rD?wzWw{& z#qK1xyIwL(ActXzQNKt#L!mdKI;Vst01>%7PXGV_ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upuparrows.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upuparrows.png new file mode 100644 index 0000000000000000000000000000000000000000..129a3383587a640f46949c70667330b9abfc7c52 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyrpBC5_jC-~E9?J3L(+Lp+YZo#x1S#DT~4aw=<2^Tq)7V9tpKd{XSm3;EQ7 zlokp-N;u~DZNmlU#M_60UMT+m;aTy=!HLbd+4^hK?57Ou3=Z#WBd5*PR8lJHOh}*g zT#_Mc?d;1@-G;{`qO+I3b>|Eb6)Zldxm35kLqJeTNl9?-GYcjIW8?nE91JcdzQRhY zw2a#YoH)*`S@n9?KT{=RZ_T%Jg1j`JdaZxo$Sm`qL7m}Vc-KDmuQz@!Jt(iwZX^GJ Zabe7p??p~V8-adc@O1TaS?83{1OWDqVSWGr literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/1.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/1.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1ed2604fd80a290eb50c70dd88ab817998ba27 GIT binary patch literal 748 zcmVMu2(fp|MWlg?c5H8rJ|7zc!MmDr9OoR0E%Hgj z`q)SC_NMuK-tHC(h1buk)rq?|r&eo$avb*-t^Y|=hRKSge<1ybNxR)HQ#^P{?RL9N zCW8=KEEenaT2YjAI-Seq%H=Xb=yJKFQYki4jtgGGUTuQs)bUm1aM|XR5VG6tsGPsv zuYcUj<>JXse9`H2nBo+$_kr}60ZR%`18^E@w#BDLG?HnY;zYDEo6lI(HIT`rei zwa-a4O*r4WUcO2z+ng!vcO2ZO<&Uaym|sMTt{UXQhkS?GK|7X-l(JfF{sq8Ns; z*=(#Ehs|bV7>1%K=kwXoUJ!)obQ-NtjPYF*=86dzkO{pqgd@$4L-;Fi~1gW94d^+Z@w;f^!K8!MR#H! z$VmKXlw4A0@;4;-cwx=``Wa7u|GWF^!W6Cbmp|JubS!#NV;8^v`qQGFaqBr1=RKG0 zKR$2SRu09M3FY51i@mS#RZqI78~Ijrjq%I8?XRcwowu9Cm(&%^<$F=Yx83~g=a^0G zg)-{rKdZ0*x=kW^YRDv}^Rwk$0|Q0AmIjIhitJtJ->h(XW*v9@tIJ1|6gllPKcz=ryW@E6;p%0ZZ~6$88DBLyyY20>ZCiF4Z_SOqY*O=n zvF5Brnssw|R_XsxcM4!}g`f);9VV+RoU$xa%lgTWhgVd5gS|2*sl;lB{@$8zH1o{! z&+E#4mtX#M&tAIfoMrMFozoV5j1Nkz7#(Der$!nbvv@w=$X(RckjFVR^s)(K!seR{ z4Vkl6t&(c{ID5aha-$qy`@Nluo8Eo@4Wi=orh}+;VXHw@)HKnyg#w34V;OGbZD)9} zYn^}+&*6C47Q4`^u|0-fD+QEJZ}Kxwi&Se_FvZUHRvx$gbU_hEINJR}`jsgE&%c)w Rp99kkgQu&X%Q~loCIF=@6Jh`W literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/3.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/3.png new file mode 100644 index 0000000000000000000000000000000000000000..8abe1967dd22b51f7d729b9bca875f27b29be623 GIT binary patch literal 813 zcmV+|1JeA7P)yIo5kJ+ML3>9leWI3H~HE0xOK+?7ft zOZ`7=vR$9;9gjyr5H6RC&*x(pCL9i{dXLBR%rq56F%Srt^^zp{{eGDH5cEw!;gy1* z5EOzsA9TH5H=9kIwO+3;mrLRuN-!9--$~dwV41qzZdK^@dV(ORvLFb(UeDn0Oim}0 z3Bxd|%rMMkGI>6yxm?cvfR)W=$#PmK6f~J-S-nYL%;)oDyFP6k^m|8rF%pU3>SBY^ zG_4A!(@C$_ikbt#=&(P&gG76*gDql^_oq*AGJxol7x?tkuD ztJP{Ml_F}Fm?+0_=IbZJ?blr^P1Cp!tj}L;Jp%h{$ww|Nzkf2_Za4iWSrxTfZL`@( zlEiTwMNzF*i=rrw<0MJiY&Nx8&AeC;|MDy3n9t|2Sgc;JFBS`;iqq+|(P$(RiPdUF r+9({CfhZ6KqCgag0#P6eL`m=ga(>!t>00000NkvXXu0mjfvKw{7 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/4.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/4.png new file mode 100644 index 0000000000000000000000000000000000000000..31ad7f74479356eabf76a76e8bb97454a87d3834 GIT binary patch literal 635 zcmV->0)+jEP)Q2HWC6$!x=aD*!)BrN$WEJap+oLvGe`)OWJzm4NqJy=7mc0CimSziR>^gl*ehTgxyL&p}k_9y4MLI-cGU2-Lu*3?jNg~ zyWI|bA4!KJ#Uq8JNQ$I`keb7gmZY!35IvV}b43F{6h*G<20^f1uOD;gmZYxh9u5aR zFCdEIP3MX0y?o^ZC33(#d4<81{_v@atiol(K1>4oIIyeeI9bW4vft zmWnU&-bYd-MN-U82EZ5m5ui{Mib7E+3PqtPbYP)`5XRW|$1}zVA-^EhvMiNH_B6g1 z(_bzZ0Lb%P2*DU*j0quB-CK2i4*PQoA%y370O0#RX!R=9^gPc{ejjv4Ips8N-5_&3_}1&l0nxd3hkrpqW4g`!Xtib7E+3Pqtm!9Q5k V#~#b6-emv)002ovPDHLkV1g$~6*B+; literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/btn.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/btn.png new file mode 100644 index 0000000000000000000000000000000000000000..77d7c10b296c249d3d557fc6a29a5221b4173d9a GIT binary patch literal 6784 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 i+iO?PToSNf0{;&Q$@k<}p6WUP0000b!J z!r;*0CzHuZ3L$_9P`Fp%=!H>FGd-6kn}j)Tk|f$TktFhW^Pa%6EX2p+O2M)$B&U)j z36R9hr!yppyT=P4VqM;9a^8xk|qGjt9erQj!F@JW80q?8htWidVP zxnFH2E+^Efx~}&HNX@1wrFWQRS&&k8d=QJq6rY?!M_XT84|zAcm}UNMUK2v#tT+n* z5JGfCp#``t7eWa2j!2i=yL4VTjITEjP8YyEayh;Ta|7w3bCP>^1R=BRHa(mVChNeEqy=_>jv{6zno`&Ij>G$`EG@55_{!6 zN+}_wgltHpW>c)zswzi%+Ng+#z7$rn7D734`fPk<3r@Wp{Pzs7Z5x*+E-`a8L)*4P zLr0tI+<3Ube)8>~I>S*g0}J;Hyl7rz=}D<~zngLC`80jr`}Kh&s?V!TP9;0?CVReh z9OupCR5HX9g*)frI)@H|J-5dL`hbquxmbuRmHi4cUuKY9%t8pE>Tb`sx?atFlSAfe zhUNV-gVjLSJ>2d}*<(PxUPo*=7Lu(#ScNfSAQp{je|NaQjPr&Ti^j0Ex#iXGw#$vT z4IlzIFP+WMbPaehs?}*#63>2qMj-^#^XbrR6d#K-{%%~&L*23OekMMcpfO^E z^ou)13L%)gm7{a$z;PUO`blttn@aY6{J2PC#Gqf8k2~D@!-6qlaOJ^@H!U{%;5Lp) z!hXd(aXF!_udO3JpYEY$_ey=9V*YL(lOIiLVxWT+!i^k5!{Sbn=D5lAjdcbs^*e9w zR*rk+J$BQq`n<~Aog8ID_Rv%|B+PM>OV^ir!q~qTw1E0i{SD`(^QZmNra5M6A*=lf uHF&E&vf4q-Yrw;u(OJ>>|7P@WG2kzFYjbyphIGjQ0000La=QK$f2$t>p(DOX+d++<)Xmew2Y2oq$!!S#= zb+b;#^T~Jm6#ZZQacI*aO{z_@h1+Cchmg@-+=8Iy*&SGiw!3%l9V{_SibahkXUOg zmT!SltWp6F5*x(ct{|eGmF%%5{&qmATx+3SK}Xn=nN8p}QJl4~&njqWQTfbM+=%cYZGVTrN+O;giPx z)#&LKbx$&#*_JM5#)m$2dq{14t+M`!UWv7usW;-!tzUK$q0OSHMQw1a2sU(SyV$>=rClU(D0Grup_00b zm%%~~EaX7~_rQbCA+3#AHScUJ^@F#(;rD*u_kQ2+`xGL=dB!E2b6iXUob%M?`X*Uf zi)LnL$UpF@FjXKcYfC|$KwiP3{d|J zqeiZs3M7+Bh_-mK`Q`1 z(pDnuw!`ycixeKifn*cHZ@ zC*>|O|J8k*Nr&_yof?e>Wpi2bK6(_i0ubx4UFf3GR6u40i(G+tEbfhFM!{6} f;8c2FViFh?3y^w370~qErUQl>DSr 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 U9@IYl`WRldVxgqH$~Er)0j{AjO8@`> literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/script.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/script.png new file mode 100644 index 0000000000000000000000000000000000000000..e29e594005eca1fc12b32117e9da1e6d277f8f7c GIT binary patch literal 1311 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 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sum.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sum.png new file mode 100644 index 0000000000000000000000000000000000000000..8c663e2bc0b315ae98a5892227b9bd27c4a393a9 GIT binary patch literal 4273 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 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char.png new file mode 100644 index 0000000000000000000000000000000000000000..4eef3c380b0f322363f83f032d27ff8367f54a71 GIT binary patch literal 89633 zcmeF3WmFu^+O7$KK!6~@10+a*;2JczyIXL#fnYNPcXuafa1TBNx8N3h1}6|)gZpXT z_uJpz`#bxrb^e~U&QGZ6?&|82=eh2?Doj~X>IK>>Gz0{M7c$b~st5>3x(EnQT2P+> z|9Jv0O+r8*N01R0QU7ePcZd9)spt3(iyO0Z(cjhq73n$Bi-XPp+=YN<6jvDsS69Th z+DAs6i=qy$4?aS7ZD1d-jnO>;kHaqqyqo3jStl7DV_5?FwM|V$wqT7jR-uP%o-k}| zL{VW>)F%|=NP)ip`iC$zDh5?e!Anvw?*CTyUqAeeBo6Jz{`brNc@Jd@L`q$HB(;W@ z|NewKWIwv1jETFuLmyX;VOB986&-i9$LC+a04}&z(2`O4_XjG!K;&Nbtetn6R9N(R zxLLNbFK+(3!oqJJYe4?*HRvE0GlIe`oIUpIQ*@n2-lM=1b{&Hr>*a`z4S$JZSx@=z zulmZbqZ>l_hS`U{BNJ$UEigH3 zy~yJKov5~Oe{-09|0LfJ+lm~h`70Qms?5K%WB{?B(EV|Y;EqY*7Yq6q-5JiK+xKUc zK8-3;Wc8=6?v2=+E~&=Bj{JL70Ui%`7p-~McNfdeXEVBE747%etqV=(hokRj_3Vo> zAx|c z_P(i5dOws<*?vE#z_*=$u;4rfW+<=f`r5tUeAwokV(9HwvRTMA@yX|AUUhZ`JWiYK z`AgHl&D?b}({*M#@E|=v__x{6T8z*E>pL2z|Ityl@cc}pd3yzpf8Z{~F;G2RjrlBm zI2m5c?AGr3CaAa(#l5uEOY*6OV#K~~T=HP~;l9D+&j77y$%G33*4eJ%!`v$448;(0 zb2`six67{F*8HkS`wRaLb!I zjtOb1M(d)?nHay)joiTj0>0QPaqqXl82cfD0KNX!eBi`TQKy>mY&sn1kuo@+_v>dD zb}QSL;xHK#sYSoGllum+55CL$Z22wnc3a8ENloE>QcQ3dwRp&a>#|ogGGDaEJLfTh zhM0I?PMfq9X~u>HC;R4oXqm)&%E?Z*`K!UY!_}kJF}EQTAmJ$Ze#WVk&784m=|Pt&H++W@ztVSZ@a6Dmu)6YHv+< z>?IZmezmcS%#EAo8_sGPTFrrX9B@0K%4N?msmrDZY~)RmPz;A;uG@4`%D z?1oRooL)P0Jn?oF5x2atuf`r^)ST6Gj>4)Yl~)Z!W-&hMoS`0NktOH603IW0WWuiw zZ(BV))iG#~+fjC%+NO&6@QaX+r$3S!%>jx_kUJG+wCPgSFF~lkPS!XsNitGVJIcqD zomoeek%1#cIzGQ_^iujsF2;<$>moEJD(~`YGuuPn6g7^sc1*DOfufY3LCesqUKc#A z(V7shHiy?)LK~mQ7&aZXq(H4p{^GUA9-HgUenW#7Q!>|IVYE#O zT<{+WkujF1LSkn*P?JRcBSm8S@2d-<=uA_ako;_sLY(JR z)=?e67hO@Ca#&YGv*nvK4-)Vr_9=N~abBPitv1NY1%bxmQ z;S9;wic1nt<3XzhD0#E8i3d~lBN#g@>@pQKgY>Th_z3AU{TJT!6J%)gmnN=8NG9WC zg}&a1{nKS!-5s$4e1l!Q`-xdop*_xyo!R}NA-H^jCHD1cU!E||Y54W2_SQ4U@&^a4B=Q*99Rcl)6gkNPnRhJ`95u~ZR z&Yo+u?Ua_aoJhUni$kDkFt z*ar&zZ#EPa0cn&vPGMJJADMHa#5m&(rmS7ellV9+*&aNPdk8T>p;K0+oIxOCufC61 zVG7XO9j*31TrR*w$X%cAbVeB;;UWlPlH*DCihUvmt>Tc3W*m(i2qv-LBJ|Et>lQr) zR-g+-{N>dk2VinZ>5-eAj`ZDsO?W1QO9~-yk=IrT_qC#jcM(x7XORi^QVG!^34}_! z19R4$|3bz(<(~pYGDp~WC+T^icy!>pEYGJ`ogJ8l3DT4shz@3?y`eBvJH&FU`Os1t ziG%`5-OwrWYhP0D4BWsbRGy>2?%H>juAJ#MonY)2w^Jep#_fB`u9V<8UNF1E%PxI^ zd4W6&dw-|KH;Iq=G)7{4RgFZn{8(J_PuNNOxRF#<-`nFoK9zN zSFwDG6?)il81gw;`({g|im*Zh-rrxYd94XZQ2XksoK&+RV#|zGMPOlEK<$8ejaz#}qM%Bl zwnEnGww9g-gF3CWUDk$IwW}{__Ck8n@$I{G$hk4ZI1qz_h>#RAo8g&|J)`z4K{LlB zYCX^epG36rlkZ8rz=o6e%0j*y)lep?JZq7wt2IpbaIx9qnv<_o^mHE zHH*^-JsIV1em|p~cjOWK^^!xpNrXs*k-c)70*^k3i1v3+V1GIgXnFQOgt<`fCm{CI znPoWk9y{ag7AmJc?Wm>OUD?x1<^+;&QtN<`}{>Gp$>8mb#40I*GU<@!>yM$)ZSC zdQ5QM=hQ~u&Hh%e@20z5AcatcrGLe}Ciad+HU7+eH~1m#&VzPrVY}YAJ?IX;?X}ai zq*`UN7Ju=94wy2XDA7Jj#KubctvRjup@O8;_(DwcU~hpFxIR~G7ZpV0kkrcfx+k^ne7j-Xtk<~-|4?=Ey#J*X4EMTN3|V-^-XDtJ`=L#EShRALL$y4yG2D$-DRqea zE{p&a&q+}e1a|mdO&9^n>E}RBG#%y#pYuXpfgrdESdPlpEShL^KVRuAX~F2xU8uNg z=B9p&*L~ERC}cv2fGLt{WKnB`i}kf?b`tLCY%^qKB0uHXFgEguk%1nCN`80n55}>< z|KPr@3&Zp=fO#w_pqkg=sw4gU5XyAv8nYW*y($*bFBGJ^iMf-ZA6o-<`Jzz$ zeNQPAhpnjd3(DKBcf6Q8WnQ={?EYXpYjy1H{3^{e-JQ!_L+d|Pa3jakx*j_CHP)8F zI7j{+&p6|hG&x$ZHcIMIu%dehN<-X=&=kdT`c`pbXusHEM zx~gbcYT}v>4K^XIcWxUe%rwE%A%IV`HHSInZHx`Ev@dL$^uGE*V{30CuIIj8;3a5@ zNo`*HObdzc zC;8V9QW2wrOnH1^ zR5z*^AeC;sAbS$GR`@`aNDQ zO#$64$u+y>4{4S{K|ES6M>B^wVZkl~<~Fx70gaoF0B;Cz{}+rH;`d)WcVlrP7D{>d%niCYUlR>cN=^{s~E&*oEYw zeEY@pl`P@v)tt}zUpU*ttZ7p|1l8hZvBqn47s$##>uNO#LfSCK&zgw8UVkO$W4uYF zSBzKC!&z{co<`qIiU4uj)+TUNMX5H5csf_avMVdLU;p6Njy;V$u58I?qa&c!I;IVB z5~njh&O{Y|Q9>6ugymu^mAn9}bZzblX~Y@alIXl1Gi zn5t?*&aCNs$HDE;B{95aY4~{+St@@7NX68(8~hjbAP;eTq(T$CsR?16?6j5Bbo@a6 zl{rhT$(I1kMtOezb+KvU0;wyc0c3X{U0xFPab!d0tlO&W8U4yl4Z3ik@0dYoMXBx_ zo};9qZ{;)nM-qC83VDO}ali=A&wfR)%#=v>T?DV2t+ivoe;$v>d3J`TuojaSj$x-G zFg%gzONmvKs`gRM;ZJ%Z0zLY<3SWKZ&xwT_sj$FLcY$B4uo*@WJx}O;M zj>M4xCS_oiV_W)j`rc{qkLP~chd%`goBJDcvBFfX^vO@>WVI&4T(QtQXtn~|fW=%j ztaxqQ+KM;&-Kc~<#qlCcSAUsemSi*h==K8z6AJB<_*BuZe9xBSUJ`H#$9fwKqmK|* zKy(f<@EM63>_v)axmvjB>wkv# z%AM!1`Z^N2CJ(GO@uGK~hL|?d1#mS2V!bbKmLJ-brg+Wxov(mQY*voD{+4;)>49v3alNKCug=vPN^J!mm%{T0T1@c@%s>!fF;l zraL$^0uiqu|HkCc6gVi#LSf+GaOtsg8Uo4ukSfSRA8h+xPxbY5RE738E3#&d)>DoI zZ8gPd6VaMH$MLf0{t$L;{5S@J9&`6Xq6f_wBz{>1`5DT%h;I_7v7jxiDvLpmfG5hLp$=tm6OO0>c(J@sJyqtp_K?{*S%qj1K2D+pH4naJ+xku3UrD@6o{RH*UWowYj?eV zilDghS6;u{0`k?L?Vogce}QBHKBFqQ6MVrEh_~HK`f2zRX@+*hW)%@LvN10OCCwM5 zyC-wzDbOS}DRFE}P8Bq^z))05DrwxoLUli42tipY+n8L%s|kTYsN9=)MeXE_?PrrT z@k}33?z*>4rv&{O8D7a@*NCIyNq}7fWWF3Kuc5rOT5#+mbK-rA(zjxPe#N0Q4G$?q z5J#6Nu27_K-j0)cy$!a>%?CmoS2GSClX#}n=Q#0rfx&f;oFW~j(8wo}Q5$V^aHt7{ zKjDg0HU-kdgeDEXTOOicg(y4T%8u6*&eS8Q5u6&Qsi0*bK80}7s{IS?| z+2EUAqy#w>Z&5`cF;W`xwfbbvnqClyXt<(f;+%p7mGCbJ;Ht>sXG>4}g7o)7-gv`8 zeymj~Uyv&m2MIIbXP{?fmF|<$`bwCo*r*lbijM;@YBTQ>`O9LFfFG0}tZ%;O%t!===;)G+3#hX%D-zb}I1r(A{7^8=&vky5Hy)LuB!B2a8UxpfMhja#!>r^xQoft#8; zMS7z5UE!*p6ftnT3SDyk67CfIUShhIOHFb1b9w-JNhmK9BEAsz4Z}PCC@%MuPmCVb zPb3r}NKfZGTn68q!l+X!zhjtVOz)hb$v&3KC|?wgmsGk+NgtL*JoPX%D9o`f(spC2{_0vV#~BV&e=2wK5}2p-N~cFC`GS5w9q55HraUzKBlYjH9?A(uu$L z%F=de(%%J%Dtnd?1hgfme&6wT6GIGq|6rex5XoVs6D@gP@!*REfXjU4!2@`fJ` z1-Vn6Oe=*xARP2l9szB4spm~8S7I#kQNo7ew|VQ?%!w4lS&uu8=_SR_=ZN{AMabiK zrew*9N|eMYK22mx@9NssPxD#J&dx;oPSeRJF{_`fou$u5fVR2ysU`jr8~$5W5oSZg zQ|(pJRF5dnCqd%*m5i6eE|u(z@xI-C1YxlpO@K4PJ5OF#X#DvX;5O$RXqW}Fy|G4Y_zyANN z_WL1X1TcE=#j;O(Gl2FN%@Py{id5<+a1e#=P80qTqPXTklj9dI)&KIr-6f2E#xnJh zxn|58hmg7V*mn55iR_U5FX^iX^}{*L)c#xJ#vj6RV7fa1BqLnChmekg=EDO_K#>w< z{M<+CJj`YfGY*OJpM8q;VPzxR$J_M>j?{MXuGj@1?JzTvspt!Wqfjn0qT_Rv{|3K$lSMbx};Gtq>&1<+-)v) z$|{?HdAg73`-=Z~*70Vx52PD|BN7n)W)~9G6p1SqAuj|jR|2wNzIgBAA33;P+tmis z^DmHnmp@mJ0SLaxaX(cI2E`(#Z3dgeN$(c*@$(Yb`Me{+Ez@jO+=T(A|;PD~h zQr}AoWn{!hX(3zf826ItR{@$jI3^KQnEasq;U057`62xq?K5P!Xnt=r|H0N@N*b`l z6^S*!sbj1u@St{Ze;lw7 z)?C$%q7VTkWH=0&(qt$6be8ChRl>A37+@wGb#c`f7M*UsX6t!{yWgCF&r;<2+2r|X7tp?YK$TD~{tU73 zL#F2k0QvJb1a3}v0pP815$_*(aZGIE-=IvYWWehQ8SaWsd_c-_+aTr!gg%cRKpfcGpW#R8(u4$R3OGl#%9V+H1vI*I@RvN*Rz?$VK!1QVwrRU4 zdr63kOTX7UMbAm*Q4YExGYjoarL3W*nVW{1D^kSa##>M#-hj`Yyc?g&-PHI7 z>tYmd$sPqdysiME!m(Lp?er% zu-S*IbW$~O=nwJc3uu=64juOpW9=o$aaTHcMrV=G(35SwSNtszeAdIZsasfb1rSUj z?bp+lA3ARUji(VvoGX>YpNl^`>8_tO*xfZ`s{1J#<^OcizU5dlJ6EINlpCO!FL$YD zRBpNYrdY%FJ2uH&I+~&{NUnSEW?DdVI^ygU*Et*ufhJ}9T$Luj%mRk5&g&tnOj}v^!iCi0`&jp z+h@`?)rn)V-2GHWCc8R`Iw}%A=kicim_xi8`!{pGx71I-OA z)S*f!Ct$z=p>zn$?2}nm6d%Kn&j5Mx=3$Mo{pO(A9#Ego9u(_67JOn83xg4?qhaHK zj=!B50tl0is63CNE(_?oNa${05zvb5ffUCM&w)~RA@C3xD>7%7cj0 zt4E9`dv^NrDY^b!Gu10nxLG0@gtrYrzfivbEt!0i{?Z$gIR*&3QPR{kymT2uOz$~^ z9&9B7w}%+54U-J?6PSpwDTDyE$g8~=mKiU;Wrq0Glo)#@O;mMdDvGI~mri2&w1F$E z%MF##L(w3^%o zuxsgl>WY2U?V-=Z?$77`j7fT*SA!0I;3}QcLPvPkBJIQJ3b$%QbpYtP2n@mlNiwi{ zw(Jxq@t#>k+$+WpVqLyLRdHy>;j)qUwW8m7UQ8_;FLn@#7r}z$9W!bapFH&GK&_%^ z0(U2U9+i2PNMe$_as_RA`90KpO{lfFz8Y7=2n7u#uWkbBjna6Cg%~_hSz7Z*P69!v zohzyX{VYf5YW0(3UH)66YUkQ3B4>yJiG>pUn#~PKUY_hrrCU*8I{Iz)RRUjSGWBGI zqJA9HJ23&g$UpXAvz^66+1 zt9`4x;IoE4t-9V77Z9GD5~U{`PPMv*bv8E~69^s+jbC@Tni}8S z^}%jVCzTRLkqIPT#($GQlII?S@4J#?xupc2XB62sTpXr>j47tk;U*MTi}Xv|7pk$S zi|m(@l)lGC*s_*44LFBj(AhcUN4JS#l_AjU3fd=kgQlL&x$jnZ zWxm+4_gw>QG8q{T)tt0hhd@AckhXq^pM7*=+_}RS{ro^u3sOa>3u1fFK-bww2 zi;8(9M>hR3>zk=pveQx>Z_aZZE(7v?O4`_%%6&LqHj*=>GcdZh&@^h^;-!x%3$6smsK>+ z_rJ7@V2Zud%u&)ZLpRd>#@JC{!8PRK4XP=KRCJqFPkJ+BcLQ|S-sH68hy|vlr&k`O z@Cn_+mrR{FYZ`>x!;|5magPoNspSlZuIEc^g&o^Kn6ay=ZH(;N{et__rON9ZUepk> zvpS!j|2W2-J@%@luv|;d%VJUS2sXsO@<}(@*HH(BEHXp~DpDAU1QH>w0TvS;ab(I- zp4_y&oX)*0j{}(;gAy(j4)_Fp!!qdwOp!oQUghlzGr3Z{h;p`S=I2-z@618?hIm;` z)(ydR4eG(+=?vgznms*Bdq_U;4pYln?k^-pa708Ms1HJUTrn}G(5AN3!lnh>pDyFCU++WEV z3dOSEJvQIW@1x(=$YCNo*gr6NOJRa665;8T;yRX*(z1l0g0 zw$CK~!vRyarBm(VGYK(2#jRK8 z#ff5k&ej$x?4p_fmU)Cb-#FxPPcvg%eVh~}ExTV8a&MV>t>Tg<&*)*RCCvkwk~DbY zC{18vP$12~IgxY~D&2e($Q03*gJoJ2XuewytDe%xs#ySn3Z##1DAb#X#LNY5Qjj9A}s!;At1DFV&2izasm=Tsx}viGUGITH2zt4-y$1p887 ziVDFb%;Y{1D5rF5NtR8y{W5o%dOsq*63H>@kZ#{p!oOQyd)rLSkiUZiSA`fT94CUK zTJJ@nu&~YIiHaGNT8dAbnfoo+DPuvn%l8>!P?h>7T3 z6-AkhiCIs6GL`Edakl_Q6*6mv~Hu8n<$S}d!{-5srs6u zvY)}3X0!#rFiK(%pX|c~y+WOR2IC);=3mR2B*T0ZhkNDZ-j%_P1Ttio7-_sC=zRSK#Sx@)7E|K~}^3;Rf&KirH>yDv6uh z7=k3Uw|*hDXLni@_4$9CGaWGjAfN7R&GJxL~;6}=3-s>40@~vZnhYiA?{2Yzvf35t-Zozu7_2LCUzGgehgK^pKUsT|-4LBvDchesm7{C! z`-u-O8Zs|eJ$$0>6@`z!)|TA&kvk{u0%IRUN2AEna^$a6bh-b@NB7kM5K0VJeE$`G zAG(n0f6^6K2{6|0l_@`w06kEb#dldlOaHfzDk@mdWZp4+lN7@){uy-UqwST{Z*g+P zXQgV=R5fI|Ee^kdQ2S^0JBh(pC!k4jGdXAXACU4ZyXXMk{@eEF;^v;{!t=r%yeCX6YhfiGk~e%K0h}AOYr;iol}0YwugI<3n1%n zGQ9tja;NA@x4?)bTJt+6oro3RT~9X}v7C^v z%7{b5EPB|6JbkJR119lbw`RPIp~3TkZb9VgJCuq|H-)H2ZJNE2(&D`}9}+ei$ZM$a z|GcnEkx3+Uwn_e;bHu62)b+0YdWXRkh;o`9?Ivt|ZMT1hqSqWv^O-m|ativtiu$5P zJ(^zbd3p+m_8XQDB#DdzRq5hdKcK%|1u`Yh{C<4~r;uN3vCNb5911LeHS6Fp<(^Ci z)_ol5y;4-dIHt@C;qkb!%;l1$Pn_0bW2zkvGirsJQxTuRt_@Q(Wv-KW!{noBUn3+M z#oiUt;Fj%z7wKpa-QI_pK(m`FM8u#SqlJ7s^k7=o32$7q7I1FmH+)0@+T{!TCZtJ{ z*l{kOvh|U!-G(ROfh#Y;PcoXIG4g*unKZlecGOo#A1VHExYckjO~*u|It zE1Nbh;r|QX1a^>%t^n?|BXC%#4V^BQ8Fpu$)L*akw;j9Vt0aIPzaDrCwEPQ+`WJV$ z@_WE1T`H-5f&17Fe_!;k@bcMX`7`jv?&`lI)PMZOuM`IxuKGT=Df>U)pS2h$XD@Cx z#A5jyH~-J4s7LwsCzs+(-~CIa0A~8%_ZN9A7g@Y>|NQs+|AU$S<2PSz0K>U@RPh1r zKQDUnFF(b2EXUY6nC(XY*MI->O*N>eS1OB2|M~tzQ$RWK)M8}_ zA>x0$Ln-iy<)%Y-y#Hfq;Qvh*sQ)LIES=H#yDwm9BN=$?zwaBPj9_Fp%C1g9xdDQm z+u6QXw&e!)d53>(5cubJdWSkC3I%;%4PG)%bsD52LtjtQGT1Y`ZL#u-R+59#C zbJ*TatCOniSOd6~qdS9b+r1606{8*754t4jviT+|+Qr55drMR#6Y?+)kiBZ4=3qy43LD>-ZGY6`z^ zn2}c}(5Q}9oUg$FFSw3ui5^Y%XA~Wz9jOs?Tqr9=kpkzi10d|Shqu_hBKrCSWL>r)Pkev}ZlntG=6pdF@aXzKI;wKE++_3Tf6v@ze^o{V|DPQSt> z`9+IgV!Urj_Eb(GVt*kJAqUqKn@p`uE1b2)&G)KnBa#TBK*FPlZ365d*ieQRBQMu;VK@i#^1OW%|EBF3g0{>fw9tB zaR0HJq@a;JH>y}-@(lh~z2WF$Qf}G@g}=1_S_C6C@vd>J4h4x??lH|2hQJ%_vfvw2 zcxv)&f!MWCsirXk&?2y#yx~ z@6bx<#$|?4T1eFxOIb0yJ0UZ*=pS5aLt9dN6Zf+j6&1GI8EHyR*(t-3;d zMh;z2wJoC)RRc4*%Us2J(|Mcfz6Eu>UwRjBMY4&lV=$9#^jw?WEbuv26~yqKNtu z#dPR1EBxPTr;6osZGV<7B-ZgDv*?ORaZE%)y}=wdn4(1CYVW1Z4^UWL?1>06!q3E) zHAnff`yep8jyO52NumRy0=+FZ1ftOMiRy=<$h4ZDx_c-$(eH`z;Jnw`oL~0$;PqTN zzvD#Bdlf2YwJ#}=B1X_}U)1CgT71`P?Xb>^;(8@2`X%bjeOa;1aO%@)G~eAb$gpm; zG(A<0E)%0J;EV7VDVhxy_hZ6V-8;{7Wx!zkAb3tWb_A-2)i!cKzVY0do4yes4gkzF ze^}A_42U;#)o$!uTSuO+f>(a<_d-_Y7xQ+;(${$sDcDqbwJ8qFPs^LK{~V;ux++k7 z+{^5Jg(k&<%x1SXGI3H9N3vyQn*$a(>qw3hwo&P}ZacEF! zJCQ*wD2D^@dQW%zL6^2Z93dLV*rtMrU)G8F8!X(%q+tR^+RjwAGm!_fGEbSV5hRXhk;}b%VrNgUwWVb|qoNWjeiV z`*m;l8U^Kfs}ZMkNPZnw+hV111bNLLBq^jpPy7_C$ppK(%>FRxRpTyrv~taVGG+?i z8=~g=5^|>|X=XThy|-lry}`?*~1jjj#LBf6Xg zk@f>7W+%dEy6p0`n0S2EPr7az!k~Ebql0|fnx5?EX+76$({t?nTqmG~{$~3=M~!9l z%>eb2@4N~UB8jd)nX%W%9C^dNr#ys4;K9JKr_E zzg?s}b|;=}_2h=)E-23CE}kZiGo9a8Ef4De)>Xpa`wnu|k^?(aZ~Hn4+AAhjK)1)F zCD%1!W)THOI3n>j2~>3z4$MmLV?xHME>TzcQhapHti!K3J+abX8_$`e)f8yh6l5Yy z*(;X)a`w1L4zn@eH&IE_sMFtgt&qkc<`vQZ^ymk4s~cu(9MRTi7^-kuw>wl5XwZCP zCR7PD)WFy03A|V^dcqfE#G!0uqLw1uHPqlhB=_I@?CjP*i>h6x!}|j?^F@oE8TOo6 z2$k$FPL$PLmFYNDhFdZ_V=>s^zx)jK=(#wtd79MtDQWgA338L_^eyWj->bgsC~pkM z!9oM|t6PbS!T5JAp%w26y!sT8Y_wP_WxX7O$Ell%gblkZ2G8df%QOHF#fZJaIcyYi zQNDA6H!8xgxJ@P3JZz9+BUKR=$3($pVOSE*n9i)DNc)XJzsV#yvc$B)_@Fr#my^6GzFf?#HlwjKbo^E4uuQ0^Ub8bKe zaIU-LDt^qW+Qv40{nd^^*f1ERVm9=!%hVrmbcCyGSfeAcT=2)VoXfbhZa24H&UAo4 z4$DfTs<^br41R;h_VxTCG1C_3Eu*NNF}7{Z;4e%5JplOM#Xe8)bmwoXVqDVD*IMuQ z)qyh0XxKsAv!~9KMZHGi2403#Kq&dVmTG3xnS!i6bWjAFtLQuqOTUS|F<>l-!5Tf+ zB`AW8Q@Q;Jm#_|uGow=t4F~bEP*&3OTZ6MT&Cr+SWHyQ%FvF{Cw5TXq#04cEej6u( z9aMQZ&-cvLEOvTJ>6+_u0;cIB(*?UXRI{E<<@Xcp_3voH(x{Pn$>yw=JYM_~lrO57 z|JLZkv(y==PDYiRCJFt@LbQq?DqE16p7s)sNMJrhf@jV(Wo@YNg`;-NDpf}&Mia*$ z{42rr5YKiHG6vJG>4^p_;Dk@1)wR5OqoCc-O8%vV^>bNiW;jR$YYvJ^B1b0O<1%M< z4am$`+aIY;e!kbZ%l8<=W*`KtcC0k} zR^0~kJEu1al)77QPU+B;xKMuP8uEF~*jKUysBAfa=K=4JslkdsioRR{`QsFxng?gj z#mr<{{7!P~ai^HjPoVoS$H6wbht~k3ds--#MV3ccq}UtDIa0WzT%2aoL})6ia%>Py-ybfKRM|E z5Pu9ED3j~?d#PT4i3qV&e>O6ZvH;A@TgWN3+Zu4UfFMhdWh)sxzGg`hZS$)YGm98@ zeyF{5NZho;bE+njmUJE5VIXeKS{R0Ans7JEM2o?LqosCWeYm{WNt@#> zv3&*>5(8p~Bb{AJEWm2NSZGrE0xPS8xrLrWw_Nxe+0C$j!c<}+&P!jwy_WfEMtrMB z+WpF&%j@f6S8ED%(34x&G;i3|L~pXr8$Fvh-IerdjHX?cwg_#6tn6xWy7wtb1Y*Q( zHDZ}24|kBg8(0$LXW7^e&BJeIA%2iV)Sc1?k(CR`-JlX?xcNlnyxD(AW{gvn z9+{}j5BL&*OpFJ_%F`KkbXe84*!eD)fA(_p)#a?5lSQ#@aq}~uChg#HM<5RJi!ehz zQru0x?ek-kYOkY*We;|u?YD26$q`ZD%p0>%;&jBgzBwl-i#E|D>?I|6qeGdusHf7` zT!pVVoMc?Rz&D3=Xr10=e*4`($!2?9r(-LOHmkoP%0eQ@E^}$X%cB)4<7{!s2#!Np z{H0NNZn!teW4fXN;4u9v4r|r^a(Rk8d;W4EZJBc z%%zYiWFkJ7^BB^>5Y+2S81fhQdV*s{#xp8O;k1I1xdEtTi7Aa=bn5ou52J z)4?fIb((VxO^YhHMjVawbl#ZX(16$Tw|+PeTl-$&NBTHb>RqEr3atvmh@nJx~6k!D3Tp`Z1-R<%`3SPU+e0X>Ua zw=1OcdpWrUJY))djLjNCvw=i>xILw6gLM5g?B~F!g8t`ol#Cts^LxlLV`sv&(6n9} zbKjvS&XBmaZCyj(nwA$rSB$~N|`pG z)Ky{ayJi?BzG=C}auDVX;5psdf8k{siwgNHxdaQBNweJabr^k4#qnn&ylL}Xv&md$ zwTT-=+!a&tw}SALQgVAI6u&fKPLDXM-`DG>bo&}(c{Xp*HIxP2Fc_Q*Kki9FG+ zIBK6~!*4i-^92Cd5^WV*)Zi5;;t`mmAgy(v{3pEPNBBmvcw042K`kc{yI4oy4 zS8*1gBg!m@@~Okf)vlMjUZp#Sn2MUSh1boy(E#Y+B=ci`t1ORLoa7uk;fP9xy2Qle zM@Lp({#0)r)Kk~aewRSaZNlHrcC4)1N~N5<9wkA3dM_TZiAmsSrbK!o5Fg_7#WmB5 z<=jFg&R%0jg%19*#xv~)%GlSL1T;VFClFKO2XiMc6b>i(Bg#CKTI4PGzY(x!?1)JT zOizg!1=0aTu#Xd}!&uSE)g=1AK^*Ki0RK5=(~9^%;2DHRLWgjmCy@4^3EKa^{{Ol5 z`zeI;`Oz-{C|)q0-|3}VYrgTKe}8_~tw$cZr67#(H~s4{5?*=aTxyEE1thlR)$xJ{ z0K!_gNHu3G z!f`GEJhuRBu$>8Qr1Rw5kX>R>h^GPKcF(l(AwX-`-nR}RgB0s4EL~)KUzg}w7bMvj z;)a1rTKT8{3tD2BA!Yg8ySV~tb|YY_?|XDmMR}?d>^%A^0A05)o&~0}z*zm`<>M(1 zb{LvG9Kl$DayEXEe@PHlc~Qw9lLYsH7dSlt&L(i7isDqwJAJh`xMK8px_~{9aGV6@ zm>E&{o&b_-#CL!YHnL$sfU?hsR)AMAMKMa`s}H?D)1zO^9@t-fagJw-xt8ez*k*X= zmVo;&0ERR}l5NVG0-w2pI)X?EFYNv>_8%IQI6?9_@*=JuX$v~QnE_i-ZIbLo zF{&Qmor}ia0USfsOgA#Aw~vNPO?~imF<)u*LkI#U8s_5XwW!TU=YrtR)Dx#(V$07c zCY{KHE^^F``71X9vh#@3U{# zDog-IZS!%}^SL|2oJf$4Z~FasVhLcaXlh6Rm?Kp~!I!aIz3b&DP%twvFy*blI;{~?N=~80D!Tf{bXR+sT zv@o9iWneGJ0O|>4hNzd?nz#>+PMVVo?y*SMb^|mOQ*o>{NL`XfBT4kEdj~0?qs#@a#E;qVez7B>=mrh86&! z_KRo*#U00jLw6%!)aiUAV+Vja$|2;nd$B1kWfJy?6JX0d4ZAiTM+octFpk7V`Q#=V zh>Ui=j3fWS<>!Aq#RIrNn}kh5chGdR4zW_YycnBdYD4AmB<}1PJ`^ z`_m$!tHkfD`c{v^vZ)F?Ct|r)2f8JehfNpXr0Rz~S6LK>F^e=JkqPn4D(Z~`y!w2r zSsSaLZ8-E>Ka_AmXg6GBeXl)0LeEV34<&fsTYp0;`pH5=59qHH119IVwReiwxjXMV zv-$~$zLL2vjKkNFs91Uy-c`PwaPI^=^Nz z1K?IYWi;GNsr#+}vA7IJ6azM${_O{_MQ z3H1!MaafZGu31NtUkdv3&br(DT?QJkTBowlA&bn*QBYrmL@pCXa-in(6{=$v{^C|( z&e4YxRed>s!!mP>^-|F1qE!IqZzandsa<``#0u}F)lAj~Qf zyRhR1jj2nPa_YMLpq7u_-wOE_PFWxBMX-bVzr6HI!T6fRMjM$nu6Qir&giG5!R;Qd3FKt&Cg1e(*hV2&-$t zvb{?-2b&8I6cinRTth~Gb`ZYiP~iSh>Kf@0mdO2Q=hiERT6fy-fbNleC5_}m5zKO> z_AY9e0G}4ifS((&J?cC~ZIh~!Vc>!GtN_SPZx|DAmc_%Kc8}R!xPiIkn2G~X(mmP8 z{6B^Uq$~jmI4o;)>l5J^m<(L($tukC7r0@H=gsBZuyK1qt|KB<;p;&Z5^vQdzusE) z%}7aAtOBR{<+Qhn?@b@Eq`}E_!J2Y&kC(q3j2^-(FQ;O~WX;6>v-}Q;&DE zif$D=`ONnBJCW}CD$wFj&DtdO(>q#u@QtMt3=H=JqW7nOE5ixmB}lrdt93EM5yG>f zNUApa3_g(iOdy@Wvbo&^U!O%~GPt1Qcv<|F(3#YWIiDD*AD&H#%^ptChAe*!KFLn8 ztkf2~9!Op%HO){usVoeT8k$7dnI)JCp!`qOW4=sWPX^f zG$l$smGSW`FoR(kO^uBTz5<3$&H@`tj^N>@s9b zDw&kn{jpkl-S1+?nB@Ln_-yzHfAEYu@iE(9MehXZ@Z3qEPndWihsggT^ypW@vvZ}{ z)jlG&gX-UDii*?Gr`Mc~>v0T<6!6tm+vp|2fIi|^P^<{yMuerfI=gKi8(b`R0SMx> z9{C2)Yy{d+UMuK|Hb>c zo&FcMMf{9N{j(04e7@VRnB6$KK`SyJ=Wg#8?|11#)4U7oG##pG_^S6vQe1%F%LCm+ zH}S-^h3nbPB!W)?^%FOy@zRGDzqm0{Rm46$^R>-1zL#LdPvWJQCNo_d@4vi?r}aLX zu8Bb}+btY_v&xC?i6v7}7{w3tBCOZ+{fJ^eTJ(>}Gy5g`9KTy@f#|9flQ*ZSbTB^qI7G3g&;>TyszdC=FXRkH;#EI#ICrF zV-%bGAX3%?{DkJjB|h%@=6J{MEIiq%%gUT@02sVcSV^x_j8x}ijk@_0>c>R;Ev8K=2P_Oy-s-k>)YkB^T_tw7 zRFPlv7UAe|UeRF@DKt=RhbgNKBFI~|Dyl6ndBSWb@(zc+igoIhejM*}*BG4YN^6aW zc@VguCv39!`hVxB&2;~+=BK@P_ip&H#uzQ^Q?zQ;Q)Y~b&tUEs{-uawUk@Spog!bW zz=ls!<}2%&wN7vfn6$IRXp5cZK^sDPxy5)JbIO%Wag_|$Zdgz>H!Mao<7Jdd$X#9f z=<+s={sCp}W%3o))vAaTajm-dPOagpq5$o5b&I0pL;Zc~2}&e|F|m$%;DhUSq*U@| zHVY-tKQ9!YNjkv7xeRJ_N<&@x3jwuNj)fnVd~?UQY_UcJs7N0Fm)7SF5sT61@|^Bl zQJW?f?w=NwtAuuGE{5^b2}URjK0mk8@h?sFWU=Mcs0*=hkMZYW`_6h`-^pEvhfWrg z9d%Z7<{-~~R&&}%?;77!ZQHEcAhzP1(7qnkgr0eP1`lHwY^u6{b+I5PRjVFhRY9ld z1T7`%>RaUW%k-V=9^5H9_=7b73^{tts|=A*1Ixzyy_5FfZcBVNayowF+3eHeSDqQ9 z@6GdR@XaKqUzq4=d|(bW{T9x4VMd}B_srx$T$-J=-6@V)tc9IASCVgF#tU?&z*D)M z;j$V_6vFfuhWly6_MRP;qTl46319iZSC6-!n!UzDtP`AE6>+|GlNR39=@3>(($}&9 zs#X&9C_uBtyJ;fZQCvxx$Qq@Wm9VN)9If7Os{Jx2->rF+c0UznV=E4UB&8_tinm*l zCQDBd9$a|a;wNn8ITi=0X=m!VmDaienI{bl`_ZJfv#QrA-rw_BzI%-|##Cu&6PJ}g<#L9XAs&x|4(HxK2K zN=R*3eK@dKu7j$YQZW8POiVzrNMr{~c3?%4jVUBCAnMrd4c;BTh|QZs3r@#9eC^*- z!8~FOq)3-9A3JAo*3b3#L|rL`4a)H4K<*-LdC4?4fS&3KFwA=}mGGitpKgB)nub5s z?>(Cs-A(L+*(c^He6QMZr~dLN=haEty$aH_{9(tpPgU7M+vLmSZdBCWaT;1qbvD2; zcVl>aM1jW0{>^>VUml#q%RN3kUyLmBzj#+Brq<9Y?u9Ybw>hkBwxbxWl(2cVj;8-1 zZ4%69YL`$ILHE+I-rJaP3sGdNT*#YLttHg{lAE(3>GI%DJkR`+z29itZ~H*k8PretmMw!i=$Jq1)vq0(K8r8ws*d(q zcCMPM%vq%;`+Hn+^>fC?^j`iVQoDjQRRd~>T{pt360D_X8`QZZ^X^*uWqB4aOV7qw z|D_m0tlLue1qBMHh^{se#))g3M<$qYD6SY0O>4=1*4&wz*dDQs z+~+on&%cgN{zM;{FsJm|KW*VcOwiC{N^0zG) zkL}5(3;nL4Jb9PQb7hm+z-2=s+$0o; zA5$ORQMJN|kWMYfX%AO_mK73`MW@#dm+yv|Jd1ws%#3Mzj^z2K2lW9)k8w|vJ&8US z5#uVBBm4XJfX?xFUjd&5NE?-m-Xw_CSa_1)x0dU`aIa!=Nt901oy%SlN{^xZXSo(3 z6>-;1DONTDt^I9|M`>N|D+mu_*2`GjNO&e)!s(a1!FpRt@!SxSCcBFYx4%d=D*E{6 zYky|u<&)%?~Jr1d+{ljs((EyTgo!Q?vPC5OvEYBb1d=4so6g%|#^?7df zaP370t2C`)20M8woEJ>!O;su0Z59;IHsN!TM?1>ygRdzze*xy+(Vk)Oy98}3q|ePDO&FZ(a!8MA=X?GTdZFcX6o@RZd;%W$gwE;CK=PLO2ajZ3`>kRZ9 z&XVz*jh23l$S736^d-&0c{kO*(IdrRL4Q_0{@q~>-i1HAF+s|SSEJipmKNWHqEtiH zS>XNZ|LRAwL4R-bHll+as#MA@n5IynFpKohzh}iHIkdBzH5I`2!|;?Snq z83Z97k%+m36gp4(+R@G2A=ZQwm{fFv4~GRmKcyvF$JF7wG6mjq5q7j-Oab8BV@?W>8rL(@z0m=uk9Jqj)2bBtI%DqL??1rHl7&0p+O3L#t=4=+eZUe+D+c^1B#-v0+VvT>nY#e60QGw*4-;#!78aQ zdGlF^R_FQQcE~Izq8-5$hhk)_QAX)U|5+UCePfkinBKWE7BYc}5bw0(!#?9c@~^bdRkXU}xMiL%e#CgP;R@-h-RDSZ z@aT)d?sT&{`0xEec<3o7;!K#uVxRy}LA9F6H;GCxFB@G6-Iu zl0HY;)2Xc{*E%z6Yco^3M)Um~5*5m0|Hd;~8FPq)x+SIQ@jE zR8-aXRZ#LN9ps)flvHVXlaRioUGgR=RJ1hMLS03_^f1)vthIOsI!n3XpXS_ZLKKC9 zaV&gQe%_|ZjSj1N|3;Cwfu8naQ1C-S=}Hs@;nI5rxmG78xyhZD`Dj3idOC+x_iMlJ zd*7c??Z-F`b4U{-I#I;MIKk`C%&};WE^8aI{{r_JuYx%NskGv&<{QFE0;&A7ay32g z-KKof6z{-rc>b=-Pzm6Mp;8rgsVtQS39BT$TgZ7jp~GxS)z2b1d_eg%=+yXGLh=() z3!lYk=Vzvz=QvX;F#d^Rdc3%6Q|bFoXw4+9&+_(*K@d0u`v+3`u44mA~1vn!(g<~jG?5VNudjd*xvk^i!P?ZV$6nz*Dg zBcUC_vg@s<3SJuM<**(IwQn5NDs{(*|Yf0agIULDuS5-uv~GiwrLuVsFzv4ti8D4 zrCqh0*Qx7nbgqC+&Y_B00xiOK7sa2MpN6afb=H#lROnlx&T7_6>0$UwQl@6Jhb{Vn zetUF=&&Ee-(H8^e$SB`=S?`X0d@HdfVVN6E=665ae{+pW(f%4#Mfn4<89mxg&p~>Y z`#d_-(I(OF^U>!G-4)>r?xqU~h()N$-TN_MwH2>Ml{U4%^ge|n8{1(m>3=w#dbSqJMB_JqxK00mnR-GzF z>8zFhBKp*P?cuTZ{clRsSI}HA(}to@R#eM>&&9mOD+#YvA*enfykGtlD1bn3z$_{q zsDM%uU6a?Tp3t0`%Y8!C9*0RspkHZ;Jb7K_A z8CsN#ueob)rbMY5DkY~eszY;YLp?SKg@CM?fh(YzhH2eDvjS}5WD4) zll3u&|B2cSnLNtHCY|f{k$<92?*>w$KW7K^UnNCtcAMT|6gj0{ntp>>2p|%}Eu>Zs zCQ$7jmL#`Th^&bP0*5CC`1SL26W)o659~9mUK09M)W5dO`!@J|I6hngUOQBrBgY}` z0jv#DaPI6$(?}LK7rygT5Wow6w+A<|yOurdc1$;`9Y% zIIEJ}ff_hV-t*Zlw_2-Sxw|YMJrT`)g|8c%QIL~(g_$z9z+wR9-I$0x{0+U(UP&#b z+@IC7dt=@DK=#?cVB_#R5s#m0Vlo*ySy+FFD7&HXEwuk@s~1Qh;ka-fQFs3zg~JnZ z+$g`1YVFdn|4UAxfOWBHA^x8a{eR>jMi?N(AnBWJ_#e*y|41DEg>1JdOR(er^Sj|B zSeXbsw>#^fL2he{C0RbCh=JKZF;XgLB zgkbu=#^L|YY~5j7V7KK=i(8M_3x|7V=5 z$-_b6`jH$sXaJjp;kpL$RZ|Eg+=1geHilq??a>EdLZIt`RTyKve_O9-`(w8pP6EZK zbT9{e@b*U=PtRy3BOTZjlW&ed5xx!@;j>HqNa6ZHg;DHy--p$4L_%sT z0NTquS-5qnLCA`$1q1VC6&CkqJoTzM?cZUzpV-O`u``uiyY<0KX=E`I68<;lHNYA7 zvwhU37L!8d5Oe3g#;P7DM&4|*UHy!;aBCi7 zEPa+q&xmvI2ehV6L(hQE?({q0&J&>y@r`;7@)|ZLq`vTX0^qL)xS5nq7Fyrx2LF*| zz+yMu0Kt?RS7DTpJ!l#TzK&^O0Kl|#aHA2O{P)**07%$LSi1y>*#>Y}5j+QdKB*lr zdz5@|Z|Wob`>|#lX!%e7IQ+@gNYPpT#G)4E$Y*AkrhM7`!uhWupNwq>Q?y&()MjjQ zqlMhBZJNms8xPOuBKz;Ce6Cb>eScSb`kh)^Sqh6VQfu;W6jghLcY%dr5AcHip#3i^GQrSEDWMl9)0%%C`T-=k z8yN35OjKTc_>FbP!J=>}M|mIzz-J{Cis&vvK)1St&O+?2wUAZd5M>TOCnO~FF5sUSR1sb`H!$bH%QK~=makM-Qe-l zIvdd4HHxvmNB~~EH=aGe@$7}@{^erQ8We@{djtx?)rY-x-wr^_I@$Xcz^H;B0_vgv zt38GLMWEM1Q2^}-|{FhaZ5g>tje zd;|=fV}b*Kdo}~sx#_q<{CE)b0j^sN!4G>us0C~1pR<)`B4LW6!qj5-q?Z(MtS zP7nJ3ETG3pJ4BDdX~!iGv;i(oXhQ@i5b=ABL-bRfL#5kPy5;?ehI)3KoAdH+nj9Vh z&a@48o?Ut}8<8W{gmCv~$m&BI-~@4Ab6Z(4GzwrU)ddy-r$rwxcWz;k&NKO-Jw=t5 z>$y*}<^SyIu8ncR`>C$=*yzduK+UpndK#{1>6G^_8gK=%wjXz z#{geoO?8NSF=RFOPQ)EkMKyO|;l^_77SMM7x{b%vE*NyNSJgX1q5s;PdNTmLS6A1i z@iid{cn#Qn1z&F54zu@Y0n(O>+ts{BpTX_@0ATeEk@z+fwT6qr*2OQtW%gU_c-Bxi zNE8z=4(_x=5OvWfHAnxz^JM*xKLDmBXEx-oex)o#cjc24?O=mjW+sbL?U8X5mo%4J zJ6xCEPid4zGT=$GDjf=e!b|;8!<^;^V~Ji%;AUCXxY01X$V)fCts+~Xqh06REusz; zq}0@!rOq9~WZN2S5>3B9Kn_kLYNUob$G<3dz{<_IqlqmLe7q`R_e@GmE=uWy#_0V8 z3*+4}up&S$epL=nC=VWm$NHWWc?db^6avUIHr}QAHR&5R z>}ayykyUNO?WaIepvd55(U5BxVVVo75z0OWyH45>9{|XCqdpE&m#OY?_`AZzUn4*0 z$D-~5Bd?2HR;61m51}G=q99*1@l|72?U`SeCrgdL14GbWt0;9{Cu8l*XdO_{n zV7ZUy9M^CO8mw>s2vT{fvaGHDW*?LlvYq z>%EH}9*Q8WqIcx;y;qrQ8($%1-azSv{&6jYiS#BR^EN?OPEdL`Mcf{K+Uu`)LT*;` zCnbN9H=@i*$TDaTr|)VRtrOP7h9MzCO_Pc(0L7ypyfd}vnxzueD01=6*EOeqQ1bOW znyT0=)XU|_UuKFlE=z)^&|C-yf+tABas=!!R)p4U z`tqstHkq_&;0bvWk3_L-z%tfeOVJz=7(@nmTP9omd{|+82XP4y-qS~w>o=0Q)8x%= zgGblH1}2})AfbIJ{v@{!t|HUgTr0=Z|5VO%i$H8a9DD*LG@6U8N-U zzeftB56uT&lHZSMmz2}uFQMVTSb=jt99 zCz72=oqzBNB|3f}QIr_iH~O}wrmR=zYu{s~TT$VpVa;XYPBRDz#iQ3Jo{FV514M51 z*Xp%NfRbWhm|Ms#KCY};0W~VEahAUwDFuv*q#~w*dJPUd!{T&j?o_iW znd3|eh~N_eZ>wXR+gAti)J1kJSYFkTaIz!GCi6-u+Y-Kpnd@M@MvH|O+?d%8BBGWk z#r(r0lyd1}i0*#iin14O&^e8A`gIJ0ON8CnWVh}HVkkaentN9(e*^RwK2!-3qZpj& zQXPzm_mm_%mqu}Y5$~uXIAFqMXDU|s%s#x%etxNjK-azh<0^m+qkNHTu4_zMgN5a^ zR#vFh$4xm4!o`JscsPlsjEqS;UVy1JsAU2F(c><7f!yflibjU6vCk5*Mh$lZBb5N=Q4Ngt;g64P+szG91?izZM#4XL)}Q)gl-|A` znXWfIDYekT#j#Y(rg4lP8&iBEEaSB7H_l^fOM~B|k451g-=bnh`3^$kt2T4f%d&YshMpHu-oo-84l%eG0Z9Q# zA?@k~T(c(dTn-r_z&2FOf`pfG=mPb_?5xoFSirP|bGa%crjM1jL9<8UAYuj1{ z7Sej}XiD+A)L0Vv@R{t_LO?3l#fRkG60nY0qN#)Jz8%Lh_u_`#y5T;w`oc>QAB}g- zQ60iN605$3Z2AK-1bIYeDy1{nEGJ{J)l=F0d=)!NU$7LBE<0@mtAxgq=G}y!92K9V zcs^XWOjz|2@K@8|KBhmrdx}&*O$vWqa(fDunHH4wpEJIDx^VS1;MFm~AzHI%_fz+2 z>7T!*LY499j6lpiZv$l|qrM?*9-zAX$2(%rsIVq?kHo%s5`*73q)!8LOm9PXZ zVaSt164Y7gB^Jr39f?0IyhiFo7DaJ(^4Z8N>vrXo2|8Rj-W zIw*Wa^)5mX2?VcpntWwLUI=^{*l^L@1Cas;Z)T+7fEIOy8qmLMe&gd$n& zFCaYGzMgF%_uW82NfL%L{XtpmH|CmfA)U%RtJO?X$$K(dBdVPaS_C5tn(zipSRyi! zM{&zrYHFZN?foaf$s84Uc&`eJCxu05vGc`YAk3`H+oH*)Sr=68itbd9Bt%~^hNP@f zYs%Tscz@7CdQTIT4Xsgb{#4e#G>cbu&Ba(bW4bu`w|@juc&RQf^s~h8ZDHW7N*q1$ZA^F zWyr*O!ShM`vmAk!9j4($S$_rHlK0ZmY?p^y+03^JP7Bkza9tj`*Fd*!W)VZ?I;I1W zd}ttHCp9I1P+~qt>pF@_G1aG5v8}*VkKGJork#%Vl1Nf}vh}vP<=Y@9)Tz~Jy_7CA zdW#}Rq1q?$<<>8OZti*xC3%Nq611&xlwozwTo(Kj@g_&*Osv3^T*usCc}X)5Xz4uBEo@vhE<~H9VZD=v__yCvFpC898`Cauf@} zj~8s|N!I(2$w-gVHt;$DPJ3V4eus1y2gTX87Cxp{xuTLvp4<70tC3Tb^F2L4mZi;7` zi$Kp7+i!n6VQaT&!4)BO)`=nw!$oOpso&{niaF?zA(S(*ta=e4|1yZD|MaKm+uubO z6#Aptxu^2GrV5E>k)_6t4B=1}*Y{=}b*y2xxWg5Cg7Adum?X>Sgk-t1bja&zly;Vd zyJM8Odv;@N`0C@mS~6@ggu=4uR0BB0PHus$c#@llB9*j;dPfu$(=O_x{n%nA6_bfP zGQ}zGdNb8>7t3#*S5FZQ00Z^ivkxep`Bh!;C21WKy01{&h_E;cNmUl9z|p^UV4D$q zhtYu~{Ab_T7Ai?kEe~$~IG^z#Kc)(2u7L-js*d_f-1S#?dT6Qi+d?dIu+@9M(02_O zDsY_gaH^!94phhW-T7<}?sMqNH-@?xPPj6UjQ&%) z@3{rKvZqG(6UA;=6FSpXnkXtZ05&bQ=B}us-B2u{4$oEj_7M{F3!c5F z*+O0(cBGt?_++6m?lX?4PkJGQ)6WGTF556?xP?C%$&S-$HefhB`9fK;HS%2sx?8XO zrZJ^FRUjLeI`Ue$Q{P5I0{NF&`b1vHjON>^H&P}*%iGdD<*33vn7G)KQQ?$uCI zKV3i51)Q-OQr?e^&Sg61njH}p8ayrYi+D=Kyq#!xDe^Q|P+8jDZ*P8klooTHcJp$0 z!g~|>GG8%Kfj3@|UE^`NcUmn1IxbVC{7i2<@7$AjRu|sQDUk=+!0+nQHSv0&=7*rJ z_6WbW)h5Es6K~Z)Q}+0E#)W|2f(|Z`j)pD8$gdmJb>)ijT6JHRWi5W*F2I${L@`~D zdpfv5X4ncrO7%uh?i#9%ly$2V?b2Bla9Mbb-ZqYBlW+^lt|X=sc!9?dAQE*>Cmz_3 zI|(IfaJjU8RFOWX?6&B0Y*k*;v1pqhr>9pyurmDD`-rNM!?tOEE4we;R~A8idk?bt zew22a8E%oNhf3kDC$eoEfLnb3$j((wnKiCj8(hD**D6Eldc18%N|>B!T;ZY+|20SP z*>{MG8XXB|9&2f_2r>ThySkl~TAt#@}@a#70~YES;sQbD*SP|0C@qP06juf$gOy117% z#F1<`Ri@Bf+2bj{9?PZ;K2aJ8){mF0nq)=TQZk8mr|0>YT|$v*U#O}wko+X_PxKz!AVjXPl1t_N<))FW4C~lKPJH#@1Jcrk&<0|tRWl2P{-256h z&dVYB36-%?uc(G4@hgQUiAl`gtAHCL&03-_BEqM zM5qI&CCkr%2f8QWr=5(_FQNKvrP)ayqp{3ku|iMp=* zm?M`O|9tnEi4G=i@Gq3^a?Eor(CTQy`}KW*@;43V8L0Gkqm9YsNqUQYr`6?FBlAUq z`s1!A;<>O#Nx!wfc#`AF{-)W|O%f(uyAVHnHm$<*u{~HI2t7X9Y8r*GBeo;tq(7U{ zVQ+MQ*Y6RSr7GaK;&5Kr-&=7cd`7hlaywUIP=pq6!-NBusz*zcasIX}53shnzewVMe(kX)*fH`6$be-IiLZyuvPaC{@s z>6=(58u86*?`h5jqejhOywi-_h@6tIuK|8LO)v7`t;k8LE>>G`e#({x!B71L#Ub6*m{VIEM)BEP!N@jlszVNAYj2F+ikJJpSF}a++*PbOED9sQU zjE7p1Hftz%mM+{yLDJhdXzwe^g`XP;nJebpBt^Kc+k$+G10vwKR@DF=B=OwrRKSsb&%*Z}<`WQ21+C zKzPW#Mc;#pN2Vg1e2R!UmNZY{&I%vF<{~RZ_U=MSbWS@)uOsw!$CNNdfz&2II?#H z7Lp?@pWBG)q~?PCW+^=XfLz$vMKdLeTz2sNUX9;7GoWeZX(9L=txOa7*b+@ry&MN! z;xJB9j@QR~G8WwYhRWa6)QyOlI3p>XDhAW1boTn*%%jU!bm-dY=i0Ac_}0~~?45+I z&x-ZtD|FCL*}hWRk(}e4yr&@POoLEux_J?c-kxRZi|~$_@_JeS#9txw&cH`*@@FugAMqgl6jM-i@bU7t`Aa26 z%BqT4WE$6lpBEtzJ9>ojQ>-ce>qRCo~eY)AAng|tAjb&|R#z5pd2%_!}SdDo8Od^h400gwJ|4^^E=N}A{DE-lKE#?ol|J{<2= zzQdYjljCnOH&YDREOIK-fwDBJDT166chqg6hRD)HVq$0}NK~9D7oC{gkN5B@? zD0)z#m1ga~wB#Nu`S@{zVRbW3P%Ma)vSS9F6F-Ti&ucN{${N5*8g-SICa`#&$1FOH z5~`mnzwtZuTOj~X(f+*g)!$&%Qgh6r6uu>3+!xAqItYw>fG!JsV?4-% z@Fmx!Ab;25U`l)`BBNM<8r@an z%Zo%3awq(Hu@w@6^JKS2d+yC>W@UwF)K78!TNhJ0*|h^Y-Mx;6r!Kfl)VBHd?}5X( z@Rg}|BX^?oN%KjcUI}b5DwM0RyNLYgRZfJP&8_SV2FY=8811g)0GLqAL@?vm5?+)8 zUPZ?N=(Detma+3hv$m!Q!0PScY?}O*v0+>Ic{1?!@OGm-j+naXo@%QE&b1y|}6?1n%T_PNyDkMo$zex#$Ug3TPlhKIF3(pQ}Mw^Xzd z=_oTtKYLlzF+d{9CmdqCZ|Mk2xTC&|YUu_g0^`ir-(NjKzr{J>L79+++u3>`$Q#uT=mSU1 z5IVMT%8kN=@OmZU6o*)&H`EB@UCiNwcv>onR3yX)+8)bJIe`0S@h5l!7V#&IQb;$^ z7&TZ~n=+P?X!)khLwvP6-s_tY4Npv0`sCdcV2KgCUf5@qS1MYxWY>FO`bl(>>X=d3 zHNwNhG)wQMTXj*du=8NGz>HC^A`{gTwGa3=Trcrjg3(bMnu?kKC5Rt?F!EzU+4**} zuZWQv7k~$uE|Jo+uA@GclC%ZpOw9zi7ziD+AdUZ&x@>8nhn7teN=(J-)sI^wTMl&J z{PrEw^dyCY2()X?Z6*kkORmS%8}h`@95+r5VA}G4NA>E$<#RBDFb|owo|)u$Fw=n$ z$hzO79Lp0V$@JZAh?&~iqzn1_f_fd;AiU?do1wcujDcQnooI`K#k9- zX&)ysPF*^b-qQZWZHbGkC(7uoLQRc{+PrPCMy~}{li6F5e)TQ%;?dWg+mlO^Zwq}s zp8NG$O(uN)Rcya=)5oFli;sZPzTig&eM*3tmi-C}WVeU)K-; z|G&8a3ElEgljf9Q!F?g+p}56${6-KOev3mMS;1%GU{r#mlGEHF+hx2+A z6scTsn+!gy&B2E=FiSVe21COxG9&sd{A?+x1ZN*0YhO{77rnJC`2lB$Tt2oJNi zQ(^9D2r!qwMe@Jp^6DFSC&QB;9W?Z+3R;*C#h~oI-zU@GN0D*S=fHOD1)Lr{yzvDm zO$e3iz1=$21gZWmUU7R$B^3gh%Ba_bCZ&ofk@ytvGLEvH-8s;4*}S7?$iv&ww1yRq zEv0SDCL^?YA8m_mlMFpDtCK|Jx5;4`lgD(B<1#kdjE3$Lne=488Yk>DUrwQAN~0x` z+bxwSE*3vF&=eS;8ru47>krE)QwsyHhFdUY_oi6Y^#{$E4i3$gtVQ9E&%a^2;t2vB zrn3&{C~Asl7m#3vc+s_+FVfoxlr{ah%Oplap6fIsgV{7{T{J6PbpOhx64F!5=BRs@ z=@`q`C@Y%N5I6y?;TgX;VI4<{F;v&UbllM8^)k2 zOofLWMY7{G9>dDk$fh_h9c&?5wD^l7?6=~0Z)oHhZ^PQV788C^#H2UR?J$$X!q=D* z-59#RDli11-4~#dvJ7kLDAJfN&+3%YRqzUZQ?mp;Zp`Z|DE+e6`H1aqht~zk#tsk? zXjVE+03<3;RZNAo_uU<(*HC&M+=>8&id4~98;uKmFai8p#7eQj5ELlC%mcroAcOBU zKA+`?IX~O`vu$nn<|Jk+*b@TYc?`Gy&p)ppQ33M-&`$0{CQI} z`3PH?1@J{ie71FL%@KQ?3ODghOPZ?|T}KcgJv0Fu8l}=1&{UE{ z%+q>vL=-(Tle}(6N{UZ%J7JKXe(6$GvLodInIVqS&TBkMUl200jq))yf?EL$xk^NA zY8iVk;32N2o>A$+~)kn~mB}jD&_Tm7)xy-2tr>FRo?vpbgR8Xaj>~_Y%e-DEZ z$7?x^PUG%?NE+l|MAFt_KTPDa6`v}eaD}+BhQ&W5cecJb^QRYY~ zaMSQa=!#-T{A18~7gKo&@9jj(UGcj89?xmY<>)^7m|vWm;mz3_YZa8*&o;WuLx$V9 zwFvqF(q7preCTKYg~un^^AXv{-g)-Ky4m1(m2xMRtToi{7?-=tOSYZ``;ec=V)V`B zIo2goG?Grlq%bDG&YUtf_|eDnN~c$lcSio2!Yu?t)&K*48(+tVUkLEk7zwLovTf5* zTBP>6kxGZ~Po&vFt+M6wIQtZar-PTg15e+XrtFz32b{VaCeD=78@`-^S`m*D&;8n4 zSt$K>_x?{pC2OTe`!9b3-2~3yJ;+=m_qTWVw`eE=+ilYXtR+-ztwm`B(SxmTmR)~|e(An^w#L0c8Lkg)iB6*X#55GHts9a4*!yum^rmPT$%p1t0bT-Yqi8&u z#4j=5?Z~5PGOVI>GE(eX?s0r-`}QK`4(f;Ok!6f&;vU;1Q@S4cZJzJNM?9I+Yun%) zge_N$_Hi%7zU0;w<8=`^G5_>T3C#)N=GYL$Pd1*q$M=#o`0GjDu|}FOawdNQpI-mH$Pd^aVKF{Td)gh}6^pDgh+-)fG!_6o;ajrQezk-< z>4QT(&WMkJiTWh+^W+pXiLMhM$-|1Kl+;UU9mbLVMDrv11BZQ=Zc*&}m{%7J8flJG zWgWVZX%+YKU6&Q*RDwMJDC#tQSi~0&?N`4mzgfFKi7`-nQShP%W4-=y_dc&dyg!Ue zLkUXYm#f9yZx6YwReU=_{q$3c_mo`bCakvhG~=5F(l5+{&fKY#H%-vk)rsnM_5%Uj zDv(I#T50>?VeI8paIV241I~A*)4coh{J%pVAgnnRTfJ`<-c!+X1N4?Wt9fx;sgu9c zs<#~79oYt1DHvAA-j8RI3g!RzRcKETwkeSoRIgC6E z{Dw$Aggl$Rf&TDM&zvFL>C!K~ejj7X>bu{HBw3P8K6445ZI{<|I7*6!Dew7NruIBM z*IuSPgDwEl-J^^*A@>cH`J;+U>?fHbgsbs9M4^I8>)iLoWen7NX~szcC~qX zVrEmJnDHyjsqbD`&M2_ywR2=NhbuPgyqzGJ(~JE7Sf0CG_9z< znG=y%$JAPLCjCWG?I?_I9Ssg!U##$6Y6e{Cn~?Eujn*{3rDe9|K3-e7Pr)+UGN%o@D7WK-_O}qw&Qd7cUvn1uc83Dpm|fDpK`VHcjmvQ zateOq;49OrU9P}wM{UPA(YV|E84MZiwCD(XP?Xu1>r*k->YPxv7~e?O+{ZW;HYdT? zTu-h&Kh*-W2on4ZIR1&56ur7}{E2sh#TjU>7=^KA)AE|cz-c1W$FJ|HTX*?B3Qc_q zwSyF5Z*||fM+ly33e!5ia2HfH~>rnUDDNyzQ{`Qtw zrjA}!)auLfhtECFLOR0emZ)24=jr33;El}B&=Zx#e?qEbl9moL4R)TK+K3_9<;TIv$r;v|R+(jm%4dRG2S z{oA0=oe=in!OI4v^{59FKST+iX(SR?+k%)ZBA5l$O<;NojE}ezmaC82cAC?|)lamY zsG6sCy55$&*H`B~pp^NpaO2*kM8L1F1t$y#KmOiIN_RPW+w$Yk(6jnYNWq7j48%Em zFr2|lqx}l`Vzd@pt*Ak}(9mK*TUa_pZpt+vkjI_GHql9l?{~zsuw@z1$uBjOcZN{HYmRzJAO&$G&S`2e(_{c7>@^5sH+%=UaPlD$->B)tnyTtz14h zym?<76{5J?XL<6CFVXbX?|H+-=Fet~`U`nQJ)UlUcA3;hj_l63*4t4>Q1NJANK15w z_8blVw*KK}pFun&i4jv-<({dJWsX?cg7BsxV?h>&& zKs9W3xZ*du_!xJ&D49!<-(jDG)9Bj5Mt#3m{9JWetoRT}ex0-RN)LP0HkeZ4;iID#K9F0p8 zl&JX0<`zK#@d(lAqXbmfB(nFBmekXf%rt?v97aTFN?${NP5paIL$?wCqTHF6XoltQ zbUN^?3%;ih-L?!CSWlk{sqeh10v;!>G_OXS?*8q~h;!0k8Bq~_-zbw@|E%=J<>#y} zk~Vm#4mdG3 z(jERu4YI~Q?>q5+zn!ZM`Q*l^DRu-s%xkerfZeBJ{y*&f^;eW{814-#(jkq5scu)?nc?xDYE^S;^9`9&M*<~qUS{N+i#z<|?L_xKML9Jw@NYtwp{ zX7QvOeYtU$UYI3!4w-m$kL^B@i>>F#owK9%Zha2&vPQGWFj+WwXRC-X)4w@h$nlZ^NxQu@+j3g`Bx7FjFB=87dEODvZh3fZ2)Krc!yUEkvN1*b(YXG+-DLCNpC317!ca$?ya zJu-2HM<1dMZU67mf`Hh+n*0cEh3~=Ifb*FO)g~*IA*Wwm5YNz9$ho6%@_avhBJ}tm zfyv;BGTM&wwCzWNqONn@@*na|hj0-eI~HRbZ%)*{pdZ?_`h9ZW{q_JdR9r>Dy~L`U zCZ`M$MAQ?A$xH!@Vf~8MDpmd;bzdPm3LGLJ>1=Zp=Z$g7&0m8?q4bl?$woEmq*{#w zxLCua{-Rl&`<_gVi(j9C9i3_G4H!L3WoRh(kAuN)9unFw<@Q(2J1Bs1-5yh!A=ex? z2*>RhI5?y8h&2@I#}u9(I;cQx_Th zCfw9c)|P1z#@A_jS#jJ1|0rWfapd|xOLAitI(28>2kqm^%L;0LOPPjg8I!kul94aL zA?5$y3w+KD0?rz9;i!hong3I9o=azJ_SzY7g!X@`uK(Y^@xS*z{{QKD#LE9iMEp<4 z4)8dZ%WHoM7d+vvF;~JXa_RejESYA=pW3X4kq5vy?24or&B-fA+#&4-EjwZ-?pi+u zGsyx40#uPO8D#3DGcbcc#;wo;3gi`m_EWq@fau0(`K#mc!R|VtNR(l*rI3E%Y&{Ua zSxZf9<_MTE@H|D@$1NTk`d(VYp3PAIkB#;J@dW@|1+bqCww-vNIGy-hx2yo8l(^PY zx9hCSa*NT6RlopEdnX|JC^HC1M}Gqm8=&i84zJD?0JlRtDtNn_x1uU?l+dbYEDJ-8 zBaqqDoI6D_9!G&X$0Z5v;Q`rfe19|ac6n4_Z8;g&vlGW?UHqy#rfEm~x=Cv3i|;(p zPf1zWK+3fLBc~zN+5b*se81D&uVWm?$~<>KLRwb-bGrbEC(t8g;?}``PLcXb?@_U{ z0lEc|$oiC?o?-9`?ICqzB?R z@GRdLU$!NGCdJzZOaWQ-y_nhUm`e{KKena(E)gytN7lr)FUF6a(N!$LsSOvK0Mh}} z+S|U!K{HE=J8sXaN{)Ohk#qE&@uwJ+#!gJ6yI0gQ*(m;in~33#k8i>8cZ$Ua)lGmb zuuA1TE~Q6t+;(l$2oUqkt%Fcyk`aEtlHQB&2~q<5b~EAzZ8dw&G@nfR}B z@V%i^@Hg)qWL*Klq^uo2Apvrx@gYH`j${yswb=yH!zxDHj6S58=Qft?qQ$-{-;1Q^ z@!tj(PK*fPwaRO>oKg`OMTGyCt#Y#+A1&mKv;_fW)f!vV_7`N^Cp8BT5F@LR4F*#J z4k;w#GGex`(&w`56Ob+KKtLTU;(pV^B)$O%7v8%9&6*~_W(08)nct}de%Hnasro+# zh<`2s%upi)%fmedY2-Q%q`A))0i0O+@~sRE2FY&sVGNw+tlF)Ck6n`BdkMK`@kXdP zekg8AG6Am4HGTb($vr)cF+#c~AmumY26rh2t}8BY`8#F-%kIbd$&**#zIT;8w!Y%C z6x7=pnO_{e{`r#k_em^&P4siw&zxiK5<|=L<_H(B!{o>&@55d}VO_Ntp#08nmZW}h zLHJv!j~M&ClA-Yk+{~5-Rg=yy?xtzX`=<$O5ySwQ4Su~i*Uld??)R>9327Tx@&4OQ z^BIZW;K3L5=mKnKdq6Nv%%QL*^*=y{%Mch^A0|OS)ov_EoKgh@nwo#_{Q`*P@1CP< z*xGrfA;Y9skg>r)QmNZ@h(Ig28+946Z7kM-+^ngmsdKH2cb+38ab8)j0PV|W831x- zMIM47ds{S*Zu~x&afGt;GSEXr^ZLV$_cjBEyJ868_UkyweL^tm0^#fSivkWIOs3zT z7Lp|i2>C97cwS~V9wdY8y7X-u3r=4wXOa=H-s_5I;aMf8V{zUt3}Eb zR0U`5j94IK{#BiFH{KMIkdwZIdm4$N@_vr*EZ!7}-;tn(^s148#bG^COYNqdwdlAi zxD(Mxm5?=3KfBsMp>^f4hcYR%3$^C6=FfEz<$I!!<0f%*x>TevpPR5deN+d$xTl`_ z7l~h%q?jP(MvOqTkSKD_V1s9R^lzrp=U2n3$3f(>;6@Pf2S39Q@Z(=#-!uVqR-W6c z|H!TdiEmhxOBMm66(u1@T?!%$)Fq6Gbp@zz)I_Nv&xow9S6p4Q04Sw}8`~a~fHUi6 z#G=Nx=pV+uI~cFonzs9;NbJZmTDu$^bltHl%i$R7DKlW_b53zRnbbZF z99ZrJqEB4(?IFbGwLegBP;GxBwWB@&d&dG+%8{>+goz$gow$Vtin0<}5lh8Nu_6t` z6-$W;HaRX(Jm}AAtmtY2ihqd69F_RNfwI(55Q)<8OYRz(p=LYYSB5G|UI&#m+vo!n z{8SP|0oOPY>L=AZJ+gjW^rO`XNk1WcmC5=&ymMXfbaTv2@KXd6ErZmsem&BIMj&oD z_u>yu8}<0}ghj@#`NWvSZXz3hyyOIF$4&rWQw^bEr_Q;vj|LE7>)cVB1~{go^t8X!&rT`>1YOh zaxo8pHv>gp81WeDt3@pmp)Os`KvcLd(z&KM7QR^Z==ry?cc#}{H(+U#Cuqx98>G-p5cm9pvwp>pXIg7#Eu!| zFJCXBGxsizcqBajte0D7Fke$)C_jR7k+f5MxhEt)niKuQ^~bufAo6ykv8=q1!nWY3 zyt?GK_LLA2ybbqeBzEkK>okkP)7Ms*OlR)b5(plMR-wDT}v zrsaAHhAFixFw2Sd3GY3RCCI1lO+Xq%UpM(p|2W8c5vhecj%1}xOqzZMh{ff2?$W{9 z#F)4cf1}gzw+UU630TQ($1ar-a+s%%Hl|lbnl3-!HfR3$UbL@UOqCT=6xm|U(+`nu z%MYJ-lYY3;-?yPMTZ-9=(Ph_8UWA;W#!I{EFK)C{gy<`Oq;{>O9nHZroP7 zMB7Z`?Z}>tLhu;=)~6-LI5s5=Yfs;mOBE8ks#wUO1PAFtm&n0t!E_;L^@7&CYS8fcGY?5n9G>|5sh0&qdt2`T&jWJsn%uG;fFtZaw{!&uw0WaeISB=A>W^?> zY@Y@Fv3Pak{f+4;e9I#&VL*QCc8mcJr;G9P?Z|cewOAvdXf~@nwu-&(%sVzhh)h;# z&fc6Z)h$|;ne$nj=3~rUwjH~MZ)?gI*(@Wt0}%z$L>fkh^Z+1!YIoSx=c8%fN6x-+ z#@BRKS1G)`B_EX|te)|DT3_lwe}hmAb3d9wxmCDW4iagkX;5e~Cz2?4J$=)BNZiq` zEYSa_7ND$Ot|9-;kgWD!w4Y1H!e6at@c-Z_s_xwNpL0#7&0ataWTZD{3)e~pXgIB8 zc#{gwgSr&PESK1`(y>;)@{ehyvJ$$5f7HHsOObwlGIGMC6p{D6Kn)hQ4CZ5}p~~ne zik$v5_5N|ui$W$|#&Bt7Tl_r+A|qtfqel@EX(+xA!UgMFs{Jco&)E+o3`06$LkiH?nhwaN9SI~__Xg8rqxX86}vkC62=c9?`(q$ia?1Gzm`@O}Sw z)5m=ehZEw!BC%Q zA>lmZ3ihv`Z~v+v9|Ic15l>3tdc}|tQ9#btU3+c|?N$!}TkGqsEKeX|U=w>b-Suz76-jpATbLIcs;j1~fbTB%9y~HZUDzaFs z2tpby-S~SF^54Y0!4h{1W2yvPTx;*IY!Je#Ak$B$ZNKRJq4z@$Th&4F!O4xl%i-Kw z4Kz7VMk@Y%MO@V;cXk{cO8F(jsvbGsC0XeTQzWP)@%xQwXGP*dNN3QTJ$sr7%%5cC zjC7I~S;`F8P2$Z1ElczJc~O?~4HVs_!r+8czAeV%7u2`MkCv|+crOFq))(Q)nU87Y z8%+5Kw5giCehXJr;`NSHY1qEw<*zAV{tf;%b-k8ov$13y&pufLh&;RmVz zRGI2Qn#H-#kEwt~06s2PcO3!hdqcSYol9gP< zXHIZ?Zg#$8L-w4K`x(bA(A^h0JqN104L}5sbDh2;+W!FDXKl~jo!h@^=_4f7pQ=u> zBi*R1`q#4tb{TH$B`h!AdpYb}^R~sI6kN0^(o0WSgfy#eckUHsWm3_-V<4a+k+XHQ zMO<;k6kp1u64!q~ApYRog}BKtSx6SDKSSIc4g&y$)B+QLb}p+yXD_6hvenG|WK>Z@ zM|z*Shsn|fM&C;W=|^6?&0|8nSkiXVsb$md@$J-Byk%`W4=&eA#AyLZs0V$j;lx*)96T?K>af}BhBB;DV`7o0 z0lQFy?rKVm$2pzBnJs>Wlm1JM_yw*lzVILLpMPw1Dzr+b5S$I1&9rPMSfZmnX zUq12GIVjN_EE3ed(Ik#6?enkBibiuB<}9HYZg*-v{+F|+c9)+XL0fKpKJTNZLHoi6 znysK~4+Lg!{tGo2}xd>7E$sOR%&*4Q0!-2~^|on^uSnu;$W| zdkn34$I1DN2}-zRe@qv=is}@suzu!Um6w&Ka@P#RJtQ2zoryBPW)f&|+PyAIguEN5 z{X_@V&Y>gX{8r31u1!m+%S5WQcG2E2SI;1Dzthht-PvZV6pmm{_?>H-YRkpk+^#ZV z{RrA6IQiz$r@J&$xW+X*96N@4!%Fkwv8nocj(e%MYmvr7_7!l;-j}Sn75fkr^thT676rjY zE=73B@}gJf=c&8lZ!#Mf-2->x9G4GpPSyVLkm>JgGuL=xUxDpP^OiKrhS)!+SrNR0 zarANjUF@95g)n)IM0Ms&;t#M{mIN0U99KuQzWnk2+bwN1=a7VJ`H|9$uV)OH6BQ+& zTe2n{D6$q#JKf#;crv+6aHUb<%KapohCUa0H0Jqg?ce17wb`n=>@9v!{kx%Hu?+;3 z|BO~)2gXL4sixo7{NBmWPEBYBH?5}ece{>F>_oChPKYah3!RVZ| ztSlTBKXM*y?&NbG8zx2>&JZJZl^lp^<%q4ehCV#N zTBhUge;e`s9zvH}Z2idI>Fs)RYI zV}wHEwYvs|Vp%DD#p*cUBkFR#bM>3j!J=ZBYXPQ4GXU1^XRG>wqQ?b~mWpAE6)k@T zQv^!1Fok|uGQA#$TumB9rH1^WVDwm^9KIljC-Xk9$NClS%T%t!q%;2EpGxA!UH;5P z3W4l(Ayhx)twxbv(5DWuF@j`P%-!OVoJA4-NuFLyzMQJB795G89NH~KOHSIfx(|#G zVJF`#{Wo;oqUsH+Z>`7pP&H}&9DXXY!fI#%o=T19Rc)4`0kQN1<8&)+1^DZ3@e+W! zb_{_BMy$$bd;>Z=Y_Gwk5q^71t4Od%E-lBckV}eJXOrYU?vd|#+S>B9OVsgBvPECu zRIcD@e-iL;L`7CX0l~x>pq+U~p!uc(6Vs8ES5LnJhzR!h68H8Aj8c^Ln}ptP#7Jxg z0qcPpaK~JA3{a3wC0r4HwAx z_qShq?lSM-6&gyU;!hnPXs=C9UA27GL|LCg)}2oCJ4ur zkgZz2GxL9!uX0imtfQ(%iekod_?$+30@y#+%5RndNMFiCxoLIIDTFjcfkJhA+t6)9 z(J+>^ep++Ep_Y}_cTv#AyEREBXKHN&-{DKyjw9CT2- z)VJg-US`$hQ4xHI^#Iy+4W3&RYl7NSENjDx30`R=Qw&2DWq^2+RH$X_|1kmiA9F?} zLfS6eF5rs(X)w0|p$zFV6Gp_bO_?NA#QdMeXt78Y>=!9pj{lR$)ql^=@BjT9|4V}W z|D(^tp9^dcP%xSRT92!;N=?K6l0E<6g{@mi+@*+YMe-~^!xvruuL~X*1qmI#lv*EvMI-xf(ieGu>H2Mn})mg$fB<67rG|&gz*3me2PlNWn0a(rL zTjcm?`r+Zk*EP+iMv<43+Vha>8VEA-4%w+S83XWK6RSexH1{QH-Yi-lkjF&WZ-CV_ z<_h4rTJCn`C4|Xa67omolo|XNjJQ<@z612E6_M4`=dOT$(@e}~<-lkM8B~6~ydyq0 z%00}=lVcC`rCWfMq25nGc!d+ttk3gA-e6Q>Yd)zmpaMt6<9Fmh;uy)kl3Dwp$^pDm zwMrr~?#})jSUeoO&)WNk@4YK?%mcKvm4TiY%{{GwKu7|T{e_HMli}}NU3ua!Pwn0# z1{Bes>89Yd0LrgB#ozi6iMw{zzIHx+hy>nsTUY@`FsKzT2Zr^xfpQWBcLUY zWbS4Cy#b7j?Z{SOUc=TYkQWC8QN3<(8{_Jy%vb|1Y!*$xXt4GC0sJZG-mRNrb^X8V zT1*ib}W{|*7 zB)e9G*>{@*9;`H zT~@DSp1o_Am@NmY1%ZL{3xdckV2tW{eBJTbCh~VZu-09h$r!2rXaVSBwa1!w-a(kg zBxHoNhG`za-Mr~-`&r^KkX<=6tDs;s`}zWf+3m(63z#k->3~E3$ny@Z-{0xa&8aQk z{k0Lq1E_ z8H0>~ndBfNHT@Wd#NW>HsP)f4QEz^dY1e+k&A?P>98~M?b=|V&V&}C*A<~BZY!_H{ zpP@xyG(-DO&|B&?g&6AbFe11>$ zD<(MTst0nMEP!14D}ngp$>iBc#+~Qtd1ex!Xe>Ev{v#j|U}_$-Gp+$Dl;9w<5Q_;5 ze&5zk8!uxGdMHj7@blU%`2Jwl#32GoLO32Nn}fr8X|#igkVV%u@7hxw%Rf3U zv34|pXqBXCtH3AEs)z&f^#THWve`gk93B%9xf}TywM9sazyc+a!`ybk``gK+<$@%m z)QTJMHqas(O?dsA&yCj0Gg2inTk_nNJNhs#2Q@hTCh{yIt_Cp2&5FOw%XCR}DX-)t zD`z;wg6VkytF4@2>*k*&Q=FLuFr!gQ`}4K2wRZ!waR=otysOJNmEJI;raN?yo#%S| zuO6G@T!SMXRp8~sw*B)}kBL}Y*T8`&Iz?xSbB893=~?n;Gh_V{ImD$K3-d5HlKNK; z4Er@wQJLETSf*KAS}YmzY-3str0(@#*bp8t>Ej6D`~WLs2h0n{fPvCAB*NLqSss^- zvuP_@WZ7Wt_6zrC(HyA61lsGv1R8&KpNt?g zB}EK~_2wpOW2ZlJGzk3UJT%;^pXUYWqO!Bp0r4! zblJ-WC^5Hs4(7`{<3>{tIAMedFUYwNUThibMTdQ_BgK_gC>=-ViC`ckG=7@*o(W(#rYr$M6CQ38;M=HZX`MQ;f!a80rhcSx z5~~cV{Q+Ojrmqn~`c^Vl-#QbInSINK5|jjQ4vYFL|4`q-KUWOM9YN{q*g{+P;kO{? z>wJ0jNYlgE{h?a~Y)~3>|B=j7frbAN6d;co9L|RULDLL91y4qw;00sT-4>>O8iK@e zP7}7{w8nYowxwQSn1{QB^KS>AYA!PL;bt!CcC{8$)aJSZ|3(mDF9~YR=GD7=e+uUT&114qb zXuDoUoRVsB2GpNyRhy5p6U}1gn(`i3FQT%SXO&}kT@$>Aef_(al#D zb{p$2GRBiU$KQB-OF0l!7)2m4k^w?tjE&rF+-=4*TT z$1%;Gu7SH6W1L8s$ehw#_zUsUPk3ylC6<6%)Z%a0L)0a$6e)Koclf{cuOcNV^QgKjM z6;~aBC>=CE2bGQ-4V%vI^DI^g4)g%_td}6N5ILYGUVRR@CD0H9FwiRm{X2Wbw;>Z2iXl@rF#X>iY8wen@C&v%$;9=TH02=MT;P zIM%jmn!^JovV|p>XPNtO#v(eze~Apb22YHn4$b!x;EEy&A!;Xvn;=55=ye(zHx}Gq<;&;EU?*GLMu%Htr%5|LI+b&)UzPl_HpPRcOm1 zFmnk6t2;Ip;NFaoJOz*ht`4pXrQS#Vn;XFQpTO4t+QZjrx=i9_7#`CJio3=eeZaefm$ z*RO{t;|kjSo}rTx+O+?*CKuchI|H9W44*6ooruH`+G;tImp}>3sxg^wgK`Ya0;^t} zQ=LT>koDoA#9b1Vdl|xl(JouXSoB9u0a%ms96+s^+p$X_nR>MSdAhgursm6dX7FXy_fs#7V zlNrXQ40)*>*J-Zt@}FmMeIU3{yO_XMGEDoq$3o*s^K<4v|4=7?ewptHSWZtY6pj4x zCX6yW=b3xUi$_8Ipo;RX5)zF+v}f5?pC%a7xvRq~h;tC9PbTz8N4u$2M9TWAPIPl< z2rKmYi(tmJ0+fh>KwrevwY<2T#T@}M8x-vew4*mKe& zO1Mh*pUK@aiJyjj^f06H5yTpYC+@Ry$K7p@Yzsif!<3a6yga9`|MV-Je6S1I?rBhB z77RTYup81LAbp=GPEj+uJ4f(Shdu|vJ*zugK!P$TV`iN3Qw^p#P`Tn?X~z3Xq09_>V_lH#Wcm-DjSz#BYr zGi+pI8U@^|uaZF{k-rR#+(a?=S;iE~8{)}u7J@X;2;VTcHEU?XW2ihU&LR(HRUopQ zACkAg!CW#oAI8`KP=ktONq3W!_~#X2m0N-}hc(f?8gc1d=vi$2fJ8msW~$4R0`UT9 zBI2R1((YHI|4AMz5fjWH3|b*V>&KUM8l)V_oDVflmZ2qaC*?cQYfRMdxqsf&fAc{1 zOUsj$5S*WPlRGURC*f|xX&lz$?TaAkurt!19Lp}uf7n{?0joOQr;IkCJI zp~qRE$oD6e)qMT<;i#`Lke>Z@Xt}2aQ%%8s&XcfBzJwhOTR0bVScB(_xPbNd?T3v{3L%q=$6gYS<|j@Or|s5w;Gteqet zG9W+-;x(_J{xR9W9OdRIj{b{>$pUZC)4IT2x&nK3`uNetV}wNlEJ2o}YQBi58a!L@ zZo|-`Hos8zqp8vat!;;$i8jgYvUzLivH!>3XJHnI^et|%sX}kJbR+mt^vr@34J0#B zVJ#t43zO8&prtp*;kHB2$tdask(9Eihv)j`M01e_DzkRQrTd1H&CRIf%rk>txI66k z745r{rm&Y{Jag!3F3A1$Qf4-9 zq#Z0OaZ)zRxzzKaYkcTIFelN^FTYE?K&&!yk8-?I?pQbo&-FPwSEy$w?w0Y6R)<6) zqA#?Zf(WAFTrQe?$b~=pUS(knsoS4_HX1&yR<7_nB>+YmKiryzHnqyl^N=c%}{o^6Qo62 zElON~{t@_RDpeV1|CBkPyJKxYY0kPzNFe88$c0|kb0MMuFYF4 zYJF_%EkZLVi@0ln5du)n#`>@R_~8CHJaju5y?U=px}KH?i{e7Od~H2;?->!U+xg;% zguk)2iA9)1mHqC=I= zBM7u}zngkarfwEB>AWDFxNx_v>~47;wwUh|y)VD62e%Dp1Lfsk%#a@Sg6Pd_qtk7d zjNDJc_oE1OcIN(qy+e63YnsM{W$R2eI-47gta4FhP;$QKRn;<1tmeQwvOYZD^misb zjvyyfOW>!M72i}%4ubxfcgA(tm1LLts-O)`?|`qXCzUB{+w0QnPhHO%Vk|t{i)SL# zB?b@aF1h4$ZJ|#*-4H_E$W1VsRl=l2pejAD`kZ&ZpODZj?s{YRlLhg*<0>xQ`(_ds zh=?jH|LdOAuzjLI@z-@#h8`9ETVDNc4ID>e%%8u`8kij|_DKaOukkD-qJy=&+P}SY zo&S*lrqz5MTFv?Ou(zaNxj|z|KgZSqN4252T{dy9)Rs=hDCVicDh;u!PO6M}$Dy9G zjkIZ)$9e~|s^G^-jyQ^-WxQWpa4!0~geU^@rwoOx<*&UV+wn0v@^}aI1>-vdGPl{q zvB$w1J)1pp@@Cpb>OTjvs-+ND*|Ci%@mxuXfmHu?0jXwv=GFZy^w%erpoL#K4@8Fi^=!u@2Y9W z%b7YmnK|o;xE>c+6Xo-ZhzImdt_EZK&0e^zaTJh21j0;d=KRNQ`)dK(b+c@dtDtCZ zOqIAE`82Pln7#GuG;X;2BB?DQID}i7-n^7py!4Mw#uu+qNIGVILG}A0f?1jUE=l{d z2l%{XWGz{>08dOlegCHz=OQot(tTSf9xK`cP<{krYYJy+9u|>ncm_$w!sr#$_fyXA zJwHw?CJ4lq$fKxEqbRwQn(M96^5|qKdl*dAmmc_K2K&EM3epfCRW3mR9lq;c#VHxo zz0>H)S)AAwf?1S(i}uy#;A3=F(vRP9ZjxKm$Rx=Nc{x9Uo-v=lb0_cBubh;#8VBhv z4Tt7+tV2ze;er>7>)48N{LhXQ>wVtV;~T{AVRprHsWOKvo3hcLEsu$7sIV@|D1o+L zClNC*UCFx`e6QT)%xD;U)gmsq5U`>Bwf1G{gm-3O=Lm`_)J5r+QaF`PorZX5dCcZk zXn(pQ&8xAdLEW6#c%N=a={xD;S3Fid`CCy>UjL@V!ALX9n9Eo6ytn?UZ&kwj1+7;z z^QZ<$86#BxroCQq)KdCw2PBYdjfk~sS=i6dNM@2RK02#Pnh^u9L?k@pjEaNMLW->Z zk!+L`rwQq1{)6TUREC~x=x-Pav&b0|0&R7i(aBqr1kj|EOki7!w)1V?^qVVfG zX%CKr{P2rHS_3zUhyHnbk8X)Lm6ARlc`yf&BQO7{awG7UcVr*L*P?a0-vW~N5LQokDcssR%Rb8LLM)WgWYldrwk0*ZT zXrXg1o0#hiux__3ik3kS>qj4QzV#Z&Rf~irueZLPU#mLbs9_n`eOsGtn+6`--q;&2*7Hx0#yWFArv%b!o2m zk=tOi0S`9VhiotDKc;S9u`Hj1^bUiA3W|iiCC%i?7rIh|-r@y9LJ)_iQ=utpf_!Gi zdu`!Qpl8ClPc(zRAM%#B+xEw5MoTay5>7~`Ql3x-ZV!^pYR*n4lmv-CKNNxH%E-zZ zWAeN>%XDs+ZGHTw2nAsKs$j@Nyfe>avsWBXAuFY!r{J}A#@|_U>LE$S+>imypaFs_ z{l)V5#%58GZLvdlke*HnN_h%_CKzXC3S)JU=bR8d7QVZ^yTujb#@-zV7oRe_|mGm>s~(QBjeQ~Oy~unYCCK`6zr!edfHRIs=BMSm^vb3uC#4!#Mjig$0s#N zmMo%rokP0{Qe7Afl*C4}`MCRTT)4_5AXs%=edx9LcI~lHjxQ5w2pS1K&2}$=^aS_3 zr!V0P@%9%fvi_~|k?NRuU8vp@mLlMYdsE#S!dtXPGiTBn`Y`uxo)C(mckSN|R+3E= z0`Y=ydWTKJ9d}QyVuvJ~Gp%q5qMjKTx|nJfH<%m}g-1H5RvWm3F1@Utb7rZl6ZR!s zFe%iLtm=<~Nm1xDanR(MjcmkAqSMUZC2y_6w&hX~`5_=vEoC;~M3*9$KV>+}RTgBx zWj!6(Ow5-wTcx1EX=JHEtBGu)x#|Aprlixb6pPS+z`mU-mJ z_{`nJ^DA@FLNSZj(=gm?f={B`xIQcCXm}z-&Dih_f3%(m_=yLbl$sWLWDb1QF7dqa zfzC9BZ_l;%pZc{^D)HL=odpw|j!QdkN`m5{D_mKOJB=D1mLFx*G2oI7L>aJr4qd73 zuxzC$Qs%_nkFcd|oI4CrsIYnw!K6=Q*L;9ag|_wp?r)p;;+M`$>3Ag3(QLxgc{bEH z%-%UW8cXe#cDN2+_DilwhLtXuOs-1()JGF76LbqpwA~6x@}-a>>C3iVq1d(jgNd)) zdk3`7l^USU#=C=t=wBUcHFthi`_&|~&?tlVWWG=u=MUY=e1Suq+`^4}8P4wSm>!Mm zhzk|4l{8pnA~y@&L`@1F@|1O!0vm4SxI(x?UK!%8)>q228eTtsU5TI#_|Z(EM&iGotdr|Cl8337aBWJ5(!8*d0wc%0M%!DaMy8d zb%U~AJ_zVl>b#4kdk&wbEIycuz0`LO5B5coZf|pIcHrdfrwzFIt@&jSz`<`cikSS&<|4f5Z5;@=~^7ZLXxX7yrCBGczFh=la=NZ+{? zN7dze;3K08qWJk$=JYmWFmA~SnuhKRO%-RGg)mJQ@1rx3Ajb0`l9*P64f(!3I>fo; zu6I5Wiz&fmJ(SVl44oUcGmqLGUB@vyR4V*t8oSH>Ew)OrPxke&Vm~DfB)p)UV>fF4 z8A<-=-2D=e5X2PzN?@VvZj+&id~74x@v1|3gM`*fC^&ka#j_GyI_any4l#gnK6mJX zllzobq@Hcl)CcqVK^Awh9NVQGC9^dsa3NwYx77K(gjz1vD4p~^4^7P{U5{d*1qh0N zF!zUrHda0U0{{`NC;Ip)TOs(O}K590VILv|ams2ThIJ4Bf;6nhxdKrg8= z(`9NzQ0-8u2)u&`B3AvpbiGb{^N6wZe}Mant$Ff|dp0T{)A!Z=)Wf*KktU8iI`&_C zNr@tgpJyFLEPM)XB$J)9RQbr$XSh_lsNf=>a&QyQAK`syrso?{J{RCG?`)vgMo((a zc#9sab=j2aQ)Jjb-VxIlbhFhM_jyYwU?AeCP1E}+E=zl5Gs+(&6)jt$V-1)(rsxH( zXy-KCgl&X|^xITBh@&Ica^Skr`|AK%F1?157WL?$S8(!Xo3V_ra^gA^yf~>=YrC|@ zI5)-ajE@~sW0XjRfm=P+D2NJHE+r1Jq#~?H2pE?uv7^14AXNDi<&L*TRiCC%7Nl@F z)gHcDHhtCXJj!l+bzsTIK-k<`G%Qvsqni*AGWWj7zChRw)=cRwWpS3*5^)>)DLRTy z>^ly+%eDFmzBDN-?NBw(1H9HIY_O9P1&$+49Cx|X+V2ZIwEaW4N8M_&=>LDXP=a&410Kd!&EV+i=Ape>wdeV@i z$$@51PW#h;)69*r)Flxp)wDm9ck(RNkB!et7rQY6xnI(SM(q-a?y4lK@GIi#^flNx zlu_j6t_hVA6x8g3M95tUC|Z;L)NscTu1+Jpr96((%)n^f%jq{78|3+~UPg~+(wLpE z{Bz>p?zXIJI^%=ZZDFa?pllFLKVs8iy`wrA{sW$xmamf?G(m62Q`UNfpdwqDLqW}CHF^vZCQ|By$1)r%q>%#RK z!4fjqX2jH65bmt&;y(1p_eCN>Hg9KY%_6OjR4JMVG>THrwDz2Lz{pn&a*Rx`olUmvX)8O&qum z4JD?&8ET5XMO@=BXXqNmy)s^{i1yas9zZO1I^-wrN!S-5O0YV# zuYyA2ytDMVVC}cLH~c-!=CJGPH78IoN9m5HwxGntU*^RDUv>|i10eA8T$;<-xmmnF z6@$(IG+i^Ls{V$H?DTUmS#afyET26JA-2)J7Ghp~;1zv1-FtlLdWs?3SNtDvzkwo> z$?QZkm1#xqptzg|H!87Rl_W>n1FpqfW;xp{vbhS(K4n^>=7PCBLD)%5+xQ&tIBCf= zXUakaUPt}1uHQ1o=o`I^f!bV?pkU5NFN#<_<{%+lgXjPOn74nf_@+*vu9W(KM$h1k zoQ8!M6kfc5X*%<@Q+&eQ)Ny+`5G6FcuvvgOfmk9-)ISSRP*{Jwn80w~wwP(6( zaYJbpB-3k+CxXjAE|g9R24zNp5|^|MD{VSrP4ULyVBgcN4mt^Q7{U=II(SyEiCLh^tm%BJEc1PR zc|DDzjH)+PimG}(P9XA`OYEOi;-htWjChnGAB9sF64%MMC8R-;xLXxwnZ1tu3ckZJ z#LUhh5qBo?pP*UXTVfgD<kHgBnig=VYTl!ln3l{6bMa>r#qaIIg2Cnh_Ne!I4jQ;Ub#EIvdCN25^_GmePcVQ1I~Thr_=ntBEQ*pgo=bRmkX;<7Pmda3*RJ2;dJA5C^!|n5 zOvA?A_IELa^(;Fsb0j&*=hiqGtRW!nt7g4??QQV#nO(VJd75!oqna5leKX?KjB2NG zFu^a1s9yz_OU1m@xpxD;a$$a)kyI1X6eOe1HX|?;WNe#GGivrHCjQh4Pk`?l5Km!Fxtp* zI7rP|=&D`2e~e|4mZp9r*_1-EE+M0p*jjwAX~fz_Bv*tX^2HvL&aEfn^PplOf-4uF z)8jx>h@@%k0W@3PBLUX2{!)WRD*--DK9HRts$R_Bk(Sn?z;a~GBBgB+y5d@KM5(qj z_S8zJUJAQxQV=+O#1nhbh3Ny%H|EKCO$7dS-KoK80eUq%0NFE8{?50Mdy&MLVG&^R zmru;6evl{P8=)~MHx}bYDk#Uanni>>=fLyecnSl*tT z&b01@9gWFMYq!9n`afNI+F<7%N?R!*+U-&f_oqukf(rYPxbM#cE5kOAd2*p2NDjNZ zm*r@))$6z>6~h8;O3pty;)UQ*@CJX>`X#=JCZ%WUA1fKjW${toYGPhmJZfVbyH&&O zNEb&vRh{e}jl`U)Ts_~*JpB?IZQ(78v}wtd8fOqGmd1tG**MPP6tP#Gf?`x3hdXqmj@fF6hQ>af+gSy>4*TShe!Snj0M0PebK9n9xXC6ir$EpnBwH~= z0k7fn8I3Zk)|2)iN||j`LA{)u%Zv*un-&hwM434Ma;%BcahMlfMZgRj5AdBBp1vv= zdztO#nWJJ|@aU=X1vDqvwpolF}I!lw8hsV|KM zhE*I&df;w}yF(w2>e;#L-yRXvhj}|V5##e#Wo)<4W7v|olT?g_PNwheYDI6O1`tC~ zL`xYI6xDHJ>+x6f|$m^f^luQhG2|eH}rW0gNLRj!2|bBnDAiZHPQg`14aTFy8aHd`Vq& z|IeSeu}rS2hVGy8mF8OXunEGB*sVDYQg_)s z$2v9_RF3M5RWG16BJ6F%c%7!24K7Ypq3-e8Cix!IrGC_REkA>duApE19)H0ouo)04 zJyAj`qq|}6b2hL0^Flk9-Y5^KpqNl&jd4!N4=TRGOO|Z`eTf5I#C}ZOM`v=^mx_uR zu-U%SrmDAhWIVXfU_kB}z>;H;fg?<|F)CJ$ZtKTb#<>5NA^+ze$5f>B+st^z?Jy2& zb%Ly76~JSBp7oRFzYGEV+em;F4xnrLPD=lLFB{mwe`kyTMPmF9d;b5o@t>FF|IK>H z8>7(&pX*)$^xgMSfWfwAfN2Z=Cs}ir9-wFzDv4C5&&ht5qm%k-2=d5Ga`z# z1SFjg0b|bFOa5K=!QiWdrO+_s?-h%^4iWgp5|U{8@g zRsE-TZq&X;c3A!~#S>7>tg^hk7Z{ClL~fwyJdQpDh;*t_qRVGWR@vaNF>>y#4}gma zz{6V*QY^%D(%~QeQ2zm)X6!Oqgum)~tKjG#YFLd4aWjPpl>N&eVys8P1g0 zf`Bje6ZGNO?71rlZ_ih;jvdWIMBIJ-2qFKx-2F$rb=7e+`tS&No3vl3cHAxx#^0!C>?jl#9JN_N7D)TgF`EDQ>7#0}cJW;@;+aL#qvNLN6cFZaL zM>sdVmloZDnKkI(9)QF){{(Wo4L)V+1QHvd=0W;Eh#3rEoi~$aqT1~q4gu0X`Ur^Y zHPG6v11S38D_}r_YPJT1dJ7B?_8`P#hf^B-d49BeT|f+3u6G?E&}n=Rziz#7W>qiP zXq?viK8ro@{^AzkR&(OZ@h7!rnLBwGbvM8C(DqkFi?A*M8IP4Lf=Z0^J zo(On&WOfEvuV7bT>Uv1}XV5#?uc|XEdX3*e2c-=$-}EMxy=M~`F7v8ldz!sP4=8vS z#G+{tjxEG-cxjpOo~Q*#a|;ol01~Lr-TIM8&SXTcZvNlRXwgJdVVjVBxuyL`#mB=Fx!(w3J&wh$WcNv^o>T$gZw;JCcTPoBRtH0BB(Qz^t%M z;$sWc4am^kGZDf1$=2yOSU9cU-__V9pyQrPl?fvC8)E@R2Wo_Sk@|^05-KzNc|D5B znmX|!Q$OiNQVlScCDuk3ou^q@^TE3YNQ%4%kCaBRp8%^ows_XQB{SY#b@uqqGUTfn z01gZP!9jTeNWI3SK^#MrVs+8JwNwEdZvl;@3tF^Hl&)iql9N}{6WwOCOE<1-y~ z?2LD?`XRPM#ALy&ED&zNd8y$SS7{fHP7cST{gw>=*>~5?oC~103#@12s(;yBJ1(AG z0ZuusJDOz;oa-Kn&NTmcox`}P*X;<`$%9PI_Uc6pM>1=gUs_xmPA3nb7oZaSE**)r zM(7gri*cBnZ8F{{?n}5}#2u$iHMSSx8rpCIOw!5G)6&E9fg$)G=72OySenKjXUa5+ zbZ=h6;*?lr<2`?nTaYgpO)*;pNpS_Z?mJ)d3X{h@(o3g-tg#O4Lc-}bxRoh4z5@a+ znMsz}&{?cmzuDBz*OuJ=Y<;OwUtoZ11^$r0?jMOSx_vv`a|@hvT_aNF=bG!{RxGora8&|AD@~)^HPnDi)uIEfb%tX$22^S`H89$jieht;+*>fYnh=N zeWXT5^aXQ0`VnEiWF`!1^#M}vsMt9ISh7;k_W*TXpt7sHUD|TWhoH4Q$jfL6`>qX!~byhDvgFpx&dB+BBBbHHhz9<>oBp>mA(vh&1J z)Cr3L&l~&qHPF`N<}mQv)t2}}>ig%7(F-q}kEBN;>KrJAam2lY*d9nKl{5{d%Rsuv89;~K+ZMHMAeCy1_c#@>Vw-8C889^XuDSjT1+AH$hOn~4qB||tl+VZ zg(D#b!?G*{cajg1EdSJ+<$Ib@SwfNaVwj2nent4oAufaj@&u*gG{v`_nMO<%8l1?n zm&B=@wMjcig0Eyi(eoU4^$Y3bbyIW4=sobNn;X}@ZpOSu&`X#q^~kz=2pk{*O|Die zQTf_d-JR&yNrm|oqny>)4@XJh4N_v80%zgb*0(oU`~94%r>&QTD#tPeoJ`{}v>D)A z%PZGS9vrqw<87DyXwz>CsA_xBaN+kv$g`b5DFMb*8Nd-_S3FIR^#*V+dX<*$11~>^ z`UN)zQ*2Iov`%zYdpxbAUOD%Zb}!HxUF+v6Ur@DfPQ3Ko-kg86y~1z}R}qpK_Vw$d z*YNh(x5S<_+fHLTy1OFDOygp*Jc445tt(KUXF0VgVAyh7DdB-3uQLuJrZY~Iu-Lj+ z;m?;n2I-c7lEriJQkTV_aWHTKQcn+Iox^0G8Bfg8+CAmpba>3mOyKtjM zA4Y-{3)bpNNO=J8U1u$b(0`I?ET+dxmjLKwB=0ny^HZ+-b(pYZKHIR2REZjj4P&*~O!GnN1YS>H z4A{$Z6_sm;V9CYE%tsTG7ya|?_%929wjVz>CgFPc9>iyM>$E$^S3pHLpaHvNtMymuEp1d zWIXzV4t4Y+ZAZot!)tw-C;3cFa1a*dmxXT>uQM05U|GTFsHvUAUs$b4UbtBogz;>O zNjtAJ^bu>=y)+r|4`Ht6v>W5y5Lc%~Ibl{bbg>0KghscFrxFsWpSm{0&y~zv^nczC zxuk0ssroe14@N_$R2gaRyr|~6$&^SIjyhrH;w*tXhH*HIQ+@i-45}Re^{Gli*F>#24-DcL^&4x+RWtpU0iO7``m1 z$`oF*HqmH3+Z5h-;*9+A85+YeJ~2_$Ln12nAbx-bOktdvI{pZco#Pep4Nd^HGh6ys zrFXPx>qI>6aW*Pp*28c2u7!wxj*798~@2ftvOI<6J??bH5niVeH)>kXSO?DPz;C{hBWf~;rT zdW`%}g!AW*w0}9PvLglGVBBC1VPlVrZD*Wt_=0%tSGSzRoVlExoscQuTu_FR5V>Je zFWf(z+6n7q_Act2RX;&Flzo%~wj{H!I+^9DYvcZEFSsV5V;L?BXt~V)y|?GHj#Hcm z@AFdp!qvI{-GX*I@2ZDaDnJ|bJu!wtyfcY)>ct+T2yUnwRv%%wX)1B1cL{i!26r=R(*tQyKMOAAuQ8nAvH z6WZ^b-Zfo;R8g>F&S=e_p|NYpEF1>=w3yaM3s95Q8B#Vc6ZMo`Zzp8>8Ea1oTKym` z{TygLmlYLdaY^L)qokH7CG~3T3T6XY{lSih<)&-FXcBiGNAzsy*3UHu`=IP2s7C`! zpCkP$daL_a_nMkO7i0S{oSZ3yvFbP_id@gN+#!6fNlyxfRMG95wL-w9%f3@upI0t9DF2_0!{tLj-Na8<1+6Me~@ZR>H=g128`2@+$%&g_GYreh6^e9T~}TW1rGK=fR_lNbK3lk;uxO}KSrT|8gXik;mkOTUmob#>{1l0&!^@8US=A5j+I zz)%e4PkMD}F$CIcP33GAaGB`F(>zJ>pnF9mnK5-AOIZ{24blW!8lz6(xc7t42o%87 zeh}nhfGW3_L6qVjz#-s|@v|&T#y-69A?zB+-7$LEUQdIOer~6$&<`;g8MoCf*Qvzm zL{ZvS8=RYSjoe*FY4wEkP=BbW-^Sj4w!Lde@JP8#GoEP?c7~VJPq9xk&_4X~XR-Mg zJ6ysO6QOxexn&Iu1tNJS#Zz3l1oSy!lUwpZyLwPQe&OmCN#&WJ8dVq5k&yL?z;10y zg0Ult>9n(z$w_T9{?AO^J{vRNVaRmTwxsb(GPqrYMx!HHGII?1uo92khZ_w_SsD%f zaF9YcemvfKYqM77=^#|RQ?uB{qj*Kf!&#e#?wNg zLc=h!-Nq$3Svy3wRyMt-PYtSs&B^XZbCwnVf!c=WjcB>8zi!g~blhL5idSI$$?TPy zMad8s#!T&`&tR?B-C6QfF#^Za1e3__GmT51a;zpcs0X5b5`qh!U;r6MU%%|34sBkJ zRmy_>(aQV&d?iUXh(xGf!c>3atOu6Rt`Gjn(oUd_jNYhBoX{mXt)J2;`v8Wmag_Id zK%mPeijPpdBb`nA=>h42q5)$pBO@+M|{K8VS^5_h=Lr;$X-e{^w`9T!zZ6vJ-bb z+Q_PLZ$VYm<6ZL4%B8;8_;o^HOkj;PyiO24QUm!%0k)%)Jx0AQT6D; z+v^NPQvAAy)F6sUCY{U0VjR%q6P=}kR`lm(9MPBc6_f%;<8zW}g<%m|l_14=DqPG- zT>Bj^pWupHx}KC7Dd>zNxc~cBfdFKba#O;kn*^J)*9Mo9L}*y~fUFQl0jgDrmdX=_ zEAdfMsP=PeVdz!j@>^*9>W|VCND`dM+E~+_v;$=|*3sYVq(_;&UHg*Ds9e#ol z7LkNJX`*&hB`?%DWiv>ZI$gAAKAjho0K(!ZsOU(gL{9=I_{pl{Dn`o9q;kBTu}hrt z^5HGNBelGeIq$YMvYS3#tK~1iIzNbd6uwC2`At2pZ69gi=U5uo@qWo zdPF&gZ~x)@3$7`;@9?*oH}X{BA3EO0;petgK)otB>V3-VV2Vu}U!$8^MA*#Y91C4> z3qKcQs6AN~KS4Vx=Le`J2xgdK+{9lUMJ|#rQm6i_hB>KN#gu3$_ovgZ7K>ZU8Ck#% z*BMGTYtgTxnkU6>{9XWJ(<4*qgr2IKCbe{7>DZnIQVUlmNaM<=;`LcahUQ^)oAMX0 zQ(bL6V;xYI*)=oi``FwpQqxll&giuh`Xo+i$DogufQdKsX%pqsQzA9LTGBTn8y>0Z za^Q$Dxf6}Q98ebWg`Pm;cjXyTid&(+0b;*x=O2JK2;q%5KBw>Cvq98_2~lKZelxlJ zmEaQi+q5W3-U!3JVLlgy-tB+lxv}q%q zXI}xT&;85Owv^>H)Anng4IidlxMm+C4kswl&;IO!pb?qaX{>#KGHQjnLp5DraFb+` zV#IA(wbX^wy(djcFox0QVfqywrYO`i{f%6K$IDp88+Rc;hs2xiI(pe+Rkt z^Y(vCIY~Kl;}K#5%0L_m5ca@Y0(oOEV|3^zef9SWRr=S8i>T%|CHjAEN^!jXeHUba ztuPuI6P9NvQ}dVL-(^(Qw%yHar`@~V@GzStq*t1L`p)E*ZS#9eawo&zA+hMwciNA^ zzfFAI$e!78e`ve*fg}Rr~c1!JQlh=E{8_@U32D z0xcD%Qu|p;JPb^&6D=52K;-H!?ux0%WKv{$njov)I;PdOWY*F3hY52<@&4fT#= z68<~(_fo<<#S}s+2GwTM3!m9Ch!7@SYv-tEZIl5%mfbwukazFjJQUqFY7zLK8vTBY zdw_J9X!PUP?(Kf-Z5yPixN1S@Sv~Z|?*UEahd`f4wavPZEojXbMn*d)eweV&?JZ8w zDvx={oD6?kNdY2HB{JGrFu3rNo0Gd(tK8j(uATsNb?rwB3}{I<`EZFb|8G6T2YoVQ zedO6nZxXuTks(%uU*UG7ttU`Td;Lj4DZREVl2*{pckxY{$nN;7Z>r@K3f+2mSMB9# zj!F1t{d$7?r-RKu@S|`P2z8%Qln@kQVasUw+|M4R(fK8vU9a7J#upx#9G5P*Hrc#Z zxMnpkT6;$1{rL$PKI4Tv- z;^SUrCe~;3X>PeM??FyQ%*}2)wQr?2^0B1-=M6vNZav+dHdVc5Vr@tOo)7X8@e&Su zcU3*p`ycaUCFgp3F<1>u!Cayil{M%u%^M#FLPD3$V$aEMU8bL}EgJ{AH?4F<{DP=( zN~#upb_))v@!WX%nGBkL~0CmP?jHG_zB!Gq&2kR*8S+-+tp=yl+8Q@|=_& za6}M?XQmr75f@g}4PmNHLfI6aT6^m1q<@qcGU?wl@jm~w42)bSP4bbVEXq5EcgvQ3SYSYYO|Rlm3ci&yW_k@4chb}%=S5X9vWNE2Od*y!*bz4Tm3u#a%ROptW$qM zn(>NV0i4}54U@_=ns<4oP!O(CTJE)*lDb7DoP4>LPbtACZyH(fEqI?O7X(r9i1Nb; zXY9o`uzM1PLvc7oNc*gE3+;Vjqe7hVY>f_jeNLmMBsHgdkXNUwEabwuLZ zky9L%!D=}Z>)whk1s=PaO&^~2V_eRod7#V;nogda&6ErXWv?8ht5zb2pr93sIy4w%*Kono|ChHHr_B0xUc7Y~(N zDd8|{!gU&zqs=I`-O_7C8hwcR%~9XP$5-Ija_7jW6!jtlU`&_IF!)bGf#= zv3Ol3q0_Q)zSiv`6K~h;NT=+^40z~GHCC`HJr?_Uq>xPGkk{>VW`}G&e(+I+zBh0- z+XoiZuzLqXSokldwau%VXZs11aztrZHAC_4s8>+$c3w;}I34>C`a6;w9RF*J1V={jN~%!6`sGsAq@`eJovFf%orNY#!@ ziPSNM^jQ{ZZ8?P{3-W!v_USLYva!4hu8p2_Y91bW;X^Qf+hxAOUXJl}xs`4^wD8R1 z?>L|0aqCbOSOh0Vf3##)<0SMsay*q9FDidxtL*dvt>-``P2(&c0eRf+8;d&zq`R(zuX~n&}0Y5%Pk*hFF49#%2m1ZL{gL~|@=G(&!cIun+ z*I=h~ERtC;9k15C5RN0a=SSYd;2H=1XHlGJ>@iZd@PL$V>0*wOx1z;WO3&uDz}kOx zeohQsZ@Md57k^Atoj)@EZot#_Sq>b^{)U|SyEga6wIn4Nap)}a*Zie7Yl#OqO;F2$}FBgKK$K}GS;Qq`g>gUj zQN=neo>yvElm4)P46J??) zY;h_K{pL;%)q-NOJT~W@9$E5@p+AE7%a$EBiKG8w@f*QuHZXUjYQOmX`4fzrOvaKj z5JxREQ^^Q<&;0gNlC&s2xn18npKL$%PL9ZesZPWItTIllq!(83?VfNux=jHFYd+BfY*SX^o zTmFZ)i+eW*9Y8LqdCrt3Z}AFWk96?Qlk`qav2?Gb{9-=b*4zx3*8Q~SIr@~h&yJYmL~46^#OiKVa=yqv5nWM)5iPEIGU!t{_<|N%vRck zHR`|UQBQiUNkw(%t5l`?9QL_4dXhuLu>=RR%I%A+!7=KhFtT%nl(?TwSB<7dml6cB z$8TCBGPmROc%|D_n!N-fj|4LB*#=6+mD=^Pt|s}#kJ*j#vP9q4-PVOCX7Ga0C|L#8 zo;5_4$4$TojKM6+)IRFFpa1*>Xdb$<^Cx%;w2K}z)-6#;y|h!t-U2DP^kO0!quXcX zND275QAzqwaw!y_$G6sDSodQSrHhF3)h3BkZdCRg8Kov_{J8p*@QPZAw#;{RM9HaG z+`5-2+@!x7g-EOH*3294wN#EaHulavVOEn7x}0UF7)Zz0dy7dCRXA?cMpznIt1PCsZX zrYHCHi0qJ{;xIAtwcypcat3UBZ(!ke72;;?iI?U2T}<|*Js-gGjF#x5E|QZ%?$KpT z9>>#(d-{OC3JUp5_~uS;B$5u{-2dF=1S#I;wzd&?JJVG5lO&QuJ9JtObJ7m9 zdWu+r$G1)!(OyE(jT8|)8-Y3|ze_JIT5%|l0P0BO;g?7#*9XF~U#E z8HFkSx>E^Qbq3n0+F3j=;=#I9eX$}!N;y^Wq*H`DT}5sN%G`fMXoB`qIbW#Cg{wDa zIz%fvjn|bDPyBC%_DpZc!UpBIKrXQg-5n!Ib&0`?^YBQ5c*S7~e7!IdLRE7OiU?_D zGG6J`-j@#ht);ig!bj^zJ(WtIDZe^EUMIq5Hy)rOHc{$H7Qk>SR09^{VV4YIyZDNwalpM+re(1k z2tX&;;nO|sO+BucbOU(A{66OOvI3*mc-~L63@Ml1H-uh@bbxA|HDYxvd(-U4Bm1lv zx?gZnN$80!&Z|fyUWkrLPT9@}#!k#*O1N{FpGyoxC`mhs#YC@YtVdhQ7l#<5H8non z4Xp>&n!2LJx!2|w`DiiMkKKAB-2^?uaUbx1G2Q0D6h9r-fbvx^ioAX{!yP4|4sTUn z++!?D!}?O2HvIDB8|Q1Jff9KDmS%dbsK* zjS{*NhTvydSm91+;&zNhEGfmL78h8s_LG79Uq=CHBKox~{aK4yO@kwuSNXevo~lqH zU?zW9%TP4fO$fBomEfOQ|7rwo_uWpOol^zcb!fL0SZtMsQNo566$S#KoH1FI&0p#} z9muCyGhXH0{6G&ZYIJ|D%D@u+rd1l^l1{AB(wq(4@FkHk0FeYgaZP!0-01fDVF$>^ zmMCC+SIDPuV=^sogR=Z{vuR9ZKuzqxGZ;X!8<57JZmQ1Un~=(y)XDQN_opZiJeF`~ zfj*8Quo8xe=Hf$|6AYhvpA%yHxX$N&EK+w6cq3$F>xWK90^-~Hh!4=fDjFP>DbbLa3PLHUHre{l`5iR+6{Vkc3^>{fC|Y*EB57^+kMBQ_3rpzb})?qcm{TAe`G`>p5Onrk#MRwVEa_! z+X43f^A0l7p)i?ES$|^xU)EO`1Z-c}ed1#Hzis=UWssKyo}l91XWIY6`i8$u>H@H+ zKb`jnZfyv)E+W+8gQ!@T0Vv=SASRSdUN)_nMF;M}TxZJRpFA+(igb})81QwA<>8QaNPP}K z_zh#1=SRzHVaoJn(%R8fvT|-wu4*M$Af5i3|qDpnO z{CL0o00q*IDpvpuH7j$Po|-Gm|5 zY5N8|0o!aF!T@~byT2En8@3P7frmi7!xsUySfsP7I7W9d)F z1kZ9Fr}rPl`+>ialL>JP{Q2`2;5hzSl2|7@{iHx(WfFg+4AE^p1i0C&(5r>YV`R+Z zR$z?qPC8_+?e`yGRv&VOfJ_mfXo^RS>W5W>BC3+{F!RBbF-zbV z^Ba*%Kta6p9p!CR^dJyhMFgkz3_AfbbQEFmJOnJr?V)^H9LWzRW{orJ{eeQFFJk9& z?Oj86G%P(+17lbzqc}dj!PRyB7~F$y+(kV~9?Jfi*qe&i;ng#`!<)T6)rUbYpR2B{$Ix*f3dwjmzM!x_Z+1G5*@#e2al%T3UAsO$PF zvTiB=EO!f0W*s&Mu9*nJwFI!?-*4^^N9?mk?MtT)&3Iw30t4r0KlHZklUZjT2c&+zV&~6zuo2`Z1mf* z$Kiy2Nc=4;C|3wZ@2icbpohbnuE(8%P`?s5rJUR-W!G2iHWJ%3b z7y0pCIGKZ<)ic^J(dlo-geaYbmj0T#JA&lln)f)@cG zsbk=+fW7K1Et!j%ujZBj^7>owpXg;CPSPskm~^fFGP`RC0KGuHc9}#P_<^$4*Hdsp zFv&yUnVE}-+uuonUHAImCn>&-k`%#MUx9|eS0JD>PNNGbYG1RP397mQuIR5R9Cjo7 z3k|`(xvz=IqPo#TIH_Z3?mg=LfEua4VunX}lnkJTzFV}-w?zwGBPnp#4!xPaZ&%ck zEvOe6Ww(oJX}IpA{HSu9uWk5uMJE`@IeH*YqowKm%O~0_^;ZI)kAk+OmH;Athpq#G zKK@pH09rDCu1Xwa_Ds}P6bH=QI)04X-k_p-qo&XYeO#dPbIYxCG2ME}s6E8Zw@}tX-4EJzE;Pj*q8G_upQoUk(__u7si9A;SSUZtr3r2w5F= zUXQxn_)N~xC+Eks0H38aejy@R@wos#2z)*?C8V*#l%%Koe$@$ha9e@v*x=qHX|m5H zpo(9-2Xw8+0U(-r>hZ*48Dmz6__zQ99f#4Mx>1g-O}0;^iq5`LFL z+z@YPT>%H~#VcG)NL4?=@{MQ)Yo??lNAPT`Z1S8XU@^kH>}(6VFZ&OBJC&OBwIo;< z=Ih>d{NZ&w5w%yfh`>F=GO3dQk6lw0^lBj)`QZ~ND7$pL=H*e%Y!=ay767K|Dzv1t zEhxK4I~Ri0t#s-HOt31FN`Zh`G}i+_j-Dk78AbAJ5VAX4N4{SI!k(V-t9j%}Pes2K zii#3#667#Cr)H!9C6Vreq|?w@76PwI{e4P`T=68&bI>pem3Xu`0Msr4Hso#XbMVk-i039!xY>8^6S-U-{YUXHMdl_(*H-XS|wHfrqGN!Rtj1vG#-JOeCht@ZOS zD(A>R5MWeir|>|i@^e|d)T2)<9E=r=8{P|F%}?CEN;!b;JT4uDG|TxEFWl5G3lF~E zLughz9&A1z0oUsxk0Mlp=K{sy#eH|C)QDp%Mpj)9v?z@ z+?m{I5yE$VhhOe+>_1+A|R|bR@ zISb5pgB-|z9&%e=s|)4!V6HbR0fUCyx4_lnuNA>5Bcb^7C~tp6>Dm4%(T`{7-g9-f z_z^TI3qUqFr$2?sX|!l*K9VV-@cQA&2#L_)dVi>1x2A` z$vc%K%wydmTD3=N{QDU|o^A1GzcQMFY!QRnvh`7~=!!7sBBERNZL5g6JG{d#LsPWk zV0cq@kKh}!iM|Myrz*uFP%T*BN+=2SP>uW?Q5^GRZt|$ z2OL)m%$Lh*#)%?gZE7S}9g5c5SCand?6#Beltr_8R>ppeUVnJ~uDy?2AXhh+a(-+k zIl~4IlUBkRlq)V|$X<*1&8dSp+yMS#Ue#(wkT%IGyx7JSjM>UG7*BqL`x5XAF6X+t zdq$n$O5MlG-C2M3O6VLW!*O0mvQ1G^$r6si#h}ZfKa0CIuNQ2Vn2e0F35h-9Eqh*Q zJvOx0Phlx7mJp3Uu1W|;>(O3d(HBYhm2QeI5oWE{N4nu{9*D>uh`kWKFc=fuptbb@ zt`B~Km9$hvB3ZWk(Lv<2*bZ7t0uZn{*i<4+f&D{jCADAuQMlo74DB}R0Nb6fVZlEC z{F8ZH&c*UG?0wZ>Rfz({rviQwf^3QsuB%7Jn7Jb)yy+j`?6)1;z*3F`{S63akj3%4hlBwIXNJaVvdYEj%<-v zv2Bp=l6RB_24!-~q-K%O*jr_wwqwNM;SY(}cP(;7q>REZMzjB1DbY?fomY9-vk@oW zGtilSX$Hwe^M)Ou2=Qj0}E+un=HZ3cA7v1v&>F3+6 zBOMugNR~6=v|*f=`Y927Hj5?FHDKT|fshCVURxCA8b#bR^gHA7^^xW*VUNLTe;h)65! zdgps5>-*IxSBN!uRw?MUoGM<}X~bvvsN$bygA1`V*~Z^SgG4h3oANReXp=KQ8v0hk z*0LX2JV1(((bKQU-6~(G$8CAF4q-F+5vi+3g4P;Q?d6{!fq%csMw>kT_IUfPW9vq& zgWI|kwn$09%IrbOjR&05^Ttth5P?3799Atsb`n+^Pb(}ho9Fd~8564@{bC$gZ8wI6 z5pjNYTQr6eY@1jCI?q?u*eLqZopu3xYjXpSIO(KYb;Y~98mzCrMai6ZQg>mv1$VbW zjqd>J9Dyo{=g7IqnbpbjjMZ4EdB@N3bl_{5>|ffQbDrkfq?}1`oV$$ z1sBsPHpAAiN@dj& zms8P}02hv^S2gIo zF!sh{PvTJps0DZ}RfBbzd!=%BN(O~!*Hm)3kT;33f}=oa9PRtzO`*fKC+WP>Qh3^1 znK6H!uS!2xU{S92%R6Dn^-eY6pAp;xSC<;Yzv^>bEmCHm&Po@8c< zWfx{q0m(_TVk$81>REAAG0a6MI*N`(3RqXoWtYk`Y^68XnU%_s@V6(*t)n^&M?0g- zuGCUf2IYjvI|+HO+rCJIRQ#!f6YVpdRlFu3>Vc}l z#HwFeH+ z*xQqJxU!tGsxnbcuJU2tXG$HN7H&L6&h|=8JE%gS+jG^718*#gM zTO^aO#JQESv;ihyI^QMc#!uVr;nmVS)npH6sFP4bB0c|m<-Wy%g-8e^7xG$eFSnC= zbaJcJzCVP1gUu`rRS0=-CWv%OZiu)xCtdF~Z=ov_dS*E&p-$|}u@ne2^Il=opgI|b z&1_bi(arm+a_|j4P1rTEiM%>Ckvzmv^ozI%$?}tw-wZ~4w;?nOifGfor%b^D>-5DC zq4&qZYMSe%X8WT1ZZOc)gy+wj$3e~L`}ea|&MnKb)QE-XVkyRD8YgIVP~mFynOh0+tP$>}3vx!Pv$zM0$VzP!b{!a%dC4TrN$Isy@ga`v}uXQGF!Lc zMZ@a!d8azN_+iSKz^mPS*jK$bHifesQ-*7s+_Q2}N9<-c-`ot!Bt4u{A_eHV`Peg+ zCV|wiCoyqqcDAUoR!?;)lC~v_1ok&lW@PlH^@z#L1?i(<*mZVC;WGmqnm@APB=!EHyxW7F-TZ#AaSwnNTfk6KA9Ou zz!a2&$esF)!|nH_W|?0-<*H|$)lBPxK%PMvqHIAa{3*ikjEZ?GmzA5+6tx$nJ~%oBu7R>pUH_G?D~{vyZ6@SJ>osAVn7GY~rb!qXs~_iZAr6z(P6hWdeO)RAjI zcu`Gotb0mCU58vNhwM^V-V0P7;L_V>rMj@VmHE>(i|UX0;60C#t)A5I)YLpEp0Pqm zeemGZ_p5c3uMih&_`;VA(twiLL10AaU^+@MM z%u=WYz0qb77GoAnsh}z5zogb>CBZ5bG-6?yNOPu6K zgCod>1z75%)1bSq6FSGR7!G|YR^E6LA^dPyU2?jPFRn+!2}HI?)RTh9g-L>^J{mv4 zRGRarxSfU}j)A&~$F}&JRmcDwvd6#mW*;Q8UCLE70)I=ZtL9@Ii4J}<1MNQU{eU8t zoAoRCB3dEEwMfAVw5h(xjE0xvk+7Z4r%a2+e0|}u1Wuxht1$4{+_sImPEmfc_P8o;yzR1)n8#c^n_`nkVA$&KpYd& zQ_5Dnem(P}a7b|6CN@tZ)s{pICJEG|6zsl-PN=;sZ%z)Cezor+ZX&)@OxN&Rd_yU8 z@gTuve1GpsiP>yq*1no#6{W)Zf-5edP!{J_pc-Jom$zAAB%hX16jBHkyjd~7=zk?D zdHHlwvsjQsSIM?!9ivNhP>j~H=xU+NE1h?r7i3#Zs+4QyjUl$GP+8Jy|JspCPlu6U zEx3hXy#<3{LpD$=fjkAf3FneX#l4UH9KYxP+|T=c?9Dq^%$ij*-zz@Xc^-*+$=mbrM7iGc+|mWpg|g`)q~sm9 z(~y$?9~OY+30n$gfN%-V)VEB4BIei7kKd{`4K7h1PS;mh+496YIdreDP1zl*wG;YMeju;{qUTf$bgIc29ep80o5 z9k{b9BuUhod|hBUaCgWxK7?I6scclk(fKan_=X->P=ia=??AW_Rd%SF%WUKou~|%} zpR%3a#*~yvffDSI_DwD3&H!X8Pg#(WFM{MdvjfEu4>6Wph$Mx-UaJT^;z|L~_``ab z(4i%gi+zvZ&0D$e`}6YdV%{20>$eBnXfbNLa0+HYNrck`=HJv%#SwgmY5e+moplWf z_APr~mUBwM(P&3xr9-asSBDfs#j^^xHBhyx{y`Sg_k^+^@I0W}n9IIMHA5=S!$TzQ z_;rB_j*O1^F(WFpadbah6V10c6>P)dI_xy^sc%s`Epe1S$FdbOWqWky5)YM2=WDuD zH9oN=8>s4^+?(7Ao()-kN?9wIC_ct>=2Dwtq>AhGTa1p3SHyVTU|Zy5)@f*AN`cIv z(aA}D zajq`Lt)0>MYX-ryB%N`mQf&DKb1>x$xGM}}i(6#zMRV_|(xFUi#UTG;to!b}{h>CcxN1O4aCvILO@UF5)2bH02mct4Ucsad`33F|=>Wo)h<8HGol#(Zu9 zwZRYG##)mCx_!Y$P0axI`d%r7GJ<}p0$`Yb+S{#I$Fmdd=g-?>U^XS?DWQd@?Y z<@EIcuN+G)kRW{>?9DCpJ~D_t+VhmKvsYyBM@DID3O7W{jl&9@P9}k$7$Ceoj*LO| zWB66Q-r&_Q_cM<*_kqa+iiJKh_iCHHEOX6uM8<~%SO^j`Gq-?{8+Tx=eRpmcuz$=>itE|@;7b6h2 z{pU<0VoH=5uyvHDB_C^a=PMXqn>Bwal)c8!ma(u>YkELL!R6^p$DUcd?tg~p?XT#% zJszz@QQGto34Zjg3kX-sbJ>suOr#fI0opA0oucQN#mU^4%#a>}0uKMryofm(gykAPKd~iOwW&s5Y?#tD(NLU$&Y4}$Y zg98WMlgIFj^faR!3B{L14>t^ntF-vS6d|MUr zK_@y1_!QvGDLX+m$RjB?!=^P7y{KAkim-%T;yt%UW!>9SxMykB%f35`mskIuybl3m z4)^U5vupevH}nzu;~Uoorx^_i z(&di%uynz5D}R~$0ys_tY@IrXmTKz+qdQoBsv1$uiwwHN_K)H{oBtydF@*iK7w3afyQB#yf0daS6V8{1|RfPsaGi%beTH}s0eZ6+;pmC zJKl+aR{CVe&FQc=GYKV1=%pJM{TpGK1P~V=2UhEZn$4Ah>25jkS?W z;LkfTK^QBJT&yU19Bx=)H@LiMr_k?Ox=cL7KA9_7i;X_LTM)!YqiTJS_m*1Gs&V3cEhvcg7za78rfH8cEdpimE;U!431v?M z!YwCOGNacn1V^_@@=`8#qtF3oqI_$IiEu(@*Jot}ifNY^TIrfPc&oU3-c-XM^ZPjn zggK&ww|XdoB}v?dGGpFiwV8%TRj*aYMwJ<35~qRFuCNrN`Y<)w0=#e>q%%y_fR3JSH5QECagFaqz zf`w2s{LC?f`(TXrpa`6`GJ0k6Y_pv{*JN1lbM zl3>D@kfeP0J$*c3Bq}s=#e#SgGA*$G@B@E`h1j_iab>gllL)7z8IAY5kYP9nK?V^? zztfH8tB-@pOp^;Ps{QnK{471Gjl=n1(`1%p4T$tCm>8na_;=xKWN478#n(7soj|%0 z_~t7^$VS~lC)_gVg8<6`1W#>8$&}0a``o26o0JMw9eV}~-8y+})34qM^DT03)^9xA z<3g043E-kn>xq`6b|{3^jHv{DezWoJbII|>-=@$`k$84S^o2DAJTM9F9@4r>(-2j{dm}1w zU1~a0UWCV)^O4fHh$rolW&$PygDYH4zM$#nI}Y_TjTo)0rZDv=V^&|}P;@)2PWo%z zmp2sOn?VPD;cr~u+a{8e-PR(b*G&3St@Dnkju!U3JAa&ZK-^1EJ9 zT?}^YjVz6_6oU@8)kiIpLzA&r=VG2rt*y~0v6R_5lQ<}Neo3GheVu$uz;lE=HJ;sd z_gWpsbckO0)H8Mb93y^nB5j4U{o${`J;X!rjVT=|s_;Q>|t4?V_ZCCdZK;KN27`ag=lUOZn0E{Vxl4o;aedhKL#Q+lHK~q8j0lk zM60M#9TfGkrfu;dTbUldc<2L>}!P)-#~Pnx=A|dd-4Ki^{3hl!aRMvFI|^E zvoPtpX48|p&d1s=@LPjO(v-EUTaKt#8Ua58?#{Ns8Ur3JKwu@GNn^wh*($p-~Oix_4-{j za{-Cez91B;+UT|~)6jtRWL;sa@3kg@&t;z{GxR%%JAsce zK73Pxa`7dTKs+11iLbk+T~R2i>8XXGw2W~&?Ye$vIOjS3!-WeMNru>g!Q#KgwsLl5 z?(xUvoq0}K#HP05cF?Vddb2hWa)@|&OVCRf1r)UzjZ4p3$suB8uOX{b`w@Gb{?Pkq zk`SaY|DRL2yySAIq=%@D^u&>A>CMpE4&bw`P=A>D%MjNO<^T`-6amomp`>_d6x zixH*5GRHAiUGnMm`Cdc$Z`ao2jGPXdwK4j0-ohVfr$^^=hJtbJ3ZjHDlEO5;3NVn+ z65=SRvNbPm(Y<3!9VV|SRuvl%9bhMgGQ>)HaVX4mq$8e`CTJw#kZ$zpy0WR-rr?qN z%zq)T{H5J_eQNWE_WOp(NaT^HSkv@m2nh7Y)cUFHYBMsQw@9ch*B{Ziu06fXF1vLy zj}qLJXnsqh(+zA7Aj}i0r(Zp#iC25G(QjKPH^6 zLkb?6SLyIKItN5T*(U^;?AH>mAfC!*J=6C|{`m6cr^rW%DRDC~#Taf;$k>L-RQQx* ze))YwbvU%$ZF#0k@43VLg(Bl??r0hC?8FpmQm3zNZ(X-)N?dh^`T!nCWt5(q+Ae*U zB;K7N`4ZJ6;&Wk_7q$47MZh`_|Iz0$D(ibKU&|uv!FxHk!0s2{b@lh++^k*l5_v?` zgVv+Zbo9XF(I}hW$vAt*@8uH8cu>N^o`A9&Wvw;`PCk%vZcBxOpqnD&JeYVO*L3>Q zTn30T<4!PID2o^W3M8DVE5^qTdm%_f-?|~}c4&IulLT zlMx`>%s0!UV=DAd5Qc6pXx(+j60JsFM-`1IyDs>yb>ybCD=WCWCn)jH>q ztSC~W0!TwCP!djAaFMf&tzycIBk=6*Wo}(NqH(v{q=!t-#ZN^@4P|hn+BY>7I-pQB z2Rkbci(PR5pi+N@roEeQXp-`2@1`Q{#b!ttJ5{&F#OUD{S55kGYk;;mDPhrEP zd-Xe6WSt%i&co-L_kuVr)D@QwEe_hzo4jX5Wv5)szoj%K%p(*}+nsZJ!3VdYDn2!T ze6#<7sHKG?DXhh8(V;}^Tkj92xG40eu=>Wbv9#ud0LWDi?}V?~zr1cJ7)dZrd2RiL zy)IwX=j6*SEMa+d!bPzrZ0>i>3RyI_ETlMJm=dioDj_dhO^oD4K> z`(OV0e>0E1z=^9RS?uflZ@ULhTlD{nr)>d+|4bDB?V9vvfRRJt4M6bhk-U7f{x*;_ zsCS=VvNwt5TkxkxW9*Aa;hxX`FjluqizrxJKLFvnpiWka^{0%K>d?Oz^^8N!g1q0C2c!v%0^ z_j%+2d=l+|wlno+O?}r0ckktfOK}8=I{-obGUM9@7BhmrbxzBYz zYGkeeLWduU-#*-3bOU;!lNpnKfcW2XN!&9rJkfA@|BDr$?yK#**S~$PT~q0C0K(1Z zB70B*K~MNgC&@Scq4^PUdu(Jrz={IS-GJR@Jz(E`r6d022AKPJ(_T+S-A+Dc02hyB zW)N=ZKEO&<1|a}2NQ%UJ?Pm4jA98It1|Zi~(}@2O4h0;qcYq4Em_eX#` z4aD7YxmfjUpv@b7{!zkbZeQy^Kw-iNBn+S1^<*;25!^UH&$Kd%no4UnPQ@7bv_FaX zqzsKy34CN21|I-D(qrk+H&u)hmy*!_nWB5ocHnY$15;Y1Mo6pYZS9>}fyZesG0d5N zz_=nq5DA&XAEz6QACEH{@|Si1l`8J`FC?aK2+(rqq6#kuSi2r^LKi@BlS-{kD_~#m zQBuzXNY3h$zKZ-EAYA#?zV`d4-{MT6(41`4p$yBtOv@qg9IjSHMZZPx7p_ZRJc?lc zf{#9XQ~~W22NWH97$5Z>eLDx8lWmh7~qb0rK-1^P1vzyjG2=M4=X5FQ;$TG1de{K9%*eNk6jP^lu zWp@)0jXYhEF=Rx=xym&6Hfaa^=_l??98LOmN=@ZZy6TVekG(SXfO)Lpr{9+UQjGZL z0>OL{zwnA@T2Vj#roi^;Bg^*GmkJYs%gW$mP1Vq`f%zN*%5z;6PIbOoD+tZyw@dVS ze<=-4ZzJ(o?>GLIP%w;SNagabluZqrU?cSoIZ#+R+ zf5e%!(wzp;hF=%L37}fb~ZZbg{s9zpAkD-IuK=V2Uzu zf%^#i@79I@=T|F2QW)eeoj*xv*-;$+0KDw7x$9^2j5QO7@(h3IDCf(+u}pBVxxB#l z$IfRvfT&5;;t5HWB+-pUw^=Udfd-l6p5R54S#9=PMkhqg1}vQ%M5FPOxr^3T3tZ0mcz~dmvlXc{*6Mpc+4~;%a;++i7UH%ZY*FI(O+j zU#Ro?cZ0^O#TTy`20Um)!u_b*R3(Ip!xT(g-OMItKpd_l3p=+Ky`L*I-10A7S)RF8^Xo9@9k8>xk z)#7P+-2)YducAm8_=Y>ch?*%oQB`GY5FYL^v`u{e>>!~D)0qfyJ;pzIdhk2~x3!<` zK$>MYp=T#KI_Nd7O0(_=7=mieT71yFeFrQpLgFRUMcitHIXJL0#OIa{eeZe`Z{ zoJZBi$^d*zSD?}~ClzX+k3s7{rKEVeKqgb-xcdNn%QpFZkExGY!g_TnSA=^4P(gDa z9-&bkq1S;Yc{^9xB!Bn|Fp2zCOkY8N-xOfavJpKGsew(S_;;nA1xDN2cEIG zyQYTe2k)YNc*e>sQiV?5KF_K{DnatJKt=RJ0>Z?8Xa;drBU zCTSvn^!SF?T z_0IXD0?oG1$a_r$#@FznrH+LcwKEG{rO`5RH9)Ff|_ zyr|HH@1SMr2VnX~yefMZvTcp{fZp*^lq}G=xMp>HYQoNO3rq*_3+sE_$eZNKY7RLJ z>oW*ZV_7C54+o4)Tz-BLrZmG6#eh?4ri%w%LM*o-m!~#pJY$5qr|6nLrIX6)kItFB zVuF|Ze!rC6@SS1aIw0igbYs6EBUZVee{Rk8PYbz27^Hjp1vL95mK-zQ(GA}bR^FMB&2K$ z37=(K6PDqndr>;rzg-fA!v9vQGGY!!xCo+Vm&C7pHQU$7I%vaa7`3{1Q~S<<0b#%SnUrGQ8j45^4_A zUK6K?x#MXR)jH`lwbjxtS{E<^mKr@wt_F#l`cz#f7Kvjngu>>Zih_EIQ@DRb_F|W= zT5~mVPv?mKX%e`56JWY!YYu%HsGc~aiAWk!0nv*O98nfID74|5%TVLFEMI+V2>ki- zqHE3|^2z#`$7s?w&OK9|#=m{3yvF$4kfnhLy%glWh*QGY$zC8-zL?{a$2Vcj{b_#W zn^g*O9Z@_5l@Ybt^q#jibZ#a|-&^VkvEL*W;e3Yo2XecvCb;fq4Cx|Vf07d;I})_kUQ*l+NPoGasY8RRxM zT|Li<;}VBN=QQfO^kX+*Qab+UtkPF8H=pqW ze;jmcw}&gv;t2n}1(xjNB8`P;`*mLj7GbzMKLOe#ATVA8Us|+d9DLNerL~l2%ng6g z;~|yfP9zv%W>Rqd_$T7|r9JaDnTSsFduYv~zcDJ?*V*+DgQFEl8(k866IJ$4q4cg^ zy(Pq$NA0||>4fu~RJZ@c7GM7-_XkloD&V0}hoFBWp7?!SsCPFuwWDYLTf#c)pyea( z55wwrhv<$#dRBXE0^*PUqKX#kUtaQhAuHu9g!!TpP3>vA|EM?x*Ip$ev?H zZb!%3_qTHAcKx~uxb4+=wf!CaTr(ce+lQ)^n)d5?i0lmizV7i@kgVpmG1--suhg6r zhz0+dMMg>Orxw6X>>V&XHbDBK{5R-KyCZc0h}a9ZS5GU1nWcGIR3nCR$Ay;0c20Gf zNbL#`d)P(>ddZnD*dgl4y@VA6vRugo8E_D+LnQi`UNFkEoGvmMLl<SzyLnzzvufZA-}6$!5&vmtNY!jKTI`16sW6bts0`m7J>q0WP~I zRf)kR!5@Y)qb5V?Q@CqAu&NM$26BeY>BLv%7j>y`UKlw~K2^av$LlWm(kl#fpG<0P zv315P`hV>>AI%RQDNSpY`nTaN?4L_~xA-mjWGCV58?ypw{^I`2(~u-d#?`Q2o@@Ir zw%jFZR-fJtys#d-v>vdX$g8W~B3RIsM*SQ~>AY$GDPM=1#oQl6rC6`8(7W}1j)2iF zB0_I|WhN1ZERl``W`;Pqw(>u;Ap*`!VND9hxwMdK|3~5QNBMZ8@A-x~e~D5#Xo2an z0A6!t^w@O*Ze*P>lubv=`-0Mcyc~`Kj{NTW$`mo%kz{orb)?6p18ivVrMQ$4$(|g# z-pcJ9)9=US%Ep1L&pxPJWX?TI2M8#3{@M;saxaTr49kB*43aJGVJm9Z6XCC}RM%xu zRdyUbgQ{gsp5AF11Z0Y(#3W4e^i>Y9#7k(L#E2#);!%d%;mWr-*KbMuYRF5IrxUVT zh@?wPFgMPh+~QD4ZXK`c_0pO-k%Ke$YG7a_x7r>Hlndn4cCyYf_3>r~a}@|1 zB@i`MF&ux6ankA_t# zb^nG(5J1(;wD?*!s~KLY&cEGdIz`=s1So0QF`9PlMJmTo;cOsF0;>xpLE|MCy zo)(xDU!6=!fAsqig3-fun-|DFp|*viBiwTHyL*xwkW49beYEH3VT_fvESd}<6=qDC zK$9ZEuFwo$(QEqq%8TX9{`$gbk=q>rg(Q^X67s# z@crb7rnH_DD2mtK68E3z(@|)VAHe*}2R&AcR8qHn*+vED@s4(8C)jd*U=w zkD2(BO{I;j%0jd0Tl^3)@x0eZPI5sL_qv5^ry3ie9Gkch@}2EwSER`Kh0oY80$~lI zU+weghRUA#7c@KFK;L|^{>6kwPvn~yV6(U_IlC8koo=qQXWed&{^}LsDbKyT%`^$V zGqC*q?3`rja`p{CF3lRY=>-uNHC=N{M(f^y92a|jpg(tg z964nb>?nw~>V>onw3_LT=$yeAOe{#%Qn}5fada*py-VVT$S;@98BwSX5R>c z(Y*JQZPn^>M9qK6l*CsiWV53@KDc}wEx0ylznAm>3^wJT zqiUd763S~H^(VXFcfO$%!>V;x$~}3h=>DUI5&%33)*4%*#Tc=z;mkdfRS^9+YLu`P zg~e0yZ$ixQ2oQ(}KO8B+vjE6g8ohgU8@7NNn#WF2(0zwT*U81jvWJ!y%+(rO_}8BY z9O31ub%}vILhVK2V~0mY{-z$C=O#pux#V7Zunw#(J)Z&6&deK%OIHEig!iaIp9%b;*jBX>_ws z#VRGIPWA|l3W(Sf`}@>c)2b=a74F8UG58hgKKA;WC#qgki8AI>VD^kGO)d=v2IIgq z)_D+OBGxO^W}-i_O)|SvBRp{8jx;B`->VHo#-ODs$MI6lS;(%wH7d=e%FTdp`)iiL zkrNY^$71Z;oj&HnsC(`eUQJqTmEvVS!z;ZZF~9S}Ro#mUNE=dN`Ou%&`zHG324q9C z)b!Wr1oTFXx~SzUzPJ<5jn1VW=QE971$aFJ`%9~HDdWU`5F$re|D{l+7fts9D1YJx zna%(v4ck~}kvKc)D7_@bO~5L8`S)>z6>epe3%df0Le>L;GR2jd2}Qdc_;c&5uA0Gy zOgMgohZZp8Sthdnhk@{fvXtF+lvlB8!D>B}Eury~z3Td+Q17xZfhFYcJy8|nG9ix` zJYk?zG5$`DCZ1HNaJiDs`3Wyy6T25X*ZdrnQ(9F+AmAFhO;}ktyAhjb-v81IRc1~~ z@y;yITHVop_?ot759%baAMxBy*{i^8Ea;pBm)>0z@3g;= zwD%+Vucl`dC<}edGQE!jkVliEDmaWdT;m-1mA8pj3nGW|4B+b*YNb+x%JSlFgNpFG zcA}7}GCUYfj&(L?Mv|a`!5W5m+FR&xd~DFGqSwu$H~W>pM0XhwOugBm52fAi`ys}L zOG?p0J8PmBsoEqwRu2|ZU&MyK(_cTm%NV_HJuMbl92}wfb0T%##h%9f_-Sd7Jq9Ad zDd(1H#mBPT1+K>OdlfmyFLxJfM^AI}oq-Xxzm%iET>QRG=@3WCQ&Gw@Yqs97rO%Y83LItr=Jy8zr_yr8!-Jdhn2UpO~Jj1YZ+x^VK#3&eE2=P&}K9a8n>1&?Z@vpbxtV z++U-#v|vYDr^(_hFV>(XOL;xf19qxvvYar6a6+k1Vy|#g$SPiyXO{lHlBYLKo&=E| zqHGh~W4$T=uHZaxTIQ#DQ>V%jr&_xtJ++egeeGN`;BK`fpt{fwSly`%HF99GjgO^o z@y+Ew@*0^Uj^VomRKE2GD?kzarmy0}qrUsMSkMW6&|o`(SKv@KEt6Ja3p3_8fr>8a zioD|pFhaets#cp1c$(HToZ4{G&PRxzDlr^gU+ zfOw+Cu3y2LzWAr>FVi8&W`G*QxKgjo)H{1Ss~Y~V3Cc)>n(^+u-wmwsDGZq9U)gQk zW+xs|74Bz9bmk_`SG=igOm0GOqWAG{=6Eq_U!EUE8GfuH;*g&|T2v0#ou55(+Cn)G zG55(26FCYE+j|asZ{|%DKtZ4I(Sr59^SYrQ-6~7~52gx*@3zxZ4b691<7P0NST84| z*Qy@*Dc&27(;{XO@KIl~9e%^`-n~Ca42Yq?Qxpsuy@Ctt6z(22;TC^j?DK-1?^aes zH@3cOpW~>u$a~SD_gtwe(z+M80@q7kbQG!rC63XU4xIU__F_eyfMP%@z%)LY(;+PH z!%>MRJ@cjuqw}=~7MFwu+J54}ct%LvN+YVJLb~RDLR4OqvPLs!Pyc-iB?E_zKwn+^ z>i+9S28L0WG!)9!HHwb#jI%nPXP0$=IDiU53y&D(Ke}(qVZr5M#&ramtzJB7Pn;wL zX;G3f^_VfQ)8Q(((Iku7plYc#KN$Q=xad*OiN8MDnMy|qX=sQ*^4A2E2BO>#Kfo<0Y=UT zNGG|grU+EfTQe;D&%WzFFBJfdf#A$Ip1#%pTgQ_oF?fh%924k<{Oc}GAGJkjKF^l^ z>(<9sDO|zhzqLvK^A|}#8Kqo_=Zx)t+kG@_n(AL9O@Q43ZR;dJ*JTf^E~)x|T#$dZ zKDJ63Oa(Chx8s^(1UCDk=_L`M{KsAU&-VgO`@i<|fBwt=FHW0G0>#M8Ey6V5?Aywt z8U-ND(E53l6ZyZ%%-9M6*U|R;^5EB?%nx9W-;31TGiB+~Ku1&jmjEK|)Bw0wi})Qt z18xOq;OO|*J@$$oH9%Z|@Xiyk3e?J*zy9!_kKZS31&a|VmLkg&)?Yxs(wjBkHPjTa z-=lf58N*t*J0WqR{?Hvk@?vQH-M0Oy-&YmZ@n4RBqJY<Lns;!TFp%e{Zx-tMmt zcJP$~)b-GeF~(}lPJDCw-p^6cq3o*6^k9@JvP030DC*X+SzRdi}%pcshy1N z=|5l)qmU?*Jn1`rhuAHO`%8_`@cEy)YH2*WsXD+hN#T>l!J5XiK&g2yT~(hUDbS5REy0~~!xX;)Yx|A?v{EvOu;Srr-Zc%CRn=<2g zTg87Ls^9lK+mxQLi`;Kq5-*mfFOHN^=FdtL-6oT^RigIN|C`G#Pt#35Dm39c?Q=pO z90*-$#>jKoS_AwT*OvoCiv&*2p=F}S^pqzBcjf5;pL*rW1bkyYpqUH$ox^BF>kJc+ zZekaF%6Y0)QQMVoO`2`rK3G-=HRb?nJhumFELvFn=rETsQjda6r`{+y@O|p*fj1*> zk}O)OVZ=&!ovMo(X|0(9`<;tzVKWZ$1Q%Wz0%KZnqR(J&3`WvajQc)UACQVJlr7|| z2{0C^KiT5i8^iv_GdOQ8WkNqzJnIy_qwWAlH^XL)`^skHiI{)4#cQlu*Xn9bueu2+ z-{f*KAZRFGJzasyVSD|`n2IyMfzawJaC+YbzABpf z*2TI(RVt6Lvvg^rlS~mQR72(M{&w=-m@d4j{qNwlU0{xefo@i5mbwt)oAO=n>G=Ce zUcZ>X@H3<1M#l7_vq|F|8nUyM>)W0LQxTsj6^jhh-eS?iCfr7O_D0^X!9{;X8%OpA zjSbPGZdu~MpMMyK&RX2fyjK4jf+x*sFbm)Xz1TN9Yv(6Yb7_SJNuTDSSV@SSMW9=| zf=+72qcwtyKqagj7^pm&r~6@7p{zCpjjR~{^6-{bP4gbM)pj>a4&KOh^D z57>Tc?97&6#+Fozda6a6(vKbeHMT(jY;!b8<_rvJpCoh3zi;IqXf^VkXgPbuz}%`@ z@#e5kuk}w$-LC-M+uqY2xrfF<`Y7@@WF_8HmN&H5$kdrPXq}q9Q!!e+&om~>UeBy3 zLPGS|OS)WebJEPLXzQDiBTGh`uvC?t!Urtbu!LAdGRWFpR~b>k1eW_QDgh>flWG%x zS)wFcPTY4{ujL=Y#n`;RPOpts5n%Wa*-d+U?`G%q;0=Zd+V1VGPpT=d&?`~BK~lUl zDnHMp^6-fcIF)PrW2Md~$8JgCz}uvK{nI2q--U4B&{4L83>2}muj|C-x5Zvun_S#t zx%wq#o!?t7wx^r|@!Z-57tLciKNhIjWHg7W57||klsED*)83owl3-iLqcEC8;nVXD zwAxui!ASDm4o>f(aSCn*<@MWz7v(z{DO~h1eg1HLx&G4Gr#=P#%+a)sNUSx^#1q7U ziR#SfnO&mc>hnCdJ3sT6G|;s70xC{(;|4jr8tjdS4kkE2b{x!8LuXPa%Bfg-qBJ1T#pNaQHZ(cU8 zj=kPkvoJgkmOksD-aqkUH02tIfBIVWLwJfdMvDed&5X8{OuPnmhTNXU;`PpJk14e% zo-|GhC6x@ahWS5re9>x(uX$|84n#t+Zed|u5qY8qr>|qBj5J?=6W?TNyf*|=M=fs# zJ@(L#v{O8T~Y)rj4}4uc5etXwU6+p)UTvYK%R#=uDLMxJy@=H-VPs%%}&xhc)& z16;FDc0lk-L)8>w#>~L9e;AtT=UO`&Wpx6N(pC%m7(>N-Tn>TwWSrPtTYzq2_T19S znHEB^oBDB!KToR0n`gJ#g(rcZ8)6ohQQO#Xku}rLYq$w$KTWN5(J=XhoJEt~R;1c+ zLvVMY*hVLTJKlTq`v5CqVNWL}t6KMW85sL>h_E-Af(`v!5;-#zPE$|IXofNrYZDHp zHqV!DzKP6&DVcF3<0reUiVc4>4&-Adklah6p?b1a`mVp>sXSc#!?RKX6_e+B1&hwi z*HU!Hj)7U$PNj9~S>_^Sp=u{w)D#Q4N(}nt(%UbBygWcr75a5GV%_hyXe9LEUk=@< zyf8iCA6=d7tGdAJJ=_ZL?+aeQj9%ncV-$QIN0(%LeAS2}VhHio@qo^htTSIt3vn0j z<$PI?5zEG`HUE6m22wa|82X74g@hTp3yhnflc}fACC5*S-N``ceD5xL<()QNu7Jamo3v&IRxy*LLd8k0@d8uh(ll6kz!jG zv47a!SRh_fo!2E<$uYcXkq%IXsvQP11ndoE&Re#7%_YJfiW>D9aI1d>lNDI(@iLdH z^r`Vz``6r0@1747mkZIiQWr+$P|HgMA4dLx23Gq3uGo3Fgd;*Z*~Y_?3)Pyoay{;& z{pod-4XKox=Ia*L-_^KU#lkwuijD027waIRF$2}S>@gZ#NyLb@qGp}R9R5M2CmEPw z)QeC3;uoeoJNIgeA#L+s8@9U{>N?Z}D&M_cX1RBDjbu3$Rn2UAzc4LHE>>WX-_<)v zl#KXuk}4QeeTdSHQx5fXO{30m!u@i`Q@Jq&<>3$wWU=n~-JeU)`L`Ob!^P17sm}lK zQ6bsVCzDAaIqI!-gsX;BO^R-{X6!dOCLS~eJueYdpE|zJ!eF}Bgo?p0QaqyJGT&;!q6TA2XA?5m(azusx5GpsSAIYd#yrm85-=c@GEdch z-|gMN#7@jHmO3Bqu5TVNcr^azIdPzvK&2K`?c&#}+$1+e@qT#A&CK;3)FHL@pvQIv z>`X!ue?%IyU+I2skZ2687wCn5q)Rq zLc7rf7zXPJhL*)HffF6{Gk{K(N%}4lrKisxs@AsH4X70};j$^$6i@P0J7v+d^ZZ-! z8Gqd{34eGEnWHJlZP#T48U9B+b~VSUy^DLu(uk}gy|_l+fDg{RiXHW?aUQ0<@psQ_ zkD+A9ri@5ry<=X*VdAa+w>fRVk|B>={bgM0P!&e)QL$)%xtIL#TjDgTawu;AHNnmp z|9P%%RiefT2dQT9W+xDQ`k6!9{}k7Zg&?zHTc1M$5q2KQnC3r6BeKp2_uT>`X@pUp zw{x8upyq#u3!t*v6@5ymWP-}qBGqMkYC z;V}fxODv%yvt9&xLt*y*}ts*6E9FF}0@Sc7m zi-Pl%7D^sULq@@pMu&G_u#zh9^jH-k0XkJ| zn~-XK1^?i#dzVP`o2_9f8km(eKdbF*sg>W8UPg<8DJ8 zJFt^HoSCf6rl7hcf!WZvwT4eAAMH)K=*$0>Wmt!XBa+|b8BBO-vvy)R`7fZRxiwvt z<@_Ep1ubE(Qey}<4^40g!YejZQ<0dx=zq*!!5wKaNUF%8@iPIK>rKdVa&E`kBToy| znV7wzW%9+eQ{PZ;3}FivSVkKc$MINk-S$8VFY(=~QmY(aYQ!F<>Ve{8kxo{0{pc;C zw9}xoK2tkD+L8@J>+74D=Qu84@srR~ehz0wuO_@!kKoqa{iFi>mn4*o2*_@p2vQL! z{(Fv@?Flfy>enFEz<+r$kW5-=134=BtgABF|FZonKpgY!F|u9#x1{R7lGYGeAc3~g z?x(l>uRr~_oHRs52_T-!lHP5R{(BnxBm&6KWpSdy!T-LUg&M$))1*REU;XP9LLYS2qn6b z(IAwr0U?V;nUs}L(p|4)L&@Sh_%Zko{K#K`*kn**kZdM#bu+jI<;Ugo47Z*^PfwSJ zp2d6moOAm0I_G@epK~w(K%W$jKCCa`3wRJs)2USIsTAy~K2WJtGMQ|@-+u(q?RIOm znqIFbNs^){u>=q;pU*cMjaZh|>2%_=#Ma<+It_-BoG+3a?^@px=B8cinCa=AnZS*_OBJDKA+f*|~UKS2-} zh6!8ddH!;_bUK~YYUTBM8HRbi57Oy0Lg;q8JWRAgNTU(P$Eh#J_$x-%tMw_%DE8nReV5=4z2Y00000NkvXXu0mjf_BjsT literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/b.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/b.png new file mode 100644 index 0000000000000000000000000000000000000000..cc75c7d20cc48c337e251efffd52093c306f721b GIT binary patch literal 617 zcmV-v0+#)WP)1${ibmA%lZI5fS*hIY+=9O7YYTF$wUyu?RG;55d?wbxG0Kx zz20WCktCVPWbAhP8v;BR!!YCV7{jpTayg&RDT*qW%ZtULR;wX|TCJAD;mBsQ@KOlg zNvqW=h9t?u;h^|RrP6M<0iakcmdj;z0HIKb=Xu4mEE|i({)Tv&hHn*&S$zP*Fcd{0goeXmDwR^92EkzPcswdzk|ZVXG)-G97G*yEzx^3l z6ve?{a5|l2Sssl>_xs&qvE*{Od_KQkuW6b#7z`MORjbv@M-XVelzgRnR&w)!%xZvKdcwvKLjX>@?pg=j7JUl5479u%H?t}7z6;C zrU4)tjdr_TP17*OsZ?q^Z7g;j{|_i;jr0k)9KVA03p=x z_a#YU80PnEwOTC{3Z+uXA|Rbk4+aB_aVQiz91fq>6pKXwumX@IDU-=yjAdD-DC)sJ zECO=5+;X|Z7>lA$U0qX95U<`1PG22;#{Azu&*zZq1mYsQrHbWI!MgxB()Oh%C#`A9g&?PbL!p z;5g0=$8oJzizG>}*SlCO?o~D#4TfPX zj_X7sQLEL?=d;V@G7RHGR@e1>K93N(Ua#LifvL@A1NLMftM#?e+0`0sei!J08-4 UmN$%iEdT%j07*qoM6N<$g6iS~BLDyZ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/d.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/d.png new file mode 100644 index 0000000000000000000000000000000000000000..66e23a897c4a97b2da18e9c2db42d91b51ec0ce3 GIT binary patch literal 525 zcmV+o0`mQdP)@5XNWMM6nYk z(MD{vMJ#*+o4km%58x{ZfmC(@A%(Hh&RRrR|5O$d<6IH(O;R-hh7q;O+$&W0bn!ZQB+_@d*ODX}Mgc(`ia+G#bt2a*`y4 z!(jj@6bjBRS(bafo@H71li-`!d_HeBo0oMrrKqY30E(heN(Y01cfe+|$!4>T=Q!>* zG?`3NsT3ksDiuXhJOUVFk|enT5V2OPjYcCxlx11dH2(p*uD4n(L_8c0p-{+w03u%V zw%cvPFkF-T>K@p(?U-t{s_VM{7cCNr?Du;BD3{BoY5EUHBoe37$?-hT`ww7@34#Cs zi^U?7$@mZ0ZnusxO*5a*KQSsEIYpLbiK6KEKp=20iT4hM!(qK%2LM%78;!G^ziJR#&Zq-h$@^MWA6VzJq577PZxbYK`pr_;F(yWR14j1P#sKVEOZ-v@jEvb#&?OK31t P00000NkvXXu0mjf6gAv^goX7~m$~GA8E(!Yh;t6Fln-94H{d@2;4gZXWtpb=ohh;`i=z0jg}(4Xxm+HP z$LsYv7K;gjaJgIz!_YL1F=m?PZnpyfMNvYbP#_SP&1R3M@MkI(izu91h>Nvf1qMcD6lWg>hZ0)q=s`4*>`v=lb`Vaj$y4-syBcOXcT)<#L%w zBmf{9jjmQJ_xyUj4h92NRc+gDG#c@E{Ey?hP$)RBj4{R-JGCf^82@HZNs<6yv)Mcx hg5Ez~Z@|9~_yzANC6IOHq{#pP002ovPDHLkV1k(^@6-SQ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/f.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/f.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f76fc95c9bef8111333e5973497f492d23bdd6 GIT binary patch literal 500 zcmVTUHE_rI zs$pkm9=kJd1_JbFh{xl;?<0gl8)F;<0b{J) zZYzp%GYRJCV87q*cDrV?X&6SaSX?X?)9KVSO~%;qcwDVk{eC~6&sVF})9GXw#_cR{ z50ui$WC8%4PRF+GE3c}m>2zAtw6DVN*C3Hdc%B!2iy&Oz9}EV$T<-Jv3yNH+R6;{l zRmRvOMdo8Rn}tTB(crw`K?28dE_No9d5sPLK$0Yc(0o3x*Xyqr8X=_BYGI5OML8S} zu~_U`pz7A7xXxm<3yTidp?+3aXEa$UFE?VitPQ50*n+BbE;+Xv(Ec(d6MLV_T; qXf50@x~_|&_$Awkn3Bd>EFy~Y;k!pzm0000iV#5#X4EPTL!{P7`&t|hZm4H5>cDwEI zcq9@D04Nj+0FcRKu~=+89wUUbT5YXX`zZJC0GrK5k|aS8Hk)nlEEbDOr4j&mJRYCV zFPF;<0R%xjJUkQ%1+`jz7`?fZr_&{qNraG8D(!SSN7pzU4gg>R$mjEV zy&fSn7z{2iFHh6~0Hspt%K)?4T(8#=LXVG+fk5B{AQFkZzP^4Luy3&2+uKYggP7|0 zJ{XNgBuUaXMNtGneDg-@_xp4g0zjkDpnLy20bDM3KPOl$7Kg)O3^<;7adFXXHfdWb zl@102u~@v1S}c~yWP)MXVzHn-0)b$?Ui*ALm&^6pqk_ZX(1z3Le13lZH8dO!pPrs@ z9PjmdqtS?>C_bN`%jLG)?csB_dP;q0neF z;c!@^(Nrpx)oOM4ZI71xsh>ApS=Zn`F@b3fO0nhcC@66(+-v9sr07*qoM6N<$g6+pL9RL6T literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/h.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/h.png new file mode 100644 index 0000000000000000000000000000000000000000..0347c9327748445a525e29c28e8a6698f30bcee9 GIT binary patch literal 537 zcmV+!0_OdRP)!2>3|_zz@p@`~v{})RiP@xm+>~W7{?%grX>hVJyo^r_+r_ zV>ld6r&E??FPDq!x&VM+Flbp;G#c%8yZ61wGZ}`VD2gbGqtQsyw83BykH;5_g<%+k z5YseORn6scolZy7G+CCz;V{Nn*Y(F%&nFNBK@fyOp#UL72O&fIJ^ev1A$z_P4RC8yog`sfJysqzQ3LWKfpHFb71=B1M&ynA< zW1sg8#d=Fw7@RtSPOV$Xs*}(-pCRa!0tbVGrmLnY`T-|~Oaw%qNxi>KWC{Z?ZG&b`|?!`GHCF@#ls;M{25o PK4tK9^>bP0l+XkK+Y5f6 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/j.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/j.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ad651dd102a424bfe686e6c5eeedde9b72d871 GIT binary patch literal 388 zcmV-~0ek+5P)Oa3@C=?Hcklp$t(BF6t%U&#D@80)*y!6Lutf?pOOP$rzj_Sw_y&IF ze~%y{Y$*yGYX|&2;7jmc*L9S>zGhh#RaFTgYn>>dvMf#0Je^JeVB0q5+%OCP;G9QM zwB9QO_>rP0&mstdIF3bHe&>O%>wVt?Kwa0Ws%~g9rBpBi_J6PgcECRXWLf6>ev%|F z=Y$Z^ZDAz{$8kI!k9nSJnpRa6B67~Vu0ur2vYy39Y1%Z6<2aYg#kTFXZ2@4KCP|X= zJfG)TFiqdg1J`x0*X#LwM#MBt4~Ih-hK#Xc7z9Vin~_-*#qD;x-|v)CS(ZJ|V~jl> i4{?*pzS-@7kM#`=1%9=aMn66P0000&sBOD~f+5hLof{YG#-LgSAqt8@P0l~i zRL-Q%eGA{_*$~E?Ab6eSxrgtEd(ZcrOJI!QE5iU^96x~n0Dv^J`}_O1x3@;4QBf3( zF+mVUqfwUS)z#JQ?QH;v#bT3_lih9?08Azm#@J%993LNRXko1o1mW`Xa&~q$o6TNd zU!Rb0Y}Cu;A|QjwH!Kp^#3e0U(pfRI61@DQ&K+M51@*6DPnrl!`{*I!>> zBaz6%!^4<+ep~?0^Mk>FWm$}IqtTe3pMQIM(-V+LBt%hMT3UK~dZH+*SS&6qEa(Yv zI-S$g)8%rRVHf}ihr=5i8_{S~XBUOT;mys>P$&cdTU%QIu(!9T^Biy-M^RKNl>&f# zK7Vv{R4SEpu<6K>U>L^l_s3$fR;y*TTAR(L$KxRg;&T95mPwKX0992H`m3^5tJ!R} zU@++Mc$&>7P1DcM&l3|9??ry??(V+NUR_;PDwTtS1BPMl@9#xXJUl$4C`ytfx7!T> zk|aGoKAxYS69gd$g4t|lS$27Od2ViQM2gUyms~Dauh$Vm{eJ(?O%dw%`-_W<@pv2n z+U@q~=_x{JFc=J91|ej(+gX+!3-I&l{{X%f;5T7vZ3}A2W32!H002ovPDHLkV1fy- BNO1rF literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/l.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/l.png new file mode 100644 index 0000000000000000000000000000000000000000..72015ab4143687e0e4434d81ba4ea3b25e7dcc94 GIT binary patch literal 376 zcmV-;0f+vHP)E4ynuHwF!c_Go}P?b3nKjh0000)P6y*=*M7 zbgfoPQ4~T*I-RCz`qRmhB>DY*06;{FqDDqWBuR?JVpCI7Zz6mjxm@nx-~a&D*Vk`u zZZ%r8t9(ZXfy!8VzD5iEXy=a_c8#0(b3UH zqk)JE3k$Vcty|Nx2BA(~*qDZOb#Wd+T<))taxau5ug~kH@vq?-p4Nhr>~=RuR!= zvwax)2agBduP7c zY#Iy(0ALvA@$s<_fh^1Mc--l9j*pK!9FD!cJxP+(AyE_oAe+r<;7-xb1KmgzO5RFFP-rjhge}8`m01U&5 z#UeovTS7LQeRy~fi^Tx2TCJQ;XDk-`rV!eLPNx$Nht+Czzu#{(8i_>W>gsBjFqupq zA0IC-F9D!jE>EY^Z|m$8KnQUh2LQ=ra&z^1y_rnr6Q@)vnM@{uB0>W5`5XX9lI-<* zJkKM92!a?6hr66&v1qYa1d8AXT^fx>7Z(>VFE0SVFpO5K-TdriT_lxC^ZC5dXv8o~ zrBbESX`jz`;x-M1LK=0mIp37P;ffrYbJEEEdGCqg6= zAxScoN&$e`Y^Eq`Hk-BE?Gt#gYev0ZM+mLgYaGXIHrr`D*n(jghr_X4E=3|ywOSR9 z#W4bMx%~eA-e52QfKI1dtyZTW*M7g>(G{QQ+BlgVnennWTwG6(0S ee-`*h1U>+}I&RA2*NI600000hSOo08lIz)y2VJKoCSA5U|;7FE1~f11uIxtyW_g z=KTEp_jN^4o}Zs7ijpMBWHPZVy9vPW_ut;$qMU0Q&d$z;!{K~BCkW!>kdNY7?7k|bBX;y8{Y5eNiEqmkaAy}rJBJRYP) zQMB9bYs0j=yE~ao^a9Lg^K!XVW2h&s7={@b6(mUtf`GKk<(f{XtC~MQKar3mNxkXy zfW5sv^+0!ab|gt!xjWO(_J@ZD^|9$1c8Nry)9C;Jj*pL7meuqKf^c+ng!J9r-O0&` zfnmpSoZIb&5I#LU1%p9NPrY6*6bcYRhGCE}HYzfi%=Ps(3Xv?!e;W=C4tSpDIL>Od zZaD0GK3_hcuU4zcWb%(o?RGm7iFCVN48ufG+NY z3dyppD9Yvl2;uwtd%0W=hr=khIF37=&dbY7p6B&^aIo!<*B0>a1AYK#xe|k7XKA@5XQgNl{CJ9 zA&LZIEL0Ft!P-VFQwhF;TG)w=U@v(Id%@B&m4$_kg4hHt1g!)MiH=1Mi#soR8jpj^ zS1t2re+#oS3?m}EQ$D;|9^fAUxP$L_Jnr}Vo33CmC1r_%|5 zBuT5)%6))kS$@ACfN7ecP{@6NVHl}Y3P8PHZ#J9m0DQiW`0aMPSS%z-DijK`ENhzf zOrw3hUDx&DaCkTz27>{BY&NUwdZ|=;vXejQd_I@U#@H*H$9=$LGD#+r07Ow-uh%~&I853~rDDejg1|YqyDSh0wA*cZSj=0zJiy-v ZTmWFeIro}|6xIL$002ovPDHLkV1h$w%b)-N literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/q.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/q.png new file mode 100644 index 0000000000000000000000000000000000000000..e47c32ea6b18aa30d7b9285a958a28dcb5bdb234 GIT binary patch literal 825 zcmV-91IGM`P)Z?MxHuUh<`gtFMT6B6BGu9mNMkfKG$>>t1a7&BMmQ)QS(M_X z1m%!k&uF{mrA9g(P%!Oe|dS) zXf#t(Q#PCJXLhi^zfaTj*x1lPm-2D8!EX#JgogfI0$0N(~H}$Bj=jUg=Uca)k zVzF3ucXvOgBuVP&={Y(&qG>vrOn$M*R{(>-5Q#)msg%iN`kdX{+gn{-l_ZHI$=lmo z)c~K*x4yoPh%T4w?Ch+mhoUG%OsCU4&#MNIB-sc$J3Ey;6B83RH#dlAx7(x9X!CWN z9!w|{@_N0En5Jo^^D~>xi9`YbHa0eb!Jvv;6bgl$PA337K0Xc(4k`fzLC9n>05CZ@ z84ib40E)$;R;vYoTrOuY7?c2geSJ?)PmP#mSrq_L6bA+d06>;yifXADtJSIsfFKC@ zd>#N8hN;)a?rs$Thr@AlasmJx$EDM0C4eZ3 zI-L#xE-o${4u`r?!7xlC=gGd$8lP%_Vo0$ zX%*4l)A9WLJe$pyN~NKpq4Du?qtU43B>vu}{~hoTaD5yG{k=yJ00000NkvXXu0mjf D!6SZ{ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/r.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/r.png new file mode 100644 index 0000000000000000000000000000000000000000..44ae3c0d6484ff0336f451432bd3a86bc819ed40 GIT binary patch literal 579 zcmV-J0=)f+P)~0005vNklq!bieKKc(4fugWK&E`^93x^ZaNuN~KbT zLgD@lU+jUd>)2?T=61WW4~0VYdVMyVsjBL5I2w({!%Jj}rs*4l)$jMqx7%UwbULk%>E&{{Ua#02hG9KmI-RD|X@pR_-Iit9f<2%p$}Fx{E1u`O-EOH= zk|gPLIz1m#6X0^W5{X16lc8xEA;hw5Hk<8qIzK%JCV*iW0PuRfgTVj*Se88=kMIpW z7SrW&DM=Cl42Q!=Bw{@P0BW_Gq9_26%jH_Fmh}Jt5Jhpb*__X3j^oVx!%Bdvs)0ZN z0LJ67-|x2uK$7J9dZkinHk$yTC`z$dd=hXt9DF_>_R(n6FpT$Ij^p|TH$>kVMCEDKP2 RG`Ii&002ovPDHLkV1iEf|4{${ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/s.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/s.png new file mode 100644 index 0000000000000000000000000000000000000000..93dd1c61d6ac04beca23465cf78704952acf934f GIT binary patch literal 665 zcmV;K0%rY*P)D=G%-1E8J@9+H1AwUShUkU+#tT*6401$sTuhZ#NtJT?TMx)WxYPHQ~BNB<-Zg;g> z84QM7Z^E0xaeTYo3WY)dfW=~|R4T<{QLonn0H{#bTAqWvkWt6d;qyB$G*})7fY=u2R$K6ae6MyKk>>$7B>mtyU|W&7RNaS1FN5 z6buIMyLX!}kw`Y1&EarB5M($UUS$V^K_ZcO>KA#v-cqTA<2Z(4d_Ldda9|h)f1^8q z#bQCBP)?^4j^hx*LZQInaFj}AwOV}*078hOD49%dx7+8cg%D0A6O+lr{_k%xd+K)^2-2ct=DUbL}Ihq&X3V( zG?hv{4v0h|D2jfK`~CiKIDD=Gl}h#aMx#(Dh=1^$H(LC8pm-Gi4+I~a=F}9YPZ|*cs!j>HyVu|Zx!))Je$o51Ol(u zdl?@NhX4R3lliSfzc4u#i_z(HkH@1>C;$LPqtR}+%jI$afZ1$buh)00j&S?pg<%+% z%RP^e$78S8LlA_)V2H)yA0CB-_s#ANcv}Aeod}3@%EiT=00000NkvXXu0mjf*;_Ht literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/t.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/t.png new file mode 100644 index 0000000000000000000000000000000000000000..c359ccd2717878d307dc9f28b9f42a92dd293680 GIT binary patch literal 448 zcmV;x0YCnUP)@+~05&#muxnw}@; z^zCUO=N$Y}2>e(AAOPR1Rkn~MiR-!uAz79I0E{t=@$>oQoJ*3F=Q+k0A(UkqW6ZKF z&-0p9a5|lCx0`92`~AM%ZciqY=I%f&E^(P%^n34&lgpKrI@(h_)y2qBuL z^?JSg{a!={gF%ucob%~)N(d=}o6Sa1l;Ln#mZw$GzVrE8@ka*u975Gs`lGxJdT1^!{b-!~c!08kXA*=)AkZ2+j% zYPzmpuh%5wI8LEZ006@<06^0;$?4ZKe?7=nVB(7v)Aj*W;5i&6&#O8%d!wL zilSDl#mvm-b7l|j;l5-HT^bhKiyr77I)RQWN9xSQN!lsU%6#XfzrQ zhm_KMKEGP6@CC?=2e0*dz1!`AATSK0)9Fx3U);weJK1G|kGTP^Z5U$P)5={^W4 zC9AyDIfH+IQc7X*7bwYqO<9yvW`p^ZOk`jZS!6OB)X6{@7#NPhBFXm|&YgO^-1p&j z4^R0_=Umry&ga+F?@a}OeiJqQGH=0K@N@oLhYp9sZnwJ#0H;>xo3-x@NoGy4~(Vp}_Mz?nCzykw~Q1>j4;zM$u^WW{tsMU>F8pa#t{) z&z(-^XVI-rE*1+S%IEV>3IMPyJDE%XB$LT@yM2)r1c8VoNqSz;?REo!002=Gyg3<;_xq2J4*)#R$K&x= z3No3DAP4|rvDjcRARf?D|~Ql!}+2!gnY zTBs-*MNeoOJgit6%L`_Xihlht+R9swav)N8gPKc1RC<1V~T&Jg} zS`>@LR9Bt7*Xy-ftzXsB7;J5A_4f7xSX)~Q1Oi&r*4AdRST;8|0d#eB?d|QUsI;_n zet!O22I}Y(Md5i~?M$UoM09a+;c~eEL?RK7$HP!EnIxju*VpeFba!{}?(PC`I2`Ba z=d9D`^Uci60N{B(l}c$-nwy)etE)>t*0jBmNTj{JouxD~GNKE8c6N4RVgkUxz(6=0 z24J__S>w9~0630gDKXvE)m5+8%h21~8{27;Bvn;aso(s}KpkCeZLK6pJkQ_W-m0{| zzCIR<0VpXc@%#PiV*J2Bk|c-20bqT7-Db17-EJ-2-rnx)>{Pe^&d$z{4FH%-rk9r& zmj2PvQKp@iB_9BW@$vCYH?5*5XJ=;>6%{KhE6dBvI{NVN@cjH7kH>kQ@95~rcwc8R ze|mZ{o6TcmV+#ulX)|;>ovp2{?AZTHMC=?C6%}Qo<>lpOvpKs0m;HY9cKiAHc{m*2*w{dM0y%?9rIN{HLPSv%RVoz#OeT}x1R&z>?rtKHK*WoS z3#ZeGvLzQFiXs3EheJfPSS*=L=9dA8SglqK1_L6F$72AHPGzBf@KoI0-8CAGR4T>u zydVfpr&HE6naj`Ra?+}mO6B{FlCx2=0QGtu0D8S1A*5I=TCLVkr?NbN5Yle90ia&5 zznfO8wOA}7;?>oaUawysKnUq}yEIKlqtTE4a5&^RPOA6z_F}Qvl7L>X$1u#+*4F*~ z{io>Y=;-9+M5&yh$(r_=fUev`>`czD=oG^D80=?H=_7!1{ZTrSUTMa}&$8jVKLXq4l)*Vk8yqSn^d^m_gN{yqRSn@vFwSe7M(h@wbQ r6adgPtZ88`{8NB8GDH4y)neSV00000NkvXXu0mjfv@=m- literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/y.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/y.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1ecf62a2ea93f55a5b60180258324b5b9e1b5f GIT binary patch literal 556 zcmV+{0@MA8P)9{|LgS9iNzp-}L8y_d@c0C=7!gb+g7?e@E; z)oM*969BMnTaqNd-><6bjV`=1ubYyyHylL5Cm0K1A)L| zvAEfD7l4ShTCG$nQ7uW*;c)oqNvG2QU|H6^l1BjAyWj5-aWEL9QmK!INF*{G4j(i; z0rdO*OeRBhI2@kMX4j{q(I}ZrK5lpdKtx%V=kvMix`tr{gTd<~kH=%0=63;xVaT#f zbvB#r^?Fnni^WEx@ihJ%KzlV!LqyXw1wlZ>&1U2C`B<_{0Mj%jNus)3E;pM^S(cZ} z<&Obquc9ba6GHO&JY$d*KwqhC+lW}HRJz?RW9k#%qEIMwI-LN35W>C(KLPmKa{X8P zz;#{Mb*W%~Tq27})3oF9xLU1rT|b}CmSxrJbpVJ)qw#qBah7Abmuj`j^E}6Kj^l6~ u2LPfdI*yY_Byzdj4**_&6)(Ww0^R`8)1&asQC+_P0000XafZY zaS*J7)=6;E#YG*(!NJKz5&RQ6xJq|X7Z(xdE)E3|M-g3|q#X)w9TZ%vbjrCy-jhpx z*4}b2Ja~T7$vI#8qah~=1_1Pv`h|X2Z@_;52)NX2+rD0}?(-?7(P-4gfL;0kV_YZ{ zw%aWmilWGI975=LJch$z_FYZWZnqmDF8MsNe59^2K6NRaF2uolZQ@!z(=ntX8W`CgVshm&;r($Kq@@yI!v;rTzhm zqBxSFQ0Q{G0Kj}cuT(1FK?pock|bG{S&T8ZEbBV~=kxi#;+;-sI2?MM=oKJ};%>L2 zlp2N+iA22rwzg#z_Khth@+~isvromEDr{Q>2&&K zfN7ctAwozX@cTvz{1L|Ze$=yTz`ZT-`{DHl{QH0pob+c7bM=cO00000NkvXXu0mjf Dz_0ww literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/a.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/a.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbc10267ecf51ec4f06128c516b65cd9d887fe5 GIT binary patch literal 499 zcmV7?s=qtReBrnOp)5OUjEmK7vmu~d0%_f+ed^j8c*tUH;8IQ*RqS0tDH#wir4+aC8 zHB~a11VF)`R?zG900@F`=jAw#GCaJT??2hHEI|GTT~ z++`Gx#|a@1v*URlK)2iVsNewrz<$4{>r5u2D9T^vY&Hv^TrR%=n9t{Q1gq7mBuSzu zdYGHdCJkP#R;^a+DS&O;;c%FCFBXgKb~_J%X__=Lkx0yDvu9hhUaxbxT%}SupU;lt pcn{ciyIn4qA5GEs+42SW=?X6_)14Nr{Mi5i002ovPDHLkV1i@^(arz> literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/b.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/b.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2d08ac31c91b8c8f480920fd8fe6eb1c54e709 GIT binary patch literal 599 zcmV-d0;v6oP)mrNEZB9e$0?!LpPF6qmCfA{UX zc~AHGJfG)z^*o>Fo;!o0DELeL!yoGd_y8VtKA)d<4u`|xaL{m5exPQvX|Y&}#Ufd* zR;zS6twu1L&6COGm9GY1xm-G(PP^R>pwsCnijvFa+-`Tf-5!lbf*_boCIA#g=>**G zcSTWrJ|BSDY{oE5Hk*AsFdmOd9>?QR4}gfKX#gzCG7R%g2*7MM>&$>8p_Y5M+dZ0O zSso6D0Q&vDe!yTbAkp*r{F7<1SWpxtisBo0Z9uJ7BY@NCq;5)*#BrS0>s_zc@7=Wl z$z&1$$8ls?DwV8OD*(UWKcCMv-L(O3w;KSdLm&`f7{=rAsJ9Xdg?=O z7K_D*DU-?Q2ap?9>+_^|JgzwoG-gq+*8>m^hrhMf>vi(5*=%&qqF^uxV87pM7Eou2 z0JvPPSJunr0)Xdvod8i30aUBiR|f<^FdB_-^3wpYEDNAgsn~2bNs^wd-ENnr>FIQ; zvrWmprBW#X27>`WB9Uk`8m(5VTrN8tj%YM`yh48(v0n6nQz<4}<@D0NtgzWcwUO+aRRTSmfw{4p-Mk(b2tX3-kjYflg zs~3Pur2=3!n|%!s!ry~LBH?)+&zlhjxLhu>EC;<3%Pg{O8$dFdjBD5(k4FHm>&690 zrBcCSx7+<0u-$Ik?Kamm4Pu_llv280uK~>GbFMPgbv2#7L zNe~18rBZ1!nV6>8YPHhoboh*W7eFaJ91g`|@ph%EstyK&$QtdTs0blZHrnso@&ml5 YD|ai| zQcMP2qC{QlN)#DPvND~)Xkk!BbvC6Wg)%UkZZPO(G9kOcl@hL#`wgC?$KO-Gdg}4s z?)!Ot?)9y^&$llj%QAj5D*ST3g8x9ERzz>NTTv8MDwWY_e78q_m0qtGi9~cd-EFVU zW=p5jlgZ>s`!fN@ab~kQl}gp?^-LxMAQTF59M^8Qi^U>M(-#v(QIaGn6I3b{yTWd}jnXvz z;aT*D0Nif(?Ybz6E|-g8m>2EO%dJ)mK&#cdUOXHQg+jq(GVwhBdP1N7pyhHI06`F) zPDc=g#bPlS3@Gn9 T+4U}w00000NkvXXu0mjf3BBZ@1g)_4;@` z?)Q6)amcW3y8wVBNz>`{vmc;Ztrp;5Hk{F(+wB$t6h-;i(sf-F#pm;xcSIOt%d!BV z)9EORA_#)-`>WLoV{DpcF)>{(mpsph#f?ToRaM7vii~Obt0)0+`UNv5G5>$Ul!*WU N002ovPDHLkV1f?U%`*T1 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/f.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/f.png new file mode 100644 index 0000000000000000000000000000000000000000..28a6cffc0febaf5fd4e7a82b7abb382242902dca GIT binary patch literal 483 zcmV<90UZ8`P)_Y{!VbNd^|Au8jv>OG3&L9T=2cxhgcCA(sG#C__O%?`nLBXQz3p3C=#B&jB#7FGAx0jD7jpYzr_QA<2Z#vp`^m;uWfTw5CVzD5EWV6|TpG@-ov-=7H Za|LDowplw^g>V1>002ovPDHLkV1kQ))lC2Z literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/g.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/g.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f1999bdd520beec47c4aa1e5d9b06e4641ad8a GIT binary patch literal 579 zcmV-J0=)f+P)@jQ{Orqij*<%&k5)oN8ylwPlw&1Pwu1`vzI^a3iC3d1n-`TU=FE|&vPEEaVE%H=YE z!{Kn95(I%|**j~=fbn6_3Z4%jNy$1b{5d0P^|# z`B@PFKA(@+1YH24SL*e8DwVoZaL>t;$piq)vbPG_?Y1b2Mx*gbC-?h(02D>tDhLLH z02D=evPFZz;PMii&E`6L*&lJ(JoF9H>GXBV?REq3`~A8Akx1mikY)KJxZCYK9*@J} z08lEGbOE;8t-hUa;jrYVY&Bx$i& z*ladMQ6xzspBvBFCz(tF*zfmxjrOHhs}+D+t@Z;>et&;Ao6X^HSXI@JAjffqLg8md zMJN>d+)u03YOz>4ozCOieIwrNj>luG)f$aPCX~!Y}EM%C4J`y@B4o5@RfTz z&vo7R^>p3mzIzBk5b&F!!Y{{1;QtZ0-ERM0V7J>9i$$8I34+jQG?hw4jv0@~1A%}v zCdfoSpZ9n?^?H3c9EQVT00x6Wl3AH5!f2C*5urKsucklX;#8kjZ4^1pe;9;c(DuwcG9X`Ea#b0r2^JVu!2MDu7%r zC)-Kkjfll!049@(7_wTe%0=E1uvjdTRXC0VkW3~Oa$nEE^?Kzv&gF86p?13sAeBlf zq?5|kN2AenIt5^}**cxh^KK_eve|3`xEuJL9_aP@JBJ_$aUw-g02qc*wpYob%jF^n zg4t|VtJUJn@pud%5{dk17i~5hp63&Zgc$1g`v5|r(2oRqy&iyUHY)uUTX=nMjh9 zgj%f@0Gg)P>-A!>(CKvLa`|f(u`Ekb6w9)b=xjE7T+wc~4+aCdI>fghUgz`qcsx3t lPL)c@XX5j+`w09v{s53-g&g?I_Mrd(002ovPDHLkV1kf_4X^+J literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/i.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/i.png new file mode 100644 index 0000000000000000000000000000000000000000..a149116cbd55f5ad964efc2d6aab15facc6967ba GIT binary patch literal 467 zcmV;^0WAKBP)VHNNj>{3}M*rc$tuu%{{z)mE6ibO5a3fU_JkzjI(XSm{= za@g5f-g~pV#27=7_(H+>82kf+(hHi?=|n`2OcX`+dj0uomI0H=q}%OQDwQNlj^n~G ze5$4NpzU_Me!p*;rX)!m$2FVHa=Cmw9tVSgZQHUeGscLh-EJptk#g|ub_-y=UdQ-q zwW_Kr%Z4-qK@dixQH&gq#{ibgwY>$;xj8HQ0*4jjh; zpzC@L4a);XQEoZNE}>lS0TJ;$e?FfJDbZ%L0ibDGQFqa5wF1!V_3~XT*{dmvV&0zp z5VS{JE*Ai%X%=N*Sr!1#^J4traCnaafZ=c$BRidrD2nOAQc`1x$Z?$O^-4t3>9kg> zsj51k&+qfPSS*4d*zfnRG}-t4bXBX>n$2eK58CHf@iF)lgKwE2iC9>2d~pB(002ov JPDHLkV1j&L$`=3t literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/j.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/j.png new file mode 100644 index 0000000000000000000000000000000000000000..cf94ff276a68cbaedf599779e91267d3e4780547 GIT binary patch literal 531 zcmV+u0_^>XP)A|? z;R9G;HCD=25sAGuN?FWCiq9dX*l6Md$Og$5u#<(Al@ya2v9fY4yv4jR!<~8bdgUzt z_x$_ad+s@RhEPiJ&T!z(@d5lj;Om$E{eJIoeD9J{>hX9uj{A{8t;cXU%w#f#yuo0g zOD2})V7Xi-5{Y;`o=hfvKA#{6JkQtb_33mf%W^Ch({JC>3EJ(p+wDG|&swq9>j5|( zk7h1bK)2fka5|l|;&!_Q&}cLs7?}Wyq5vosi#k0TjS7PB*vkYc6bgR7|8O{H#noyB zpjNBB0AN_+d_E6AQIr<|jGaI*7<`&$bCM^M34m-i`#ja&_H(%$fcbp>G?Uo-;CQ`W zRaIHMc1pC_Y*bY>do5l77>~yQQmGVEwv7u&r_%s-yB$-r8LFjH=>Z#nD2lAzd@n5) z3ji*c%g`XpGGqUk0%o(>t$OSA`hJz?`D(RlVIIwj03Z|!T`m``9tZ@=<+8PbH&k1# z){Vh&oFqw|PN!0-IGxUZzi;_PFP5}V1t#Ue5&i_XMgpi|1Aq)>_s>iZ3+PB+}^ zp5M>iJlpp^?|Yu_d%pKQ=e!X@@SFI9U&c$|B_N?ztF>CKyVPp6%4V~%SZuLa+@Z-M zwA*d1Rtq4VPG3>u@z~*Tc)ebZ;{Z4uj@$D0?>9c1%|@dU%d(9|!)P>0@#FCr3WXF3 zMZe!S7z_Zq-7Zbj|8fFCh|A>y(ChWYWu;Ql>2#CHuh#$=h5^8` ztl4bdZnsxCYPI@)@lQ@5Wl|K?Y&MA;JQkSG=KunMfYoZPR;xrN9t)JqWdPy@68U&M z2gBhIfY<8#x2@&w#&H-O9K@;R7Fr2yn|xvOM~qCP%8WC&a?7XW_0|CTbDOaMBajuhcI&Sta8 zv#3}s0^oW6mfG+4;uj(u4#(qhtyY^%Cck>lmv2+0QYi?6#bUXoG#brzyUpkGr_+gH mm{O_qO_#pC{_I`?|Bb&3aC|#3A7Tgq0000E-{0004uNkl@5XQef{FBZE z6-{TMSPCHzp|P=vMH)e|RvYas#0L<3fuLZUfDd3{VPWkH*og>2VhRh_A|S`X#bhxY z2l=`kX86qvGs6-}DZ`q0B{_~eX6Pofa5rikN^O~FaYSf{<2Ia6So47DB}NAB$LT_JZ{_e z%d%Rnc%D}jfv+0 z-xG-hO9k`!+}+sU9BkXJR;#isGfol5aR5Y7OsCV5Bn^kd?RNX!q0wjnI3ABIi>4@w zD2l48mdoWIY00wO>-9#XQ7jfa91bj--0%16_4@60ds$4=>~_0_LcwJSf-oMBDW#9c j<1^PZ`c*`LzXCh~Wd|aycr%7@00000NkvXXu0mjfK@`uf literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/m.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/m.png new file mode 100644 index 0000000000000000000000000000000000000000..08eccac594fe14fe65d7acb9fe63d5d9768ad626 GIT binary patch literal 722 zcmV;@0xkWCP)i6#qQofrSpi z6LJt56htBfi>7oDF+pd zsrbIbjrTQwJ%ew{7eCWI=bn2$+|N1Zaw$oY@S9NKm$4z(5Qw74aolh?{87?}hljt0 zv=Vl^9l+Dmle9K2FE9OmzicWH&@>I;=H_P2?AdGwOS;; zR4T1SP$(3vRx5zr-CacjQ501w6-7}1CXE_Zcx1%T&y#lo7+=0G4INz&HV z7NJotvdv}_1mWP|0KoI}^NL8P(|LG!*l08WoSd9YZ>_pPr_-9Q-R4OGqO(qk7TCJu` zkk98ij+4z;ECwJFiOAV`o~I}(9*=*kr%DB&-|s6Ecs!m~t0kN7@9zM#TCF^QG)+gN z(V0^Vm0UnD8jXxbG=5A zU@#mV9nGIAm&*VchEXP-C5N`}_L~RV6a&bh;V;*BrQ9uKWA@@pv2#hc7NJ z=KFnTXNP53i^W2keIBF+L@3$(T9FYam={sTcsyS5TD043lEG%Pxm>Pq5`BJtG7Lku zYqi?+TlgceEPHl#mP{rW*Pv3Vh@vR{Yfzi7f!H-zw3uBm7!0#43M&?iN$_8AhyyWL6bu>^Oe?~M?cT7Ly)XW` zsXPx)c`ohuz3=@#_dD)(XF~|VcQ!kGbNdDSJb?JxbgHT+ilKA(R&9zT6e)578Ka=8Qm zkH_=SQ!bY=#aRG`!(pjZLI@EA0RXGj>fRFw1TYyamS{X4r&1{ZC=?1do2}h$-xw~J z3r*9w6!;3F(WtKL2q8sL9_}Scl3J}6CW8gQ=kuB0Znql%`u+a@hFmVU-|s&JOeT|Z zxon2DS`7fw>GX>m)EZDKm1eV<8Jsy&eEKolYanX0ylR@k2ndSd?Y?UUxVg03ZkgLg?AidkNt6dLQb7 zAOL{NHV{Bu&$*)hf^P7&ZXVG~H-4-T)j9hkrM<-HsVE7z_;CZnt{_ zplMn#7_|H|n`dG)8ohEG+HRhX+wGR3D3T<<>KS1BeVhI`;17@>|B2ZQUK0QS002ov JPDHLkV1i431<3#a literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/o.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/o.png new file mode 100644 index 0000000000000000000000000000000000000000..a6568588bc3bbbc1fce0a8fb0be937f6745ca252 GIT binary patch literal 597 zcmV-b0;>IqP)NklL7K<#)&So=eTdmestJQ9|)9Ew-LI{BAbb2@UH9!yqhr>bbR4QdK z7;aBxS*8G=&-W*QXf$fG*{I!YHUZFk+)5P1C(U>Us8lKdR;!h&s+Y?JKqwUY9=6$R zC}1!cyaAvuB#}r^Hy)1zSg+T2gLOI`fL^cn1|S#=0yrEF)Xn8`+wJyIu-R+|FdmP! z0?y|%0FTF`YLi~C2XMV!?_BQg+if%&0Q`Qx#wj_SP8`S4Mrj(fPNxHa=XovFX)tZ6 zR={L30l+Yf7C^mT2SA5TD`3Ch16VGXFRLqx^7Zv42!hdQd;?&ySO9dp-Isu9G|Dhc zwOV~|7iF_qEt{&}?*ot|Nl}zXG51R>77Gf9#bS>#hr{8c>D4r7fk1#VL{a>HS|}7) zmZe+dxyX}mi`(rUjYa@Cj*CPhcDtPr((m_cwOTTn%w#f}X5=|PpU*p;&fmdaueV$- jtM7<>K3*TdzYq8YE;zyD3(J&500000NkvXXu0mjf)BpVD literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/p.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/p.png new file mode 100644 index 0000000000000000000000000000000000000000..fc24a272aa555adf2dcf027c43951fa314447876 GIT binary patch literal 581 zcmV-L0=oT)P)M*DwW%(BuM~dS-zv0rWp(d0Wb{nhCsPo z<~UB*^_wM=$p9FQMvvs#Y-UsK=hoF~buHA*5)Ov}oX_V+@_xSu@b&feUWx8`08P_R zU5mv6K&@7DFR)xL0c5k;r`}Sj4*ITdGgpg}Hy>||- z$mjFdSaf6OBd-g~DAgxDilQ6+kYRn@lDikLS8? zNs@NEos;BV{{ux)02GTwUDp*wiO1uDAiQzgy-XpQOad@XleoeQf#dNAAe~MVw|FrR zWLXAKtybL+1bh8RB;v4@-IQpv+1T6x4nf&GykuE645QI#{A6TOpO@W7;K%q2y?nP| TviJ<)00000NkvXXu0mjfH#Pmk literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/q.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/q.png new file mode 100644 index 0000000000000000000000000000000000000000..44ebb8de0dd2921149e440d6ab387fbc5b272093 GIT binary patch literal 663 zcmV;I0%-k-P){oqBb`pO1T2?J z04Nj+&jK_W4FCv*LY4p&MSVWsivS$Q=_F>e+1miC)ym~^8QVhxn$6}z@6#zF2%=mr zM$GcoEYygA7;MPEg!;wm*!r?H6VRpNnBuR>*8jS`3OePchmW`5U zvzg6ilSm|dK3}C$g+iglVnMqql?sQ$nNFw7GNj(L>-FmKc=USx>2!Mi?hHDht<&j{ zBuOi7JRX-yrCzU>%jLelzV1Ikk0t$#Tr3vvgNu z%49N5r<23s+%N`%A)C$acDq}oPNy>(jsMz%dcE#)xxSMG0)bwy7mLMSua|uf?ycMH x)@rrYYPH|*wOXy)?dJ3OuTH9;U&sF+@Edn{t^vvb+W`Oo002ovPDHLkV1kx}D-Zwx literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/r.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/r.png new file mode 100644 index 0000000000000000000000000000000000000000..be3017a4a29fdcc6487596b1e22941f08da6e039 GIT binary patch literal 641 zcmV-{0)G98P)=t>#h|2=!C+CcGnyz?Bdbu?;7{R}+{++EO+*Wq@%1ptboM1y@k9{}WX zIZ?03DH@GNcDtQr+3Ui`<1qlZTrSa_RH;+|;PraH^OCVjr4j%n5(!bSMx(LWY|nBf z9n;}(2mo%k`_WacRs}&A3oMbSIQ$F%_lfIpu~=Y0JRbi6fFK9}5C{Zrjgd%1`T_YOs8A>XK&@80HF6w>0r`CX zE`Bh zu~-ZM7K??bm!|2zA4P&7Nivhkyxl4c2E%5v!M*HJl}g3q@k}NYhr7{{M8g)x!W zuV802Woe^WPMQUog^jRLlD&^$MM~L`m9mo(cCxi)DJ8KQ3yYcOE>7uohq?1Y-CO?4 z^E}V_opb)@jUXbtQw+RWAHaVGoK7c0d1yw*s3 zx7X|SWHPDO>m0`sLI7aD-`fQUf)I^He>AG9O6M^g4s8Kitrh@Gr&Dc+=Xr)~uP> z2Owg<-w%hw6ytKa27|$i0e1|w1OO_Pid}%BD7V{9+n!7&DPumLTL%;hg+L&1KA#^( zgTWvGlu9Liz|(V(PN#dl-sN(k9ch)%=K&xT3R$`AuGcF7c)eboq19?N0N8G~R+ebB zT2cIFvr$#`VUEM$_;r2sJfHxUWp}%sHX4t|GntH$T}PgMTNaB&B9S13AYv+&5=GJD z@hFP2TrNkWQMcR8X0vu5oWtRe%jMi|H_i05a8Mb-k=Q?1VJ!_x;=5`j%&#-Ejhz4XLt6S zo!QAOM+m`^`oO|k0V{x2!!U$l_|x)9INZ9xT3}UfJkTO~&Vqi5G*jcQ84h9lwA_l35&0-Lu!qTCkcW5Fv=k)El zwGEwVH|`lWVuz zc|0Dg)v7ovl?utZ-|qn=5{b`}79g9=3W6ZZax$3&(CKtY&SJ3$U_PJ!AK+DfzaM}o ziX?;CY&Mxps?yg0Ns<6WA`y~dFc<(R6bd>4&1Mt8U@#yV7={6`TrPD2XqvWIEUMD; z`5cW#04RzgJ^lrN<2V3~MuTLq*=zvP>9kHjJRaAGaX#@D1bm9pc6n*l-+Jul~|T_I2_$>7eKjO)&rQ$W&rZ}{Aa1x z>j5~Q=j0LO8904&P_Xt&!R`aI7ASg+Tw2x-UUH)%R53yGrmcXPAZc)ebp=NX2P zBGb)0>I;$n-Q)34-V{JA7UOyTgF%T9fMT(zu?L3l pT)Ym4gUjX8_88tbyEow5^#=$0z&)9g@U#E`002ovPDHLkV1kL#2^jzY literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/v.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/v.png new file mode 100644 index 0000000000000000000000000000000000000000..2c51c10dfa13fca1efc357fb580242dcd2710820 GIT binary patch literal 518 zcmV+h0{Q)kP)8mEbN7VPayaLwib#)N{OO{Bw%BcYY|vvP2x3} zX7O~HIWr$~ZzhBxguqGtz+rs>Ux0&v+wIovb~~NUcDuExZ@1fv#lng}Ow{Z3LZOiE z8IQ+?p2=jQ8>Z8#Sszn?uEAiSx7h7=&)I&z@AvxwB$G*-076K$S_M$4RLl&8LV;yj z`v6&%tq*g#T;}t6v+V1)h~v0eECyh+*%%s*$788fdi#2&&Xx!9io zKqiv`a5x;EQ=%xQQYn^Y&1zjVfJ7nz;Cj9OiL0vGXf&SVZ*Q`uX@>D^Hai>+eLkNf zpNew19F0a>t(LXTMc?spj(WYmTCL9K^UEqK0K+f<;_2%UGjZlkf z0!fkpcsw3OQM_KSekGrr06?)=B(_8a7>!26u9)wyvk zk`#v&2U~&$MTbC=1{Xzw5JAYn#Yt#rwIFb4YX}6F3nEQANYJ9V1&R(LC>0?@i=&EM z#q);q-hFmGUEhP(^6;DP{m=iO@BHWg&VLS}l;S&~!8c<`uq61G1f$W&XfzT+1VJd3 zN?!#?l4P}7T`m`Q)aUaNLY|+Wf1BtpNRm{m)xzO0vp1Vf%0s`!b zL^fi6icly7!0mQ(3A|qK=H@1VTrM|1`tb0uv$NxLI@JjJ{k|f(+2z~q_Eahb;PmvA zyMjz6jCn+-svQc>8=W^=pUZZsMIR##WKvG@1)=jZ1O2x74q08tbbk%2(q zXBYsW*Xzy427|#)r?Y_I>go!><>lq9QKQlH`+fH9@pu3f3I#+5Sl5ZJHV?FLXTmlc7DMB?V==97t=fhdXq(&;p%bUK|@tJU@O^;w5vu?S$c zn3U3wkB^Ow4aHPi{_)dj0IaO6FkQP`E>>6>4u=E4)6>(e@#yF%pU?kMt9W^NkqM&F zXgnU@+uNIU*xK3xFdPnL%iZ0b!C*K%JXFrb-J*+&3jmEqIL+uK`q=;mQG z8re~ZL?Zk9`>ermz)fGL)2Xy0hGa6ygd_-piW^5o+9cLIP5ZLwOUN9UxC#ipU>~^?y9(PGANhJ#bVK9GO1rxgTWw~O#1zPbvH8qvZIu; p^wlw$Otf0}?A95h*$Z?_u&Q55s}yvHd|5}i(`N~OZG zY^hXQE|;37QP0$y67_n$a5(I0Qm@wml*?uBsy>s*FpP9MZQHhGS%M${NG6j2G)?pO zhoWLKnZ)Dq!{P8VIh{@cM59q3&ZcHXQOsmAk9k>^{d$km+U<4$%x1I4lCJA6fubn) z``xmvcDwDHpin3P5ClQjb;{BL0RX8~N|Gc1qtVDW!C)`|P^;Ch*Xv_dk|dX-SS)Tf ko0k%i&&BIQ@c#+E0CWR_T2(BDHUIzs07*qoM6N<$f?PlB)&Kwi literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/y.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/y.png new file mode 100644 index 0000000000000000000000000000000000000000..6670417a7b73caadb525e084ca2ae229364529fb GIT binary patch literal 559 zcmV+~0?_@5P)nq)q5ebn2V zXEk%qea>^wJ?Gpms;UZ~#1DKJUxB|ZuwJj@@i-zPVltVOB+1xv+wB$+!{PAxd^V4w zT41?cy4`M36#M;tFc<^?ilR=Z)7`ScV4%e*6bhzsECnG60pdN-R5!!V}AM~h6;bS{?zfOflW^j}|fg+ifT zug9|N`vn{h2gh;6Vo{rn_X}jRS)b2mI?}HSXcNFN%yc?^lw(!>L?Ur#+3j{Nmy73l zqQ)~9n9XJYFdPnbORLoafP6l$62dYAEx%MMRjbwfem?*-8V!{kmI9;ENI%9%B(hj6 x)Te+pFFRS5$K!D{8s&NZ>2bmD)A9cc`~tKKlO1JOmjnO+002ovPDHLkV1lPt?~woi literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/z.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/z.png new file mode 100644 index 0000000000000000000000000000000000000000..2489eda0e59883c60371ad2540319227c3d509e9 GIT binary patch literal 559 zcmV+~0?_@5P)1MFbTr^1Jv#xAO?#Ti?C$TXtK!4tO`DUAczimtU4Fm35Np* z{Fsi{_Y|+V`?{}RxOZ(9UDv@o^$WaNAHWCjbAZKSk;~;EgqFWz7)B6;dc7`+qQ~PI zjYc;YEzcA!l}ag!l1`^}T}KFw$K&aA`mdqgZs+s)+spbxX_`jUbR-hF9vu#c?RE`-n|jSFdWC}MzWau*zr8S-|uBvHgtZO zNKYn{7~^NsjgS0Co6Ux0SqP!i=_E-K0O0j{IgUFXkA}NX^#DRxtJNe)a=BdbcwClc zK@b#0v0AN$yD!`zkx0-qEsEk>nj8v+!r}0%=}+B2RaJ_j8jZ$11IE~74=$I>Zntwd z9Q}U(o`>goilR&cCX)$45X0f{o}pAK0RTFkjv2sUFaQ8Fn@vfQR;!h&s@EQy%@&PD z%`~~yY88vc>*qe7FAxX>gF%ucWm)$7{oQW&<=3=QsUU<3g~I7{(ll+kT&~ya`FxHL x!Wf^=XM!MDmaSH+u~_Uod+_-ue*pgr@Eb7WB@o=qWm*6L002ovPDHLkV1iP;_7VU9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/a.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/a.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a6950a011de8bed9b29907242982b6529a26bd GIT binary patch literal 393 zcmV;40e1e0P)w+cp3sNx}vo2*R(+B!mFK?RML(-GAg|S*B?+3}c%TMUlZ2 zQAz-w?lHEi3K0buQ&Qo6dVC<@E6 zPNx$91VIqTaaorCb+YTaKj(elN5n7;*D%X6HcmE8ljr%>YpWzls;X+Ykb82g==&ZK nRaJfUbL5V-_o1e%nFhSdUEfYfTWl9MQk7K=swfcyP^yWJeexm+$$6jcIzsTg&;-G09h z;B-1QScA!A(o_vPoeqG(V9*qx*XseGl*;A#e4fwed7jq>kPT6e%jME>oH&jR!w7<) zv{zQB!Q=55kH?f!&+`BfLe}ebmSyG9m1?)!0T>R4oO8MJd_Hwu2aqJm-@X-2Fr7{b zA#$$kx@B24U(;XH{i^&&08M*q#yPJ6aJ^pNQEl6<0ZEUn)!%$Qd gX+K^q;Qs@@0jA*b;6S1&FaQ7m07*qoM6N<$g62QKQUCw| literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/c.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/c.png new file mode 100644 index 0000000000000000000000000000000000000000..e0417c53e7b25ceec69b85978b9d0101db7e512a GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysr8HGK}D*$aU}FFjoxLp+YZouj*#k03$%}PS|&rYk0yY%z&6#*xQr9K+d*fJW}{;+9uEz&vt zdY8xDM}5EcmCHPTJoov})va7NzT0|EQsA(79yyJ%v*NQQ{}+i0HWVT@<9+4Xwe z@Ap+z0l;RnIh{^C&$GEfTdwQUE0g9ps!|-*u-Ov06328?EUVnXqsj^on~3K+wERSMNydfAkXtG%jWZW zJ1NUDGr;|R2LMqN-)4^)pe)PZ$>;M40F%jt*{aC%yd7eU0YKMvW`Nu6)()d60)W+O z#lXpz%Y|0zx?a~cA%rdr%d(g`*)&bc;CcRVI9QhD`+iS*_I2`hyQK_Cl9D9p@Baa- nA_#)@dQAq38~;TkUtI^peTwb0RT+XB%*EGT-OB< zhT&s?<2V3#o_CGYG(}M)d6^=U)4uOlS^(O%ou;WQOUaC-0L!ufP*pY0bHgyQEPMDB z^?eUOQ54QO-IP=hgb)C9UH5(em7-ae1z=rQ$8pZ{yp~l}Jz2CkjsY;n7-LD2*tR{- z^OHRwq9}^4n8$d*9nvUam%fh~I%Ln)X?*o3+4c7b(_D-Du0000Keq%6qAL7H$b5fdx7yhXdYpTWSO2`vIU7GLA6)}s#jcb-M#Gsx#I5Vo_sz1`~NM` zT4POpU}e1l%LC##CWHtf9*@WJ03k#ehK}Rh@Asx@j6B*{bzNUB7p=9F5`dJ_#AT7- zd_E7u0Dv*p_dR25;RHodFvhf{EE1$?s+6j#%I;Q}@1^TH0F+Xz1RKMB$*`C0k~eTzVCC+Ip@m&zE=|hKq(aj!Fv|{pzU^R zajGxWz{>IuYd|So7huv{F9MWO0J1Dw3owo&faCGF7T|Wf9S(;iN!A+I`~Cj;eA+%Z mrj4ex{^~MYk@w&9&jFw58Ml0;XbR#000006ot=(6voa{ zun?@Qv`S+kVq>k4O7a4}fTj2lHbE?W2f<1#1eJh@wO|NnkTkIh26HU};_AW#b^=@E zbaR=*H}_|TVMK%^B_Uy@fE4g8&-0Q3tk>&&KA+3wdcB@$nv=;yRaL%?cnZUih%`+r z7KdTgk2cq8wZULOMDzI^fTAc|Z!7>26$%9ao6RO# z-tYGadAVHv3JAl{_x(<%3_T1VJzu zMX=By#6zSAm_{#PK(O-!9>6nr0S{rD*3K%0m6a*dL?S3ENI*lj7>Kfw-DLO6ZsS|c zOlIbp`Tiy>iX!AG0XgdpAOKviSKs$}dor2a?{{Lr<#L(LX6N&{-EJF(Q79C$T_H-L zdc7`+;&3>OvMUvUAH}xq9{^aIL}QHcyZ%uWEtgATA3V=AO%s5ss+MID`@r{oNs=^8 ziw`#*kH1};!9>&P^mIC{R;wTgy4@~-+wDf?1IE~VKIiRXu{anE00com2B_6)&)rI; z0>E|MylPRS(EuO_0s&yZ-zNvllv2lPt>w0A8!ZFdU6W zk7a@od*ZhMUDx?WmSx3*+wB%WtJR{3qQzp->2#j0wA<|f7=}Spi;^-;v)OEtmFt(G z<#`^B50dKl`|I^O&F+~^6oz51*K-_)_(hAg*=!U=DV0iJWZ!3FzW+`C9q`sfJysr8Eg9+Zt-FCj$30yfLp+YZow87{#X!Vm`eOD+2a{Gd2nm=ta!zURQY{fU zsURSsqU*pm-}T5`F5{Zw>7jEnBJcV3%Ixfqm~cH6%(fNF?7|pBXvr-qh5ag);i`sfJysr8Evu7N25vy1`<^b2As)xyPFu^{;vmp^f6al53?4iYPKqLp3XT&Tm=|a^ z^LYeBSRGhgC}C3E#8$>JxnO#A))Bvbd(PY!GIkDTJN1iMj_pe6-uJtE4qRKcimTyy zrOrf#0-5&57N<9LFr?VCpYd_IBz0joo38KW%6VJ6WR8EFYUDe)cG}wJO*-9+c09_x z9U@~;JV}M&*S`9D2bXGem2}rEej2y)&AHE4SX&Z*Y~{;)qa>LS8_sY{Vyz>0lfx{f z8s47AD@yrqZTnhlf7)nj^@Y;8uXk0>>#ja`EbX$%VS^947yrNh@w2e}cDwCR0wOclbpe3m zIDFjgc7#Hv(}S*7tD-1ov)S|cEXy*AqMn<4yWPSt#P`N=+%(NsNw*3Zh6%$E05nZI zolc|CsOJh6iv@P_JilJAef}bfq5yzpSpe{Tf4|?$vP>lWI-Bm(9;azaA|wSMgbs%T1{j8c5Ng|&L`8Ml qi!PT-Q53qalS`;!@fraCAMgf*k8FBWf<5Q}0000`sfJysr8ZKHd;I!%E>*F9YvLp+YZou(|m+vC5A7x_3p8up|RI*Z?on3Q2RgbNu?c+ zvj7Xff3VW2O*{^_x4A9TWYBzS;_EpnLuC8kn~?|3?_zl2^u3ZbTOtYQMFvk-KbLh* G2~7ZXlyz4C literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/m.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/m.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a79ce813b0201e6d0d42c8f5f95f54cb233065 GIT binary patch literal 450 zcmV;z0X_bSP)ztQLR=1K-09rV9;nZZqGECOk`PpD5U^^bG}}$ zecuNFK@g_XDI)H6JIk^to$I>f9FNDOP+0{kK*afc4gl?T`_BF2R_pb8KHz1OB}t-O zZ(CRnT7EFbehD}n4%EH;{bY#axbUC_K|qGlXhh0twIandO;S#$6Dfiq=(;|e%?dnI z&N*%FbULJ5k12}ce!nMCRaM4VrBYcgm&N7)5go_r^?J9;a5z*HckzW@LL literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/n.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/n.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b7491a7bd9b8187349d4e03009094b6a941a73 GIT binary patch literal 382 zcmV-^0fGLBP)U#RmUs-Vcv&hBq_3 z6A@ug3D{W&-~fCIfO9@SW?A+N0xik+eE?~i5>eAMhG773T{q8jTA>Ai=Xp~ewrw-U zL{Xe4SJ(9>z%UF|RRuu+K$4{U{Z2%j^DqooR=->U5k*l1z;T?n^L#$n1B5k?1VGcY zx1*{m09lszYEwZFezw-%&q3e!|76g*uA4gY?KDj@1+Ui&z&MVZ07X#%h~xP2cuY=N zmQ!F^*7bUA+jbK`lB91NLf7@nPx# literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/o.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/o.png new file mode 100644 index 0000000000000000000000000000000000000000..f386683e561d8ac0d040377c8b1202885217a541 GIT binary patch literal 382 zcmV-^0fGLBP)o8qIZGarymz3q{j3 z&+{my$CT+X463RMhNfvj5af9-*`ZPZ#u%kkQ4~T*mSwx9%T02t`0ASb?%{a5)|Lx! c0nP_}0J+w6G^wFA2><{907*qoM6N<$g6VjbIRF3v literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/p.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/p.png new file mode 100644 index 0000000000000000000000000000000000000000..334a11890098e231dbe0f3f9177f05d084a231a0 GIT binary patch literal 462 zcmV;<0WtoGP)PZPn}zJPxPc(31B0h7r@5CmR;PN&msHlKNxB0tg|~=@fvbY1{3VdSAqXeOyPNzzx^4#C+^){Q0@B0AO>-DEXyId~)e&4oj0H$ebnnp2= zM#J}gmKJBy!D6uhU|AL+WImsFyWQLEmSq`BEK`vmkH=FDqtR%$+f}Po#>bTj5Cj3= zfkQizBY<9!BuQ@o1eQU#TCMK)`(QBO1^9kjzJNme0fBmE9D#G)kN^Mx07*qoM6N<$ Ef}p>|n*aa+ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/q.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/q.png new file mode 100644 index 0000000000000000000000000000000000000000..205df6aa1f8e3dec251846aa059302cd22e353bb GIT binary patch literal 439 zcmV;o0Z9IdP)IeZ7lY&vA>1K2?j#7;#jSu}SDl=d#>_G%~3mY*Cx z&!0c4CWJtr8lh(mfC2DrK$c~W<3v#efKuvtUb{yq%lG}KYciPtI3AC!E~NyNQqweb zU8j_uPN&^&XBY;6*=*KL0?V=hR8{q?91aHnK@fD4AW4$xbSm2-^>{o0)OFp#As0mf zU_PI}7Sl8ZuvjcQ0Nidj0ORra%{CeVXqu)2Kv|aGxCgRPPyGt?FM#aB^?D_Q$jbSA zW{jyuXq_|8xtw|cgpl=m%^2HkHUQ!{ZnZ1jgUjV20o(1Cb1sBftyYQvT_vS$+hG`% zW$C)^Uk_PV+_&HFUzeJuDGu0&uj?d90OWbz7eJ1d%+U+re!l})E|;x4wGV#0gb*sv h{yAXy=nsH*{Q%hRmesQWCwBk<002ovPDHLkV1j`7vwHvl literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/r.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/r.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8bc8b0ae880e53cfe630bc7e2ccfd49d80129a GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysr8J)^~EYYTuv&pllnLp+YZoo0Kg#XzD({dQNALIo=~xA(zQrw%c9^ez|h z-rFO0D7%6=+f_h^rTb^sfoby#Z<=^7ods*yvbtzwth1?r-PFG*4b`1?Z z>3RQqe71??Sp%M>s=mSZzaKCBljgH@kp|NQm6Mh8y2NbGel_6ff7SYPn?wWS3-&*Z Ymw%-%TO%HG3+QDAPgg&ebxsLQ09M+BdjJ3c literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/s.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/s.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6c50c094f3539b1a895fe0d07706d20fab5f25 GIT binary patch literal 405 zcmV;G0c!qu8~)-fX!E4GmpStd zbGR@JBEpek;b5JB6L1241r$Xg%W|5gr0n~CS(XhCQp<51j^l{ya=GZb9t6Rriwe+n z9nbT&Z6o62@h}WS5QNw3MdPIcJfBYhh@uF87gYu<%L2eK4Bt+k=i@k1n#4rrs@AtR7Uava?{>gP+04U3H zpOCXGyWMVpA!O4uMN$0jC(|HF631~n%t4lAZQGKy=Xr!7Nm81o zh`6rnCV=_rSCJ&iJkP%G(_5JH+j0U`sfJysr8eI19Jg&>W`JzX3_JdVGeV#wE`AmG}*_Ns71L{y!6s#jV?&JIp>X6UyhPrAn=IGNmyY~@w#=dE9Y(g ov+Q}b{Q0jb?5X@+544-iRXwLJTzszYIM7QBp00i_>zopr0O8YZ&Hw-a literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/u.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/u.png new file mode 100644 index 0000000000000000000000000000000000000000..8c1dfbcf105e9f02883f4d6a0f9a286af94a0fbf GIT binary patch literal 389 zcmV;00eb$4P)KuhZYF5ny-L925Ctwtw8;$I}9m@On5vAglhqS^RXFW)zl&*Z(CWGF<0 zJM{rK>j6A~{{m>5=0|^;rV9X`=Lv!k$MMz-!|?Tb<#~Qw9saI)o-NBFga7~`WP7#d zR#k;Zg2RX?iU2?mgzo@+L&rf~*PQ_z|H1l1JkQ_TrX0uZ9F}FT0n~L30For_e43`O z0Te|60J1Fa{Hm(10iN*8zZG7~l61F$e<3an@W_RSm<) zvg}lwx~{t|C`l4Tv~3#zL{V(p_Us%WVp*1oqR6s5j^pYK!=P!}vMh(W)ZexWM5HL{ jok;3gTOPmzxF7HdKM4w$-7NIH00000NkvXXu0mjfM9iJ) literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ua.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ua.png new file mode 100644 index 0000000000000000000000000000000000000000..cc049efe2a4f36ffb323bb03540b0987ac409e90 GIT binary patch literal 653 zcmV;80&@L{P)3poEa@Z!#K8`Nh~T7yf`gljgFi|!f))f(O1HK{&0t-m z^>qkezMx-2P21_~+1|PL=Dd@4-{nz+5d0(z_+k7C{09QY&m@VWSglqc9v&EmNhA`- z$H(eurBX2%4B>G2-^D}|q9~r8o^l+=vaC{ad3mWMoSmITA`y)*XbI$UId$>lGysm{2q9Lh6~OiNwT8flhs^W*E=f^TI-LeE zolXJRY&Llldb)^V7>c6YZub@+3jSP()y9uI(izpv+zW!&A} z@jQQcc&IShY&IMYTP&7ua1e{dip8Ru5d^{S_bbcKIM5mu^50O9&*$g!d9&HvN?R_M z-!SZw$)qGng+gIB^z`(kf7lU1*6X#;=c8%*>gsAM`ttGuU^1EL@1oIYbaZs2B#*~q zWiENWUWda0z-%__9CoQxie=eYET+CzyJjOZ00000NkvXXu0mjfW+5)X literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ub.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ub.png new file mode 100644 index 0000000000000000000000000000000000000000..841e8cc19703f08479e5897f3d0129f7312f0db0 GIT binary patch literal 707 zcmV;!0zCbRP)jpdBnt zo$O?xx5I@H{KI^uo9~wQo}1_9oWso_5JK>m`UiikEno`(06`EUk%-sphsJU>5U1^~#i ztoZqS9soFw(*Wppy8z(#`{(@2%S!+_J3CXGolXY;bUNMB(~~4g8v$fl#+fY?3TmI{ zc>pk*&2#Z2Ndf>()1oMDnxarBgc<#QUol@^UKU$pG#b$~{rLE(tp;CTUq+*mAc#O9 zpqL*YA8NpGIAmG&`uZBJ*19&u$yJwHNnI|NqbN%0_1)dwo0}VL0EAGrS~ZzWpP!$K z)9dvBz+^Hhd22Kp4u=C{&d<*^07Ov?27|NNOl`K?Z2$-cgLAo+FFUnfUtf=p zk2#KOwOXrUD2lS%?b^BsE1gcyohcfP&Rq$`Vlf;JFWpY88C!Us&tx(z%eq{y$z)Qm z*DIBZvPzO?9=zV) p-}mOF6((0004`Nkl0zO;EQCEQBbpKnXG2O++!=#K2=Xb<=OSm+Ri`ey4Mu z^PKZJf1dO7n1~2^>JK{002lxn4Tr-{r=#pg->Y7)+wFD$KA%s~`3pd!(U?poX0v%P z7_?d~w!hVCB?!X(e*XzjsZ9yQ$cfa5N=TNKFN~Mx|!1MV$olZ`t^F1y?p-?)VP9~F9t5q>= ze44I#o{z`l?--8bL{U_nXi`yl9S#SF!||cB$*AlMz|VRC?tT@H6iOT100000NkvXX Hu0mjfQi0006pNklMfx^-ckl%Vhw_ zWHKzvN~@2Lj}C`Jz>LS^;{Xi90KjxQ6(?_QZfdofICFP*#{-N;<8c6=&)06Z`7y_F zo6SbA*H^1msj^rs@{C5KaRlJ%>Pi@M9Ean$-|zoSY%-YuAel@`OY(idFibEQ6sDz8 z>2Nr_yu5sN71QZ70L*4HrH%IX_U83^h3R6k0Dw-X^YHK>t9Q9v0HD!mPV57OkXEbZ z^}F3pTAk1501$~pl>Q>=N6<9Qk7KczRG`!80O0!i`b00nFpMCGcsvdOEXzs-qtOTe z+-~<@nH_IF`F#E;fYLKqtyVaWQxqjz4Fm$AP)N4)jhlA6-G0CS{QUg-`nuomWi{LF z_Wu5UI2<1BruBMVth~6mh(@DAdkbN=+XsWe(Pp|MmNtifQwFicviR4UD8 s(_*n?vsr|Ytme-ZKR>+Afd3!x0T->L_LGj*%K!iX07*qoM6N<$g2mA?8UO$Q literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ue.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ue.png new file mode 100644 index 0000000000000000000000000000000000000000..69b1f086851cfdf496a42485fd301fa1e05a1599 GIT binary patch literal 566 zcmV-60?GY}P)TCHq0TPl?v{rP;J49n#*Lg>l#X8@k(-EMcM)4>>z zMkDe^MN!Dt<#MTKiJk#$Hd`up64%@ zi`i^e6y-&LEXx3JyWP}`#bN<~TCFyjOe9Gv7K@wBhN7q!4_Y#r1b}|OuVx$$hsWc2 zz9|hfIUEiHz+$lgfM&B9i^baQwkV2LtJT=8qDAiYdg?L8Z%7kxJRS)kl}ddCfH6)a z5`*U%0MqI8tqN3) z$Ky;U^N7jia_93|&s>wyhnFNtPN!49-}HUieF1Ol7m!cud$y6`p8x;=07*qoM6N<$ Ef`B>r>i_@% literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uf.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uf.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd1e6a1f73ad2c54f5e4f9c399f48732dc3052e GIT binary patch literal 616 zcmV-u0+;=XP)f zc#YTG=5bH89A@^+?%CO0Oi>j0N&JBy#;?Fj{M8dQ8jWhT+WCBTxm@XVnjnZb6qHwB z7)FzlN~JV0{eJ&h`U`<2z#1n|eWlAjq=(Y=*B)ZZsODQb|J|4hNUZmCxr1g0NUDlgY&4a9|kr9S?Y(*D%Rs zlH)k#9f1B&p64lwQr^TH0s!Fi`OsLF<@I`9E|(1x5JeGf>E&{fWqG&Tp>CMXW?v`j z?PQC^g3c(zF!TA`=kxjfegGH@2A?*Xx|>i+BoaYPrBX4{14U8d@i@}BUatn2+-x?z zUM~Q2yWIy#k|c&0aPQ7;~HL) zq;NQFz>9`z+-|pO&swb(0MzSs158F!<2b(G?-3(O5=oNN>C~{xE|bZiQj*DJG#X`D z_IA7J?@dh4&rT48;c)15Izyq*yT1zT_v`ro3;YAeCXGC%@$6o_h~P2*FR90Y7XT!2b+5IXPJ=j_5H-lG5q4 zBuVjj96+H^Q1r!Ou`FdJz~|@Z)z#I_%?$va=LsPU!zk}(x7&R_-_z66`hZHM5{X2z z+3dG3&gF6dj7H;RGSNua0`NTVbUGW21|g)~Zhr;HvMfo`{{H^Q$A>J-YXY{nx7}{H zvVMMkRsfHWkAx78WJ!_$a2%(&udlBx%i3(Vd_Mm*?C|i= zY&HX+C`uo|S->P)%v)NoM7DWNnYBd1FVljLf3WXSkDHICvc>G-RR4Vm6 zfMFP%<#0FzgTd`~dv+}r3+(cEJkJ9-j>B2BTJ5zrkw^f5TrL;YrVfV#0E|ZCwToq0 z;>Sb=G@DJFWxZZsxR%Q$c5ODB=K%;IjYb0i-EQ~7KA+EtPjJ^PibNs+Ad|^nJnYKl z@_0N30HsoCv)O2xz8R)csU9A7yWLK&*W-XpCPUNoe!ssC!!_`Fy$=`JVzGq7VS~Yd z8KcqYbUIy!4F&@MNT<_}0jASwuh+xtXf#@@)&AO?%jNJ2&paUF>;q zp=z}X0Lf(1>2&t{ePaCAqiwfZt?YLDWHMn{R-sT3<0YS8$Nvxb2K2o@2QsxxYXATM M07*qoM6N<$f@5XQd*Z8Vjj zZy>R<5X4w&WnrHtP0%N>wG7x;r0_))Svw0!7qGF=QZa>?7!X7W@aTyDMU(!V0{4p0FdBDP)egH>UO)H=V_W|7)Bbcs7?#bPlG!*;uUKA(rf;bybByXy7&bUNjCfFVLityX)q ztk>&Kr=zOsY&M%rCjEY&{Q?KjY&M^{Y}?i}joV=sV87q@dc7ZAmSq7LkH>ETSZM$N z*LAs(f1HC{E(c(>T8SF8R4N7FbUKLwls%nPgqACz3utyAR-P ZT>-WXL*43-sP$cj~qK~yk5MQny8F&a!3!Q?kE_yr7B&Ay-_%qIB4+z|HMFpzOyba&Tr zxo}S!=j@yx=jA^}IOp)w0`S@X0e=c`KA-&p7>1Efrzxd`kWQ!bJpy-Okx0aulF#Rz z(Zk{JAon?dF{Y}j{oHQ1ZH6ESjYgwbELN-4_GF0gT6E(=($gJ$*};ClPo+|v^FpD(IbSRm z&S)Z$06;1AJ|a;RGnotk#+cpc$9HnM+zZZB(=-6VV9@F8^?KoO*v*-`y5&G10AMs4 z-941j^?Get)@uO$e&24lUavQsO<9(AyPZo_x)s`Hvl$MDgb+!RWLf@(B>(?Se;x1! XUiw9ZoiIq600000NkvXXu0mjfoh<07 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uk.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uk.png new file mode 100644 index 0000000000000000000000000000000000000000..adb3b00ae8019b75416edd3e0f2028ec1cf1f47d GIT binary patch literal 577 zcmV-H0>1r;P)0005tNkl>6VZUV_{(<3(d%ug@3}zihn>^jIFYhQZ}=(P!=|_CN)Y^q=*;z_6Ga{z~`%i`Ft+R@^-tm+wG}TDi(_w2=LQ3 z9*+@1JkN`w$Z;Hzhr?lg)w6(FttLs*V`Q~jA%p;6I2_Uf>h*f7)%tRYVVKEeLIqeZ zmpYj&6biH{N+c32%ii67zaI<+0YDT*jPdPuqXHa{$H!jCX0y3m?%p|r!N72T1^`Xd z$iEatNvG52^O?j2K>z@r=V<{LW2e&z02Yhoa5&t9v)PP*1wm-H+f;y3sRRJ!a`~@# zBog5`uG{U>oaLkk98MuG{VYHUJq6o6Ux} z`~BWzG6BGJIyKZjHBCJp4*;+%OI(M;QK?h_U^E(i&$u?5&CzJ|F_KIs0if6G8H@jS zw0JzeSS-jz^?JRh)9G-B{ikPO&twq~=L&*#_c^}i$GzD29mS}Yb{ zE3&Gpfj|HNGMS8~X4WPC^-bUUJ+n;hD P00000NkvXXu0mjfjGqDA literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ul.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ul.png new file mode 100644 index 0000000000000000000000000000000000000000..9f138ee71d6febb585fc3233651a826de42a1c6c GIT binary patch literal 537 zcmV+!0_OdRP)Y%7X~uskL_(w zcn>`7e(yPaw(q(3a4A9vyfePw&G7;JLjcBjzuzN-^cE0(fiW%?i!96D3OSCuTrQf0 zx&YJZG!lu3q9`xh?Y7Lw=ksO(7~{oa!7z+UkH_Nx!1KH&K%)l~MTJ74bULll{eHi^ zYqrUaM&o=w-|MpI^?J<$Hk%Cqbh}-ZE=dvq^m@H!v$@;ti~~511AzH_zFx1Dx*!NN zO(zlwhr?mF+f5x)o6QCQu~>{43T;5WUcdSN762i{?REn|wOTa*&^0P5l?nhH4hJK{ zNY7V{$783{`RpeCf<@tQ7$Nj*w_Gm2sI|QKxlX4u91i>a{^@jjmeXprd_JEMi%O-E zGA)3NHR`^I}O3h%vEuWvQ;%{lYUnK|b$0ukXmVZb-zN8rB|2#3RKYipB}laeI8zP{Go z<>27JZnrxej#8gEQ%ttlq89&Q6-ScWXxuBxm;$`L?Y4B(gMI_G7-`8^77{9=JxhB+pD3WAr_0d zTrOrD3VQOlMcQ+c10H&v>y;W0l=`?_@t}fov@Am`XuPC3-1CV7|B~X>7 zXJ==fot-Rpg=}hS(&nYM2hYyV0vH(?sZ$5xa2UYAz<`R^m1%EpSH`j|kB*MkFSKkn zYcLoN4-bD^7z_Y(oyW(=+2HQ(4nRjoht|f(PtMQJkB*K?r4oPMr>7^~m;g*nOt3+X zYOfM-I-O3ZQ)Th^_y}Neagis>=kD%qmJtdBLHHAai;D}T zJt(-ky4u;~_?-Nn6SR5J}T3uaLmM$+ZPft&YXm@wl z?RJwMa=Bb%V`DOzRPloD$BT$`Q=%@kj>6B+?nmIS@eADw_>(U7=A9dG!{fr zYB0*mlr0No!AO>BHvRz?v$9fFnws@26v;{oODh)2j2TWm~P*u}#DcR;!iGW($YIu~^LG@c>{LMx)Vi97hPLR;vny zB9%&IG8w5<3c&02US}Ya$=2)j{n^-F)%$^D_Wp>rb_aVHmU7?DzZSayea3@$~dW=Z-HP4u=3F zlA{C5idM(taj8_Q)oT2r$z%ecR;v$Ab9#_j(OZedV$1ONa407*qoM6N<$g6twVe*gdg literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uo.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uo.png new file mode 100644 index 0000000000000000000000000000000000000000..0340b6d03416fa966c0b2e8970395e09e140558d GIT binary patch literal 606 zcmV-k0-^nhP)RQ z<{93^nc925_kPZ8&iURF7-RU&AmNwe1Ng51&1UlrfbK<|+wH~}(=_e(`@LST-EJqz z*OJ38#Ar17zEH2%a~wAq43yUrs*SeYZap4PwOSQLQO=qqNl_G6tCcK>L?ZL~{LK@D z!{PCG{B#N-6pO{=O_IsvPdg|9d_G^jURTZ_7!1mcp+_PNh;w8DO*7 z9tmlyqG&WKYc7|If-Id*13;xx(e{Y|U^1D=58ZB8LAGA60f1o`&0b_OnTo|C0O)i| zj8NTRPNligFvfvEV6j*z2>Sg#00@Gh4IoL<;c#GCw%u+kXW(!+ zve~TC`JV2+-|r0ugZvFG7E3OdTP~O1l^nvTFzrBZ(`aXOu~T1`Hys*yau4=~0ALHsp{ s5V~HkMx)VeHotyl5}!Z258$8U3z7%h*~Ah(EC2ui07*qoM6N<$f-77Gw*UYD literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/up.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/up.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a1d38d7583f7516237fe38ebb33ecf0a919c43 GIT binary patch literal 685 zcmV;e0#f~nP)SXCIf(vj}Ht$tyX(`d%IL#US2rH`FwUdo%8vew|qVy0K{T33;+O>%VnVm049^^ z%1Wox0H9DP`u%>d*ZVVII-LRlK@eAZB9Q<9wOW0pFBS`qZMWMGhr@SA001tR>r(7? zy8xikXoT%alFVka7{4f=&vT4Ip}>pV?e-?1*=*WuHnCz6ts;lR0RRq%gID(Zy%2Cb z9swX8k7ENUiUNRQv3MWQ>2&U|Cs8912>AW}OXVhjpRiCUgaK$Y8p47T1LSf!j&VAj zFh(E@F#tlyVzB@~y9gRkR0(gCWO(v5J!+d>xH5!d8l3uTmL?YpE*ladq zmnlN%^YfD=N#P`qMkBA+%VRtq&z&Uq0GrL`^7U{yTvgF{JQh1=ep05B$piqDN+rSx zj54KZnmceFb*osf*W3fcFb@F?heMT0wOXy@a{2ealHlG=5keA) TfhFW&00000NkvXXu0mjfCNCx` literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uq.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb7f505109971e0bd98e5fcdc2f59c943f658d4 GIT binary patch literal 606 zcmV-k0-^nhP)1xPwJ59D%t8j44Rlfr7Uj>SNaE62j_Wd6l(^sUDSi9pj`RE3 zyr)ms`}w?jy7%+kVWKF)C#8Z9>kIgw06`Ew2%sn`9*@5Pz+Q>2!(#sCd0z%eR=z-CBNnM~%P zK{BS}@fZLKg~F4Vt5kNo9ROICRW=7Gm-Tvmxm?OK%w{tHU>K$h(C_!rAs7tG0~`*= z9isrC*XtXN271qf!9WI}(P#j`X0s_?72$B$>2&_?=Al-r6##g>-ghRsTCD=Wa5$9l zSS%Kqd!8&imSz2Zzt88BGMrAQ{eGWHrQX>^48xElDc@o?o7HNy@9d&7UK%i7A zT`m`?X*U{;9LL>mH)Q~H`)~dH{FKY(?RJX{=kpmYiOFOl-{J#6rBaDRA{@u@JYTET z2!fD`CQ`fIMupSq^d-P%v-#`E;czGxi?LWN8jU8C$yTc+isE1}FququjMwXB7)J5; s;HjF;W+)UIjYd)i?E7c;1^l!A04f&oAMt=3b^rhX07*qoM6N<$f(0xQy#N3J literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ur.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ur.png new file mode 100644 index 0000000000000000000000000000000000000000..959804cd94498599d5e680a83343f22cf101af42 GIT binary patch literal 690 zcmV;j0!{siP)C|xP*|aVuMRwK?SD-g`x&+OrlLUH)&N|BLasUT$FSWL{V~yP{9cNKspT< z1+9sPhX+ArG#XuGtyb&q?(Sck5Yg&fI-Nc|Je*FaMAYy1tyU}7D4)+0k<;mX zdwV0I=jUgRm&;`l0@Z32!0YQP9~zBD02+-7TYcDsDo zZnwF^CX-1%x7+Oi4h|0P@9!TUAD6qWFj=8cFbs2abi{``oo;`BAAnY?<@2+%GlfFY z>-9c9J{%6mk4$d0T3pKIa`Cy_?FJB!$N4ZGkEhdV(I#JCUvnCbMq>d_Pfr2d-Q97o zg+jq#FmP^*79b*%$poO)Y6%1)k%+}&;m_dYTZym7C;$Ke07*qoM6N<$f*$-arvLx| literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/us.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/us.png new file mode 100644 index 0000000000000000000000000000000000000000..1d77b1d70537a413d909b19e7f4c6b201bc15c9d GIT binary patch literal 674 zcmV;T0$u%yP)!KYxCHIF6fP{C_c-t_hL6$*vs%kc2lQ`T2QwcXxk(-)uHNK0c0*j}wW6R;yLfrqO5=0MGM;kb1o? zd(t%R^?E6a`ZtK#Y+jbZVr;+P2QVIw0Wb_xDwRAQkI`tfTCE(%Rjbvvw>P>^5xVQkYzrU|y7KOuM0FopX z3Wc?Ry}dmEE|*K)EHW4j0CsnG*On-s&##EH)NpfiBcI^l;9xbtrQL4la=BnISSS=W85Q&5dEV)C z{&jNddTAHJ!C5UK@K&Z(v2pY06Y6^ld3~~q}?>qP+eSP_U zEQrb&{N&1RR&<$ArQX*!)w=W;p6EZ9M-)v8b^+?a-8a2$u9 zkz)n5S`8s|W5(n0PN(x+8#$3#mL*AYyWQH3EXxEz7>4mw1&&>m$z(2<3(xbm(`+^g zf@rl`uc-iITr3u^m!(q4+A^EX9|7V$3X~% zuBTkx?{`U(w%aWsB;eZb_bh_%`( z5&-1$`Tt*XDwSe`>2w+f5VkVGCD-e90O8C5j82utCl^7AM zC>eB7EH0ug>Sp^79O~3DgLKrTljH}u2wKpgwP=SrxCo+F2zBd{PQ{8&4kc=cwa}qL z#k}D{$V;P`_g<&hv*mo}ekbQ9-{oSGB*AyW0N;!sga5z)-%#uK`=wHe=XtN!%PsH~@&p<0`Sk;m~ccx3~BB_^2YUudh!| zPHlgY&Gc3)jxJv=<5)9KyaU1SrDM#tmvZ|ec_`Mk6q+6m6i z&Qwe;my^@PVzF|$T&-4v!63(R(nf%!2Moi=X^xMNQQXZ-us^tX&FAx-ogI=Sw-IAM eH@hE$zs4`LQ9?CPO?xW<00009d!Cv9%+EIJ$x8nC&!$$CSfkXEa$R4SCj<8hTr1)#01Egp|cMw1FeqfwX36^%y2;jqDA zAR1d+Tf}RzSP0SU^^HbD6vaRwFf=se^ZDq6dU|@6mzNI?4ip4pvDoC~BungeJL&fL z_&72$Qm@wqK_FyycGmCrpPru5V4mlRYhq$Tc?AFjL6EKy0HD+9-rn8_86O`fFq6qh zg7f*j#bQz3qFgQqz-Tl|`YbFg0O;@Ur=(OW(Pgobl}d%U22cyx3G zz+f=2u)VzrrG05nfE>sZ^>^C|Iplp68pJn-za(+~39PPvG|p Z{0IIo#$xdaS+M{B002ovPDHLkV1kyLgsA`k literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ux.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ux.png new file mode 100644 index 0000000000000000000000000000000000000000..e87b75546c5db940206bcf3b68534f1875d8b56b GIT binary patch literal 575 zcmV-F0>J%=P)uo$d1!D5J&1Umt*EFqOufHZxOHHTKdt^47z1v5l zk!hSvCe|6O0JGT)Kqiy%csyph(P%^|?e%)1C~_P}2ywgJk|d4CW7~lBdR;D;@5fXs z1wasl&1O@nR4Ap_>opJv0LbU_*Xz|V410ifyZsyr00@V}kH+Ki`1ck)DVD#< zj%-|0pU(#%nM{7_9q>F4AR3L@0ubwUz1?n`%_hSzx~}i{ds&tfi3H2C01U(EbUKkp z#2Ua@yA?%gG#a|Da~vm%qAbhRYW3&m$LVw`it;l1>xcHJQmF($lB7=!`FuVD*zI*P2_x}r6tyYCX;eJdc5~tIN zQYwm~S@&QtFkPCaJ+7>`0II5*Swf*uJRawHURBlmF7x~Sgb*{p>-DlM`{;eQf>x^q zz~OLoyWJ<(?RJaBVkRJ$%e`z7`P;|qa=EzOZkNmT-&OJbReS+&=oc8(vHp)XKpFr5 N002ovPDHLkV1lty0%-sM literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uy.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uy.png new file mode 100644 index 0000000000000000000000000000000000000000..b51e8ee870f14ae9c5f76bc8060982c49f44225f GIT binary patch literal 726 zcmV;{0xA88P)D~4L5UKq#2?rhwGhNK5i7eO3W8QC0?|eV(aK7j!$y>p`2*BKPOuQM5lLYo7HVQZ zMBP^$EXR2o&%6|m_omwY=G*&rZf16uhY*6FG(P;W{UZX4#bP?0o~VEhS}vCpi9{6B zU@(kEqwRK!y(CGVpPxIO&I4cAE3jNH^?H3Y8cn5A_xJYzz~k`*0>Q_}2So^lLKFx9 z*VotY@9*3M#A5N=+Z&#CyIm>{x7&>nayT57N@X^isnu#qMyJzp5O{ie+WmXkY?jh+ zxm>H&3gcH-SCj?^fxEjq07#`$Of~=j)M_<4ND#ziGnvdLs}Yy<$%ZnptoyWKV#4f<{X;Ns$f zK^6*yr}Tl}?`IG^9uMmhsZ_czf)Ol*-zB$-Syz*4DXx7!adJW8NYC{Vj;wOSaA zMx)_y_{+6N3G{kB9I;F$yS%)-xw#=p@|d;X&B6bd-CrQ^8@v^NgnoT@#sB~S07*qo IM6N<$f)?32CjbBd literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uz.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uz.png new file mode 100644 index 0000000000000000000000000000000000000000..58ee470185ca5a4a093d49efdd61cb7a1aeda038 GIT binary patch literal 527 zcmV+q0`UEbP)i7FzuUFHwVzC$q1g`NV5()NqKnU4xw`Q}MCI$z*z6oo`GutJSKi>Tb6aMKKr*x?HYUEOs~?SPuRFAFsa+_yum;F=?GK RBK-gW002ovPDHLkV1ke7;;sMy literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/v.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/v.png new file mode 100644 index 0000000000000000000000000000000000000000..3aed0031cacf3ad6303d9435a42333a56835ca9d GIT binary patch literal 423 zcmV;Y0a*TtP)HQ0003-Nkl2XiY`I*%Hn-pJTLCR28jVJ->jJpn?@5xJ&u8EFpU0992ri-I5kxZQ3X0PH=VPN&V{WHJGuCSyk2d?FK|q?2?1_4$?GbeJF}@ zxm*Bvo<|7T?RFfJ%(PywUw+dxx7#i4EOhkQwhh3tEc&K|;a4#L2Eac6d;!#^)mRhK RsI&k8002ovPDHLkV1k@huzdgk literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/w.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/w.png new file mode 100644 index 0000000000000000000000000000000000000000..008b3613484ed1bbb12f6f0be6630cdcced5fe67 GIT binary patch literal 496 zcmVD^E~!LB2r@DPPACWk0Sbu7ah&`89+cpEy;dp}S(bwmXqt9B9>uWV?{~Z1mpP3_ zV>+FFG0<;Wtya9+Y&MCgUa#|^q9~)$h=>-8MJyKMFrUxQ=X3H1yb8Ho4nQ;-t<`F# zY4&VI6ccs%Y~AW4!}$#ER?K`SQKP17ywwW*S=4YVHkY5 za=H8>0FcRKX0zFDw@W6I!{Ly;gAcV*sRUrTTnchH9G<(O>pFeQCjn#3vaEM*+jghZ mab1`G5Gnj^2?e1bc)XK6{w}RaGJ4d*3X}@;uixttg5`FB4!=9LE4)nkMpyqsY_LQdM>9gU@Q3 zW-Wjyia!C1&j|%8L6?wnkmt|?&c9JB0-}BvT#*r+-9Q%L7F>a@z&)hR0;WnSxCKdRs(1NT)W-wa{{Z<;c%GG=c02ypP96(0qu5M*Y&b2DW#0D<#GwY z^E^pR1>kf#0njvUu~=L#m*H?|+ctLq?Du;G6>K&ezT$el=1vqvhG768geU+Uk4FIA zZdWv?(G3@dZ<{bhSnktYw&k#r%h>b`DAt-jPbBl!(w^}b7xP_-%+1YP) z&d#7hMEIsud|4A<0{l|fb-Uf}`FxIuAz|HaH(l2iMFDWRTm+*;0jJX`48tTz=JWZe z%!Kwa#?mw;qG1^FJO{AdZUq6#*ipe4GfngLdVT8^`MxiH`Z$xju3N2E08G<791fCA zCZgl<=y~2Jv;BTA8Nl^;JUAc-0+IddsA8678AZ|cdIeBbm1Gavw&hvZbq!#%*~q*> z-}hk{p3i3h!!Q6a3_~PP7X&zt!z%-TPYcVkr1e1@$EvC>77M;CiUNS^x^g^dng+mZ zHv4>u<5<(Qs;cBXQ^puC%W}EQvMkSY+qU2Dx6DSn-|rtw*X#ADz7ZOBM8u8#gOusV dYXba#zz?JukpQNi4>JG&002ovPDHLkV1j`sxL*JO literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/alpha.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..91907f256e28c86774b8ce4260234f5ca0cdac6d GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*eybgy1C)S5pFCY0Lp+YZof_MFL_y&A@^l87EkXqsyjCz51aMAe;G5te z8^Hd6K}LkVm|w+r^K9LmZ)Q8$|K;=e)O}_x>EO73g})|}_W}d&2YE)rW82S_f6bp5 zq;<^Vd~wgk>h)7jeVZb*^vhD|Yn{dCEcfeez1ESjw)EUxi!jC>!uukEXvwJb*O{oif5P948( jc71zk?!au~5V?QZ$tOLDJd2ruzGv`s^>bP0l+XkKZViHX literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/beta.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/beta.png new file mode 100644 index 0000000000000000000000000000000000000000..95edb82f59d4cda867805b03112ad4ba60a4a6a5 GIT binary patch literal 382 zcmV-^0fGLBP)l)Gp-GMO%A;cK_-FpS< zg)(r?mD7zeZQGs(Ii=JzO<8izl~SOkLB6Au(t9tZWQ$MNBb5P}eL8e~F98Q>UW+qTx) za}2!qLWp^u@1@qd?|b<4ob&fn0K+gKgw}OUDKW;N`2sR{NWcMo^uh@tV2ochsIEV| c%iv|*0PbkToCs2G7ytkO07*qoM6N<$f=QE}8UO$Q literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/chi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/chi.png new file mode 100644 index 0000000000000000000000000000000000000000..2c5f2f28f499555ec79523d8adf36a3b5c09f88d GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*Ii|xJr`G_5zI(bjhIkx*JMCa$gMx_5^pFJh04CW8rl`iU1kPy=oHrPw z8cQ5FZyj9DTvTxEqzb#jMejCSrr+|LKS)OO2!{ccp$2}zxsWzp=Y&Jfw$(;DO#)I*bI&_C@3k-dTx0+ z6v$vWCb713-)aVd7&<8Oc0eSa`tNompiMxMh8OH0l@y%YXzcl^<> oES!pyv?Kp+3vpoG!~cV&{H|x;clM?4fI-0E>FVdQ&MBb@08S~0mjD0& literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/delta.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/delta.png new file mode 100644 index 0000000000000000000000000000000000000000..847f5c1469dbb348de397f17e25dd88cfaaf9779 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*QIRVg%gum7FFaiwLp+YZowkwphysu6*_T!6%_+<`8hR!PZgK=cHxDxd z=?6X&1SJ}^CkWhaJR++8Q9C%|{*Rj+5BIjmzhboyGtOYEPxzqcYjBK1Q6Nw=^grA0 zeasAky^kdxz5k>dHBFV}+|DyojF>f->W4&jPYHUxYnr3B*7M4F2NdjGpV(i&UTSD; zeE+-boUD5fEc$Y9@A>Y+!tlKET8ocM)a!~jzwP>hWlwyz@xLt6f7l?Tjfdgo18>dj zZ6~5;Uwb&m`N*m6whqm=H4Ho13R~7}je7m(6Zf}`sfJr+J*Q6n~1rPDy66`n4RAs)xyPCdxWDk#u){F&$i=3pk-7Y^K37n_8pEMT^} z(8TxRfVIcH(wl2epRQ3CI{92)`0z1_f=S$b&P+lR9>}xIUwc`xWlr&XS;4*E^|{w< zy}VI8am~Xy!cIN4Hy)LrwG8*lT>Jc*<@dCvATEX_Q{+^3h^^;m=%`rbD;UTTm|c5m zdADb<*RdJbZpEyh-o5txlc?+-L7>9@*Y~wvyr9m==}~ZAyy$?robndyJwP`zc)I$z JtaD0e0suLQU(x^o literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/eta.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/eta.png new file mode 100644 index 0000000000000000000000000000000000000000..206d0142761401395213686294b78561c25d17ae GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*F_oKtjzj{5u6epRhIkx*JIzvuoQ#(+U6^Q77k1n4D22mGFyZm zEwDHtH{)jF4Q5UI?fasQUe@@=ExYXH^1!$DL8_<&qez3$hIOy)Ql6fYS;cAEWFPxdo8Ygrp4lCPKgUe5U`vAE1_R&P&BSv!p~v!ri~3bD!HLCr@=A{;XaC~A(Oz!5Be~&J^OQ@QbguJU zm{nsSBlz{}&HTW5jFD&K3?7{7SeAKe)%sKWS1@of?2GxvroTPO(FEv222WQ%mvv4F FO#tELb(;VH literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/gamma.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/gamma.png new file mode 100644 index 0000000000000000000000000000000000000000..97a09a08c45a6c7f9ce729f9de7844ed8af47eb0 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*5yLidCj+3+IZqeI5Rc<;ryb;NRp4>BXyM@gf+LSX`h`Z$A&y;)ISjK8 zu$3|YYdkXH56i@sBh2qps$MKUYUX3;c5U*^(lm~?1P(hD4n-5GN5aPo85ojz1owWg zv7vs6SpAbU_BRu$MN-N?tPjqmHcY+c8-pW```PTN@K14iVp8Mo3HP{aWU}0 yoY%LNlvd4IFTPtt{l4o|pT`ePS?-JfVc6d5@OtBxC(1ydF?hQAxvX`sfJr+J*aoPEgY6XBoGd*1#Lp+YZy>?KrMUaOz;onWB5(oAY2TrdGlCl|!vKJU- zFEsAmx$exG(|Px7KcC#q5ud$rcIAzy0uBs}^_*uc^_etP-~V-GV3-oLW2(4X(5X4b zSuBiGf+UiYc|<-e__gsGmttP%lC6D)?{fFW1ZL-czZ`Y@((ye3uelT%7JQd;vXFWB te7+sSm8iMJ$7XysFWjZYq40pc!CZ%@?;*QSp(N0e44$rjF6*2UngG06R~P^Q literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/kappa.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/kappa.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8571dd2749b7e6bbc3c1969576a2e0aff20a03 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*ann`dS6=~z&U?BzhIkx*d+j1;ivbVY0}XQrGY_`{7Wb1JeGk}nHQqcR zYUN~}F?T`Ug=&o{&CI$h^vnOwU-IGiMYkosJ%aOmxcQeeiLN;CpYiuTdyW-Z_rFI5 zg}Tgn{&UAyE%qM6*z1f9TdzfFE8VLWw9GSox<5Nj?zo_!pke+~n~gf>EEyD(1Pzb1 z2yk^TJ+Mi~MI@O=(dV*@%ekGClA`SzN_09bc$ke>XGQIQu6@eEPwoeA!}q$|+x#15 yUcP<#@Kwd-#sA|XuYcWg`%1JctJVkR1JZR?Zf_2ng#8D4jlt8^&t;ucLK6V69dly< literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/lambda.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/lambda.png new file mode 100644 index 0000000000000000000000000000000000000000..b619ecd3dcc1a19882a61eb13d65f76104b3f25b GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*2~n|yFW&-%u6VjQhIkx*d(Dxz#Xx}dLZaw{1*HspT`V#^EGh~Mg&0_Q zxh5D`tY|rS@J*sHA2+*N=JyRR?aeadKdbvjb#gp8!)>&jf%S*1!THTw%kGzNRp@W- zh`ruv#HG-}z+iYRrlCV3dC&J%y1Nv=*Y4NxUMJbXA($D>^!7rJ;bDU(t6o_2?OJ!e z^lXrzvGSvBxeN|2o!Uuh&t;6eJuaJ^k8XOteE#-t_oA~WGoHD#?X8LLbFUsj1}6^A zhVw5UThy(!elB3hTkyN2^Tn!r%e3})F^N3jZ!njT|Kyim+jAG_KL$@%KbLh*2~7Y6 ClyWry literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/mu.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/mu.png new file mode 100644 index 0000000000000000000000000000000000000000..016d4642008c5a2eea36b59f2d63c38f85160b10 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*Nk-8Go{K=CE1oWnAs)xyPCLlks=(8Bk+p<5fl0P8@Q#c5O6eU=cMtGJ zsUP62U>9<}cd*@N$H)7(mi%=3FP1THcQyv&`OkO0-+jM1HL}OB_P%kkhp+ifX$P0jHp~rMuc<5h=GE;xdD-OW zwkf-`;(BVFy5oFPPRT`NZ_h2RU$OH4BCZt-9~mnjG9O*zwR;B8e+-_kelF{r5}E*X C7ICBi literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/nu.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/nu.png new file mode 100644 index 0000000000000000000000000000000000000000..0f00fc4117d938236eb5eb6c32ba21c43106016f GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*Nlk^TOSFMP`#fD7Lp+YZofgP@M1iMmcd!Bb0|u1`ESx@EdDK?)oo4^}xj>hbTkzoIs)L7THE_;ouxGv!r9bo9t-ZYxT#6iu zEdtM%Y`tb#{yLSht4?al41++Y8B8cek$FOc2krFm>d^83B-UvDtfU7E2rI{WrEMu(n{&Fu$r4g^lS$F?t`VUDrVrSPa{ g>ywz&9zopr0LF!Ac>n+a literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omega.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omega.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0220f4d0cd21495d0de45a33d6a0f5b87e0024 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*Im;qtr4FFbB~KT}5Rc<;r(Wc3HsEp5k7ejTz}CVm(a3v(Bj*6e0hJ0C zw*=-*jtNa)^tp1cY*|_pa_VpFnjews-eT9HVpdA)g)yl(F#TanxV=rD;nudRQTF?_ zm!8^W!+jx2IB?!`M+bqL3B4;{TP62we!c70)n%D+_4V3HN=2R8OaDxo@+rqE@*TmORda8%JJ)@8U`sfJr+J*DTN{xe;=UGNlzEY5Rc<;r*7nJG2n4M+$raFg3Z9mtbx~tD@W+Y0cjQG z11uleDw<;og}O2d7%z$bi`|#B*F%5O>N%S$jpaWVi7a4X{iED4b7o}S{%P^9E-oeK z1O)|kPb*2C-o$Xgfahu9EVYvfx;4Ldtvg;gr+2H_u^%&FVdQ&MBb@0DdiS$N&HU literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/phi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/phi.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6fc9e50b7ea1a2a986346a8321bca119f08884 GIT binary patch literal 369 zcmV-%0gnEOP)?=nRCuv*TopCxpjc|UMW@L7^C;T#MatrnyTq_55{qv=Xo#GUKU}eKB_&lZJROX zbpjAk;`sfJr+J*DdTUm_$C2`Hha1_hIkx*d(Dyeu!0EN10&W44?I_}%-ON2!?zV0>ChFoa|2E~^6#vm@i$n2$46k96iS=&#XQWSgr{M0FzCaBGS9(h`xrQ6>xP&~a!BKg&g>iZR|mSwIk)_eYEmfZ1+d>sEm4GtWTXYjAS X^F`x~V8{`m^BFu{{an^LB{Ts5skUmE literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/psi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/psi.png new file mode 100644 index 0000000000000000000000000000000000000000..92054d2b8e0b687eed39d9c0ff6a64c4813f7fc1 GIT binary patch literal 362 zcmV-w0hRuVP)_AGm9e@=`2bRF?KssO_Ovq&1tUuArZsK{=8&2Z)0X|Yn>`K1a#oU5h z@FPUzy}wZ4y|1e3LP3m?bN;U~h%vqf007J92L(igh{l+z#QmQOVB04T0qPZ>3xn*rQ=TgemIz4}R2LJ#-M19|f5Z(fq2TlmtdoP5T z*UACR-|95M>!NuFAflA=1OWgntKyu?))mqk(=-Vo5HW;ctqmb)t;cap+h7~#hGD4d zT5D~sO?zP5N4u^|`}s5X!P^el&ST?$(XJ!WfCH2?qr literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/rho.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/rho.png new file mode 100644 index 0000000000000000000000000000000000000000..48cc456e69b154f92b63299cd8a3ed8376448c3a GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*Y2hpH<)wi_&pllnLp+YZopzA7MM1!|aC7-f2k#BcFI}uI2)%KzVzA!8 ze4J|ovzLTb0>8?!ikpVo(|P~1s2omy=HH;yav`sfJr+J*83Cr{H`0JY`#oJ8Lp+YZo$4sqV!-2i*)%|=q1kH%%K=8A2@TC2D_CAF zC=HMaaZ*Xi=h@w!EBRnc7dU$6gNlBIgkXmQ%YT&)!@kEW>}D=oSu+vR%>zxc|~O_-4b3~%CRsgU|q(%=c$pimff8E_-B@@3k!qgbNQ1? zyPP=U=NFud%zi)TV4#D`u^Ce?&1G_NaY;L8`MtLORcTt7sdeRTv-h>vOAi~&nQhQ8 hX{kPwV8?`sfJr+J*8STw$44r^N^E_P~Lp+YZo$AZ$tjN=lcvH3@fYZZ)NvME9XhIW<$^#ae zhURx$RINYmvhjOeuJ`lTbS1&SIZqV%4l{{ucrc$uQ#HBg&oRsLeud{e413F6dJG@U zzIN-|+hXaB*O(dvngo)17H(DB>M`kDsitf8+r9RtPoh?Doo1H0=ggd7%~lr<(Jj|b zyqp{rlD&7+^e4K%9_;p902??0Zomk-fw%!1;0EXfxB+b7cOW6&>`V0WVo#Q|`L(5gERN$qPud4PY%kyi z{3u{uS9oyom6EmAF-A)1vMl2`f^rV9P1D3VPv1?`IOiZ)P(TQQ5E4R2F6Ue+1xbY7 zLEra`v9c_a8)F0}{y~EFeV^yqIhRl108j_U7>sdU*ZE}IHcIJj9T;PZqG;RpTs~v$ zwk<*k4a1OKr4%6qxE=DkMd{h7dUC@ZltbK6YAbgpd#-i}{h)^!=l~fZqiC13}EH*U&1Q Qf&c&j07*qoM6N<$g7GYweE`sfJr+J*SswnqTQh({*F9YvLp+YZoqCb8#ek=6@txh02YFwySv4u|=(K9gd%$(` zK;8oB8N8Qxi}+bJk2|&o?`W^f|EpQ!DV(uv)dv+z8y_JRN1;Cx4_J!(?)%hrFCi^k z*O>W$0gv6B=an+!*yLp`nZnf~LO3&pIUJ>R%nW z&dqSVu;rnNuX)J>MWtk)$Y~E-1V3)m-E^(ahC{G4wtO~&;Nhz8wfwtxCbHe$CYkKw z5_-M#Yjx?wH;?9@IpgwVPWJ6<@2|RU`tnlU5$K*d=GK{>55Bae=K;OQ;OXk;vd$@? F2>=WTb|nA+ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/xi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/xi.png new file mode 100644 index 0000000000000000000000000000000000000000..a00c3829d177de5ea599de8145998680341975ce GIT binary patch literal 358 zcmV-s0h#`ZP);Ouz153aXumVev4x|I@fa!oecyY6r!DzAv-+AB<|4$}VIcK<&7u?Jv@Cf`e zj$={%yHp^A;G7deAY#{bSH2*Gpp@D#_1+61NXIgb7$akBp66T$RbUtf&Ur3}YSFfB zR8PLCh|4a7(6;R~O^h)B;G7fns8b|_FvhIw3IL3;x~{2Dp!k?l(psmKPGmq5&|1eB z^C^JRzLYYboVzQ7J>-3U`o1s91L&nGC2K9`8~~POxnAHn zRMuKzalyLw-XmhuGyq_XxiaLVOLTK~s^{bN2>idm2WA<@_K>}J`Tzg`07*qoM6N<$ Ef>>6QCjbBd literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/zeta.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/zeta.png new file mode 100644 index 0000000000000000000000000000000000000000..683d9bca83ea455961ba22637f470c94fb8b68c7 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J*F@YZ*25*2u4?SHRLp+YZoqABPMS;h)`SIN;4(!tsIBzuS-e^?yV2@yu zox!(-`7MKW0)I^Tv6jehN9@}x=joYWH##48fU8gd{!_jZ_AL&vo!rAHHvFub=F zR8$hoTpRy9dZp$0&k@x`e2krFVC&lgvNBYVn*QLB{=k?Mj(9zw>%L`z)W= z@q2J7>YQd`ICH`AOwj%BXHJGiE!7nMY-8Nt@p$sLsliufHvD=Se&9c&yxc}!mD)Y4 RS%98p@O1TaS?83{1OUL+e6s)m literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/digamma.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/digamma.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ab6f1448fe0eba3714206132e00a1b3ce0d9ed GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJytG3HVXyDye&YX_nt0}As)xyPBY|cF%WP)z9S<$IX(BGU`xWvh*jdB<+4_8 zo9EiEu<>+`;D(4YLqqGi`=ur|`aki{X=v`pHIKhP5(t7{1lUPkU;^f7rlt(tgP$nOZFt+b2)?6#nRp0=HsF^zCgG z-aR4*OjA~~yy)>zU9c{DkG9+NhS%aHvCFHjm8w=AH1TD4@Oz)smH*;=&+nARuKvkj gasK=}!wuJ@mv=CH?bq741L$=IPgg&ebxsLQ0Nv4qe*gdg literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varepsilon.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varepsilon.png new file mode 100644 index 0000000000000000000000000000000000000000..2f3ae9c94835bd79f04304c5b68e39be5c712940 GIT binary patch literal 375 zcmV--0f_#IP)uuX0 zgni%7^DIfy3tu=aqT@JqUEk%wx~>R<&@_G5B*$?q%ksZZZQEW`B8Fl926bKUy6#Mg zj#q{6`w&9IFj$ryhM}seq9~#$!g2hvHl3y^48yW4F$_~xRnxSK=ioUw58wfOrXNec V1jITqZ8rb_002ovPDHLkV1k|AnsNXD literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varkappa.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varkappa.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc85a22758f76099117875787aeeacbbb86e3b3 GIT binary patch literal 446 zcmV;v0YUzWP)Ska)hV*Q@2>e>&Vh z_x%3%4ENp!BEly{!G~1?YCsKm2H?8xXf*2edQlXW-7L#wS*B?^&-0)6W2H>f1OSSn z0ARb_esdkiAx#X!xYwZyu-ol8jtj#O5p`Y9^SrRKER!S&0GiEa5Cj!XssNYE<$Ar6 zdN>>w>#Nm@1m}4k9|`aYrD>|FDk2__N0wzt@NTzzKA+zMn9XKMl312Sf@_)<$8p8n ze+>{tvET0l0K+h3;*-hbbUM8UpePCnKA+Ev#lc{JNKB#9shx50@#&s!`Oq#lpQ zhr{6&fNk65;6&^7y3^@!90vf?>GYKo?Du;BXt&$G@0Z=pW&;4NR%^LjJ{(cw-lLzU oDNWOVzl$36uc8LjfPVn^0$XNCsPaLfKL7v#07*qoM6N<$f^&wulK=n! literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varphi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varphi.png new file mode 100644 index 0000000000000000000000000000000000000000..a198b26921f9af5f8e825491313443f073105e4c GIT binary patch literal 520 zcmV+j0{8uiP)&zuW&dV7K=qZq0{Ne zvK$VF+3!Ip6slAzhrT5M`_aR@{R92}yymOg{6et`x-aB*l6YKsJM2pSc1Zp!pFJcuy0e9-dn zO!xlJx#xGd_Z+woAq2i@Kj6z&0V+TR0H9Xj+wFE3hJBa_$8n0HG8`z&Ow;^Bv6-oA zuR({yVKSN6w%uyASeDf^?RL8r}_PA5&%Qb#VA3y$OEE)F3ypUv>+g-F|FURjt?SaU8QOyI!v!I>Rul)vCC`a^C<#*y(h5o^Lc7&1Td0{Uk{?n+*V9 zI2>{u2LO;H>1_w+0$kS}jYfmPKv9%uT~U-?uQwi#P1F2jL}2x+r~nn<9{}z^`f5pB S+iC~^0000yXdAO?fYZZY~3Z2kt5QR5baANUa#1PvC8$Ql$4yC#_z1X-Dl^Pd8cD^;9Z#I2`Oquh$z422A}&y+XBGozLgtaQJpy zEEWJXO=EmO^b9;6PbQPmG_6vpM59qc$mMeJ`~9r5<+1*1wYtrQr-RZ(r_*V(*}O7M zU5}T(Wm$nhpja#>lS#MR4L}sdL?V&T=bb4LA!IZf<#IVe5F(LCEEbbxnd7+ec+6NL t*Aw5C^Z9(eUPV!KphVxD{1x~JfgheZ2g)B9vbq2O002ovPDHLkV1lld(=Px3 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varsigma.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varsigma.png new file mode 100644 index 0000000000000000000000000000000000000000..a5409dd4b923662dd2b59335466910ad94a801dc GIT binary patch literal 360 zcmV-u0hj)XP)$-|GIHoMif*|+^3L%tA%Yw5~FF8$9-}i5HQQ!Ac%JVi-_UL&YV~lftZbWLpIF1M*jB%dlw*Ua3 zZChQ}5kjVE)^&Y7005+vVHm!r>Nw8zfVb9lwQUJ^otJ$A3yp+ z2ui6Cf-!d7xL?#V3`1F#`@YZf3;-D8i#vEO+5>n1XY~iin5?d03g37D0000)m9~P|q!0^>*w~4URdg+FMeqlRU>B_=)?yd@_ybmoc9wz?D-A*2D})$4xFlYL zJ8+6+XLgroVdmW(hEj@mngegP58!_S*6TGPq|s=Y+D$E*D2nZNn^HQT&sml=+;0tV zI-Lk1kHf%zzqb=mtJM@m(Oj?BI~)#wK4L8g$K%oIbUqU3aI97FjjIZmD+4Jnw!mLd%a#F zkua-%!z=7|JD1DF^Za-`<~U9e1WOMvW7ro_N*RV(E|-VHA)QWJ{r;FwE5!5h(ZYSJii)CM2L7y z4Yby85v7z;>X;gQoDGP$EKAeaXgPjLsg5(o>YLU23y@MGBF;Gx)m<%wkWxD5KH{JH vr^t-4$9SlvwSE|I`sfJr)605#|q~NlSo2Pd!~6Lp+YZopzSDMM0po@bO(C9Y*U5Ld%4sHZZ?su)e@| zge%SK0@obAH2&E$&gLl{nR-}lkMKiv`44jTGdotys9JHttAXVQvqRlI8=mIkyxZG$ zt?TznV{2HJ*~Ibavdwwxyl2|hTGnTFAr24nC>i8=j8L8 Up%mI$1N1P1r>mdKI;Vst0Mej%D*ylh literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/chi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/chi.png new file mode 100644 index 0000000000000000000000000000000000000000..774804af196fa73fe550b41b349f228a05914a47 GIT binary patch literal 364 zcmV-y0h9iTP)xtPjX9AaGvDy%pM)18l5fTj`Epc1 z1yn#5V6Bx>c3r2G+P3Y?kK@>Nos@E(=L`XJ0RWUz=iHw>=NtgC<#_-idhaQvF~&3F zoGa;G3P8lZ?}ZS@ImYO{FDxtt06^Qe#uxy&%Jl#M5km-s5Uq8gIJW_aI1Gaj;uhe> z9_;(h7y|%n?Ttk!pXHD~#z+VWAv`RR_x`l0G3I#6V}Pr3IOj^K#{gGf9zvCD1Nl7o zx~@{nt8-FHjIpL^mSssPeQ5HVwSd<8->YewN=)>s|Dp=00P+R~;PtZ(vR)ei0000< KMNUMnLSTY`>5%>a literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/delta.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/delta.png new file mode 100644 index 0000000000000000000000000000000000000000..c3baf6253586ab872c62ccae51d725760af5ec11 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr)60QQH+ErtnLZT zn;dT*s5UU1{`t$QRz> zeDa>nt%l21t(wmeef)X%k57}fUQ3O9r^BJhaNy2jzU^I8f;bw3k4L>;doJ)vzBgOS cfxivv)3@@Ll`s9w4D>dGr>mdKI;Vst07XcFvj6}9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/epsilon.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/epsilon.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f85ef3fbef563dd92dd43417f489a61ac84ecb GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr)60QRDO1lRbe#_dH!3Lp+YZofgR3svy#KQL=%C)Y_ddHs^0(UZ z$NS#TU-m+X!RK;|K-4tVWyUWxFGU4=$oDfibtFuf zm7uY7%JWJu&FiIKU(flRd%J1&ig)#*b+78B-raA|Z20s*#DQ_oLjEp4rj6MtlRJPu OW$<+Mb6Mw<&;$Stw0uPX literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/eta.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/eta.png new file mode 100644 index 0000000000000000000000000000000000000000..c02a78af3eeba4366aa30e51fb4c7732fd6d6e76 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr)60ap7bAip)Tv6`n4RAs)xyPP@o?SV5poe<`y?lk$$nzDc|>2YF>2-FMzT zAUKKl49oTQ2A11wnkT(?{(t#{#eTy4!<{o9p0j!ItiyptiJ@Yiy#DD)#d=E_8Vu9s zrLX`sfJr)605veJ4r&54I^E_P~Lp+YZopzCzS&^gd{Vcu*Y?}^lY}DS_sQiMXPf6LL zv1ftsh4$)~v)^tt%RKboh2shL1p7qsiMdPjZYOCvFxE5d@YkMU`8>wU@R-7*nQ!)9 zkLrKyq3QeUsj202Cyw(oug%(8cB`V+mEpnO_-baClxM9B3_lJ{v}ajyQRD-+!~3}% z$0S@_T!PbMKQ?w8kvRY0E@xS7w8(;nuMO`sfJr)603BxJnH5x#nI!_nJ5Rc<;uQ~F%DDtpe*c8d=;lRX~#mXLW=#<3@mI4Ef z2lv0l@crN5`P}W$6V(uzBzHRokw4X|8*=)AN07 z=z6Vk|0%_N@gfck^*j?;7!ua9HZ0jZV@@`=r}1yu?6v1MPE6A0QedcLP_}JT%$e+X Q59ksGPgg&ebxsLQ00I<9GXMYp literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/kappa.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/kappa.png new file mode 100644 index 0000000000000000000000000000000000000000..44aa91f3c746c532ba9456a24e136b884d30a70d GIT binary patch literal 364 zcmV-y0h9iTP) z&paum^mU1d-uro;i`+rVZj32%$(OQUCP2i#@1>MQWSVM!JRVx>3q|Ft$T^q9(=^RA zO-CMb34{>OrE`u_`lmn>a$CeXf7-^Fwrw*T_2H=S-iHuMy#qoBW6WBswMN8$5g;M} z?E4M?0PvcQbB>6^FaW^k!!F6pIhTyn@CYIN^q+96|DsAz3CK6h(rgg`c1n8y0000< KMNUMnLSTY}Op-zX literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/lambda.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/lambda.png new file mode 100644 index 0000000000000000000000000000000000000000..cf67ea5de45ba58bbf2a9fc0fbcfc1b490b9ed33 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr)60N!97wW{LoX9(%ethIkx*JMAFvVFeynPT`8?4UQ6u(g!+n5{w*gFqkPw z&)|K*sM%Gt;?cGh;{Q%=GKl~G^U=y{T2)?M=cL#UKj3FOUig7cEBLd`=6j!c1Oho4 zJI=eSOz$^5R((I4ogrcE-EC`6^9dL}_i@qjnsn4%la&EPFBi4((y?2c7C1@AE?p$q zhvVV&4nI5J*SqYNeo;y5F+5iB_Q{-9f$h(pckKBd^*Y;KbE{5w@w?kBE>Gq#H`LzG zpSfl$gMgF5B6EA6_v^cYyu4PveITW@G{h@&>$P9o7Oq}axQ(Yd@xuKFtoKwx`1z~3 R`GMYL@O1TaS?83{1OTT#d>8-# literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/mu.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/mu.png new file mode 100644 index 0000000000000000000000000000000000000000..7284125d1d9b94b23b811982b93e41cb8e463bdd GIT binary patch literal 372 zcmV-)0gL{LP)00003KNklIBA+?6PY1=^B*3|val=Vi(M=? z;0F8y!1tEHIX4W0wKhqTzVAQYK}5zF0MvE8NmzEJEKAP$JkRf@X_~SutEy`Mgt*5f!{ILU}eM9#TG?jHaMA&R0f#vCfZv0bE;>bmZ5jD-i)eOx@0^*lSbH`D)D((W_@o)5OEhBai#raszI_^?)CA^!miu SbglmY0000ItDpXD!^A>xBlZx3SK zfE(}+0PnA#bI#uTloDfXnx<#FwRYRKvMiNSLWm!~zzgd8z9@=e7!LNPX-<7F0gN%@ zIC9SSeSfwu%W~>_wFYh5erAKP$lm)9!n&?h03n1irt3PwHdRU?qP3O^z&Ur$Ip=cD zRD)L6byZbb>%SSaZ{?hmQqJ?tIVV{aLI|al)*1k)c9FFf5mQRP1pq*dF@z9fJjCn0 zzY+?2eN_O!SC~@DL(&1@v<&P%TW-J&pa*;asIU(}wxA`)00000NkvXXu0mjfjRlMW literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omega.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omega.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9466db6b0cf618d1ba1359d750ae3afc6535c1 GIT binary patch literal 409 zcmV;K0cQS*P)X!!T@}Qc3`j zQaZOg05(xw*ZYty)Hsfp0Gx9Gcsstex~>7BEXzxPgEDqqXB&Q;!O>)UgJoIvA?p-E zTvAa{6jnvQN^4#4cNH095b^nZ?n8*^tdF|~M5L73t3^tQh{l)?0EnonsyDT8&bzKV zvlou*qm;7WVHj@pv+|s?2F@{F3$-4(EK6G)V~leS9?l;eV~jDDWm(_%)~U7jeV;Mr z`@ZLS#~Il1vqfvY4uKHDs($N?qUe~x?sw4*xB>72CRs*o0xrGj00000NkvXXu0mjf DKOm$M literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omicron.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omicron.png new file mode 100644 index 0000000000000000000000000000000000000000..6d31fbd95e6ace84ef6f1b317ac700c9da502a09 GIT binary patch literal 370 zcmV-&0ge8NP)0003INklJ2haigVY1n*Ph}tRV-xQu0~}_COK5V=aHl@tW<7uh z@DBi=C6iK0(=@ehi-;*D?>!<4A&Ln3O3pdPm~-yupw?PSnG19Qh%q9fwRRtpQYxit z0ZOT^>t2RJ2mla5IN#x-$;OzYT2o31A;y@h9st10`fOs1F~;7{V4mmm!?kT&<%7%h zDWxg^A_9Q-{scfNt#UHw{HRbVrDa+AzOQPswH5$kjQfz*`sfD#!3Ucagb;fJ5<-62 z`%OU3c^t=K7{2px&T-C5cF#FCg};h*U5zo@V+R1GFC9Shd|MvC1GpdX1==;FbG^FT Q5&!@I07*qoM6N<$f<&~D)Bpeg literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/phi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/phi.png new file mode 100644 index 0000000000000000000000000000000000000000..1a928d65d4f45299b2b7bd405b61624d49db8367 GIT binary patch literal 364 zcmV-y0h9iTP)~=P||~7CGnAG(Ev0rIay-G4{L;0M^<=7OiEI=lRQBDP`AnhXjNW zYrMb7Kfi2u$VE}SyyjX|Wm%rk2U_d8t{+2=F>0-wrg_V~Z5)~2dqhOUs;ZoGM5L5@ z>(5_w@_knuhY$cDgpeeOlyVDkt3^cg_(L$pP8PT(+9hxa9Kbi7cgzu3r%9Or0000< KMNUMnLSTYR8Ih>~ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/pi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/pi.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e1314b03fe7c4c585d9699e614dfce48f123ac GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr)608Dlxo8$c0;nVv3=As)xyPCLlStSI1`?##8JMe`tE&QU&{gF-rv-i1~h zSl%YAIUpm}bhAZ8r6OWR{iN>`*^PMel6fL#a_jVQxD+rQ{8}5E?W_58j-a66^Ho!r z7^1SX-!7~=@k8mD#QVR-CFg4Q{Jt)%xiqEAMWIQUW5&#ms`oA~E@x`m*KU>kx8u#X rR8glJ{Kh?oat}`De99GUOd|q9BOQPf&XDV0)w3Sj1(^WSG+trZafXsw-3 zLkJq8E{41;OYi+|nK4EpverJUB1F98;aQp9rKpqw051Rlfb*PNYqi$b01y!~pY?-? znpIGBKt$gA@8x^%LkJprC*_;W%*-5PwAKQ^wr!XC`KL|R-bFd*-g~XJ)|yh9=ULgo qO|NJX+4ud+(PvHLUo-#)fcXRxwJFvG85Q6F0000`sfJr)60S&>C7FjVcd2Hc(d8;A+1PO*`mH+b2oNws3wJr5olVbkuu`sfJr)60Idg literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/tau.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/tau.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad430550b442ecdcc55b7995c1e2fac5f05729a GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr)60IVHErvkHJhdpunnLp+YZopzA7MM1#zf6g~O*$nnujMI|X1Da$bgch<` zNoY6l-C*v#dAQ5%`t3i$lNCQ389!t{W%<~1?}rU63Ji=4@2je0+?6gxF?(pX3f$WE zb{8Lm@%q=hbWR)aY!%wMYTx_ho@kB(mfKs8&3OM|IiFj~+EA~zsn09Zp1rnCcxKdV ztGP6fk>Ls>!?Mg>`<@(rmHzI8v+#k(aUmfw8cSIYRQtQkR{qN#ptCwt>UoUi{Pzt{ e;#C+JA26ps@3lE}IF1$Q4+c+HKbLh*2~7Z^#A$&5 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/theta.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/theta.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d78300c31402f09f77c5ca91245b8ebf36b22c GIT binary patch literal 392 zcmV;30eAk1P)4KnG|AU!IRJR5EY-m!Pt!z1Pc1~`oKMqqDn-k(5RvyjwTv;0u|vSS6d7ao zLDzNbx<0r<2qL<#`3rzCwhxF15mS5!;cQF+U>wI+t`OodtOs{c*Y%r2nCJOb1ad3T zT9;+HZCh$7r8wtj`(ST{+wGP%Am`j#`wxH^W8e3E-{0$S&ee6DvwMuO$o#f=?~O5t mxF;v~r2{Cgf6)cF0Pq8V(6X@sR^_e$0000`sfJr)60d9Ey5=F>o-6P_-PAs)xyPCLlkq9DNV@KO942I~zh$*fa0EDh)?X^<7r z4$xKzQwZDeU12A`CBNRo?Vp>@zT@j}Js>#o>XV~d&P+lR9xOi~ak*6XdCjb40!}=7 zrzf%PZ|c`ry65}#(#*BT3te2^*WTWC&eEmiT;|&O);65mayMVA+s2TvmbKxAtZ>zDF~-6kjZwsIc(lncLt0?tA~)rvGuo^-!;w smg{~0MLs$#ApSFS&OcWb1;%RTIMWWZr%fuhKtC~fy85}Sb4q9e06oWY;{X5v literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/xi.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/xi.png new file mode 100644 index 0000000000000000000000000000000000000000..a478d75912ca67133ab024ee8ea449bb68968c23 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr)60X(P4ZxZ=GF=py0%h2iy*b z*z?cqShMxqPVey0nWmX_}|$oU7}4S(bxvMu>Ah&vWT`?+GEsn8PdzFbu;hQV4;` zqDlk+CWFWL?G|9~&h9$%f8c7+WVFc^L0AyiEd~+X4dO--S@GPkaQRU0 z{p60q7d-8}@4z!>=FDLj5#g2b2QQ8{;J*iKx7)kAVHl4R==(5DGZu^8wM0>z&1UpK z`~;XzrvO%~)ve|C`y-JEFMx=AK3^aZIG@i~dZW<*P_0(E0GG>UKA!`K$K$tdHk$>| zY&N+nAfkT14_*wGV-#OZY6?IPQ@0gOf?Ck=&nXIasUp81Mf?A0KH!CuB9l-F9C*O6pO`RFbE)-Oxm`6yC$E{|GYWI p|1TmU#@Ki669DgT%Ny`&z$db<4@E?goxlJ9002ovPDHLkV1gY9^5Fmg literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/approx.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/approx.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef6f5dab254b82b474171509f3743e7f5995ac3 GIT binary patch literal 494 zcmVi0s_SV89}G7Jq?B0}S0oC2^~tsa&AejklS0aPlLN4?wazM8{S zm&;`)lVP^{{k|Xw03=D0W!dF&0hmlCJOFz|q9~?PDP}8?NSx2-dc965RaG?>i|uy1 zNF>5rHTm&BSS%J+tJUxKzwlfxm*ersj)C&4TrPhdgpg9H#B(Z&QmfSrWN@Euu~?eT zrmCvz^}1TE3W8v_+sEVavpJj14u?Zy005`c>6=(66aXZX$<1c-DHe-GQ522cqSbBv~W1gOLab<4+aBW*8_n-E|^KnO{a^oy5e`9KEe?Y3_*Xw0`znarDnWo9}d=LZ=_kdxTaU4C* z0{~su<2Vk(@Ub!7w#{)IS(XjMNRnip=cZ}0EMr+VilPUa+_vrK^Qr3^0Q$ZcMe&Sd zj4jK$w37{Wp69Q;gP-<&CtVdR>8HPKn;-};0_eJ?01EhrfG@Z6{5)89q7ncA002ov JPDHLkV1oDbmtX(@ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/baifenhao.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/baifenhao.png new file mode 100644 index 0000000000000000000000000000000000000000..624539c19693627bc2a55f333ef657a165abf1db GIT binary patch literal 690 zcmV;j0!{siP)r) zLRql#2T0A5#Kub27B=#$q~ynfl&sjv1}T!oSja{Su~W=$l%hn0g-J|t?qcdRVO-bO zt*@{9tj_bCch1w9^PcxT2mpZdlla5=Vf-5W!v+9=-EJ2Q21B7xzu#vITd&vAX!Mx_ zV8L#;Q>j$+IG@jFv)TKY4@@SL)9KXf^)xk`&04KiE|;SyDwD~k z(cp(qN{WHJc=pePE%uv{+J?REhGTrQU+N$?bp4R9R4@ou-< zolb|T*lf0RIt{)8@8Px%hXaBjOhqgf@ArF1$K!FY*DIAuUuMx`1BF6yb2h8hN+y#* zs?+I4qtQ!w%6j?;GM~>O_51yB91e$lJ|B1utOoITJdsF13Rhe%mjZzRybR8hIg7UG?q#wdOVp-=uD$gsZZbN~PV07*qoM6N<$g0&kr1ONa4 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/because.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/because.png new file mode 100644 index 0000000000000000000000000000000000000000..51070efc10f886dc762a36d25e73749c6655b905 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`Esb@24VQsJOFdm2Lp+YZy<*69L_vV{f<5;=CHK>gMXU#pIY&I<%DlX6 z^Tt`+9AZhDyVN_@Y|t#58Gru6k0$56l4`sfJyvc`JteK}Yfb`%9(%ethIkx*JJpb@#X!Kdmt~_6)1-T+qC0MQO7$ls9$>y% z&Bkrpx3|}iVJ%F>c~Q(oKXaR114n6)hTb{(g~0dw81 zMX#;AUY5qLnxnumYuU-qF`g5$3eTC|X6bU+SSS-4{(9oF%plQ&2R3SSwFsQv#Gx2s z`Pt@pAMU;MszVBPgn(^Ymn%`;=?KaUKZ`n=L=wVLN7ozw5u_*k=xEm$rd;>4{` Ts++YP=v@X+S3j3^P6`sfJyvc`ea4BW-~0j!C3?CzhIkx*du<~pgCPg&1(!TV?(h0B$71g|<}E3&-% zANC2PVeD4m%g@c{>dx=jrO_vd$@?2>^TBL2Cd2 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cap.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cap.png new file mode 100644 index 0000000000000000000000000000000000000000..59d6a754347ad2e7fb94068e40e71eade8447ce1 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`VLi{6D`J2`cRgJkLp+YZoun3nsm}xA(ojUTW(be0y8vJmsWmsX<=O8;vx(7AbHXEBv$N)Fu`N z#UqvT!k@A^1d0^OWHZHHS6rl)z`)QjC1}3q>(Gdc*(# literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cdot.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cdot.png new file mode 100644 index 0000000000000000000000000000000000000000..4f923c17780c032655a7aa14dc94f1a709565e07 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`9g{bq)lxvAC{Gv15Rc<;uWaN!V8G!Ls3)sz+_(KB)0zf}#y*`1$EIm0 z-Hm_H*y2!rI;Ee-y@7#|$)5S$zjurb4xx-G&o~~u3sqIBe&4*YPb@y$wPmI+qfIaq e3x~jucdUyvWKO+f6*~m9g~8L+&t;ucLK6UndpIuu literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/circ.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/circ.png new file mode 100644 index 0000000000000000000000000000000000000000..a27d47748e475c55a752c387bcb6a86bcf633a81 GIT binary patch literal 362 zcmV-w0hRuVP)b@ZYe^X>+)TkIM;n zAf*(%Qy<{X;s6fdfIk3yvX3@RgE3y$)p49Cik{qH-*-*Z;y6|m#j>obsvv}Y-!l;? zgH%;b)AYO3bsYd;S(e-EJ)kHG&-1Q+k|bdmJ^%=UpswqyKTVS;insCm4(54A2wi=I z(6((4lq7RrX0>v8S> zw_n)1a!Ip29*@`SwOA|$G@yrV+kNL| zv!OXX&pRHEgAx^RI-M}aNs{~zecu;FQI_Sd>j)ul=G|_WW!W@j^BH6O%`S#vSe7*npsH%yw%_C#08~|FNoD{BpvNCWf!T-W SXo&j&0000`sfJyvc`VWG6PE4P6{H#}V&Lp+YZy=KVg>L9@OAaW{)`otVp-P>7P^&Uv^J>=+H zFu~(XmCM4dih&m{%qVY64_DbW^Vj_U+RG%{IzBv=`0!D{;lOqWiMHI^S=uqz?|%Qw zYv6l%TW(Z>%<<1QFHf)teBdjPdA>_8_h_Navdn#qHTT!A^18cEhnwNXw%XYTeoqWy zI$(3Y%SV7EbCwp97K32-B8CQ=^Z!51DOPOR)tI@zD^cQ+Mcyp6E~RspO6y)nO-sH1 zJ#w0==c2fD{`+E@sj=5%uS>QiMotqr^m&hZch5g1CXNPqsrqkhi%g2Y0R70|>FVdQ I&MBb@0P?zewEzGB literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ddots.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ddots.png new file mode 100644 index 0000000000000000000000000000000000000000..c609835e5a42f761cd4139dfc7b6e93904c4a017 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`T{X7v)<8LiO`a}}As)xyPEq7Lq9EX!D17ef?T`W`J%F zr2g#K73sJsNqW{@hP3I=A3jb0$K&d9X)^oEGXgx0?vD5RC6d=Na?g40sj1qcv2;UI z64U!yzKyxj(^)z+T4p?#WXKY_V87e-c%jAfS!W;g3OLnmT9@4{7F+q&#p~tg@cX=x zUYrbbKF2l1+mxN&B$0e;%ZsjSR`r|SS2v5@Js|PgG$mU%IcL_gi;EN`nvDF7uFjb{ TPyG@*(De+Su6{1-oD!M`sfJr+J5EtUz3zefUvnmk<`Lp+YZoqCY>fC7iB_v5>wGL5`*4hG&iz?&j01EgF0 z0<_sDn>~&HY0uBc&~aj8@bit4Yz7UCAq|FZUYgI>D4*CgBT`yWaPIDFr_QY6sQGte zr{~)5abAoKoyV*FT@+iang6_z7YNLL8(aP0TD0R431y{KYz)=EK!(gKWfYCm?zPlD R$p&-{gQu&X%Q~loCIDMpOR)d| literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/downarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fe285ddba4ab2b6092b93113f114fb899d96f899 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`O}5Cd_wECQ?t8j8hIkx*drgtA*+7Kt!S#(Tx40adjtRP~Z*cl1Gl#*3 z@7)1Lfd>!xBy=Q1Ja`(H2v7Dlle(r8`RmQ=`Tl#ltvFx%R$3V~=4=z`W<{S1;1wQ0#jg!}MyG-0_W> zQl~d<%Vlmz=UzBvS>~;6Z%ur|^Am2DMNW&HCfUZwAd!6kd$YoeUFSaUIq&{pxw@xN z&&GAHdp3U7R0-MRb9v75NR1-#U&VnUUu*S61ep&Rl*EQ>G=-S|wfw*kr9Geb@{`H+ QK(8`*y85}Sb4q9e06V;Y9RL6T literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/eq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/eq.png new file mode 100644 index 0000000000000000000000000000000000000000..21820cadf2fc50656cc6abac4a4f3b6e0f357db3 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J5Wr673Gjf4K{+=$5As)w*|NQ@N&#cQR%-nl$1?yt5o+yK?g9#fNSoeQv zV&xXoi}AQH`sfJr+J5OF14r|BXPQ8c!F;5Rc<;uN>q(puoWzkWqD9Q0Cy-n1g{btmYSd?>LzM zF!Rj`Vh(S0KX4+M=a!^+E*~?G!2^~DZ0W0_ydtM{7+O8Q$Dr7vZrk+A<;ed3zT(y% znuf+Zl$9*g4VG?pzfzsQ_F;|S!G2!Gtzn_D-(KvsuVQDDNI1ZLfaT0a6>Ei~4y{0U OFnGH9xvX`sfJyvc`RRwil5j~*LdQTU}5Rc<;Cp&T-RuFKV8>G_Rkn;Reb;{JwuUPlA|GwkU zDq!4^pr62Nvh~8Xn{~&x&-kzK+$ZW>ugN^VAIt~#${m+jI%O)mQ%B{zcy^2DQ-Tf~ zhy=S_iE0*$!;dIW{9Hy6D_v zi)+{QD+^?foA~nD-uS+^`on96V>dE6{TW{GI`nzrl%jLeRTuj2FwSSRVbH$irf{7< R&J^f$22WQ%mvv4FO#q*mXkY*U literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/forall.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/forall.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a01c859c410ff2d669a4cd0c8c09283079ca79 GIT binary patch literal 444 zcmV;t0Ym>=`GcQ;WC&wtz9 z_y2yk?>oLz7-Qg-`T{T32k_4UuIo}tg((n1m&@f5fMFP681l1cSw<;^5Vl6Jc9mtx z4`7UWo)-iGCqUr0EGv#{sw_j`m;+b$u*G);a60f2wT>2yj6;oBAAu=9O? zx7(?z`e(h@>!oR0*EQcR2Aoc(!C-Ja9-E&3+7tz2-0$}>#)4bSBs3b0k|en=9i>!U zVHv=7yPeHuw=0LkLDzK|uN0s;Z&g*-PseehD0(Kqwrz}Y8}A8#+nQ`PoB4b$`|C_v z*RBqS!~32;0kB@L7mLODe3ra>jlSh4`*OL|Gz~(yTCF-f2&{`HlL-JI&+`t2?F1l% mjK||n7V)U~Jo+EN+W|i#$Gq!U0w@*$0000`sfJr+J56Y&Evoe@BxtDY{7As)xyPP@q4tRT>~^(8~!12%J}Jcl_9a}Eef927jj znb2I!>~?@xqS0=`j|(P?!X}wLtbY2bp7YMc)y^EDesZB{T?;t66f^_8cn@z__qx>C zqp_n!;M~rwW^4k`p+^MYZ((}E#tn} z&ayo3vGUjZ`J(5aqxKo2r_y85}Sb4q9e E07r^>Q~&?~ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gets.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gets.png new file mode 100644 index 0000000000000000000000000000000000000000..702b6da64d3590519fd342b1d443265210f123a3 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`b>*HSbupmO6Hgb%5Rc<;r`d8f8;CT-ze*Ad7c3X#f2di+Xxr#s_*rC~ zWT}XV>{lK>F21I2&vqwG-7u9}?~~h8e^uiw$2Y z@FZL!Idhg5D<7*`sfJr+J51I^UH!0$kzx1KJJAs)xyUW;CPL_vTpp=|0EMxkYV6Bzv1*smOXut4a5 zqpFW=Ps=-IPQ|-#=GpGuW0?Q<@}KxqsxOmoo0UGdxq9|;BVWk_e}(6Bit{E*Jl?hL zzreQjhtFJ#Vn}#4N#`^Z!?~TaYUID3_TC!e;x#FViQ#>%uOH)luTGC_Ti?s34$)G{ zYdDqOO$v61wmM&2DI(~?(lF(csl(0xi4q+vVx5Xr#4JS&u0yY*|)-eh*hw6b$s&40>Tvo4uZ_S?zopr0P@v`sfJr+J5eU1A(`Tv1JTRmMILp+YZy>^lFh=Ksig(o|h-l(X~;M>-+k;U3$jmk?0 z>l;E_nspUl9{A01C*P+-M&{i14-svQzvmQ(8?RqiBz2*I?T;LXqQ&!Xwfps-Y&I|! zjLddbiT4lxp?8df!J%g(SAmNQgMgrMIAdSVZ8P7=*Q#Q#YaN(=F^YLb(LtN@hYfU2 zf2v`>7Nzv*p8cK14vA!jDc7U93_e@*F}!>Gpmx`jDU-g(X_n@nsQn#kvVgIkp@w1M XN9T?obML+fdVs;x)z4*}Q$iB}2pef% literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/in.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/in.png new file mode 100644 index 0000000000000000000000000000000000000000..271d61905f992c930cbf76769743ffdf71b501dc GIT binary patch literal 368 zcmV-$0gwKPP)&V6rv>}Vy?LBE=PV#=c_0C?aa>15=4Y25#V87 z!7JeB>!awRDC)ZIx=s*&Z?>+h=XtU$^JWkP0U^Y3oU$xMQM@w)L}ZL9iqiMJrfDD7 z2+uGK!*yM}%84L~BE}eUa3Y|TR#n9#AP3uYo@Yua=ej+5|6?COkLL@1Y-66~((&7T}&wARKLDW&H(afFs- t*|x21+pg;{#!s76<K0w{pb`UNxk0gRWap-lh)002ovPDHLkV1i>Rpw0jQ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leftrightarrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leftrightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..989a47dc39a40d1cfceb4012d77213382f9eb980 GIT binary patch literal 448 zcmV;x0YCnUP)? zuHVD=oZ&r(!yzIR86FBwDJTX1UvRtK&gU})*zflY15#s}=5#ux0JU0ex7$$wh5!KK zIHmxO;|vCaF9ksmbh};p3DPtLfamj>Pe2HX;}`(0*DJCzpU<1kWJRaGT~FpG$Yl}g1hjMM4ld7h?ezo(yq#bPlUjQ~KF z<=5-Qaa@+NBjV%nI3ACpD6UqkR;$IRsjlmdMgub^3`0Q>T-VLfBFnNQNy@T4NfH1! z91gi_+Uay=vl&xRuh*B$=V`sfJr+J5L#e~F7#9GA_ItWGhIkx*JMAFvVFeyn&#R1^ICC7#8Ut@AC`+g*NE&$YmdTGeHpB8;# z>+UU?@@UTFpm)FHynfCUmtD))P~WAhpp^ag?zI?3hBdFHlGns?oJ(PF@OnAtG0)!r ze0scsyn=I%NNl}!EozzD7hkibC0PQ69S>Lpdkv#r2R6MHG+%Z4@%3ru&x5%Yw-{?K i&0m_DR~G!iT>cdQQjUO(u6;nSFnGH9xvXIP literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ll.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ll.png new file mode 100644 index 0000000000000000000000000000000000000000..d0cc99f3daaeaead992b145969645ce4d285359b GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J5J^p0b*H?i;pFLe1Lp+YZy>^keSwVm;;kIX9v-HD9EU#ELaOOPV*ua>_ zAZ@{vSD<{MU9Dx(m0MBwf5_|qs^@I)+&(3!JoVk(qnQrOQXixRoH!JxOiqpb$DDK9 z%y;ruF$SY+-)o=lRgvX3_SWpoh`s(?<(Ng^VgaRNJ3c3sFNw-6ONjLAGo zQpsLCg8d=&40DP*R!q?{R62D-^MC|1!_$XciVO`iFHe8@jo&>x)_2X;|BUlyKHsU6 znzr=H!LN0N-K&Dq#GIyte-oLIUmGfwEYs%bRr$?&g@lrp_ulU=A?sd=Oz>VUYw`S^ kZB6!mUEYiXUk@`sfJr+J5U4f$(TOR|3wtBiahIkx*do7TcS&@hB!R}P1f~FQP2KJ+jLJo%(GR$dU zR#9M-*>L@|9NV4Vl*k|Rz4w{5w(PyO>+G52*>hNR5*Y1yEuL?=_I8)mj5(hRWf&6H zzFk@WZF`KD;jtqUmd_Pi?j_sCE}7CI!0=$N{M;Rk74I#dcgzS{HT@IkhHFAjNj+cP zZV59q2qc|ic`mD`sfJyvc`ZMA^4bEX1?Vm)0PLp+YZy}FV2fB^@KgSFRb4V@!A>uyf)6v%cE+n~C9 zgNWw;x85-yS@*8Gbu#8{0Z`sfJr+J5Q?6Z(R}KJ$8a!PbLp+YZopzA-fC7i>(w7W<2iW=^Wc0CVTQnLmDqmPV zecQz=&cgpb3jeeIz~3;lb*|N+G|K~w_6&3QH{aXcvB&Mnoa>BdY^=`obaYtE(p)O> zIJfKUiYZPm!P@s0^+&5HZ4G0%adpwPSuO44SyTBk0`m9 UR12g#0o}sj>FVdQ&MBb@0BHtL=Kufz literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/neg.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/neg.png new file mode 100644 index 0000000000000000000000000000000000000000..164bfa842c13b5e45098b4c1d81ab2a7ec846d03 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`9X6FFtyw^!I!_nJ5Rc<;rx|h`P~c$*eWfpRXYQX~eV!jo^^e~@TBr1q zTPpg<%AKZd-6|~}E+XoIj|_AY7`Y=pa3B0C@?tM@!?juG++E)9Eq=Fo!L?aIL0KP< z&e^=x?3l;Y4a^KJ0v+tTZD$mJnxU7uRxog9WoVC~m*%kL S(g{G9FnGH9xvXHbFtq zrGtA%aW9CVIEten-2}V(GrDyX`b)%C5d<9^92^9}?tWm46x6}ILGXR>=+|o|&y=<| zIrrq|G#61yfh9O#jJG8)3}d(3g^5J*ii{9C9*>1Wfr$dgank8@nAHIQs4uqLZ7P+* zKS2lq073{Mq}goxuMoUN`~9BdzJzid*YEcwN$PgHr_-raDqXMF_zM0+u~=NKR+Q4i z;eavr4~|3dN-GROpsWN6RE1|{eB04+wF!i_MaY1(CKt++eQchz<4~CWx3I4JRT1KxLhuy(J09+ zQWQnk_19zaJ`hE5yUp>zg1R)s(wr%HfxokH3{beST84L!=_`ooXcDo(p-yT-Ma5$`1 yt8p5Tkcs5;`ORj-P(iEJigeHXw=a69-t-gplY1P!*rDkF0000KP)!g$-hCV%+~kEJ zgaDfQ0+jUt9>9IEr;a2^+P3{UavZ0ss%e^nAW)eAV;ls5D2j$*48w5VK&~nbLjXXU zrpLDH07A$-&j5h3ENKC@ZEKo_Wm#H)Z|S-oMbTdM12J_RC(rZiG4(vJuImHCvMiD$ z?Nyo6eK3yWG))JFs;Y{j$g=F>1Q0?9;ep}xdTE;W`Frr2695oGdsXJ<%Cv2JUDr5{ zsZ8LyuA(T%o+~j$2>HIx^E}45@B6!Nk*@21T4Y(aEUW9f|4hj|-ni9`y8f`sgLyHF@Z2mxTVT3-^F&*x^dIh{_2!{IYX)3m{0sMTseb?<>a z(ChU!n@x^48V%_MK@e`x?^Fu(J0v{PbCrw0GUkY z`9<4oHUJ1ASF=v1Q%Q$!?ZI$31mJSH7Fc002ovPDHLkV1oGe><0h< literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/plus.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7055190c44bfa7f28cd4ee6f59f8c92199efd112 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`ZJutiP-mdf3Qrfu5Rc<;r)}gssvyv2Tgbo}v80IitkX=#0%7rjmK>#~ zUcQ9MW(TjI_D)RfDhU5~=Y4s5yWEy*C(bNLDN8DTyxt#VdL_`+h&SKCa@OhJ25bw;AdNEzHFTb_e!9f89ZJ6 KT-G@yGywpN`sfJr+J56&YC{r$(Sqr>Bc!h{y4_(*k)9DDb%Sr!q|lV1K~i>2W}akAc0kfmLQh z{H9cu-w7wD-Fv?D&hHmX9lze&7$hy`&A?P4ec;U6t*s3b%EqVp?AQV(XU{6uTRKNZ zNomo=FZZ(7zIXb@`A39h!L_WOjo12~smLD#=YL)DX z4an#7O#g5=+#mLOz1jq@hs<#t)AxG4jYb1NtyZ(Ur%Y_QT(+tx91cgLQ2?9G=KT&N zNt(~+&wjJnOsCV6$pk<$nS8$kBFbbk56*Bn6a?Yt*5-1#H-}6_i^U?F%^r_OBHHiw zs;b6fvD4{fCg{2j!0-2WI-M6Qix=?icB?2#BodKjc`z6}C!Eh`P17VvN~Ka(m$;l? fg#&N^{{V0UkweYyYlbiy00000NkvXXu0mjfz`sfJr+J5b;Uf+*kGX05>FS$5Rc<;uln*bD+;haxT|%LQAmQFg*AbZH9~^@K|)~z zt4ss4iVwfQP+ka-{V0hVo79Edo*5uhV)G*RnFW zxVR`D*`#xyIl4W$Cn`Jp?ZdY&CZDID1e*Paxq!WmRpH^?&oe#)-OJ$V>gTe~DWM4f D{FYf# literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/simeq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/simeq.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4b64b65c6a1e93dea9b3d3f317f0676fdcbbef GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJr+J5Gwx^E+ouABE_u2*hIkx*JM|)Ovw}d|#+TMP4{{ZhEt;fHux)BweTO4& zfpmj#hwuxw>+HhGS=DB~IYEd2AFDr5E;GTq!(-0M*%pz40*rzMtOx!UuqpLDUNJ@M zbdcs(5ne?OMTQ5bg(Z>&CU(pzj(WW;^V^SRmX~{PZCkr4OP25Ogw&Z^%VsTG>%7Lo zA@=&~xaeT7%pT1yCEwuZGW;Gh>K^R99`*jO0Fx4v!@TD{U&U4H?-%Syw>n>Z|NEaR z&8Mf0>R3M9D~~Ooq0I2+|MAv$3QS50Omz$u3^JMbrm+OfHUavM!PC{xWt~$(696`5 BbM62D literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/surd.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/surd.png new file mode 100644 index 0000000000000000000000000000000000000000..9ddfd4db77f349593e7d2eee602b0f83acfa7fcf GIT binary patch literal 477 zcmV<30V4j1P)FI=HlxL{(WP8BqY3O5`3e#!W;Z{Akwzf90dqD8Z1)Xr21Wi}!n?gEo^#-L z4)>hr(xa53OZ!2`_NM@nB>BGI72te6XIVBLkKY57kxeEO*L6SrYyj8mwcqdOhS&h6 z)2ZV)T>(7L<2deHlmS3dl*8fB6(9(L;z>dK@@?BLNa(fEqBxEPK`4Ght3_L{*QRL} z=QQsiilX6gSo(NT2dmZUd4{>R-EJ+*Dla7WWFC))BuM~tUC&KO(-c6GB&Ac31GwF8 z%jNRbdzz-7IfM{GNR=@w8dE|DfX!y}=1-F38@L|ee!u5_#@%jb7)HfKDOt3|VgcZ7 zl>mfc$OiD7qQPMB@|dQnX`sfJr+J5ZNAK0eKw#_xu=U`h{y4_*Bp5dDDbdeI4|;mLFK^&1y0t81DvHF%4alw zy}+{VUv;IYH&>&IPVqqtK8p{Q4lY&itr}-tiDK+Ayf^(%E}LaK!%~rGg<};(-9cX4 z4qRS3IlT217b8dY-jl`WuFdMm+0tEdAj-Sc>g0p}O6)QRc#YY$pGTcuWdU>ogQu&X J%Q~loCIE)!NYnrT literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/therefore.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/therefore.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd47cf7f8c60d97f3fdeb2ee00d85886a46dc76 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`Esm)P3#5TUb39!fLp+YZonp(yqR7+w_@1{--}DbAWpU0T2anyl7M3!@ zjhlP>hIupRGK!a-T+Q_J=Om^69>avCaT_8y91d(}>@jrem{KI_kj=|*?UuCd`sfJr+J5P0@>XEg3+eDV{ElAs)xyP6^~aYQW)oddd~fpaoo63;hl_>OScCzI%_Z z`sfJyvc`4Xq-x=31c88&4O<5Rc<;r!C}aaS&*mo9q~HLH&l#4VL?dw)j8bj;P_^ z?bf`0p|1f4+vI~PYLh!E^<-q)S3IbkocDjnXJdKm!*6sH7CEhKchcdU&|uF{G0)sr zSn+_#S)J48WGehaLtpNyOWMKh;BtH0WEDl0JyjRB>54K4?p~MN^Y$LI+4)idmek0) zi*HjSf9*5pQ9fUMz4ZR`=mQ2kk1gWPu3MEQ(dK)3Nv2lI51x&^Q;W}8?&lJ4VmM%P z-um_HI_5_fWirn-xW0$0F|2vLDpTsDihJOb-~R%?$xk`4Y0V-H4)vYuUKcZ;$nR$H dV6c6_dAa|<+$Y(Y=0JZlc)I$ztaD0e0swwefcF3Z literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/uparrow.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..0c619451ae4cf406ac66c39ca6662f3cfd395802 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyvc`4bBUJpZI}7_dQ)4Lp+YZy|$6F#XyAZ!Sm2-T{qGh9VhT4WD5rrFqjuG zl@~BuYaa}15eYkJ%2LXx{dt{*#X6HY4=ql_v&qHFy%$VURC;lS+2lBbIrH<%cfZ#O zzWBXwUG`S70M*P{Y>o>;7BQ@O{cG1{6W=I?>!sa`7EEC}uq`*}ly>O!v<*7lk1aw& zj~4oHNVXmPUaNS7*Z9F4<6{g9a-&^xW~rSocA4}1=C)j~%4bz)Fw>c3_7?DH%HAL=!w^Lqik O%HZkh=d#Wzp$Pz_=650h literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/varnothing.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/varnothing.png new file mode 100644 index 0000000000000000000000000000000000000000..ea1b6c1d9e5035dee7006127814bf632eb5bd878 GIT binary patch literal 584 zcmV-O0=NB%P)k+iJA{ARG>NyWJN7@pznNSwpK(C=di8Nz!Vy za=Bcu0AyJ`sfJyvc`UBP``^JIWRD?MEtLp+YZovg@rL_xr{-IjgXJZ;6_1 z)X;Hy6N5ufp^Tu7iCB%e6vMjLN+KMJOQxK&6gpTa^Or+$f{vu%+O4;@*`7b_oP6+n zQ_!gx_vKkp*>6wmd;j>#5%%x3-<6;Hn3}xbYq)IdF`yFnd*%vn!!)8VYzI1;!PC{x JWt~$(699L?U&a6c literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gneqq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gneqq.png new file mode 100644 index 0000000000000000000000000000000000000000..b299d23031ec9249af036beb8a18214c36b3fb28 GIT binary patch literal 408 zcmV;J0cZY+P)ftSgSQDnztvzhZ`fSfP)4@sPJaHqcDW_y;sgZ&JUDtW*h*5x3Yav8Y6me7LoclhW z^L1T~F^sX@Edbcvx^`9U%36zvAz>xQzszZxwrzV|FUyjMq?7=FhzAZQDH_M|H8XA7 zR#j!K)mj5Unx>rd_oT>LE2TUguE;rva6hksF(ye8|6SKL=bVUsocUD^rfKr+*fb3h zF~)q}pCyDiYSxf2l~PwTbFBu$Fht+#$>-_#{{asr{FRnF)4Hkv0000bh>1Kaf%)V&C_d%jNNSv@pav008IQ7!yK>Yd}^-0|2FT97jal zg&@H>Cxob^X(7mIq?F$Kg|K#+_I-akok9q=+iim;=LjJfV<@Fs>tfH>5g?*5hI0-8 z8#fsd$8n^T)~Bu|NU4Po&bfwq76`1h&8ZU(Z3}0f=Om=ftl|fR5S7DRI|sSbP1D2} zV~lNMb^wsPnlWarjWKf0bNM^x7MetA{2*1sT1zRFQfjU9nDhC(;1&e}rBwd0i1=O- z>BM`llv>D8*l1nX<-6>9y#m1fem@?MQc6OI_x@L2louBfIp^1=xXhfE{25&;eS3`(d)#>`PF1Yxc+cWym;Zn5zTXzVC3SKHz3O zfCmuJx~^^8GRB;9e++QWwQXAz1*OzE#~2Gm?=iC0A|jh-Hciv( z5bgWEu50hT)*1jPrJ;Ej+nGGiuTQ!-4-&GUdoa&)mSx9t(=?1RMEn)=mIuqStm_H@ zUDqKZA>`=$PjSu(A#ZsgrHt)NoCo7LCjXDwb2t5Wz!$^%oE}^G<{bb4002ovPDHLk FV1kg^t9bwb literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lnsim.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lnsim.png new file mode 100644 index 0000000000000000000000000000000000000000..1365188a04e6085031a6046ccf2e296cf6d7aa3e GIT binary patch literal 447 zcmV;w0YLtVP)T_tJ0KlE2e<=rK(Z{Ygb9idE9IX!jOJN0pN|hQM%Yt7 zu(Q5^eF4)n-S78}qF5y&YTH&y>72_~LPcvt9EM@D^?QI2!u5JZM5R;+q5OlOy!GvN zd#m*}AcSzaTo93nVy$v6^4@E$&*!rcqTXtSTkZS4aI2L|HpXzy`@XlIZaj)G0^r)g-dkH@1BLMgSb8HOQ$Gjf2g>((FZoC5$M z#IgWuZP#`A8T@9Z*ECI2ylzWUZa1seT9R;X3CKaXBlch^WL%r8bpP pmd8U4fOB5=9@Iz0_s8qs0A4T3#DZWY`Az@;002ovPDHLkV1jZuz|8;v literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nbdash-1.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nbdash-1.png new file mode 100644 index 0000000000000000000000000000000000000000..07cce702f4abfb4d7d235f5e19449aea32fa5672 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyro$9jSed@%lia1D-C9As)xyUfsyq;vm3!VgKuy(p*`rVH+3D{Mn=`DUqSr z#`dhMQQ_DrvjoOh5r^&`)RVdMr>27Eb0Ul2!BiEQc1AXdAI1rhVhpc$F)1v{z1{bC z1Lv1o{soy*N=C;*LPc2)-d=hAd4m8`!}H4D`^sa(r!Ac<-Sar&dg;99$7cNAmz&3s zFl(7c*Cw6W&wuV(XTY;`%C&|>iAyHEk0Ufw_q*oaR`Xmm#p?WJPv6@6*Q1yiwBxV0Gg&f z9*@;(b-7%%TJ2h3x7$ml(&agkNC*SuaybBi!C68;wQ*fL5!8VOX=-WLfrbIB*;{olbo|9{|AX^+E_aj>B=h(P&)s9*-v$iwOWY z9FBZGf4yEVm(^-D03Z|!5d^VbuZP2-&*wu?RDcIO&&y=8dkGA~q*AG`ZKBufCzHuN zJ#upvb-P`g&33Qx+-^65An|ydWm%n0N0Q`EwrRiL7nCI!;B-2x)#|$dg+f8A)e1_v z?Ljh`tW+u}ihivmhGCP*M4?dNIR01G@puddgPBa``cpRm5W>-D#4rqkAfJmEhUId( z`Fx&Er}z8)b&5)*A_(GnlNp8q0L*5y^ZEP(CAtoZqLfNyy^kNB7?!;;(=H!UaeM}&4wU|)9G|`m*?}DB*|X{O4w_6;?Tdmg9htfX)*=+XX_q?DA>jen(LjGvva0qYUA zwknFEX`0PJs}Vu~z$*t)6lGcVzWyA5F?Lw^?f|6}0JLp;>Q3LbG)~jBah7F?F}~mL z!!X#2K8m7E4y;v_=lQc|o@ZkWA!Mhe0HChxZSsF{D!At$P187z-Fp5QAcWYT_+Efh zQ^5tm7z@MDXJ_mI#&JXl2_bv{2TPwZ_H(G6GT)v2`SJP(fCqT_R+JdNI;sEw002ov JPDHLkV1i~lt1$oo literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nequiv.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nequiv.png new file mode 100644 index 0000000000000000000000000000000000000000..83427dc84ec60897226f5ac9be13a5a6a0f8086c GIT binary patch literal 463 zcmV;=0WkiFP)kWEXysH4$8oBoKM+~lL5mpNs^!ey0@umniNHG9EW~ox9EDk(lqV5F7n0K0q{I; zxm-2_)B)gmJ`BSlfVK>>EE5D_u~-awc|fo0|F`Mr`UWU0;BEe#z{&ss002ovPDHLk FV1kSX%k=;N literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nexists.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nexists.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e3e583c6d81cdb274f5d83ad06160c578d37e7 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyroWS<4%Lr*8ua-SKpB4DmSrcG^bX76Tqv#=8tTLS`H@8w49XB{~H?)DB3i z%w))apq-&H;ap!q@uTp}HPhecyRYnAaVaEN^EK<9hG@m4``^157#=WdC7qBcj<)W5 zeEwEj<U6>1JxAV7q-9lo_0u%QqB{?|O?+7;W4L&C+ zD0tCQUHOB1hD2NKeNPR>0}{?frc(MDiQP#(tbDJ&zy9&RLBDaSjDC6YM^Hd9c)I$z JtaD0e0sxn-bV2|C literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngeq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngeq.png new file mode 100644 index 0000000000000000000000000000000000000000..d3385e4cd6dce61f029f9b76541095347ec01231 GIT binary patch literal 526 zcmV+p0`dKcP)1r|V7XjjJ07=i zx%ZzAoagZ4c|QRFp#0Pa<+J`cK+`lI0rUBMGMTvB0jZM7D+EN{8w0jcDo%4 zh05h}x7&R+XHJ0o{a&xvW3kwDIt74KDrH%gmw@y6yjUzAXTvZGg#y7$#LYpqTE!eb zKNP@R`jJTFbUG2tT_=ET+s$SZA*Ad2cDpT=O3yY7!?ap02Y^!_AcQKFN;n+OX0xiQ z+P3{{L(}xTeXw4y6-6OleC~jJK5rNXF~EIg%CekDB#8e8xK;H3v-`z>FJew|?N;%r QO#lD@07*qoM6N<$f{>u-1^@s6 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngtr.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngtr.png new file mode 100644 index 0000000000000000000000000000000000000000..033a1d168126cf8e29d8b725a10ba0434d57e7ef GIT binary patch literal 432 zcmV;h0Z;ykP)1&`N`Rjh~?74fF1x_(W92tK&IDUX* z0guOH9LGdb+!{nwRh9RCJ#Bjj)>~~!UKnSr9z!+nUd97a8b<;HW`+c7wbIyr~h^)19>6|f~GM~)b z?FQg{KF>R>wH88T-B~&EopW=tQYwD~vMlo6YpnrDDZee9066Eg){L=vjo)vi%=rH{ zou=t}y>iZ{X_^O6Rn^9KBWY2I{PYZzQmblB#%~55tf~na08Kc*Gdz z^ZEP!vUgw@hU>bfX^NtlC}swnPA33BtyWtumo$0?z$NggpkEzq3e1!fG`XZLb|TsZny76MNxtv$jpJ~d7>z) zs=D9r??|5KSwjI6gS^>nEX#rravY~=TC3H95HfTPQ#$MQy61UJ4rn`hwOS1ZgZX?u znM^RowrywZpjxd)QFMQfqNv;LmdoYwc$`fi1VNxE%Hz7@IN1OU!|;7S-Q0yVhkmJ4 zx?Zp8PL8L5IF5V09zy7FIP7-2X0!RIDHIC*e*b5{=d%|Gp?14nEEXk6@_j#!<3~*{ zmwPouDTWW*Pi{0Ctiy+`(K?+D$8oP*Tc}d>f3y4DfG?DvE5W^y-znE zcQVB(V7XkjS}j2kc%B~)htAhz19&_h>-D-=EOH#TSS(JbQ!<%!W!efbnM`7_SgBMx z9*^&cD2n6pI2eGYX#k+A>Q4kAl*{GZUO6iV`~6-N#Y`qM8jT1c<#KsCodyYb>w3LP zk^}%0MLnO--~n&dYPC+M0|4D_*A>9N&??|uLV;Dx3<-_6NcZ=rpc{ZE`sfJyroWY3qcQfigg$DV{ElAs)xyPCLlUqR8Po^X#3i!ny~AbQ*;;faF2HB`nqx z`R*JxYcT$}f%8Alo|ga4JFZ0)1j$?IF#nNG=n3?)eH>tF4Rg zRreUS7(5TzmUH}yp1YMV0tI~4qxDjP7ae2z5*kERm l##XUb|Nh*jmsLkvHv&Z&JYD@<);T3K0RS6#SCRk# literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/notin.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/notin.png new file mode 100644 index 0000000000000000000000000000000000000000..d0012918e033082e4f727ec48169322da7fa3c5c GIT binary patch literal 383 zcmV-_0f7FAP)LJ!9a@F2i( z9Nzl}0mgCMw(UAEwT2L)B(1Rn?>%FzD7CG8DdoDZC7IvlRXgXFWjTrU-tYTP2$|>k zh7MwkN+}_PF(!myj2VWZuvb*br`Eb*K1Bdp>woo9O3T^02B4IN5PqLk^GPY;OS{Gx zkK>qA4FCXu5CQ-x`sfJyroW8KK;$`0YTUIi4<#As)xyPTS3UK!L}F_Y_0V0W||A=?7;cS_35-c|F<# zx)SX478OjD{(W$6tH4r`2UA$mWDhK7IJYxO`B9z2xt-TEmriC3G<0)gP%1k-LHqLB zt$$0kQY4eJco`H~ysq;csJ?&bp6c^C4{s^0dS5KLW#47pMND%0^3Nq)`M!}SttP)@ xqul(G=BY31tJh5p+IlTYc=wT?H)RiO$`du|*rD3xxee$}22WQ%mvv4FO#mqxT?POE literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nprec.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nprec.png new file mode 100644 index 0000000000000000000000000000000000000000..a929e3b024b53f8a690da1c901403673d44d83ae GIT binary patch literal 353 zcmV-n0iOPeP)>msc^zF!N=XQDWaa0kzO^=lP`SZgUkH&>s@!1HpXXUh*)&bf1~Ep?IT3m9 zi~2+aXK&MS9033kIp@~ef<9wk#c8bTx_$T|gc##649>Z>ZR;Gg{cx6L0RRBVIUlWj zYWiK*5z#bFecvmkiW@*gCjeS&@BQ}Zz2}@48SJe7KF&FFfyhn(`liQ=^ z;eWe-{_x|Rd+y;<7-RUPzTm?u00p1``~?ulvEw+oi-3B2Rmie@yWI|lLrxCAC0*AU zhKb`iH~Aaja=A#7)a&&GK`>48<*(Q4YPEVkpVQ&lY(@q+9*>z?MNzz7ub$^sDwXYa zn-2TF-)^@F06`D{K&@6o2-&v1-|q*50RS|cO_pUhn@uLaSS&`P5dlC|)mE#OBuUyt z2mwH;RMIpp48xbd+wA~gxm*$eI-QPT7#UL(MMY7@<1qj<8jWtZJDE&)o(F*8a7b{; zNs`p-^^7^4PC1T?q6lL=pU)YF`5AMH>i7Hi`~C5F5LDp%e)_mtt;*$cx-CHv*tU%j za$PsmNrEx`mStH0a5|mddoekHD2iyB&I~1ysNz>q01CiA06YOE7(F=js&pp+0000< KMNUMnLSTZxy~b?- literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsubseteq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsubseteq.png new file mode 100644 index 0000000000000000000000000000000000000000..9e530e2767f3d70ea8ca7dbf8c2324b50852367f GIT binary patch literal 401 zcmV;C0dD?@P)Ih zI=SrzH;=M15B5{&C1jZOCdY(==HPq(+6cmNE7;J^|pEUyPAS-8E6P(pk_b@5`soRX8=aP9JXp}FEb!BR_(!m1?sXle8Yrctl<|EbOU^mQSjx^w1kV^#@uLw`Rpp$^#*atPb)8ZwA3x;|gb+%p zJp6bBgb=N@wU%?fEQ|MEN_hgGkRowhBcj%Np67kv0RRAgm-@b^ls-H7eS)PZj^kjA zm1UX!iX<6GDYtC{fU2sDF&`ck08rPpF$NLGaXj7euWMkMrePRD2-aF5L`Ki2Hd@=Z z>$+wbL{ii=4W$$j5%F*3d@Myj%EphU=$-7R8oYxaLMZN!*KP3s4Ib>;D&rq+_@@8> N002ovPDHLkV1gE7j^zLV literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsupseteq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsupseteq.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1866b401e2fa89deb23d995a79a4f8e04cc3f5 GIT binary patch literal 400 zcmV;B0dM|^P)~0003mNklR*i1nEGn06IV`zz(njv;y~FK4LtG61{xcIq}R(24>!m?`2tDPvY}>7(aq% z2`Hrx5;RT27z^huu>b&TZ7?l4re}=J^St|*Wm)=%`(I$Kl~Q7iDW%T2V1A55&N)Je zlo9}f95Dn{Rn>L99?G)3pMVhJFHQ(KPQF~GN-0VyLTC-sG#!TFAU}yHe<6eq5kk{6 z-Bv}`S^(I|b*Dr^h@vQb*mYfaT3of)pN%mX<6tu<5yNL3$F^;?)=H^hGrx~lCS%Nd z*!MjEtj03Nwp!gFkuipI9?>*s2{`9k>!%2ua~R{esea0XaU2mszI%5|ZQFN|9&Crt uReY`vpUVhdAyX zfCunNob!2}gG}9Vt?P<04m3WKft0eY>rm?x8DNapbyZ3+#;mp9jbA6iPt&w4%Ph;B za{!R%`DI0xQjX)8W!W@MQc6OI*X0%dv=9OzL1DwvFRR2mt`CH6i3cdA%9z z&CVFpS|>>Y002-F#l?dbMbUl`LL3d>1K^x%t>ZW@ieeZBt@XtKgiw+sZQB}SthL*= zbzKJlx9lQgj4=jd%ouB$<^U#Sbf;&_nV)3<%&e4h&H;dk zAmU~WnE7-%A!65c%&fIu&wqn~_x^sr9}b6ko{4DX)^9WL-fOLy`F6WG=c=m8JpDDm zaJS)(l#ay%ZtD{`ry%>XW!3o}pCq_w_YuOS3P%-1LD4FF()Nh!5$ ztCWf{Ztq0^Fbo3#7-O2IIiJt#{Z-Nji#=FtLkM+UTWkBie?Fg^nO)a)<2e5OGLEA$ z=J9x}{8hbWp9Q9yD-jVjO;ci9nHMp}Ow&}rK&`JW)>;vXF^b4V~wH898^O7ZS&b8Km95wsn$A#(6+7jK1Zrt4eGjdl|Uo`8w5<(bb z&*zhKP6)Z+i4J)0kBCwVV=RRDp!Vr89mnx~IuSyNi*l-iW4V-4l+s}sl9T#4yIcq% z0OLYr#tEdT%j07*qoM6N<$g0dp1 Ae*gdg literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglerighteq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglerighteq.png new file mode 100644 index 0000000000000000000000000000000000000000..abff3af7dcdb933014f0be241e50dba2a5827422 GIT binary patch literal 440 zcmV;p0Z0CcP)0pTdL}{Fb=F$W`8?12 zspAL`vG4n7ng9R*4j*tt4-ipnEu|!cZ0d(+52_%`GD66*EZf*nO2ug!J3eD4ZiG#Z zF;dECQ-|Lr&-1|X@Ds`5+M<*K07L`;&iSL_9(6tm+>6F>M8vwTuaYR_cYMCdh)5}o ivVXKh@5SpM6MO;Y0yxP?(3jc(0000mSa<%**=I-Z|%-J8)0BqB)_i>u#xm_r9vCmwrC1H`uJG)=~s82c-2s;YHew{3f+ zA7V0KW)azZXs0@H5D`S2qyHWtB1A+)2csehKtv+49yRN^6sbr4wq!sC+z)sIHCj2* TtT@y?00000NkvXXu0mjfq*8p> literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-2.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4079f6fba03da755909ea184176debbd6bfe8b31 GIT binary patch literal 342 zcmV-c0jd6pP)Nklfpnl9pp|F`Qi2_z6)+{x0dz3;KytZ<+g;X^mks~ZWM;w_X8r^UBD$s2{gzl6 zkO7|p7>40dX&guI{eJ=0+DG83su*KQMzkzTxWV(buXCp>rS^T_w(VtSEZ{hfpV)gp zO_Ne8Bsu370JPR2Ktx28QW|4I1^}L|fg;2?4}o(I0E{sdtv3M9xw@{k*7S~wm`sfJyroWS*;l7YZ*YH&z>%hAs)xyPP@q4tRT?VzwG^{gGV__mpPqc?Ny)fM`@|AkrJ+3k?$I1|Mk{)$cfG_%bEeTJylN53txIe&ZG zU#a|hPY%Pa_RqDKP6^U}*zWbjEaduERk@6{OQ*cP$@pNOdH(g%ysJGM4R~VByOhrT zw6xBc<>n>H!l+~y_v-gQlgW=Q)~z~~ca86WMIXZk?cH0;RrG) j-t{xTo4w+|*9LVBw+*u#?r`4#dY{45)z4*}Q$iB}gg1dH literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4fb1f2e91b0d3c523f84f4e909e1f85fea3cd2 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyro$Ey==5D}izh2RvOILp+YZy}FUJ#X*4e!v5DYrMa?L!!|CQ`Ljt?QX)gK zjqO=iqr$OMW(kb1A`aa>s3&vhPfZ2S=R_94gQ+Sq?Tl;^Ka3M1#TZ`iVp3R?d%N%P z2F@?F{0lOrl#Gsrgo?5pyuI@J^9BK?hUb;P_m#(nPg^=!y617k_0oCIkIneKFE@`N zVb(H@u1z|#pa0yo&VXm>lxq!%5|>PRA4h1W?sv_-t>(FCiq-kcp1!sBuSYR!bUo5` i_~4(`z{pm|P{H8Du;cxLd34?Qpk^pw)g(?`D}K3?~O6m zT0|rw&Uwm3A1O6-&N=72_sg<0O(UgD{QD7$rfHH=3L&)CDg1+7G|#gTf{1bntPnz2 zYjd?J0JLqJH_1)Yc<`sfJyroW9)$P#?|c7n!J~$K@0VwC?d+;(=y2j#Te^>P{?8yUB`(&kP7$h^EVl$$sE_ezsz5Asa&q-9QjN^rG3|;u8T78RR*ZGHFn(EcJ{>UMiIl}>!t3| gQStV>xdYb7n}+AK1}qfa3iLgLr>mdKI;Vst058{sX#fBK literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/succnsim.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/succnsim.png new file mode 100644 index 0000000000000000000000000000000000000000..7eafb5bd473d4db551059509427c895ec984db19 GIT binary patch literal 465 zcmV;?0WSWDP)65N5*f!u-Afz*KropGTZ@c}ao$qOu=Apj!YZnsq<^vUYFj#AonU7uSp+hL61oM&UelBNMeYn=g8EZk&7 z)LLt;4~K&gf)FC59Bxrc8DqaaxVv7jO91x!{qcBwymu0DxiZTAN1~EoTskL@1kvZqy`)r%eELsRb2$7bhRD$VJ`{Cxie1 zizdrswk*qqc3K+Oh&YW{##myx-kU%vMF;@^#+Wf?@YOUkthEUf&j46!M>dQxlu{{W z(=^kb%jJ^r@eDv!Rnw1+F#>>;aumROUsYA&4c}=32_XYNLusv*Qf=FwPNyO4y!Xzz zd<~}L#uz#0<8{+COQPuwo1V|-j6{OByq~c##pmew{{emg&fMTr9Krp*00000NkvXX Hu0mjf)11jg literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/supsetneq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/supsetneq.png new file mode 100644 index 0000000000000000000000000000000000000000..b43f091926deaaf19d55f0a596f49a512a1c6a61 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJyroW0TsT`Rwba&OHUWa5Rc<;!w&McCuk1}U4YH%oIVRXsiOd#Ysr0p$sO{y(BPHm-a9On~9mw%l21 z{SJjC7X$Xc=9ZP%RQ*z1Mo)@}_fstK)l|G!t%spW8SUFe;SzKjfl z-#7J3DJ%`~di&fxYRkujdFjV)yf0upV8C-d_AHB`l3iLFCr>mdKI;Vst0I(l`761SM literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/a.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/a.png new file mode 100644 index 0000000000000000000000000000000000000000..9da4fafe5aeab01be22acaaf52aa64c6229129c0 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrWM(ab9FKh-1o%3{Y4DmSrcA6vaVFMo5%b5&k7PKXBGzPGRN=h_oia2r| z6yRCN!?ZAQf~?ll4ZcxUTc_*(7x?+$$4UE*lk}dyS$E}Z>>9R=2DTsS2X?Jnm6dj8 zPLP$u3DGXYHUY0Y-~VpQ-RT!9JL9I!`RbmIj*PVQs3&{nkAFP5(d)ooHBQ0yL;*nt zg+)UFO0~il5-+1`v=qe8TD4@?6JYD@<);T3K0RRW(b*BIT literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/b.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/b.png new file mode 100644 index 0000000000000000000000000000000000000000..c14fe4f1dac6ab7d710dc32043867d2824a980b0 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrWCb2b%_gR5Lhdf;zLp+YZy>^hdML~cy;BF3Mi9(qJdjfme0@VO6)c_`0 z2liWyHx9l}`1T;R|M9VtaX-{O8r)|%yy#pp`OIozKW3>5415OXKb!a}vS=zSb#Y;c z;%)i#j9+(Y%v6RA>$J`sfJysrWCSBPqGew}#Ax{^_5Rc<;ryk@ztia8waR8-OJJyD*l~G#R5oLSAsa(fc2?w4 zPYyvRi)%|ol6f{xNV&L4C&)`PHT&s{XGYz7zIWVka>?0{t;59dJjPaalIxt$bBd2= zcXb#Zdw$0I$68lS)pM1aOH;3vsz#Xzx~KIN-Zoo$#pb-G>e{a#74BvI%20d%+t22^ jO2VII%mxhgTonvAs~zqw)>2mm`i8;N)z4*}Q$iB}Ym;Vt literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/d.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/d.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9a95d8df8530ebcb7a5893e59960da4a457e46 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrWX0{b)|0w{4E_=E-hIkx*J8dIxvjdN-@1(Xq-Vbd1CSA%oz>#xk>Xa=d z=1j^5*m4+r7<8{L?GSOzOj24Svh)7kll#l9H2#t+gBTg}cFKcA!2 z(DAG?EGKZ1N`3MtU%6LvoR8$*e)88cz%g>#F^M$2E+)a>`|O1;nD8=4B+I$Gq&zcb zjJ!gDdQX^xp7s}|L zHtJJm*pj>Z{qOY8e+AdR{`sfJysrWX8AMA!X5yHu6epRhIkx*JM|!Mi-Le_;^y+@EY=BD24xAHKs2R6^#)_v z0@()i;jJu>Cv3^k&YF?K2tljpZfg7KfF;T9_BcDB{5Qhxq~LI&V$i%SX;A zIl07MU)aKoPbfsfe4 zLYdp!R2Svm{Md5>s;*3wtbsLy|I3D0Gv|hZ@X2--`sfJysrWW|IV|^$UPPQ$1ZALp+YZo#x2PqR8WFKU*|FbE*N~h6Z6RM)n6R1r5v- z8koOrJIWbQew$g_mZYt1RsVeGa9|@>2*V!##%obtogEAvC(erY7|tnHWJ$Z1 zdd;)w+_hWEPu4UAojQ2?|K*g;|6{v7)`}h|jb+&L-JE-0@@8Y3T_?4EOtgG1xncho qL$@?FCBc__^Ml;pD~YaPkiYZlHi!THnyWwuGI+ZBxvX;899xK8dg9!>9z6 zpb|9AxBO@bfti`vT1!Mk1OU#to3tXsFbwOumQr%gN~xT4&N-!YnX7DiSY=?t!&7#(3Rf=55>B zw!O`j+BAf4+7ti~k(r%yTI;tF)DNc;RDu`q0}6#|8F&p06951J07*qoM6N<$g4276 AVgLXD literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/h.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/h.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3c006d3324d8d6e96bde3eb5431e84a6b9be44 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrW7WwAq2h@Q=Q#@T9Lp+YZz2?ZvqR7JJI;&C~x~`78wNZmlklin;%s1L!^mPgg&ebxsLQ06k7t6951J literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/i.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/i.png new file mode 100644 index 0000000000000000000000000000000000000000..58e2a69325c503ece628a44281d8f3f31322f4ce GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrW77Mkvr9MERd`}n05Rc<;uLSZQP~c$+n9=lzgl`D)gYJe^R!nE+1kEazdvhbP>b+7?z1_bx-BH;~rx>;= zD=3|LQ=z1ENS(PNNOWtM(kaXJTLVNH81}H=*xqm{>%;M2H=xxFp00i_>zopr0Ky|f AU;qFB literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/j.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/j.png new file mode 100644 index 0000000000000000000000000000000000000000..592148aa81b4deca5fe1021338f129399c805f1d GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrWR>|V|A;CbQMo$;V5Rc<;uQ&?2C~~kR++Z>LxITe-afXuijRRaR3mVN5 z-dA6m`TVKwf5~UF8yU@vcg^IF?PKQq UbK9q_K*un6y85}Sb4q9e0LaEnUH||9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/k.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/k.png new file mode 100644 index 0000000000000000000000000000000000000000..e2daf2e56154174a51fef2078d029b1093729bab GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^@<6P}!2~4N?RmZ#NO2Z;L>4nJa0`PlBg3pY5H=O_Is>6+^l-1l|IG*h0b`oIEHu}e>=@lu*HDKb+>i3x{%gFz9^Xo4IT#=JytLm zILIh0oERX|(EO&+`gZEA=>MA2|9?`SdGd*>(yAHvRxQ!md#U@v?seI>uT{sl__-(* z%}bwKtye2oF)j7x_gKx;wWa4$&#l|ar}(9|zQ1mg?J`sfJysrWHugn(tv&;V!aQ9ZLp+YZy=ExLV94Qe@rj56E4M|5vd#krZjZwU=e6EB zbMfu_nc+Ey**2(EUn^kY5ct6|r}&JH(z1qCOc(CnX<%Sv+TZ^APOM9asqy>uX8)C# bSgvt9pUbqBF^RGQ+Q8uH>gTe~DWM4f3~V^U literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/m.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/m.png new file mode 100644 index 0000000000000000000000000000000000000000..9f020cc1b7d489578334cee644e972473ff7ab32 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrWHu;Sg7cB(}?e}zX4DmSrcIrXi!wNjEb5}7}Os;6jad11qmdJeLfbs-i zCp8Y~7QquN?;49cuV}3b`FVfdgg+`j#O8J!m|J<^Y+xf-$OrzW^v7qa_vcC*Gdp;# zoWjI#?be*)9zg~#&1<)~n@ui%w>5tMJMN;y;WLUYUFUXI&buwFw~j-w_?%0~#ExmH zGncJ=WWb}jH2*$>p!5pUzk46poIjuaYL2su(yF~YiUNX4RqtI>Vy_p`sfJysrWHsfZ_b8bMPK2I0N5Rc<;ryk^GR^(yXsll3~o}<3SL461F^aoKZ7`zq; ze{$&hWG#1G{nH<@#9jlpnBsE`sfJysrWc0vE5eUE`cmpxq^Lp+YZoqC_M#enD7$CCpjS_duiXg5Vto za{=`g(l>Z7@mBFSaWp+yaH#N0b(XzU-4lLaF{cLguTAY!88{~}{AZ{*J)iGzLkGiy zz3+GVNr|Ogii*zuZfu;rwzYAQkYuvJ##O8Sc6GR1`Chw)=hZH`;~(Fg`5ZGXbqmk5 z)SIj8rxokn5)pMRH2rMT&!(^_bJn?YyVkjgtYts5W=hht!+~D8x79k&wpib^Oz+8@ z#m2B^Ywm41=hF3WZZCbmcfXm9n!?{@Kxf!<{9w3iVbin3`KKe$dkmhgelF{r5}E+A COnR#T literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/p.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/p.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e837cd82eb88546ceb17b73624dbff1683e838 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrWcE!xqef~h9lb$Y)As)xyPCLlkq9EYvzM0jB-GOyV!(0c>GKIMg?AsV* zZ!{*eUSg~^xLG0GD`WO>ZUR$f`%mW=Mdt!0%V}L^@x8#pF#ojhwObO4ugxm`sfJysrWb^~VVb$fwAH$7b(Lp+YZofgY`M1kk{&8I9^7%gt7gdBRtz-b{NG@+p- zYDTkV0^b3~?-!mF-3)$z=v%?V{|-S+e_NNy^K1<(T`Kn~snmhJcWa z9FuTSSyVZ1_TGkC%javhG6*E!`Mx)@!--?5NVe|m%O;$Ay%}9vI_6t5ToBrjdz`sfJysrW4t}Gj^ZkKBO`a}}As)xyP6^~~HsomOPi4|tC^R8}(_>}xHOH+F8>|*^ zS#kfJT*}Y=ou@|exMOwxoh#haMH?7c9`sfJysrW4%L@&VKae3$30yfLp+YZo#x2fX28>WTAt+!<5UK&F!l!w+7>fdReYHE z+L|L*H2-T?ZFy{cp!JRHG`VZFmATW`7ME8A+gC;MUSQz;!0N#N&Uo{bNgXpJ1?N8B znJYcz<&0~kdmqgy=3w-3@h*`$F53Ti#j1?n0`^tA-dAfLz5BY0gLOxBk6}xI?2|e2 zYh literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/t.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/t.png new file mode 100644 index 0000000000000000000000000000000000000000..00432047f5efe9ce1711d81a8f11162336eba2bf GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrW4s)sJ>KB1R6FprVLp+YZo#x2PqR8WVT4I6F1O~1y5fuf_DFK`w4orMA z4yzR3P26nzX3775pD!K$y)rVpF@;Z{k4fZ%+krX3VgX(gS-;$4WjteZ?8d4Y&y%MY zuiL7WgcT&TVCvqLde{?dnqFNO)$?V(~oh;-2sJ-yUpZ6m;gec1vAuhW@^; m?DqnJPnf`sfJysrWPJw0L7XJncE%J164DmSr_Ub~xBMJhn7oMzZd{D5(fpZCq)dChThafi9 z7Cwzez5|QG7JqX&vyywKXP)1i^7ucM#@z{SM_!(@SvK35fsy48_k%gn*G*eCTo-7% zb}On{m4RXFwY^fwEdrL$wf(o~oNo8(|HGZ|=S4hI(5dgca&JHQ@N$kc%bxE&8?Qxq zbr#DdzuBw3ly6#v8qiH05nhsW&U|?(?7+ZyypnO*q%M~^Z!$jtWf(kN{an^LB{Ts5 DemY@* literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ua.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ua.png new file mode 100644 index 0000000000000000000000000000000000000000..7d36a0e98a63a6fd1968e086ae446731a4585e2f GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrZg#PYdYwR_Z=NoWAs)xyh8^rZtRQe_&Zl(m0?vR&?*pnA8lwx?^%!?E zEns@W<->mA;HAd*;*lrsp42FlQ-8Ky`7NKZj?nhp+Yh{I4jx^>6#C#YlV!T1%gjSz zOlwUUB$E5Ki&$sez7|#O>0+7g65?g~T(8q3+t+ibo7<)wn|0k=Cd7@*u9RK;oMIH no_e1hSL0npS1|o|cpx3Qe1+JJsXGIJA;942>gTe~DWM4f847}V literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ub.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ub.png new file mode 100644 index 0000000000000000000000000000000000000000..d1eacb7ef8cd2dcb0d0c6fb4d7f2ad23e18424fc GIT binary patch literal 363 zcmV-x0hIoUP)OV6WpkIDn_YS1f0~&v`2znyxE;pY6+(!0T>&6Tk~B>Lz&ZDLJj$~4>4}aPRM#~kK39}dh}d=AY482Tol;7l zQ^uH-GRrc?Sf1xWJYb9gz&y{POm@xzz^M)I1B4KWSXI@hQ{=Vp`?4%P)><25ybTwO zsTU!HbM9kA)LKg^$8ju*;+iq#oc}6r+eQfK`~Lsl_dTGL3L)CI4f|ABYXbtTwTO6) z$$urK9EL$D^(mlfnrWJ})<4JXoHND%fHCIuqTS-ZC;}n?z5!3j06NQ6{=WbK002ov JPDHLkV1kG!kc0pL literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uc.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uc.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f8bb9e0e7e3950f920b95f633e496466f4f1f0 GIT binary patch literal 378 zcmV-=0fqjFP)yL^jFi$40;N@-Af2bB*&Bu!@w8= zfHyw?V2qolIZjUi0Dur;t=*0GeV+s*imbK97z-hGqf*MWzQ=sVSWy%Q2R=RStV9T* zqzIQJy1mizJonz;2oORn%X0h+E*05Yix67ZbvL@M>o|^=iX3CCs!B@vsSo}(;MYag zS_42`*Khu9awJDZc5+I!z5oCK literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ud.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ud.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d2343dcfe16517550e55bbc0f8feee106bbb29 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrQ_&@BUG@Nlu6nvShIkx*JMAEEvjLAQ?<mI+2{d3L;v^dE?eGPGh8X{ z?O-U7aldSmd;3^&l;YBT@8eI+DLy8l#3lb?c89>kndd*NC<(Gp=VyqR_VhcSp8PS1 z?6nEvnQNa{im@mx`W`37z;Jt;C*!r!UPn*HJ>R`F4|dG3wB&j^_xkEpuXg#d95{2? z#PIXoRC6BZH(v^6*58?19QFEz0;k5O?W)X14sst@HuJsTB)mLB9_T>^Pgg&ebxsLQ E00UWZb^rhX literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ue.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ue.png new file mode 100644 index 0000000000000000000000000000000000000000..974322c69f5280bd2b88512e5d688b18474f9938 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrQ{A5Rf0Teimpxq^Lp+YZopzA-umX>(@73zC1m;bQJqOq%RZp^<0TLu+ZD=iJd*rdkmhgelF{r5}E)= Cx^<%f literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uf.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uf.png new file mode 100644 index 0000000000000000000000000000000000000000..253244e6002ffc49dd28a84f6a071cca1a7136aa GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrGnS_Y=Dk3n#hxyXAs)w*|NQ@N&#cQR%-nl$1?yrl9!Bm6j#U{M83`#V zM^vNZ?d{)-sT zxtPe;#{BSvcNjtvLO^%g2fEoF zzytUPfX|b8%d&J`7eb(v0sy77swx05##B{x6=00fT3c%=rK<-3)_n;fk>U`uzV8`h z-usQ;dyg@0n&!AX0`T4wLWW`3jVh(0fJl?I))-?U#BQ`GinzYVe8yOw=LZSj9qz0| z2%)G5mn6D<4$?GTmSy7vfN7fEON=q+{Fjp~g!sDGrgKtCrPQS+55s^En&){pnq}G5 zYbu10Qr3078wG$rc`sfJysqrGu`D)>mLGzR(iTPhIkx*JMADRiz1J!@oBLn&RdPDHyWo+;L~yS-oU(- z$y>mB1M_zSgXyg45(PI}|74r+KY2bow}(;tYtvCB2F8C3ALdOL+_?3a#Okd|i>3%M z?D?+9qUhq~nVs7+bE`!9rfYTb+DjQ6dOm*nbyoe+oXOpCMHd&&`5blNZT@4eg!v4o z7RfVxx%Y6F?K8(M%bAqqPClL!?8Vp+bjs5F{f3LToEVtau-7m&O*xwCIAz;rpraW) MUHx3vIVCg!08tuZVE_OC literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ui.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ui.png new file mode 100644 index 0000000000000000000000000000000000000000..f69e3f857e6a7c7e11ecaed284b3bd53d33a5e8e GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrbJlJhvnZfYv8Rh;h{y5dKmY&RGwU)6Gxr``!Ma$Chmkv?BmCBd3k44k zu{t{+{`~wrI}3}7ii*I}xAvL|e}8@D;o*6If4_Phcc!C?f&zoOd+@JL8VaB*=xJ3rrliQch`X{SN*7w$1Jv^_n@oOtS%Ezo)fPgg&ebxsLQ09cDc AmH+?% literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uj.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uj.png new file mode 100644 index 0000000000000000000000000000000000000000..ffefb31042c96f3fdd04d151cfe32eb1f9007674 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrbBPyPQO!W1iJmTwAs)xyUOULktiZt`sfJysqrb7Pljiw^^Zet5b#hIkx*JMH4c76qQRo3nKttQW9&Enu-a5z$zZ5Ve8n zjf3?8J|FfB)=P}P51ct`duQd2(}&M~*zc$y&&hdMx#d97tM1e=Mv(*d3^x5|qh9CU zws?Nda_!bBpKdRivg-A%YJLW3a%;;MvbLcdMluIs`VpuYUjcIisQRWs_C`0YgQgEmnQWGEv!*$=7Zb z_?G`#kQ;sOXC}MLUCm$@ACD`0{rWnirm1?f^cZTYGMM-l#|17wF79+B{QdKzR?i>p o5jZ4K{NQ2WK3&!ThM$c33B8}g^nX{^0mFd7)78&qol`;+0Hh>|(f|Me literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ul.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ul.png new file mode 100644 index 0000000000000000000000000000000000000000..47d868a0cbacd1e3148c7fca84eb9a9f820e9b73 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqr3!c)9Nrph7W=|K#5Rc<;uN~xVP~c&`kadUMt(midGeP9W0%ZfIn+v2L z99+z9x{=-Y|HhwZy%iL7iv1>>;W`xP(8$klJN2-o`LPYxlolB-oASwLhPjZ_j+-{_ z`jL(MnYV^TF8Hp;VX*mupyB54|K=XoJ9Z1opD; Xzgk3!mmjtPI)}m2)z4*}Q$iB}sSQvX literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/um.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/um.png new file mode 100644 index 0000000000000000000000000000000000000000..c45333e6034076b8fabc626ab19d9e2314ee5655 GIT binary patch literal 368 zcmV-$0gwKPP)SfD)zy zDM2c5tN==&153~j&w1L?qfATgU;b#+%CE^(g758(smp9zm?n#h&$LoSXR za0C81Kqbsw&H}x~>;zwbq1?zVA17c>hF7sjll5 zrvQKuLMiY`p(Q|imJmYn&zS(m7yzV8c<=Z4=Wwf#Qmz%mIRHd-&h51S0l;iW z04R#W7_&bCZ+ejsf>H_q*4nxGXsy%OTC0>wH=D)Rc--HX8*l@z2mAt)S@#guVlb=# O0000`sfJysqr3-cq%)uKS5kDe}$As)xyPCIzEMM0o7-TePu%|^aCLR*;LHbgWAFh(#= zX%O{bzttprqcMu{f9dA5tIc;Rj=MkbPOF$)*(#v0?4Cd*=L7~$h7aX+IxRDvOER=2 zIvnw@zhBO9V$+$Z>TfPPCIxAoFFyBkdVY`Lv6#61p-RtV?ti~*Qaj7V#pV2$hK^g? za%ZU}P2PI#^{%Y7$&3OQEz{S=PE);RzV`L3jwMqBiyzGSe6RX_GNVMYm!{^^ZMhpK z>9lYt#CElQ=nO#+dy!WsF@NG|st{^3jhmVvLP3R{=3b zLdY--E0a>XGEV~X=cJTMsr>WNS_>f#_nuX~bZxQL=C;|HzLlzSFDifnfL~)P?e{fw RnV|px002ovPDHLkV1j#yn6>}_ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/up.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/up.png new file mode 100644 index 0000000000000000000000000000000000000000..d48be7b8cfb41d25ad1e53532bd9c29a7dc776bc GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrOX>Fu)V2eKwtKobhIkx*J8dIxivf@8T;bXq3ilKw8wEEpYNs@B;MA^Y zu3%M5U^Q}F=U_Egqwjzw>!kXphrVh5`I;K))i|xnF`3hWfr;UTpS2Um=}im`hHQe{ zbA!DUA6fL(-k&e*)tc1Pes0R7t!49`U%olJVeZ1Mao4|ofAd$G=kSDLwMEBwb7Biq17(8A5T-G@yGywqEYH9}n literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uq.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uq.png new file mode 100644 index 0000000000000000000000000000000000000000..d20612bf0e3f1f77cf23b2f812d1e18c0b5b66d6 GIT binary patch literal 425 zcmV;a0apHrP)SD+F!N8m#Tem}y2FQc z0WQFKeeFEwoO8|*LgslUgaAO(G-;7h+##h@UDvNWh)5|##O$|uK-YDg^W{Dw7DW+4 zI0f+D1Hjr%>$?7t+1mgqC8cyNYK#GZ?IiBm+A_x0qCyA&===V7n~vl7cs$mksf(s* z`o~5qiemeM0I-o_9#B=)2EaK702@Wh8_ik^0N(qx9{bfI?-{KuOQlp=Ypsnj#+Vpm z2!RliHFF*iLZFlyV-V3=o6_>$mu0E7{)17G7)mKAW!tvNU!3zjgJ>_{wItSBM0`G4 zdbi_FURqZO!5EvSX&8p&vU#4*j_akg)`SotM7GWc0na(ub=~%{+x2I60Z!{1>qGYX Tagem$00000NkvXXu0mjfbHTL+ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ur.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ur.png new file mode 100644 index 0000000000000000000000000000000000000000..e812c3186f8143411f9e41e603b163045099ea97 GIT binary patch literal 336 zcmV-W0k8gvP)S3m_HX z65Ii#lCl65ahgz#@sV~)79nb;) z0Py|RgNXKhS4tUU06;{>akSPt=WY?|4SDaco~4u!g0;4k@;3I#6KSo92oa}gYM2A( z95XX>D}dJeJevSwjPpDLz~=$XOhf<>WBfpwo=Pbxr9>p9bmX~JnbulE2#9zm_95W- z2bX1O(g)XMw4FsF(hy*+J#VnC>+>Xg?-B8sdfT?0_MEdZCg+@UzS>_j{AFzs5oQK} iU)pWxdr=2;fcgOyy_CfoKG2r{0000)FhWKkBV>cH0VBW$WCPfM9x6Rmd6DW$yhEk@H!NG9jg7_7T4V3j2Ya(_ zzzz5ZfKQ@dO38Z<04XIQgfYf@Z;bgpvJn(Q&{{u_rIdM|rIeId5O8IGtG4=#p z7HX}f#FCoKIrrY5jMFrcx<|=kSr!1;wyphLjOb^r{Z2?JwXSQ7YXyKlW6BtF&Yc=ge95F`H_x+D z$`~__BO)HhvG4n3S+5!>-9H9Xw^q8o4n*cXu0RV)r0LO1{b002ov JPDHLkV1l=yjwJv9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ut.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ut.png new file mode 100644 index 0000000000000000000000000000000000000000..d897d27c64780aa6b2917b04be971d4991fb5c21 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrE4@i}8^eJ@i#%N%Lp+YZopzAZS&^r$c4_(M&b$P-0v7WNyl2#Qb*_HF zmY2ZKTG@UrT&_an$^O48zgk;5j!QVdx#FB7#w>AwL2=&ef^$2!Zadd$xb9H0X0nf0 zX4Lz=L0Pwgx~3G>9(L_sv-RB0OhyKVWv)jA4&9SfNLu^V?m^7^?Jf6y|5cp-`*UDa zcAN>@AKM3ybZ2>K3SO*!@5JHq`sfJysqrYmP__*4IFx6P_-PAs)xyPP@o?SV5poU-f+O^oddj+cx4U> z8Z}8CyZS$0zdOIPSf`|95iD*I$&+wEp5fKw2z3} z-(2jMUHg4|E;EDXQv)7%{{X+*`}TXE?frf){qfi1_2FKH;)V~x8Js$b8Q1@^UE0zS z&ycZp_A*aR+aIrYO=I}9xT(X5Blq^ZxrH*xJ*qbs1zs$bWspc-v(>3XLRm>F*=y6) p==6GZdd>S literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uv.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uv.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6cd3bbdea1f593e8b09140f47ea859542679af GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysqrYgv=84}l_#9G)(YAs)xyPK)hrF%USue0nuI`xQnD4ZZ^h6&Tq)fHaUJ zRNx@HMPo*7hLc(K?tl}M?l}MVU&8!(wttYDOTqHG2WhMh3@i)>-uJCtrFBe#K_dCq zwx@IKqhIfeyM8sQyCXHS?u*mzNkQ-SD7QpROTB-X@qh#~L+tgvTkEXs85NXVbh;j` z{eJkvUIs5sh99rJy*%Zt<}I>0KUwAF?|(l7vj1NC-0fSIHLI<-PO)Y^&z(J4YnNy4 z+Qc!hkwa17qAma72bbgStK}O%HhULRTjTv?m5A#_i@s~OEc*7xD{U8uoaU(+D;Iz6 zz~7o@mHP~tmAo#8XqLX3T+HzQ;msq5j%qXfvwy&-#=UdFKl4A1z(8T}boFyt=akR{ E0N?qLH2?qr literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uw.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uw.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5f3890cb01ceade5bb9d1b17eb32a5feb383ae GIT binary patch literal 442 zcmV;r0Y(0aP)YnB{xewo;FEDTB%?vSd&cP?~1s}#O za0}c50N*d!vMiG%0RUr+Qp%HB>#pn4G+maZX&TPC=li}N$B|M>2zXl! z$aP%-V45bxw{6?D?aMg30@E}Bz`Cx8CxkRjgGedmUYy+?aLx%K!5@!p+ZbcxIHJRp z(ko3CLLdRHb>H{PvTWNHNNerIDH1}=^NjB2dH#4jVqv9JX!vP?*d=SNw}NwyD!XVA zilvkiLhMzx3wH=9WjGU$3L(UQ4#QxKIf(G40-rK6B<_Fk?c65E<`zZaV|lS)T~$@T za>>1el#)`4R>>Fx0CinIZ{j(Ne6rSBl&r5zYt0zD^4P^-jAdCC`xDymHx~If?wK^k k9M6wOa{qYU0{>s&2kbm4AE-gYjQ{`u07*qoM6N<$f}$t8hyVZp literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ux.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ux.png new file mode 100644 index 0000000000000000000000000000000000000000..024bade9b32aa3d20452de9f458bc00beba8f155 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrW20;d64HX6kMo~`}#}JR>Z>L@CZBY<$y`S?<-b!LE!`lOV8<<}>SRdfi zU<49S_6&X@<3h8p$zRX^KK@j-z5Jo7jT1+~(z*vpcN?S&m>KHIzx~=L-==uJ__<7S zPqEzJ%6XR0QzOrP_R);}yI-{I>0b2~5!a0$mrm(1d|zuJBoh{q&FGN*H;+rvX_mrL z4~|B|xbv&0%v$!+o>7s-$s_jqM#ZHe9${Juv(#E9Ofj;ZQ`}Ioks)F2Uao|mO1t@? zp>vs*@ZH*^b8cs$%-XH7*XPdI@}=gH_NA!#TwFqj4Uety_ImmJMJ@k_d)}Jnd`=o4 zEoGTCmd;P(d9` literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uy.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uy.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa70de56d26d1a4158a9fb9759877fd01d17a68 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrW28F=48gf9PFP<)rAs)xyPP@CdMM0po{p>zxc0cxM37pd$IBztTIdEpM z9^ukyj9`pl+}L!JJ^swS*Y}@QP4>0$Z#jHsy38RKH^~Yg=YW& literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uz.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uz.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1fcc83fe1d05564a170ac03ede1fc843b345e8 GIT binary patch literal 366 zcmV-!0g?WRP)VI0003ENkl649ELj?j1(Z z319==fDs%)H^2?l4R8Y707t+HU<25|@4@6^_>!~6^WhTzPo!!43oR|LbzR|3eZkFo z01x0F0KPF!N~v)iw=-jmQVIYu#${Qglx1071$gg62z}r0bG2>joa3Ay1g{7QA)Ir2 zi*pVDwAP2QD1ekQu@priguuk2N|a?;(h_T}wHDRo^`t@wl+v#2kp8CuRaG&@@c!oj z#uxxF#@q#9jMa6WRP4_HQc6NdlJWC_CBm)>@BJ_gN~vv(@p>WuRrpMF0Q* literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/v.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/v.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad4cd8a334f33a21d9548486e4f6c2a2129e8bf GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrWPJ_8KnvH=%XFOdTLp+YZopzA7Re`7Nba(mP19=BHHZ&@qV6$qPeS&Qb zgRp^<`vu-#d@9FgKYeiY!+fbr&$Rz4E|?*C?+Slh7_*53a}DDK+q9h9%cd|fB=>9; zV@T@JRArd)TvAZ}Rpf%qS<_N?u9rye@CedodNSvD;hyzxexEaHH1N-sb z?Cl$O{c3gmqt7<;-Q%A!8p|KQ_}x}e@Zwg{&MALfi_a-4DOo+&I=6Dq^rWqK?paON wU;Xr3SpSL});!KveZ$^{Uu59@z<5CZxsQwKY$3%2puZSAUHx3vIVCg!0Gt7FhyVZp literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/w.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/w.png new file mode 100644 index 0000000000000000000000000000000000000000..c6edcb49b5f460c2664587157b62cd46b45ed5ba GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrWE@6>N3!8vKpFCY0Lp+YZoqCYBMM1!|{p`Jk%r6fJX)sz{@Y}%b9iV-I zZwvEVhP4TA8f<->Y~FCS-?jb7pR!Nj{uzGGGu8b2uQ1oG;W^R3^Mm<8<>u=qyvaNa zt5z{JBuc#4y;Y3i*FO6`#JYmrh!w8{qZXX8mig-u9XMgawx_nZmVAqib8PFyr|tn!Sd<_r`sfJysrWZn@%$H+4XvbDl1aAs)xyUOmX$q9DL};d~nR2IdzBgf_5PH}D-3deb1Z zf!TWli!e`gL?$O0yQhWD3cA6sZGWr)b$ zy^h(y_wu$}hB?K@W=#G(Y2p;2hSJ#YMUi69?*#ty6H`z!bjx1bVNlHBxM}gH_~7@o zmrah%NR;4en{c1oID2h!PtYVLg{2}+7oyVd)kz*WQ~mz4&Gy{WXTq7z__(-xy4?GH xnnCGS`tQ9=3*P^pQ@P@odiVk+(I3nYm^V4Joa|Oy`VQzb22WQ%mvv4FO#nNkab^Gj literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/y.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/y.png new file mode 100644 index 0000000000000000000000000000000000000000..98c8626b14f31920ca63cb8c34911db9b173174d GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrW9wrS7wQoS77oIMTAs)xyPCK}|uZ9lzZ+x77cS`HU9*$@4i^%rU;R(tbyzXaJ+=2j&BhbC1}Z_tIo= zII`|FL&E*MbUl*4xxzS?YC*|i9%Jdpui+W#s(01x|Czq(# z0#15@BCg7d?%Xq)ygqhUc8I~|;&;C{pRg>S_q^DthM~ga)}b?J{>Zp24f+}%!YIn{ ZKk1OKwfSF%SfHO7JYD@<);T3K0RU`Qfaw4L literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/z.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/z.png new file mode 100644 index 0000000000000000000000000000000000000000..644a5b3158bab6d2441751b15836855112cc0d58 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJysrW9*L___j`ashdo^!Lp+YZz3Rw&L_vV{LfK}f0teZKW;WKT418V8Dj`fk zR-p|nT}%ZBfX@E3 kUiPKGS_1>qKZYL++P_^-R9%kp2Z}Rzy85}Sb4q9e06MK|egFUf literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/1.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/1.png new file mode 100644 index 0000000000000000000000000000000000000000..3894249db8e513cde9912875bba551de948fdb46 GIT binary patch literal 965 zcmV;$13LVPP)7S}9L000AINkl^N*{QcFhN`G*0aB*?*=k4Dpgb+~_r>Cc# zQ2v1Q@pxPi1bZJ>u5fo_xXH^q6mU8Gc!X7iN#`pKmY(jq0q|8 z3IOcx?p|MCQ=XnQO}o3hGYmsj)mSWsh?Po(<2XbV1R)-eBVr7?Xs8*{y&jUaFn&3Wtr!Bzu%9D(P(sWaS;)>x3`ywQS^Gf{r&y+rT+Q(d17LMCTP80cez~l z8zv%tetvd$chk)J_4W0`!$W(YR4VoD&iP{ztyC%<9UVPAJ@$t*NsaR0S=m$`}PkK?=y3`{njE{-7?_ukIf*!9Ul;JEqm_KWEo1Y9lzS>Jb9Q_If! z_K4RToh_R#UOJ?{L7-cNEw`!HDM-Ue^&bc+0&w(haY}$w_desRqpL=x!JSY z1SYAR?4KvPE#Ugs8aw$jEa7)^e`sI$TbD1_ci7<2 zn%7^etmeLpI+}E`Q07!p&&Jog*1i6hBFCoErw|l$GX472kyVGFT%AnNb}LSVY|9D5tn|__dEZd0=`P*m9 zYpQw%tqnV@f1z1+?e*7*(=uo6jeGCCDQM-3U4D^ox}R4bdg#jPHLvQj$$pj1H+58G1+<}}SbnQ|#>t44S8C6lw&i-f-DA7ZYzkjdMAd%m6QqMcJzgg8Ti z;Hd?lqKO30pB*uJ#xr~3D{bT^pG=96pO)$x=)zGb^L_8b95e21RnIDdM2>FKIlW25 z^`J!eq8IMxKWWcC`>blO+7_;LyKYZdbK>3Nl_6e%Q?ADzR%W)He_rSGK1Pi_cNlR* d;J>MMj7v<+T&BDbumvV922WQ%mvv4FO#qE@B{={9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/3.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/3.png new file mode 100644 index 0000000000000000000000000000000000000000..fad9d20cfe5e5b62a221a7ce9847dca79eae0e80 GIT binary patch literal 596 zcmV-a0;~OrP)H}S_Bo$H_!nbQ-+;jDu5E`06Op=m|+}7Bbtz?**&e|;1ia&Z`WcN1~`KK!9fgxB2Wa1 zKoKYcMW6_D_dxr;Cxm#XC<=cwIE0YC@5fG7E6$)tyRI|FEKXsJ>ADVM^h{f?wRX-e zPT`!>T4Rjj*5|Te-rBa6QVvTdrEJ@F$ZU{fQYobnB3yFL!w07ieF7-we7sixz&T$# zv;yd^w!Zk?-jmk)dcAJr0mc|(Y&B5ESjzjf*3s-)cIio2D5b2mi_v4PRZ8WK(Pt}K z*R@Zf&bi0q5!7^)4vaB%U4Ju1LlQT}csM=pizb5F)htecM0O1?fYPUBYvdTBfS1s;U;#$^Cx6-EL96HKqbWNT{pQhYneV zo+3s!Hy}O@G_gP{%W|?DL*cydpAGm!?2{`RjL!B2WbSiv0udZFR4YSI^i00000heao;{}ayT3S z5R1iFZ;8d?FLT1-FaW&1zB0|Cq9UWwm}-yi@9&qFm*Y6jdh7E6Wu({Zo0^*Vd_HqP zL!ppDp-A>#nw*>*sZ^TKHA*&US|lZpkB@I} zZ=B;yZf-8~7D&2B=jP^aZ*RGQQWUkewpLM5fwumydU$x)+uMsoA_|3~wzf8XGkiXu zpO=@nu&|Ksbv=&brKP0+kPLTzbIo*od`u9;5BO4Ix7#_Vn@PX*7K`Ql{9GgwwY0P- zl}eY(RZ~;Lj_Pzek|do@r$(bOnM^p2UtC-q92}%N&C}_0-QC@cJwHGHWwouXEw9&0 z)AZHV6#%&1Zj;IMxq3-a_T=;Vn5e`wmzS3bg7`dPdU~2M%w{uNPBG{y1sxn5l*wdl zlOTwtr6soc@$tdhDwRs5QYDx)atF=I%F=4JzZU{>KXGR=*RjZ~M*Wo2b-#F&_vsH&<00I%1}mU|e60l?1A4gfG8q;_|A z+uGW=JuXA7R&)DhdwcuH$Vfp!!OF_Y=H{kWtHm&^va(Vtl>$H{61lm#;qiExnVCYN z(Bttq91ej%z&+3=cyxlnAbWM#2*8ML! hB2Wa1KoRIa>ldJcqhTm*w2%M*002ovPDHLkV1ftF2Y&zn literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c2.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c2.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c95a87123b926713695f00e1ccf64b5821debb GIT binary patch literal 1077 zcmV-51j_q~P)Bqd&dvD&({&wHY&b(O;gb-AMa6yF#2F0Kl6oX<=42nT9C@HZ*OlQgakn} zH#e6r==}UVQog>v005Vlm)SA9ySv-l+vy(kZ0v!0JRXn7lQO5Krerc%MvTE=@caEL zm1=Em4S6gUi$EYK;C6-2dYjGG+1Z&g^?LpF_4U=&ReDS$5|K)!UavP6iy@E86aD@DDKi)hhC(4UDrlNU&W47Dy}dp5QlCm?x`e}F0D#Zu%ZTji z>OwlhFaUt}_ji_39|#26+S;=Hb#-+Lg+irLr8^xChg>d4y3^?t2n1rWn5ERu&dz?< z6p2It0HIJQ<&j7vXJ=1%<}Sb%G78yRaI5(?d@{8oM9L~ zpZ^DI{m94@%4yi=c-m`tYX>S_Rh z-EQC6*%6DyKaZK;9HaTl=jSH?pr)p#$bL!=`dgCU=gD9&oS&Z;f7e(nw!gnG6beiA zMroRk$K$_JR*1!7E|<${>R(=7nwpx*y|{aNdXh?|6;Oqqo}M-~Hm zx7!_$$45s;lgVWHmdmIFMKdGk4z(F8~}4N6Jhj5;r$DNLMPAN~MzRF`7suva<{! z)ai6BEiE}Okw_#~tCej~y27@6Qjs6_d(a|wDI7rj9$z);}W?^B0qNu~eLq4Cc)9L>6jWhl$ vfY* literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c4.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c4.png new file mode 100644 index 0000000000000000000000000000000000000000..74c5cdfe2e677593d0fd24cc0f6d506a0a9ca6f5 GIT binary patch literal 1124 zcmV-q1e^PbP)h|<2K3Z>C#e!su2t}a{i{#CnPB9Vy2;xx*& zwY8m{om9`|Vo129H@$r$zb|xa5zq7!0OzIGs*DpPxEFp-{+VGD7=&z6^u%`KfogTrDjv zWHS&5NTt%$0o&W#GMS9fHk(Z-6jJjD<#M@9CX;Ngudna!?xqfiL?TU1O@y}F?HMi5 z%-87q`#XftZnvw|>a^b4+FF~<1|i(q+5!Ohe7;QXmC=EZ2&Ak=XZB^d3kx?A}RT!Jv}`!7>wN9+;5aUecw{V zY&M%rrceCv_4W1O;Nb5?6vHqw+xWM8x45{NvZ?oYJUEW?c)YT*vhSNX8w>^v!;X%Q z1Omaz%1X8tY34_!TrP*%w=aljC=`mtVn5(bi9(@hY;4T>`IPyjJU>4J0LI3~()_o# zw~LF5XJ=;+LXXEYKR+Lj$3I>5XS(YrCnq@^PE}P^UteD=7Aq+!A^Z-9BODHoj*dzs z5|Kz$Q&Ur3UOq4|5Rbot~bu*=(g!`M*e<(N_@!ia-%4 q0!5$*6oDd81d2crC<6Ttfc^##Mp87^nZJSn0000S=51)mYdzBso1Cy4gi(^Q}y|*{4S3hzPVR+za5T`35=-S<(z{PdYX-$qx z$BoXWsjUhfW>FojQ|+B{*66reA9VA0y;$_fAt%9uez_)(np5&7y1o&V zW~#{8sTr#qCmI}kA=~7dFT}vA;lRih(7+_J0K&Xb&#+2)cAnA97bW&jLqbgjI3je! zq84nwefItL>b>_azibgmiY(iGcUO$w6NUlVOpYV zV>Lv?x>*lC;rSyE^h0LU*PSu%YV7{MTDM4JYm}~3@4vsH^;UC3LjRs+R-63t@#Dw) zHT+e$?T*bzoDsHq>;3o18zYn^E+`2uvXGf{@=4LoJ8#PtX?(KLKW((~iORy6KF_kR zKP))%xKL^#$HEe;zpt{SMS@Oxp1W9MC(qX&AGHdYskQ&<)$T< iFr&p+K*K)yFT(8CKZtES;$jI*NDQ8?elF{r5}E*BMj2)R literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/1.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/1.png new file mode 100644 index 0000000000000000000000000000000000000000..3654ff91c867daf6eabdb97f02ee3ac19116b676 GIT binary patch literal 918 zcmeAS@N?(olHy`uVBq!ia0vp^7C`LH!2~2%1zlDHQk(@Ik;M!Q+`=Ht$S`Y;1W=H@ z#M9T6{T_<|yQ)RY@rW1(24+)F7srr{dv9mjdb|!0Iqv`J^I}og?(VBgIrMgkZ+Y-Q z&FY1MlGB|#C1MA)EG#;@tvW1zgtCjuw(#*Sbvn3f>V+nSur)J0cn_M~ny_VWK1a)i zYf`5BzCW33{B%zByR-ep@9f#5x&)Z)59WMu=5Z7h!H(>Ce{HW@{mUT3Z1z%(R}UUM zh-Y8BX3dh!U8`5WzP!H2Z83v_XOPiMmIeEZKfZP8&>^PNn-(u#eE06%C>05wd2{D}wAsIJUtLYj8V#<) z2Ael;4h;=Gs_s2$%eHN1wzhx8UOar5=K4`3-o0}t=WVN|qFUeMxcKRQGGx^Qjoo+Wc`fboKlilg{Q2{#THil?QaZh9Wf#+dw{O?3S{1i` z`l1#4_Sr4JoOw0o#PiQG$EV&r@wvuouGv>vQP)6$ma}JlT>~rTmG6w%yLWHcO1sG? z=ggTi#gn7`@W+ZfA+P1-<)1%)-YdBL^3RLcu3xz_C1>x{q)j(-R`y~Z)!N+WpSJ_YnE2<#i>)LUcMY0Ec(&#CzySvZfel_hs%pV{(=T@w*4M9Jwd(fU zYwee>FAp)By?5u%%>4X%ZN-^Bx88nRwrtt=qf550*}66Kcgm}R`1wo2x?b+?O_Xr* zu$sGX_ip8un3$N1qAPb!pZ4CI^egZ7jT;ON?d|QKKNmAZ#Ko~SRM^PzwKFDUX0Cjq n$MrwfEr7)pE4uJs_KUgM)w27srr{dv9m#_Wm3oam?SzRW*b&#AS(v*F}4$f{$Ig zB?3|A?BcBY3K^v$>QlR%1s67#ePHVHie-`Q3JJ)%#C5Mti(_rBlT*uw**+t)mtaP!J;&g!>MDD#^jSOlT>^!b0}`U zxhAUr_~er*UVk?Dm6w;#ojZ47Ku79LAXvU!-RAVBHJ4weM1K4Du`ng&$)iV1=k;`S zSehOC9 z)2B~Y)b783|L)zj(;k1^aW(7g)1s)d>gwGylC!g4zj?EU>BWs3GZZ-D8@6rRrl+Sj zE&EW?MiwSU8zH{-k3Ws=?D_;=y?8NW{(OHGp;PZY_sQG; zJzZT@A1kS_W3hsWMpI>+}yi&@5`5& zTVuk*x9{G)dg-lOw=}x6-fbwc0>)RXTy16LMc$Ck+AYhMFWF%R%%Bl_BHAHsp-Mg0I)%V|Yo@ELd~)aNmyaIH_Pf4vd|*8*I~{*wJ}Hi0cN!9B9TT*u() L>gTe~DWM4f&I!Ff literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/3.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/3.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc2186ac8cbb7ae187e6b1f41a990feb3a1dc60 GIT binary patch literal 931 zcmV;U16=%xP)rP3Q&Lo6rcbF zC_n)UP=EsTUqI98v?z){0J^`we|2?L=!sLQ6wmVrp`)WCgit&lm#2at2!ikjXgC}; z8jXd9USD4a0s(}O$K#PE4F-cW4TVCXQ0UVEL=jb0Re~Up0!K2L)GxTdzn7=1+wG?4 zKp@cH-+z97jxpZZ*;!j#>*(l^pOw$&3x~riD=TKR*=#oFERxgd+}PMCD=W)nGTYnR zo12?YPfs;9HL5G>a=Gkwdr?u5){;9Mj-H+#y%jAkF8=uVkhVopq~o)*vvj+@zW(6g zAm_k%JZ`hu#>dC$uIA?E-QC?Uthan#Db%5=mmVRswY4Q}`~Cjb)>dUrUteEuZ!b;9 z#>R$*hEyrT!^4k{k2=<_t}c1{7kzYUYRYQ0O54@d)vvFw${IpQOG}G9O(v77zvgzk zOG`_2rkkIim#4q-hq_#@xw*MWBx1AKqR}YJvdS7!6qWa`YVbU7GMNkp&6SEqqvhr0 zdA*r1#<5t8rdF#JV>~l6GcYjF-rlbDQpoe8z|zu^>NTMu^(j55D2mdFVvH{@FQvhS zg@sfqH8L_Hr7X*4G8u%>;^N}h`l!d_F_}zSdkG<{tE=*JR)N;l)m>a%AcQ!MYiw+k z25)a~D=RB$&GGRu$8iXuY&I)DHs^jY7z|n$x3jbJ;o(6G$}mh*Qxn55dhKa%Z?CPb z?d0TSdU~1;zP-KG*49o=PDUb;<>lp@o12D)hKY%Z_4RdHGdMVCG#V=^D!g7VA;jzT zS}c~5l9JKUQROU&L?WBb>OA#1od;>v@jR~_e13k8#bUJ2y}!R}bw2%+5OQ{QmQJU2 zpofQtc|i*uPNx%NtW(h4-ThxcUtV4~j-x9l2!cGlySqyy5?^fi-y1y7>;HQ?Jw5&O zc)_<&fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rkT5zX4>ZCm)Tw9Kiqp002ovPDHLk FV1hvCtsDRV literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/4.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/4.png new file mode 100644 index 0000000000000000000000000000000000000000..6f528dbf975e917eadde81809ad3ab663a78e272 GIT binary patch literal 880 zcmeAS@N?(olHy`uVBq!ia0vp^7C`LH!2~2%1zlDHQk(@Ik;M!Q+`=Ht$S`Y;1W=H@ z#M9T6{T_<|yN3Lfuu#IaXfu(gw@IiiX5M&Oy|3Ke?r3a z7ra&;0u`^4Qrd-H2TWJlCE;4;(ZQ2{SII`@#?j<}=?+sO#8N(|9v6=ZD%^hfkU`Gt zs6Q{#4}P{iVe|Q^q`k4#=JR}uHMo9p8!fa~VqguxfiC2G6x*lQ#9o)bFnRLi+qa|J z66g4-%bq)TPO0V4!w;W7Z&qu4d3tN|>Z?H_t*JMIR;Fyesp2UmA(0R%mYlOSO4UiOsI-@Ti4Hf{IacO_O*;ggoMx3f1-6c-ogy_2x0 zUcTXa^|k8o!wm`?K+%m6J=@I8%;ebS$J3&&y4`brg8v;yFpc z>1NKi<#oR*Z1T27?e6{b@1LESS(`vqRFsvi?bOtn5f?MAOF3qt-U2NXCr+Ff9cMdr%j{V~$0`yN9iLyh`r_Ze zxXb?M|9$u{VcWLt+npCqxaFrJ#Mb$L$IOzjlB%j(DMm{#XI2?KfBrmccZ5#b=E$VV zy>UGoZ2{v02BQ9g8O(8dUzS*}YDXKl?goBcc9_Gpsf<5!)Jcf<$UPAu}=UX^7c trE{8(kMEnjNSrH!hyx>5^hNw7vpHA88@1HxbYN~_@O1TaS?83{1OP2(k}v=O literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/5.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/5.png new file mode 100644 index 0000000000000000000000000000000000000000..e22d59278cf4d3e295d481848a2ec245d5281ecd GIT binary patch literal 904 zcmeAS@N?(olHy`uVBq!ia0vp^7C`LH!2~2%1zlDHQk(@Ik;M!Q+`=Ht$S`Y;1W=H@ z#M9T6{T_<|yC(PaMP+Ub49x1DE{-7?_ukI1^>`g1a{T>T5s@ib8~t{r6%_;r+_BP% zIC${n(W8!u32>KcC-u^6$mo=TC%kB-nm&Zdxd>#K0PW16|mp;u)kh)rn*7ym_;7Eo9s{ zRE0X1FJGR|SXEIW(S20FNn2YxZTGHST>@Ne&6{+d-)Z`PI{kQwRcv^8cv8cvRebG- zrM|p*<0EnuC>9#}w7}xlty?jA;-|H`9)15k*KfIs=j6$g%XZ(b$v2w$@_b)e8eDdkj zroDUTM#Wx_)tkQVbH+hC$efTgj`@-zm(k%k#KVQFoy)7|i z^Udqm!)JB5Ew=1_@csAQJo8>w#|^jNK6`WL&Yj=CtN)4QbaHuJ|JvTpo*i)5z-eKC zyF2?`>1VkcwrvZGjorI@xAvbf1%VqkZ!Wxf^r&m!<5Q8xf!-FnxqbWg0*f5ps*;i; zk33Wk72f&v%WCWG+qWeiCkg+k*#``(B8T677`tZvpY46{?+qHZ5 z+1)^|UbL~3>b>L;IOWf)Jv(-s*y+TPxc}*Dhr{bvu8fR|N}48c>CT-qZ_b=K^W(>k zoex``6s62fOul^o4)pZq90LiJmM7ctdZMGE434Sp%JKK_FFhz3AI5Ykk^XB=fO>S;(UZkPbWn^TObdHaQ$HdI6thCfsNpSh)mme!W1qQ7QsjaOw z3~=gLwQ6U6OOvZRbD)UvOrMQgJB~lTnX@gz^vL6n^>IG&3(jjU)1RPoddt*H`^_eL z1XS16`Mo`Ty1Ue{w(;AyZ(eieef$1h)$^Cwa&?P`%o+_$I8a^8eukUk3ev^_wUxkJ O#Ng@b=d#Wzp$P!Esi%7Y literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/6.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/6.png new file mode 100644 index 0000000000000000000000000000000000000000..2eed1bcd0533a3b6ecfc54f6f9d1cab3ef4c81f7 GIT binary patch literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^7C`LH!2~2%1zlDHQk(@Ik;M!Q+`=Ht$S`Y;1W=H@ z#M9T6{T_<|yQco?g_EW;Ffhw_x;Tbp+8!9J5xLWz|wEaqfp;vT?p5&*yg* z$-47w9?rRH`@H`B&ixP1S>BQK3KTKn`NqxL$*9r5gaawH1nj;m$9G}zV&%`A{{H@p zG?ZF4-PCdFcx(|UVm+77_wp)hj)1nrGwLcrob#RwIxSzmoMWMf%AwCStFKzw+lR*{ zaemeR*B=xzf6M##@A=vfdrVE;c{8W4w>PtS|Mzd-z684l-no1CsKoKdh3l_pZ;a6B zx|Ao()oRhVd-v|ybLMP`TDwZ5*R9s>{_*4PyYKe7E!H`G?#!7NpY?%2S68wzsps&+ z4{zSQi4Sy5|5n zojZT7ZQH+fYv}5$f9mR2h6uS9=H~jYW@BQUe%jRDe!k!G%vpAJc52h+&z&0^7su9o zu)V$g>(|oSf7h>H|M;;``GVi_%UN5uyp^0eJ$+-upI^U>g1B3oPJZ;96tXs~_ezLX z>ZbJy91@TJ)s`@9+p!~K(X*nR&CSjKnYIM2bP0 Hl+XkKMhBl+ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c1.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c1.png new file mode 100644 index 0000000000000000000000000000000000000000..d797cb8341215b0d5ec100495ae914f7f342f376 GIT binary patch literal 857 zcmV-f1E&0mP)T5g zNu1PH(a@qp8X;7RgIw{TrU=5Nz$J*lL8MGEA{rVTqK2!6A{!eV5`vaMiEs-WR2mwR zK#M#v^!&f!c*mh-zPtB$#QVPK`~H4>{O<4n?gR;?6uv{~;F|3Ul zm25Vv*Xz|lkB^Vf&(DX3h8TufUtbRfgVH)7#OL$rbh^#WO}Y8{`r2x>_V)G`i^a3E zvrHzlw6qishd&#BbaXU3J1du&Oa=h@`}@`0OdQ84OTXW*EJLACC=_bG!=llsvJ^$J zd9ok~05CW>_~TbN9F7*AFV5)2#l`FEYgbp7R8CAxv~%*Nr>EuIU@#O41(szSdakan z0O024rn|daT5-GG%?GL7um0fRz+^I6EEccVn@Xi7Cnwv18jZ#;d+zV=0YFv)z{$zU z;^LwjD5Z2^VWC_u`+Pn@5bSpQ;o;$*dKHyQrIC@5h7Dd`URDDoghV0{qtWPgyZ86^ z>-BnzEB@UOMNxU*Y;SLGY;351g(@F%gpjeZF%>34Nb{o2W~)}KQl3ty6N$vy+M0Uk z<>h56m6GymwQ8|gl+V$8KL7UirhKfHN~MMgl}hE|;h}l*%*;$OnUr#u%azS$zqs1g ze~887@y^c9$HzxPNTE>hcs%k)tE;Po5K5`pY+hMe0f5`v+tbrilgU&p7U$>ZS(e?| z*|V6aetCj0p^J zF&HhujBFf)YOzl zqxoJ7{NE3r=T}x%5JDK^R4Uck*=ey@zT4z)K(DT@>gwta4-ZMYyu3_NlpqM-YNGtZ zOozka*Vk8uVHk!fDJdcKY&Ls)d&~2DadELmqtR-$r2g{q^8EbFvTSK-DaUa&H8pZ8 zhGC3GV_{(-NlB2&WN4bEC<-BzNF)jh3iNt?EEeN9uBxhvVVHcsdY8*}aB!g4>sgld zcsz1_ettd_3h8t@j^o^JH$q5$o~G&A+FFFr;^Ja%D~4gbUTQBd9UUEYI-U9M(Qr6iQBgr+gpgLNC2=4SFq_TtV@F3vHk*ya z4Gj%)eRFg3s}&3c0xc~qkw}E3OG``1WD;XMH#bLG?eFhLqtSf#sMG1}>gxKv?r=El zcDtNDK0X?aMvmh!#vYGHrBe0x_it@&eWheswzs$U?Ck6xbwLoUR_of@+8_4l=S!c- zWIjGVey>ZClzTaWF_t7Lo6S-bWwBW9?(RA|I%a2Q?RNX8=jhDL%*4cm$z)04U+bPN$R8WHLz(7oX49+}teJPfkwcgJy7WP_DPNwTYsb z+c1?%t*)-hD?U9vEeOK<`}^_nu^ir zr?QTUj7(f9EP=Epypa2CZKmiI+fC3bt00k&O0SZun0`y-Q ZzW^ literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c3.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c3.png new file mode 100644 index 0000000000000000000000000000000000000000..0f55b7e17fa552ec9a97f0624582e5c8ab9c1c74 GIT binary patch literal 2532 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 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/2.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/2.png new file mode 100644 index 0000000000000000000000000000000000000000..09cb7f882c266d4f44fa14fd9e9d01009ded3ffd GIT binary patch literal 1148 zcmV-?1cUpDP)r6qN000CVNklB^;KP6E%As_6m@ubxVX58AL8|T8HUN} z<8(U38d08WbbEW7<2a+ysL^P2I$i!A!oqQ!Xq%MZ|Lg4RoS&aBr6XH!#?lv6)9H<$mzcs!mz z*PoxCVr?eix8L=8eU6f4S*O!!x7!gycDvo@^L>1L;HEU7Pft$(u)MsCepkv~qen+a z05Ci}T^*E3hQ+Z_&v!{IQV zD6A|fR9WvhJv{}0?(S|Opc4}l05Cp24geaBMy*!k8vvM`oD>K2{QMjM^m;vSN{`2b zZ~FTB0HC$C6*ueZ>Hxsya<#R!sZ=VV4!^gz7XXfrk9m8UL?V$$B#K$1(P**Upgd6g z-(s;CZ_r>c7z_rBSU2kaJ00v zd}Gz=bj2!yGDh_B@)AEw2q;a{G))(?Zf$L`EGsm7!aK?3av>=M%H2tCZ*M~0XSdtG zNvW2WmLidepepqF`MJ5dS*21%qtS{!De?RLq9jcok0;~v^TlGZFbpGTjjpb)0>H+` zhQOs3kH^#LbUK|b77mIz{8C5s;^G1T3pLQ_*y6*u+x8;Dqk^FIq(xuu8qtq&9akFjvMjuTAEUJI~@QzQ=R;%yXXSoaf9apePD|g8hX*#CT91ln3QOc~Bmd z2jxL|&FFswtw_Y^m@IerKPpCwX{AlG11r82cV*&LZMLn zzDLz+bzWW`OAG`805&!@D6TDi(A?bI{{DWJI6puC&2UO&X(rR%-5p7it*xyreSLjh zEEZ=`)~~It0cdV+X6ZJYO)8aU5vavt0U(h`Vnw^%{we)$f|^XG^73+)Xti3i3-s#h z3V>WLXX)G9+W;CG8nOj+e}5l9Wo2c2fEE`QXVDQ#d#^t0z6QW-`&j|Hx3>qN zzP>)5KHkkN^LRXFvl)P1uV-4b+3fLnm@aNkrk9r&00cp>^xocH07j!R`S4&c=<#?c ziaI+xV_LV{O_C%@l3uTuvy*9SYYRYodpk?d&(84~!=^x)ties9{{-KEQ=FNfRhcIK(#&1SQ4mP~Xl z%wnR`tFf^$l^FyA!H<`DE|=@mQEhE)02UV)znmcu2xMaEFD@?PHzokb$HxFv9Yn|=jTMR zt5T^FM(}@nXpu++;NjsRR-B!k1u#53oGl&=hr@4gZv;Wmdpl$FwX>zAC6!5ZIvstl z`qZPNqoW*n^ziTyKv!26OQ#q8{{B9dNl21R;=Dj0z(Lm2sm%&ddMh9ZqNu1Sl}T=H zZuELR6OJmCiY`qY4u`|xSYBS{AnS*Qh5*oI1Y>Tu8$eG_Puk&_C@9nSD4pHa)z$F< z8h;&4<#38^xvWPoFE5*#npon=$q9hY&dzLkNp^dC3!tN;<5N)9b@Vqu6M4>RwbBWZ zEueID$6ETw$Hzz{67S|8u@v)EB9SPSN|tCa7y$TuKI-Q!C67iT5vS8RFfhQU27aqH=O_=H}+8j94;ItyW9FxT~tF(rUH; zjsXS-2Q3zhP$;A_Wr8GsehCJHGMTKPpg<@T8jVIqpPrufdc6jN!D_YE)YN3=tBBys zf9ZrmA%Y-SVl)~R3Wb^ceDgIZ|3Qogna=s)!sZ9nuW Re)9kT002ovPDHLkV1hQz7aafq literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/4.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/4.png new file mode 100644 index 0000000000000000000000000000000000000000..483092e69a6bd7acc836a05ef1cfd97870c578c6 GIT binary patch literal 1406 zcmV-^1%djBP)8w$CT3z7@Pg;t7^#kC9Byi>^g>%@d)jb>g-8Jm}}IXnN0 zQ>XKsV|zB+{P*-fpNmub{Laok`@a8vn}8%q{0;EIUjkkzFO(O`3+09KLV2OQP&dG8 zwR)q_`T6 zb#-}pc}#v_U?4g=x}>CJX=#ZhNwe9^eeai~r-W8iR8&<}O-@b%pe>})XeiGF2L~r4 zBzVZ8|2Q5bx3{;WqoYctk|2oi@bI{}IEt^Wtt~Dt1`r<~pP!#^D|KAWC&#~2YisMT zU%yzS#bN<4GBQFlR;!i1+9y5b`q0qO^73*PIXpZJfR$cjV`JR6e@QwHN6V95ufM;) z&&kPQ@d|~)-``&-6f()MurTfuz9il6`oY0L04FCWY>xnCWo0b#{r#QASglqUv))mQ z&dtpMh>eY9lIQ2=0CID4SvM<{N|VVXm&FMd*RtX?8Gt*m!lG)i=04XUcEPiHYMko~e`T2Q^(8a|? zs-81RolXZpEEapwn76R703ahHy*8N=cuA|e1BA0K}^k-NIO z3iEkjdxcel}Kv}MtTh6YD1dU|>afVG7uNisDxm22j2;Q9I4&c4rRG&-8~R8{8= z@COG6Tr+ zz1jVBl&jL#2R}VMQHLl@oSvRiW0x2Gau*a7WU*K-E-tiMtxP8S`1sh^*tod3NJvO< zyHJ5Ef6yXH^2;&87XP0K<$qn~h4Mmqp}bIDC@+*3$_wR%{$GUt3jq?uS`N^A`2YX_ M07*qoM6N<$f;T9e%K!iX literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/5.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/5.png new file mode 100644 index 0000000000000000000000000000000000000000..604128ceda81954571b399706eec20a83e427dbe GIT binary patch literal 1486 zcmV;<1u^=GP)<{P+91{3MKt(I2;xau`K&v5z2Ag^z^h!rD|+!Y;A274%O7un9b%3 z7cQ)=t?}gN&!1CLQf}V7dH??X-74iIA}J}Ur>Cc(p#i}5_BJ6qJ3G~CHIdlX*2WtH z`10k;)vH(kU?B?sNV==Xj~}xvTT@drH#euzXcP(s;Vl-+lP6EMx3{yiv(KMDPsqD> z@201x=jP_>bh^aE!~^wcUS6KrY^KQG-d+HqP>AA_lapIoTDU!e1fk!*e+OW**(ly@ zHfLsLQl!`G1>kbI;vm#!vjLc$ou#J$>g($%vaPLc_i-tNgwT2U@+E-Nr%ww>;<p(NO>+92jEG49-@bi|mIT~l7j#oJ$h8gzkT~w{D?_3pE`AF z_vt7hAwgPOl}e>FkB*IviE9#R`2bL5X>f25 zfYE4-I_=QV5V_Tec=YJe&!0b~C491zUc7iAB>VdM0OaN6McheaV`JQ2Bf3!Dg+lV) zy?X$fnwlaS$Fi{9ZnxX*JB{ACb7ysRRf5pvwjHTAQ86$uz~_81+S}WI{P-bZ*H2DPMqE1(2rvvo_3#rD69BGU zxe|*|qtSTi&>@cFs5C^-+}up<`Y4ayY&MgmBP4x3AAs`ma?03XFaTItS&8v!k{QU= zYPEX3Ua!|{wOV;nLX48sO_AN*-2fgwd`R(1rBWQtJK@)_U(_|?P^>XJH#bN8B#uR@ zFAjx5TU%Qd6%~>SkMJ6CD5iuzGc&`tVdC;b6;G1tuV23&heI+_ImALgeE1;F1Ehe7 zjSoU7S-YsHNJuU&E&?bkE2E5uhld%4q2Brr=$$DiC&yqgP~`LH&q*c{pYn;1r4A_J zPfku&R#u8%M->VM6`;XjFcb<^S6A=jk@HS>K-$fvr6r2b%*?EgwvWS}h?L7ZC>m&J|iLaf9bF+%P>s5e!h_)RQ^Fs7Agysg~~!@ op|Vg}s4P?#Dhri`{_lkT3+S5(IQogUxBvhE07*qoM6N<$f-DWpApigX literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/6.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/6.png new file mode 100644 index 0000000000000000000000000000000000000000..287b6ca3da36e44daef8c3baa8ed58678a40ded8 GIT binary patch literal 1376 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 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/3.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/3.png new file mode 100644 index 0000000000000000000000000000000000000000..70b0f3e1d0603800b7411651fb2172f01955bb46 GIT binary patch literal 988 zcmV<210(#2P)Vd>x zh(89UNOW*>QgO)OB#6#}?xK^_;^wF*)WJW%MQ15?D&nL=hbjRBL6Xuz)E0}iw$`TD zJnwK4Uh3PLUXog0?ip@)?$;;JU7q{q!U6#E8;oOqiBV7rN?B^%u^3{ez^hK5`Rl_Y6-d6{7tgwWR3R-sU+(Kwk*777Jf zmTzuu%zKTwxw&vS>_AB2JDZ=M$1M*I4#2V{5{b>tP24e;%YkiUtTbwGZ^u(65{bG- zFPF=rC~jEx3{_PzXkT9+!5pF}HYlP1u)Dj9Sr-=<>zyN&N`=GW27v;=^z<}l z4TVDBgc*immQI2ei^bN~R?M1Cr|lq0k`xRE0bq7^)+~d;pd?9V6*(vXTwGjW(2*RNq_>K#202w>Lr^>t#zwY9b9=jUp*IKXy60YDH0%zAlw2~JzJjY|TW&1OG^ z0>|mPPB6mG&Q3O)tya6by6Q|s0U#6#Vb+O>39?5mm&?^^|G6s|;x)n=fMJ-ImzR3` zo}Zt;zrRLizW`}_M0!(3lqcXV_Rbgx^H5l58g`JG$^bhKGl3CQH{7{@K|X$8p7C z(ed2w*b!=~();^+i+aa2MNujQmy4q0?d^^D%p4mVt2d(Ld311a@bK`^l%y6dl}e3{ zj?T=?)JUa&mv-~$fUOm6d2T>h*f3rl!6< zZ0_#v9v&VH!!VtKAed^)#qat^ByxOw+|$#eD2l}qySuypzJT!i{f^{Ul7vt1p4^{v9v>eyO>0I_^NX~G=jTB)nT#yU{r&ws&kKU!@puLX24q>zWHQYK ziV*Vod=*Zg&xa6l36$`y$638%t#w^*X=x$8Om!uq`FuVWi&Z#du~`f__Rb3(g+~)pb1{k5@S3@wl$*%>~NyJVHoS)pR-?jYdnQ((UanLWt-2pZP0N z!@9b<+S=L>LcP7c9LIHbc6z;D_Yyu8B@~o`Qcwy?K`H3}4f+Sw?_4!#iGgVV0000< KMNUMnLSTYc2hrsK literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/other.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/other.png new file mode 100644 index 0000000000000000000000000000000000000000..a5796aa82861db92a8d248df72c151f187032dd9 GIT binary patch literal 40838 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 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/2.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/2.png new file mode 100644 index 0000000000000000000000000000000000000000..1eac155aae83d21adcf8317a8dcf8f80d0d964bd GIT binary patch literal 464 zcmV;>0WbcEP)kFIhEeSa-?0_iGXe9`6j}$k%mcCFp|{B7g!Epa2CZ zKmiI+fC3bt?*hs>H^!vc7{fWgx|C6$$A`9UD}+d~5Tb3{t4q1Wi~kEHA|kqR;<7Bm zFf7ZGnRMMz(=<)ftk>neXN-C8*R0x2eX_Hz>l=;|QC-(nRiQ>p1XW5YrEZ)^L|xb2 zyNFLa`Wxkh8b!lL!^dSp!$-qMjiTYB;b(C)yR5Y_#uOyKz4s}IF zRsfT3sK2D5(ex;&k1kQIb)M%Tk$Il` zyWd}=o>D4=@U{?wQu?av@Qd^N$+YL?Ohn(rL!!{ zvTVa;UMWQgQA(ZhQkbCLmorV%ZKq|Lrb&{ZM`KKsa~}A>9rsL86x#;z>WZG%Na#@r zJ_H}b1i^>kqemh55d57LJsee4HBI9UUvH(9H=3rYs%mJ=VS1Q^5YN9WTI7#8R{9H&!njA4w0L^8$}R%h7UMRzh`Y5Q-f$I=$m-<^6aZSPu9ENx?a xg@$bIR<8ti5&R@cmS1V09*H7RB#K1$;RE-1D=}0)oB99%002ovPDHLkV1iV9H}S_Bo$H_!nbQ-+;jDu5E`06Op=m|+}7Bbtz?**&e|;1ia&Z`WcN1~`KK!9fgxB2Wa1 zKoKYcMW6_D_dxr;Cxm#XC<=cwIE0YC@5fG7E6$)tyRI|FEKXsJ>ADVM^h{f?wRX-e zPT`!>T4Rjj*5|Te-rBa6QVvTdrEJ@F$ZU{fQYobnB3yFL!w07ieF7-we7sixz&T$# zv;yd^w!Zk?-jmk)dcAJr0mc|(Y&B5ESjzjf*3s-)cIio2D5b2mi_v4PRZ8WK(Pt}K z*R@Zf&bi0q5!7^)4vaB%U4Ju1LlQT}csM=pizb5F)htecM0O1?fYPUBYvdTBfS1s;U;#$^Cx6-EL96HKqbWNT{pQhYneV zo+3s!Hy}O@G_gP{%W|?DL*cydpAGm!?2{`RjL!B2WbSiv0udZFR4YSI^i00000g8T0lfZwA=02AVwwz zM&8`=`8)swgTc4lN~IFM7YhIig+g+&_6}b#=waxej~e#(_tk3k!^6Y$^z`7RHAt)j z5Nfqr-z^e#34$O9LVap&Zf@3_nnPQ4e}CT`+Gx;Luc1Dl?^Amk1M*B5S-zi4$&}+b z0C;+O5{s9Ym+5rcXf%GyG!zPzN+pFt;dZ+L;PLU1n4FyK-nDi8 z6+bL4E@HQ$xlg7Ni-r`Lk|~+~FjIzMq&F3p%3`rtuW`9t7Z(?ue)roR!vsOdX0wQR za&i(5hhJV^5HXodiZMe&Lv8LqI_U3zjg5@~K($&`tJNNl2LOhLhfhyW0bpxuD;A4= zfwWc6&(DaMN~O~2v{>W!`)jpY&vz(@Xf~VQj=GX;&?Y7(5V24w;5XEqKEp`xKtAmK z#*rw&Gv#?607gegX){5lWJ;z#^mH;X*%K&%5-5QZD1j2_?*SDzJu)5~dn}&kr>3U* z2I_P=6N$w7`nq^2n~ zFDjMFTrLLyM@L64xw1WKR;+8g}?rgtsVb*VU-00000NkvXX Hu0mjf&?kid literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c2.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c2.png new file mode 100644 index 0000000000000000000000000000000000000000..572ad1ffba49478afcee3e46fee8198be363a0f6 GIT binary patch literal 626 zcmV-&0*(ENP)k^+-H{C=?P8pdyM%m_&y}rBd<=I*AF*BpP182#HA;fs8*|az23=Wa^H2mUMG`DriI<@ zc2=vE5Q2Nalmqi4*GK5PL2Wi00Ho7t&Ra^;w9RJY@pxWrpB|4#08kVq7K^def3Ost zPA5VLr8F1};xR?&Z-L@IMJPfM${N*bRZ)~%74*RvjYgExMx$|~=E=L1-EQA*w>;Y~ zm&-SZ&$K_A%|fA2AQ0f+K8MwBx7z?9NfImdZoiTw8QmNXhvjm~GDWO&DhLAmyx)h4 zqDU#7PN(e9`*Z4aI>+O2tJP9f6(7+EMJPfMYU-`;ZMsKM6h%=KMNt$*QBF}Rm5jvY zat#K9*A*26!ALThOsCU%20=}XL?W?REY9ci6W=xIHLuxh`g}fz!(p*ldc9sgpU3yn zUn81IrS|*%d_IpvBH3&f0NieOx7+1r%H@>EvTP*7;qZqJC}(Ii8m-ssMy{$VM>2<{ zmt~m{vRbVQg@Uf@@pv2nipApfe@yUKD2k#eilQirq9}@@D2jfHzc(*hEZq7lZ=Pp& z{kpuzzH_Q`?>)ZvbLQSV_kaNa^1*(P&+N3`cDt?k%;szi^WOX&`}X#xL@?B3%*As% zxR>Yo^OAk8aD>1$gfa|s!)bksCAfjmMx#LpQK?jf5QoF@#~6HJola+~hhnwtcKe~B zudlDTUC!_XE;2ug{%@k`bo$}p;b>LZY0Kpj0Q`P`p-=#TZnv9Cr2rt2NbLC39?_5H z@p$&e>`8wznb>T$&6krXii^d9Dt!R3*=)yVgJ&N_&uqA*P!vT`6h*g96vcYIZZsM< zuXNh7Cmap~Krk3wHyu0N_5{U%IanH}syTgty z&2y*p)Opk`N_xFSluh&aSNqd+ol}a+1bi3VO1*B3b$|=sa^gPc80)dy8m#zL%sZ^`g z?(XggA%Y-0Jw2IBrhoQC0bn|vp73Yy33f9#6V=kUS}jSE)M~XTiawuDuh(BGC>A9M jil7LJpa_bfS8qQ7ClFT@Dkzn>00000NkvXXu0mjf=doX; literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/1.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d0f2e56f9112404f1e0371b7c6de48d3056e20 GIT binary patch literal 800 zcmV+*1K<3KP)20008NNkl zJGj(A9E27Jhq|b^xw*Lb4;0jYz{S}=A+teO9kk%Af?ATr#UEJEE=7Y%(SVT1c|#s~ z)*5T_;xFF$rh89LzI-?L}8y*gaK|k=@M^cl4A%&z!ilj%+P+neMtXAuW@#*Qw z$ZV>j*Xx;_p%jZnT~qX4q#ln40P^`f$8kHd9et$g65q63Dw#~GspPtSbET&%q&`1C zl|r-G{8v)1*Q*p5hA}Pp8;u6f^M1cyD=H0UeKwmdo6V}#L?Xem>_&I#?)|}F0EU3` zK9V9SlKzLQlZ$CR3PqtP6osNt6pBL62DG_!JkQ7D@nA4WQPghF>+9=ODs{5#$>nmj z+wF7j`amF{ZdWMBN_d_Z1VIo4p66BL-xDXg049N9m|QNWloyKy%d$KE*K-`Fm){(r zqtPf73aM2|lDgflmh*T#-e)iCAo~ywhvV(-?Hq@v<#MT(qtR%&Tt2&Tbg@_vLM#@G zQZ1EAZnxX%bRK*lH5QbWO6B?ad9_-3z25IvB}wY{`&#!-CKCfOYOw2lKHtsFjlds?HH&40000C=?1yLZyXP+SwbUg;vWCAfdn?AjSq8jEx;6K-6eR4C`m1Awe{{?k?vQ zlecdlyWp8|N?x@BMJ@bvTq;PUcPvv4Qi_@^s?rKKf(wOXxe%&D}85yz4iWaEVYFfEeDy^-p0Vos-nz2wQ2!ddGZ%a~BEG{nUtKo3i zHmUZ$N+c4zkj-ZG9k#Z%-l8-bjSdbDYSqWbNBxWP>gvk$E_(Kf)M1cI5h;-p={F@! zr_*O=XR<7}+d12P^+}S{)z!sgo{o+VXO!OD-0;G~!vkY15C}Lxy0^E-3+LzOjIouK z6~e94z*2xVFfd@uM6`h=mpVQ^<^_u@ z)-LFc#bSJC+tbs-jb5+!T|qB^?d@#fl!Lit(T$;rvl(NQ9ikR&OYO!CvYxw*Mwv1oC$b|;v@A!M`J<>h7T%kpVL zM@L7Ej@u?@Wigv)FRf>UAP5r^6XkN5SI5T2N~Ka$pIj~{%W^A*{r!D+pL#vIySo9b zuCDIx?iyRy*Vo%*R`nlsxxVzdTyAo5a(;f^v{e+vOeO<>AIDVW2LO-}IEfzEtZQp)l}hEa0002+`1lAKIBe43 zu(xmBZnsjYyuQBbd<_5`4u_2z^m#21e7C7fTWGafu~@9pXcUV@#ga%Qh}IjU;CX)3 zINbE&;sOlt;~w~N0e`8fYt&RI6r4`yxYH${&vP92#dJv~lPuFkU9CFZy1u^tXV5k6 zhP6IFKZ7xFx>)dlE#F7dUr8zm0wKiX@vyLhDSEvg02GTwumUoE(`K_dG16={t31fE z{9V$^%S!+Vhr_zHgTY`h7_cby`~AQKT>D5mVc?WPQY1xE`$>m13@a*htnnEoHCE0A&>-DD7X+p@#%F4mP!S3#^Qq}2n&d<;1 z=H|X6SzcZ?Jjh_%jGN%;>1lp`UTX;kgJ2sNg(eb-Znvw*RV+rinjaHNDV?32otc?& zxm<*hhld9M$mMeCm5hGB-)gl0;O6E=NrlO>%=0|Y^Rg`8-``KwqgveE-NoZ^wJ1rF zNlMN90LNaT3kwU{BFAyMw_?-*nefrhnAqCds@LmU%kAy0lC{-EtyY`HfAr+!#O-#g z_cKbRQZyPJN+a_;|Nj1N#L#ZH8C}9K3LcLK07Ow-U0ofmEtktCxn%R>&HNC}@$z+&+G`}d3jnNYdMWHAZg`!XtibAd812|k# UAGE!VT>t<807*qoM6N<$f(pB&>i_@% literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/4.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/4.png new file mode 100644 index 0000000000000000000000000000000000000000..66470a6b0d6767dbe7e4b9d716d09a6e32ee3256 GIT binary patch literal 916 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 V=M|+_tOS-e44$rjF6*2UngE4UFRK6m literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/base.css b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/base.css new file mode 100644 index 0000000..355d9b0 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/base.css @@ -0,0 +1,40 @@ + +.kf-editor { + width: 100%; + height: 100%; + border: 1px solid #e0e0e0; + position: relative; + top: 0; + left: 0; + + overflow: hidden; + z-index: 2; + background-color: #f6f5ee; +} + +.kf-editor-edit-area { + position: relative; + top: 0; + left: 0; + + z-index: 1; + height: 0; + background-color: white; + /*background-color: white;*/ + /*background-size: 21px 21px;*/ + /*background-position: 0 0,10px 10px;*/ + /*background-image: -webkit-linear-gradient(45deg,#efefef 25%,transparent 25%,transparent 75%,#efefef 75%,#efefef),-webkit-linear-gradient(45deg,#efefef 25%,transparent 25%,transparent 75%,#efefef 75%,#efefef);*/ + /*background-image: linear-gradient(45deg,#efefef 25%,transparent 25%,transparent 75%,#efefef 75%,#efefef),linear-gradient(45deg,#efefef 25%,transparent 25%,transparent 75%,#efefef 75%,#efefef);*/ +} + +.kf-editor-canvas-container { + width: 100%; + height: 100%; +} + +.kf-editor-input-box { + position: fixed; + top: 0; + left: -99999999px; + z-index: 999999; +} \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/page.css b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/page.css new file mode 100644 index 0000000..8026403 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/page.css @@ -0,0 +1,12 @@ + +html, body { + width: 100%; + height: 100%; + padding: 0; + margin: 0; + background: rgba( 48, 48, 48, 0.5 ); +} + +body { + height: 1000px; +} diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/scrollbar.css b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/scrollbar.css new file mode 100644 index 0000000..b8254b0 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/scrollbar.css @@ -0,0 +1,78 @@ +/*! + * 滚动条 + **/ + +.kf-editor-edit-scrollbar { + width: 100%; + height: 16px; + position: absolute; + bottom: 0; + left: 0; + z-index: 994; + border-top: 1px solid #ddd; +} + +.kf-editor-ui-left-button { + position: absolute; + top: 0; + left: 0; + width: 5px; + height: 100%; + background: white; +} + +.kf-editor-ui-right-button { + position: absolute; + top: 0; + right: 0; + width: 5px; + height: 100%; + background: white; +} + +.kf-editor-ui-track { + position: absolute; + top: 0; + left: 5px; + width: 0; + height: 100%; + background-image: url(../images/scrollbar/edit/bar-left.png), url(../images/scrollbar/edit/bar-right.png), url(../images/scrollbar/edit/bar-bg.png); + background-repeat: no-repeat, no-repeat, repeat-x; + background-position: 0 0, right 0, 0 0; +} + +.kf-editor-ui-thumb { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 100%; +} + +.kf-editor-ui-thumb-left { + width: 5px; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: url(../images/scrollbar/edit/thumb-left.png) no-repeat 0 0; + z-index: 1; +} + +.kf-editor-ui-thumb-right { + width: 5px; + height: 100%; + position: absolute; + top: 0; + right: 0; + background: url(../images/scrollbar/edit/thumb-right.png) no-repeat 0 0; +} + +.kf-editor-ui-thumb-body { + position: absolute; + top: 0; + left: 5px; + width: 0; + height: 100%; + background: url(../images/scrollbar/edit/thumb-bg.png) repeat-x 0 0; +} \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/ui.css b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/ui.css new file mode 100644 index 0000000..e8ac470 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/styles/ui.css @@ -0,0 +1,536 @@ +/* 工具栏 */ +.kf-editor-toolbar { + width: 100%; + padding: 1px 10px; + position: relative; + top: 0; + left: 0; + z-index: 2; + background-color: #f6f5ee; + border-bottom: 1px solid #ccc; + -moz-box-shadow:1px 1px 1px rgba( 0, 0, 0, 0.1 ); + -webkit-box-shadow:1px 1px 1px rgba( 0, 0, 0, 0.1 ); + box-shadow:1px 1px 1px rgba( 0, 0, 0, 0.1 ); + color: #000; + font-family: Helvetica, Arial, "微软雅黑", "Microsoft YaHei", "宋体", sans-serif; +} + +/* 按钮 */ +.kf-editor-ui-button { + padding: 8px 6px; + height: 79px; + font-size: 12px; + display: inline-block; + border: 1px solid transparent; + border-radius: 3px; + cursor: default; + position: relative; + top: 0; + left: 0; + z-index: 3; + vertical-align: top; + opacity: 0.5; + margin-right: 1px; +} + +.kf-editor-toolbar .kf-editor-ui-overlap-button { + width: 100%; + height: 25px; + background: #53b856; + border-radius: 0; +} + +.kf-editor-ui-button-icon { + width: 32px; + height: 32px; + margin: 2px auto; +} + +.kf-editor-ui-button-label { + color: #666; + text-align: center; + display: block; + font-size: 12px; + line-height: 20px; +} + +.kf-editor-ui-overlap-button .kf-editor-ui-button-label { + padding: 3px 5px; + text-align: left; + color: white; + font-size: 12px; +} + +.kf-editor-ui-button-sign { + border: 4px solid transparent; + border-top-color: #2d2d2d; + width: 0; + height: 0; + display: inline-block; + margin: 8px auto; + vertical-align: top; +} + +.kf-editor-ui-button-mount-point { + display: none; + position: absolute; + bottom: -2px; + left: -1px; +} + +.kf-editor-ui-overlap-button .kf-editor-ui-button-mount-point { + width: 100%; + height: 10000px; +} + +.kf-editor-ui-wrap-group { + overflow-x: hidden; + overflow-y: auto; +} + +.kf-editor-ui-overlap-button .kf-editor-ui-button-mount-point { + top: 27px; +} + +.kf-editor-toolbar .kf-editor-ui-button-in { + border-color: #8fcc91!important; + background: #e0f0dd!important; +} + +.kf-editor-toolbar .kf-editor-ui-overlap-button { + padding-top: 0; + padding-bottom: 0; + border-color: #61b864!important; + background: #61b864!important; +} + +/* 分割符 */ +.kf-editor-ui-delimiter { + width: 11px; + height: 100%; + display: none; +} + +.kf-editor-ui-enabled.kf-editor-ui-button:HOVER { + border: 1px solid #a9d9ab; + background: #ebf7e6; +} + +.kf-editor-ui-enabled.kf-editor-ui-overlap-button:HOVER { + border: 1px solid #53b856; + background: #53b856; +} + +.kf-editor-ui-delimiter-line { + width: 1px; + height: 100%; + margin: 0 auto; + background: -webkit-linear-gradient(top, rgba(233, 233, 233, 0.11), rgba(92, 92, 92, 0.20) 60%, rgba(92, 92, 92, 0.41) 80%, rgba(123, 123, 123, 0.50)); +} + +/* box */ +.kf-editor-ui-box { + border: 1px solid #b3aead; + border-radius: 3px; + box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.11); + background: white; + position: absolute; + top: 0; + left: -1px; + overflow-x: hidden; + overflow-y: auto; +} + +.kf-editor-ui-area .kf-editor-ui-box { + border-color: #61b864; +} + +.kf-editor-ui-box-container { + font-size: 12px; +} + +.kf-editor-ui-box-group-title { + background-color: #f7f6f0; + height: 23px; + line-height: 23px; + font-size: 12px; + border: 1px solid #ebeae4; + border-width: 1px 0; + padding-left: 12px; +} + +.kf-editor-ui-box-group-item-container { + padding: 7px 9px 17px 9px; +} + +.kf-editor-ui-overlap-container { + overflow: hidden; +} + +.kf-editor-ui-area .kf-editor-ui-box { + top: -1px; +} + +.kf-editor-ui-overlap-container .kf-editor-ui-button-sign { + border-top-color: white; + border-width: 4px; + margin-left: 10px; + margin-top: 8px; +} + +.kf-editor-ui-yushe-btn .kf-editor-ui-box-item { + border: 1px solid transparent; + padding: 5px; +} + +.kf-editor-ui-box-item { + display: inline-block; + margin: 4px; +} + +.kf-editor-ui-box-item-content:HOVER { + border-color: #dff3df; +} + +.kf-editor-ui-box-item-content:HOVER .kf-editor-ui-box-item-val { + border-color: #6eb864; +} + +.kf-editor-ui-area .kf-editor-ui-box-item { + position: relative; + top: 0; + left: 0; + width: 32px; + height: 32px; + border: 0; + margin: 3px; + padding: 0; + z-index: 1; +} + +.kf-editor-ui-area .kf-editor-ui-box-item img { + width: 32px; + height: 32px; +} + + +.kf-editor-ui-box-item-label { + margin-bottom: 5px; +} + +.kf-editor-ui-box-item-content { + background: white; + border: 1px solid white; +} + +.kf-editor-ui-area .kf-editor-ui-box-item-content { + position: absolute; + top: 0; + left: 0; +} + +.kf-editor-ui-area .kf-editor-ui-box-item-content:HOVER { + border: 1px solid #dff3df; +} + +.kf-editor-ui-box-item-val { + padding: 5px; + line-height: 0; + border: 1px solid #808080; +} + +.kf-editor-ui-area .kf-editor-ui-box-item-val { + padding: 0; + margin: 0; +} + +/* area */ +.kf-editor-ui-area { + height: 79px; + display: inline-block; + cursor: default; + position: relative; + top: 0; + left: 0; + vertical-align: top; + opacity: 0.5; + z-index: 4; + border: 1px solid #e0dfd5; + border-radius: 4px; + background: white; + margin: 8px 10px; +} + +.kf-editor-ui-area-container { + width: 293px; + height: 70px; + /*margin: 7px 5px 5px 5px;*/ + margin: 5px; + display: inline-block; + border-right: 0; + vertical-align: top; + position: relative; + top: 0; + left: 0; + overflow: hidden; +} + +.kf-editor-ui-area-panel { + position: absolute; + top: 0; + left: 0; + line-height: 0; + background: white; + -webkit-transition: top 0.5s linear; + -moz-transition: top 0.5s linear; + transition: top 0.5s linear; +} + +.kf-editor-ui-area-button-container { + display: inline-block; + width: 16px; + height: 100%; + overflow: hidden; + text-align: center; + border: 0 solid #D3D3D3; + border-left-width: 1px; + background-color: #f2f0e6; +} + +.kf-editor-ui-moveup-button, .kf-editor-ui-movedown-button { + line-height: 25px; + height: 30px; +} + +.kf-editor-ui-moveup-button { + background: url("../images/toolbar/btn.png") -304px 9px no-repeat; +} + +.kf-editor-ui-movedown-button { + border: 1px solid #D3D3D3; + border-width: 1px 0; + background: url("../images/toolbar/btn.png") -325px 9px no-repeat; +} + +.kf-editor-ui-area-button { + width: 100%; + height: 50px; + line-height: 26px; + background: url("../images/toolbar/btn.png") -346px 0 no-repeat; +} + +.kf-editor-ui-enabled .kf-editor-ui-area-button:HOVER { + background-color: #e5e4e1; +} + +.kf-editor-ui-enabled .kf-editor-ui-moveup-button:HOVER { + background-color: #e5e4e1; +} + +.kf-editor-ui-enabled .kf-editor-ui-movedown-button:HOVER { + background-color: #e5e4e1; +} + +.kf-editor-ui-area-button-container .kf-editor-ui-disabled { + opacity: 0.25; + background-color: transparent!important; +} + +.kf-editor-ui-area-mount { + position: absolute; + top: 0; + left: 0; + display: none; +} + +.kf-editor-ui-overlap-title { + width: 100%; + line-height: 1.5; +} + +/* list */ +.kf-editor-ui-list { + background: #f9f8f5; + border: 1px solid #b3aead; + border-radius: 3px; + position: fixed; + top: 0; + left: 0; + box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.11); +} + +.kf-editor-ui-list-bg { + display: none; +} + +.kf-editor-ui-list-item-container { + position: relative; + top: 0; + left: 0; + z-index: 2; +} + +.kf-editor-ui-list-item { + line-height: 24px; + padding: 2px 6px; + border: 1px solid transparent; + border-width: 1px 0; +} + +.kf-editor-ui-list-item-select { + color: #61b864; + font-weight: bold; +} + +.kf-editor-ui-list-item-select .kf-editor-ui-list-item-icon { + visibility: visible; + width: 16px; + height: 16px; + background: url(../images/toolbar/btn.png) no-repeat -367px 0; +} + +.kf-editor-ui-list-item:HOVER { + border-color: #beddbf; + background-color: #ecf3e9; +} + +.kf-editor-ui-list-item-icon { + width: 16px; + height: 16px; + display: inline-block; + vertical-align: middle; + margin-top: -2px; + margin-right: 4px; + visibility: hidden; +} + +/* area 内容区 */ +.kf-editor-ui-area-item { + width: 26px; + height: 26px; + position: absolute; + top: 0; + left: 0; +} + +.kf-editor-ui-area-item-inner { + width: 34px; + height: 34px; + border: 1px solid white; + position: absolute; + top: -4px; + left: -4px; + -webkit-transition: all 0.1s linear; + -moz-transition: all 0.1s linear; + transition: all 0.1s linear; + + -webkit-transform: scale( 0.76 ); + -moz-transform: scale( 0.76 ); + transform: scale( 0.76 ); +} + +.kf-editor-ui-enabled .kf-editor-ui-area-item-inner:HOVER { + border-color: #dff3df; + + -webkit-transform: scale( 1 ); + -moz-transform: scale( 1 ); + transform: scale( 1 ); +} + +.kf-editor-ui-area-item-img { + width: 32px; + height: 32px; + border: 1px solid #808080; + -webkit-transition: all 0.1s linear; + -moz-transition: all 0.1s linear; + transition: all 0.1s linear; +} + +.kf-editor-ui-enabled .kf-editor-ui-area-item-inner:HOVER .kf-editor-ui-area-item-img { + border-color: #6eb864; +} + +.kf-editor-ui-enabled { + opacity: 1; +} + +.kf-editor-ui-overlap-container .kf-editor-ui-box-item { + width: 34px; + height: 34px; + border: 1px solid white; +} + +.kf-editor-ui-overlap-container .kf-editor-ui-box-item-content:HOVER { +} + +.kf-editor-ui-overlap-container .kf-editor-ui-box-item-val { + width: 32px; + height: 32px; +} + +/* scrollbar */ +.kf-editor-ui-box::-webkit-scrollbar { + width: 17px; + background: url(../images/scrollbar/custom/bg.png) 0 0 repeat-y white; +} + +.kf-editor-ui-box::-webkit-scrollbar-button:end:increment { + height: 5px; + background: url(../images/scrollbar/custom/down.png) 0 0 repeat-y white; +} +/*定义滚动条渐减按扭的样式 */ +.kf-editor-ui-box::-webkit-scrollbar-button:start:decrement { + height: 5px; + background: url(../images/scrollbar/custom/up.png) 0 0 repeat-y white; +} + +/* 垂直滚动条的第三层轨道的上段 */ +.kf-editor-ui-box::-webkit-scrollbar-track-piece:vertical:start { + background-image: url(../images/scrollbar/custom/top.png), url(../images/scrollbar/custom/bg.png); + background-repeat: no-repeat, repeat-y; +} +/* 垂直滚动条的第三层轨道的下段 */ +.kf-editor-ui-box::-webkit-scrollbar-track-piece:vertical:end { + background-image: url(../images/scrollbar/custom/bottom.png), url(../images/scrollbar/custom/bg.png); + background-repeat: no-repeat, repeat-y; + background-position: 0 bottom, 0 0; +} +/* 垂直滚动条的滑动块 */ +.kf-editor-ui-box::-webkit-scrollbar-thumb:vertical { + /*background: url(./images2/bar.png) 6px 0 no-repeat;*/ + /*background-size: 6px;*/ + -webkit-border-image: url(../images/scrollbar/custom/bar.png) 8; + border-width: 10px; +} + +.kf-editor-ui-wrap-group::-webkit-scrollbar { + width: 17px; + background: url(../images/scrollbar/custom/bg.png) 0 0 repeat-y white; +} + +.kf-editor-ui-wrap-group::-webkit-scrollbar-button:end:increment { + height: 5px; + background: url(../images/scrollbar/custom/down.png) 0 0 repeat-y white; +} +/*定义滚动条渐减按扭的样式 */ +.kf-editor-ui-wrap-group::-webkit-scrollbar-button:start:decrement { + height: 5px; + background: url(../images/scrollbar/custom/up.png) 0 0 repeat-y white; +} + +/* 垂直滚动条的第三层轨道的上段 */ +.kf-editor-ui-wrap-group::-webkit-scrollbar-track-piece:vertical:start { + background-image: url(../images/scrollbar/custom/top.png), url(../images/scrollbar/custom/bg.png); + background-repeat: no-repeat, repeat-y; +} +/* 垂直滚动条的第三层轨道的下段 */ +.kf-editor-ui-wrap-group::-webkit-scrollbar-track-piece:vertical:end { + background-image: url(../images/scrollbar/custom/bottom.png), url(../images/scrollbar/custom/bg.png); + background-repeat: no-repeat, repeat-y; + background-position: 0 bottom, 0 0; +} +/* 垂直滚动条的滑动块 */ +.kf-editor-ui-wrap-group::-webkit-scrollbar-thumb:vertical { + -webkit-border-image: url(../images/scrollbar/custom/bar.png) 8; + border-width: 10px; +} \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.css b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.css new file mode 100644 index 0000000..de07bba --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.css @@ -0,0 +1,540 @@ +/** + * 所有构件样式规则 + **/ +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-widget { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-drag: none; + color: #000000; + line-height: 1.5; + font-size: 12px; + font-family: "ff-tisa-web-pro-1", "ff-tisa-web-pro-2", "Lucida Grande", "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; + -webkit-font-smoothing: antialiased; + outline: none; + display: inline-block; + vertical-align: top; + position: relative; + top: 0; + left: 0; +} +.fui-widget.fui-selectable { + -webkit-user-select: text; + -khtml-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + -webkit-user-drag: text; +} +.fui-widget * { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-drag: none; +} +.fui-widget.fui-disabled { + opacity: 0.3!important; +} +.fui-widget.fui-hide { + display: none!important; +} +.fui-widget.fui-mask-animate { + -webkit-transition: all 0.2s; +} +.fui-widget.fui-mask-hint { + -webkit-transform: perspective(600px) translateZ(30px); +} + +/** + * 容器类通用样式 + **/ +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-container { + overflow: hidden; + position: relative; + top: 0; + left: 0; +} +.fui-container.fui-disabled { + opacity: 1!important; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-button-menu { + border: 1px solid white; +} +.fui-button-menu:HOVER { + border-color: #d5e1f2; +} +.fui-button-menu.fui-button-active { + border-color: #d5e1f2; + background: #d5e1f2; +} +.fui-button-menu.fui-button-active .fui-button { + background: #d5e1f2; +} +.fui-button-menu.fui-layout-top, +.fui-button-menu.fui-layout-bottom { + text-align: center; +} +.fui-button-menu.fui-layout-top .fui-open-btn, +.fui-button-menu.fui-layout-bottom .fui-open-btn { + display: block; +} + +/** + * 通用button + */ +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-button { + overflow: hidden; + cursor: default; + font-size: 0; +} +.fui-button ._layout .fui-label { + display: block; +} +.fui-button ._layout .fui-icon { + display: block; +} +.fui-button .fui-icon { + display: inline-block; + vertical-align: middle; +} +.fui-button .fui-label { + display: inline-block; + vertical-align: middle; +} +.fui-button.fui-button-layout-top .fui-label { + display: block; +} +.fui-button.fui-button-layout-top .fui-icon { + display: block; +} +.fui-button.fui-button-layout-bottom .fui-label { + display: block; +} +.fui-button.fui-button-layout-bottom .fui-icon { + display: block; +} +.fui-button:HOVER { + background-color: #d5e1f2 !important; + color: #000000 !important; +} +.fui-button:ACTIVE { + background-color: #87a9da !important; + color: #000000 !important; +} +.fui-button.fui-disabled:HOVER { + background-color: #ffffff !important; + color: #000000 !important; +} +.fui-button.fui-disabled:ACTIVE { + background-color: #ffffff !important; + color: #000000 !important; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-colorpicker { + background-color: #fff; +} +.fui-colorpicker-container { + border: 1px solid #d3d3d3; +} +.fui-colorpicker-container .fui-colorpicker-title { + background: #eee; + padding: 2px 4px; +} +.fui-colorpicker-container .fui-colorpicker-colors { + margin: 0; + padding: 0; + font-size: 0; + line-height: 0; +} +.fui-colorpicker-container .fui-colorpicker-colors-line0 { + margin-bottom: 3px; +} +.fui-colorpicker-container .fui-colorpicker-item { + display: inline-block; + margin: 0 2px; + width: 13px; + height: 13px; + border-style: solid; + border-width: 1px; +} +.fui-colorpicker-container .fui-colorpicker-commoncolor, +.fui-colorpicker-container .fui-colorpicker-standardcolor { + margin: 4px 3px; + white-space: nowrap; +} +.fui-colorpicker-container .fui-colorpicker-toolbar { + margin: 4px; + height: 27px; +} +.fui-colorpicker-container .fui-colorpicker-toolbar .fui-colorpicker-preview { + display: inline-block; + height: 25px; + line-height: 25px; + width: 120px; + border: 1px solid #d3d3d3; +} +.fui-colorpicker-container .fui-colorpicker-toolbar .fui-colorpicker-clear { + display: inline-block; + height: 25px; + line-height: 25px; + width: 60px; + border: 1px solid #d3d3d3; + font-size: 12px; + text-align: center; + position: absolute; + right: 5px; + cursor: pointer; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ + +/** + * 通用button + */ +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-dialog { + position: fixed; + top: -1000000px; + left: -100000px; + border: 1px solid #B1B1B1; + background: #fff; +} +.fui-dialog .fui-panel-content { + width: auto!important; + height: auto!important; + padding: 2px; +} +.fui-dialog .fui-dialog-caption { + margin: 0; + padding: 5px; + font-size: 16px; + font-weight: normal; + line-height: 1; + display: inline-block; +} +.fui-dialog .fui-dialog-head .fui-close-button { + float: right; +} +.fui-dialog .fui-dialog-head .fui-close-button .fui-close-button-icon { + width: 16px; + height: 16px; + background: url("images/close.png") no-repeat 0 0; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-drop-panel { + border: 1px solid #d3d3d3; + overflow: hidden; + position: relative; +} +.fui-drop-panel .fui-drop-panel-content { + display: inline-block; +} +.fui-drop-panel .fui-drop-panel-placeholder { + display: none; +} +.fui-drop-panel .fui-drop-panel-button { + border-left: 1px solid #d3d3d3; + visibility: visible; +} +.fui-drop-panel .fui-drop-panel-button:HOVER { + border-color: #d5e1f2; +} +.fui-drop-panel .fui-drop-panel-button:ACTIVE { + border-color: #87a9da; +} +.fui-drop-panel:HOVER { + border-color: #d5e1f2; +} +.fui-drop-panel:HOVER .fui-drop-panel-button { + border-left-color: #d5e1f2; +} +.fui-drop-panel:ACTIVE { + border-color: #87a9da; +} +.fui-drop-panel:ACTIVE .fui-drop-panel-button { + border-left-color: #d5e1f2; +} +.fui-drop-panel.fui-drop-panel-open { + overflow: visible; +} +.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-content { + border: 1px solid #d3d3d3; + position: absolute; + top: -1px; + left: -1px; +} +.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-button { + visibility: hidden; +} +.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-placeholder { + display: inline-block; +} +.fui-drop-panel-popup { + border: 1px solid #d3d3d3; +} +.fui-drop-panel-popup:HOVER { + border-color: #d5e1f2; +} +.fui-drop-panel-popup:HOVER .fui-drop-panel-button { + border-left-color: #d5e1f2; +} +.fui-drop-panel-popup:ACTIVE { + border-color: #87a9da; +} +.fui-drop-panel-popup:ACTIVE .fui-drop-panel-button { + border-left-color: #d5e1f2; +} + +.fui-icon { + text-align: center; + font-size: 0; +} +.fui-icon img { + display: inline-block; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-input-button { + border: 1px solid #ababab; +} +.fui-input-button .fui-input { + vertical-align: middle; + border: none!important; +} +.fui-input-button .fui-button { + vertical-align: middle; +} +.fui-input-button:HOVER { + border-color: #87a9da; +} +.fui-input-button:ACTIVE { + border-color: #87a9da; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-input { + border: 1px solid #d3d3d3; + padding: 1px; + margin: 0; +} +.fui-input:HOVER, +.fui-input:FOCUS { + border-color: #4d90fe!important; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-item { + font-size: 0; +} +.fui-item .fui-icon { + vertical-align: middle; +} +.fui-item .fui-label { + vertical-align: middle; +} +.fui-item.fui-item-selected { + background: #87a9da; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-label-panel .fui-label-panel-label { + width: 100%; + color: #666; +} +.fui-label-panel.fui-no-position .fui-label-panel-label { + position: static!important; +} +.fui-label-panel.fui-layout-bottom .fui-label-panel-label { + position: absolute; + bottom: 0; + left: 0; + top: auto; + z-index: 2; +} + +.fui-label { + cursor: default; + display: inline-block; + white-space: nowrap; +} + +/** + * 通用button + */ +.fui-mask { + position: fixed; + z-index: 99998; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-menu { + background-color: #fff; + border: 1px solid #d3d3d3; +} +.fui-menu .fui-item { + padding: 2px 5px; + display: block!important; +} +.fui-menu .fui-item:HOVER { + background: #d5e1f2; +} + +/** + * 通用button + */ +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-panel { + display: inline-block; + vertical-align: top; + overflow-y: auto; + overflow-x: hidden; +} +.fui-panel .fui-panel-content { + position: relative; + top: 0; + left: 0; +} +.fui-panel .fui-panel-content { + width: 100%; + height: 100%; +} +.fui-panel.fui-container-column { + font-size: 0; +} +.fui-panel.fui-container-column .fui-column { + display: block; +} + +/** + * 通用button + */ +.fui-ppanel::-webkit-scrollbar { + width: 15px; +} +.fui-ppanel::-webkit-scrollbar-button:start:decrement, +.fui-ppanel::-webkit-scrollbar-button:end:decrement, +.fui-ppanel::-webkit-scrollbar-button:start:increment, +.fui-ppanel::-webkit-scrollbar-button:end:increment, +.fui-ppanel::-webkit-scrollbar-thumb { + border: 1px solid #e7e7e7; +} +.fui-ppanel.fui-ppanel-position { + position: fixed; + z-index: 99999; +} + +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-separator { + background: #6d6d6d; +} + +/** + * Spin-button + */ +.fui-spin-button .fui-spin-up-btn .fui-icon, +.fui-spin-button .fui-spin-down-btn .fui-icon { + width: 16px; + height: 9px; + background: url("images/up.png") no-repeat 3px 1.5px; +} +.fui-spin-button .fui-spin-down-btn .fui-icon { + background-image: url("images/down.png"); +} + +/** + * 通用button + */ +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-tabs .fui-selected { + background-color: #d5e1f2; +} + +/** + * 可切换Button (ToggleButton) + */ +/** + * FUI 通用样式定义 + */ +/*------------ var*/ +/*------------ mixin*/ +.fui-toggle-button.fui-button-pressed { + background-color: #aec5e6; +} +.fui-toggle-button.fui-button-pressed.fui-disabled { + background-color: #aec5e6 !important; +} diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.min.css b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.min.css new file mode 100644 index 0000000..3faab2a --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.min.css @@ -0,0 +1,10 @@ +/*! + * ==================================================== + * Themes file * Flex UI - v1.0.0 - 2014-07-28 + * https://github.com/fex-team/fui + * GitHub: https://github.com/fex-team/fui.git + * Copyright (c) 2014 Baidu Kity Group; Licensed MIT + * ==================================================== + */ + +.fui-widget{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-drag:none;color:#000;line-height:1.5;font-size:12px;font-family:ff-tisa-web-pro-1,ff-tisa-web-pro-2,"Lucida Grande","Hiragino Sans GB","Hiragino Sans GB W3","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif;-webkit-font-smoothing:antialiased;outline:0;display:inline-block;vertical-align:top;position:relative;top:0;left:0}.fui-widget.fui-selectable{-webkit-user-select:text;-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;-webkit-user-drag:text}.fui-widget *{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-drag:none}.fui-widget.fui-disabled{opacity:.3!important}.fui-widget.fui-hide{display:none!important}.fui-widget.fui-mask-animate{-webkit-transition:all .2s}.fui-widget.fui-mask-hint{-webkit-transform:perspective(600px) translateZ(30px)}.fui-container{overflow:hidden;position:relative;top:0;left:0}.fui-container.fui-disabled{opacity:1!important}.fui-button-menu{border:1px solid #fff}.fui-button-menu:HOVER{border-color:#d5e1f2}.fui-button-menu.fui-button-active{border-color:#d5e1f2;background:#d5e1f2}.fui-button-menu.fui-button-active .fui-button{background:#d5e1f2}.fui-button-menu.fui-layout-bottom,.fui-button-menu.fui-layout-top{text-align:center}.fui-button-menu.fui-layout-bottom .fui-open-btn,.fui-button-menu.fui-layout-top .fui-open-btn{display:block}.fui-button{overflow:hidden;cursor:default;font-size:0}.fui-button ._layout .fui-icon,.fui-button ._layout .fui-label{display:block}.fui-button .fui-icon,.fui-button .fui-label{display:inline-block;vertical-align:middle}.fui-button.fui-button-layout-bottom .fui-icon,.fui-button.fui-button-layout-bottom .fui-label,.fui-button.fui-button-layout-top .fui-icon,.fui-button.fui-button-layout-top .fui-label{display:block}.fui-button:HOVER{background-color:#d5e1f2!important;color:#000!important}.fui-button:ACTIVE{background-color:#87a9da!important;color:#000!important}.fui-button.fui-disabled:ACTIVE,.fui-button.fui-disabled:HOVER{background-color:#fff!important;color:#000!important}.fui-colorpicker{background-color:#fff}.fui-colorpicker-container{border:1px solid #d3d3d3}.fui-colorpicker-container .fui-colorpicker-title{background:#eee;padding:2px 4px}.fui-colorpicker-container .fui-colorpicker-colors{margin:0;padding:0;font-size:0;line-height:0}.fui-colorpicker-container .fui-colorpicker-colors-line0{margin-bottom:3px}.fui-colorpicker-container .fui-colorpicker-item{display:inline-block;margin:0 2px;width:13px;height:13px;border-style:solid;border-width:1px}.fui-colorpicker-container .fui-colorpicker-commoncolor,.fui-colorpicker-container .fui-colorpicker-standardcolor{margin:4px 3px;white-space:nowrap}.fui-colorpicker-container .fui-colorpicker-toolbar{margin:4px;height:27px}.fui-colorpicker-container .fui-colorpicker-toolbar .fui-colorpicker-preview{display:inline-block;height:25px;line-height:25px;width:120px;border:1px solid #d3d3d3}.fui-colorpicker-container .fui-colorpicker-toolbar .fui-colorpicker-clear{display:inline-block;height:25px;line-height:25px;width:60px;border:1px solid #d3d3d3;font-size:12px;text-align:center;position:absolute;right:5px;cursor:pointer}.fui-dialog{position:fixed;top:-1000000px;left:-100000px;border:1px solid #B1B1B1;background:#fff}.fui-dialog .fui-panel-content{width:auto!important;height:auto!important;padding:2px}.fui-dialog .fui-dialog-caption{margin:0;padding:5px;font-size:16px;font-weight:400;line-height:1;display:inline-block}.fui-dialog .fui-dialog-head .fui-close-button{float:right}.fui-dialog .fui-dialog-head .fui-close-button .fui-close-button-icon{width:16px;height:16px;background:url(images/close.png) no-repeat}.fui-drop-panel{border:1px solid #d3d3d3;overflow:hidden;position:relative}.fui-drop-panel .fui-drop-panel-content{display:inline-block}.fui-drop-panel .fui-drop-panel-placeholder{display:none}.fui-drop-panel .fui-drop-panel-button{border-left:1px solid #d3d3d3;visibility:visible}.fui-drop-panel .fui-drop-panel-button:HOVER{border-color:#d5e1f2}.fui-drop-panel .fui-drop-panel-button:ACTIVE{border-color:#87a9da}.fui-drop-panel:HOVER{border-color:#d5e1f2}.fui-drop-panel:HOVER .fui-drop-panel-button{border-left-color:#d5e1f2}.fui-drop-panel:ACTIVE{border-color:#87a9da}.fui-drop-panel:ACTIVE .fui-drop-panel-button{border-left-color:#d5e1f2}.fui-drop-panel.fui-drop-panel-open{overflow:visible}.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-content{border:1px solid #d3d3d3;position:absolute;top:-1px;left:-1px}.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-button{visibility:hidden}.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-placeholder{display:inline-block}.fui-drop-panel-popup{border:1px solid #d3d3d3}.fui-drop-panel-popup:HOVER{border-color:#d5e1f2}.fui-drop-panel-popup:HOVER .fui-drop-panel-button{border-left-color:#d5e1f2}.fui-drop-panel-popup:ACTIVE{border-color:#87a9da}.fui-drop-panel-popup:ACTIVE .fui-drop-panel-button{border-left-color:#d5e1f2}.fui-icon{text-align:center;font-size:0}.fui-icon img{display:inline-block}.fui-input-button{border:1px solid #ababab}.fui-input-button .fui-input{vertical-align:middle;border:none!important}.fui-input-button .fui-button{vertical-align:middle}.fui-input-button:ACTIVE,.fui-input-button:HOVER{border-color:#87a9da}.fui-input{border:1px solid #d3d3d3;padding:1px;margin:0}.fui-input:FOCUS,.fui-input:HOVER{border-color:#4d90fe!important}.fui-item{font-size:0}.fui-item .fui-icon,.fui-item .fui-label{vertical-align:middle}.fui-item.fui-item-selected{background:#87a9da}.fui-label-panel .fui-label-panel-label{width:100%;color:#666}.fui-label-panel.fui-no-position .fui-label-panel-label{position:static!important}.fui-label-panel.fui-layout-bottom .fui-label-panel-label{position:absolute;bottom:0;left:0;top:auto;z-index:2}.fui-label{cursor:default;display:inline-block;white-space:nowrap}.fui-mask{position:fixed;z-index:99998}.fui-menu{background-color:#fff;border:1px solid #d3d3d3}.fui-menu .fui-item{padding:2px 5px;display:block!important}.fui-menu .fui-item:HOVER{background:#d5e1f2}.fui-panel{display:inline-block;vertical-align:top;overflow-y:auto;overflow-x:hidden}.fui-panel .fui-panel-content{position:relative;top:0;left:0;width:100%;height:100%}.fui-panel.fui-container-column{font-size:0}.fui-panel.fui-container-column .fui-column{display:block}.fui-ppanel::-webkit-scrollbar{width:15px}.fui-ppanel::-webkit-scrollbar-button:end:decrement,.fui-ppanel::-webkit-scrollbar-button:end:increment,.fui-ppanel::-webkit-scrollbar-button:start:decrement,.fui-ppanel::-webkit-scrollbar-button:start:increment,.fui-ppanel::-webkit-scrollbar-thumb{border:1px solid #e7e7e7}.fui-ppanel.fui-ppanel-position{position:fixed;z-index:99999}.fui-separator{background:#6d6d6d}.fui-spin-button .fui-spin-down-btn .fui-icon,.fui-spin-button .fui-spin-up-btn .fui-icon{width:16px;height:9px;background:url(images/up.png) 3px 1.5px no-repeat}.fui-spin-button .fui-spin-down-btn .fui-icon{background-image:url(images/down.png)}.fui-tabs .fui-selected{background-color:#d5e1f2}.fui-toggle-button.fui-button-pressed{background-color:#aec5e6}.fui-toggle-button.fui-button-pressed.fui-disabled{background-color:#aec5e6!important} \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/close.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8885f47e0ce084c2a963bad9a3d9998e4c292d GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1O92G;jkLPtXOMsMzWR&J6Sy{Q{Czpb>SXl)C zO)h3IT>gKzKAIY^ORcOtQZv&tN*GLyjZf`ioC;JUj${s0O?YNXNd`zsq;KE}pb|+W zCBB)tsU?*KsSIFG=ojRr+iwc%W1gMI^(Ad(<+{D7f)T~Q8m<^~z7|ERA%qn2y z=vkV1J2~ZkTHXkhPC}9n4f142%gjjyhM0aver~FMT1kPvp{bF9erjTIWo9xkD3bF~ t*vTn*x|zA@ddTuX*XbJ?niv~HNHZfnpa{bxe=VSG44$rjF6*2UngElh3X%W- literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/down.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/down.png new file mode 100644 index 0000000000000000000000000000000000000000..cf92db68069cad3c42ef007f543f905fe00fb2b3 GIT binary patch literal 1089 zcmaJ=Ye*DP6rPCG7VH5P6%@m0nAFZ|cgJo_jdoch0%zyWO$c z^~J8GE)2tpqcuVt?T%egRDk~9C+6Nk+Y%T_!aAc7rX>qtA;o9_cvO>`KpaR)+qSzP zfMGLB)kG2|#SOe{Xr$!CkQvQHXbcNfWlTwK0T6EhO{yLw#;;r_a8(Hs8+{@znqkna z*0fuouDv!Px3|cZ3Q@Hd4`g^mpaCf187-yTd?rX_d3j_zZi>LOA+RM#{3$9a#_+IV z0o+G=+%nBDILDEU*T-?pYMiARmZH((+>Dp^aXedrPksc-W+{z)T&SMRg-$`D8A6k% zsB}6_rah!#HBn4uWu?QxvThXNw%c?lW!$=5l4B5nEnBJyRYS)eMybJQg+T&U`lkiW zoTAn3$!kIvMr9{n0UC3!&i!utm=-VJc|%TKC0VL(q#}8f&}6qRaN1=6}Fx-P4#XwXD zB{EOFwf(MJ^nxAT?_#d{=P!PA`ahQ)I5x2PZQ)mOPUnK+Jx>-DmhXL?*g95!b9W&% zcqQF?_QJEk{lmn=jv1$W=6wp>bKSVSeBZ0ojgE7x*Q9o;$4l>AD!TBv;n0z?2VZ_h z-`qOW_r8AEyKwFVvH#RXZI$&XHq@0aI*EO(IV$++k*i;34c;DFOm>aE9O+ftL)Yhb vulP08KTeb`K6q{8=%!txMK@0be|?=zW7=RMaef)Q+j-Q{NUhMfZcFEHB|va9 literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/open.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/open.png new file mode 100644 index 0000000000000000000000000000000000000000..861a04e883c7eeabda06bf1ea385218b2c34ff3e GIT binary patch literal 859 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&V!2%?m`@?4fDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&U|7|wYy{+S z7I;J!1L+hn=AU--E|4+Z)5S4F<9zLTL%t>hiMEI0yJu7|i1R&MraXJMw)#ZT{6|@j z9*Oeo5?GfYQJ|*c6TqJQ=lAvxrP=qE_$%kV*?8tH7bkDovpqK&71QVVu=Tkx7(Pu2 z+3;`gtV`^Z`wq|F_DHDboX%7JZF}}ENqbyZe9-eF`zHNJzt60ZexGDF&3U3-)bV~| zZQX=7pS0y><%C?hRQ&v9Tph!N@T$#BUq5yMov2#k8c~vxSdwa$T$Bo=7>o=IO>_-R zbqx$dj0~(y%&iQ}wGAw+3=CMEvM!@&$jwj5OsmALp+x>tK2U=%$cEzlw370~qErUY z+{E-$-^BFHlpinIKI- z4Ai8TUz8rXB)%TzlH#&-tK|IL+|;}h1_k%jywoC~CsGuWDiu7F^L_L4^Yk+F6%0{uKbLh*2~7Yx9TzJA literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/up.png b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4a6d1f9831b280fc99774f19b835ae0ff96c7e GIT binary patch literal 1080 zcmaJ=T}TvB6dp;$Br^(1MQ9q0655%a+1=3{cQe~rbE7d^m)d@HoVo4}>-;oxZCCLr z5t4kdqN2AT0|o2Fel#r%3Zk;7it@!Eis->0BB`M6=&ttAHeBYOdpO^B&bjBi{Y{N~ z3JXdLFbpdUHSl4y+jd@l9{T_IQuG*YB`_F;&3ZdbiYCD7WW5dGAytflFc9UglTUyT z!&X%&ktmD``#4EgNzslWQ>uZ`80M=@8KRT`5N`u9Me`H$_Z|?qBKwI$9>FOX0T5Rj zx=qmB-58O&6OvaZYIowk6o&{@07X2dc4!ut@)L`^9I|aUMc|7eFySYbii!$NctAG+ z?jc|&bsR6z%nTZ4QQUpa_T6r9m;}(5&(d0}m|8R1B!-8g4U+ZF(p46R6Uq7F1)I zRsgo6 z<@8hsXgcVwbMXvc$9jUnDu$tho(z`PrA`%SFoTs>u&r3!RlOjg_<4!eqr#s2Iu~?O&tLxR8Eqb6L3Puq=I`A-$VO*c;z?2GOG!3GsE2 z)LY;Fse*^jb@wZXd~LYbtycDjb1zMfonKgAQa16uvaDuEnWUmcWKU1+c+I=1ZCi4$ zzUtgsITX7a`*m>dftm5KYb`?;b{!kNHSOJWd7^iAq1<$BRs jrDjcgU*e40*OHTmbscRzN6p+Rwcm0m*vQ}5-Fo^Dnsa3k literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/jquery-3.6.0.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/jquery-3.6.0.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/jquery-3.6.0.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
                                  "],col:[2,"","
                                  "],tr:[2,"","
                                  "],td:[3,"","
                                  "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="

                                  ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0p;p++)k=n[p],k!==h?k?"string"==typeof k?(n[p]="brackets"===e.name&&2>p?k:"function"===e.name&&0===p?k:c("text",k),f.operand.push(n[p])):(f.operand.push({}),n[p]=b(a.operand[p],k,f.operand[f.operand.length-1],g,i)):(n[p]=c("empty"),f.operand.push(n[p])):(m.push(p),i.hasOwnProperty("startOffset")||(i.startOffset=p),i.endOffset=p,e.attr&&e.attr.id&&(i.groupId=e.attr.id));for(2===m.length&&(i.endOffset-=1);p=m.length;)p=m[p-1],n.splice(p,1),m.length--,a.operand.splice(p,1)}if(o=d(e.name),!o)throw new Error("operator type error: not found "+e.operator);j=function(){},j.prototype=o.prototype,l=new j,o.apply(l,n),f.func=l;for(var r in e.callFn)e.callFn.hasOwnProperty(r)&&l[r]&&l[r].apply(l,e.callFn[r]);return e.attr&&(e.attr.id&&(g[e.attr.id]={objGroup:l,strGroup:a}),e.attr["data-root"]&&(g.root={objGroup:l,strGroup:a}),l.setAttr(e.attr)),l}function c(a,b){switch(a){case"empty":return new kf.EmptyExpression;case"text":return new kf.TextExpression(b)}}function d(a){return g[a]||kf[a.replace(/^[a-z]/i,function(a){return a.toUpperCase()}).replace(/-([a-z])/gi,function(a,b){return b.toUpperCase()})+"Expression"]}function e(a){var b={};if("[object Array]"==={}.toString.call(a)){b=[];for(var c=0,d=a.length;d>c;c++)b[c]=f(a[c])}else for(var e in a)a.hasOwnProperty(e)&&(b[e]=f(a[e]));return b}function f(a){return a?"object"!=typeof a?a:e(a):a}var g={},h="\uf155";return a.prototype.generateBy=function(a){var c=a.tree,d={},f={},g={};if("string"==typeof c)throw new Error("Unhandled error");return this.formula.appendExpression(b(c,e(c),d,g,f)),{select:f,parsedTree:c,tree:d,mapping:g}},a.prototype.regenerateBy=function(a){return this.formula.clearExpressions(),this.generateBy(a)},a}},b[1]={value:function(){return{toRPNExpression:b.r(2),generateTree:b.r(3)}}},b[2]={value:function(){function a(b){var e=[],f=null;for(b=c(b);f=b.shift();)"combination"===f.name&&1===f.operand.length&&"brackets"===f.operand[0].name&&(f=f.operand[0]),e.push(d.isArray(f)?a(f):f);return e}function c(a){for(var b=[],c=null;void 0!==(c=a.pop());)if(!c||"object"!=typeof c||c.sign!==!1&&"function"!==c.name)b.push(c);else{var d=c.handler(c,[],b.reverse());b.unshift(d),b.reverse()}return b.reverse()}var d=b.r(4);return a}},b[3]={value:function(){function a(b){for(var e=null,f=[],g=0,h=b.length;h>g;g++)d.isArray(b[g])&&(b[g]=a(b[g]));for(;e=b.shift();)f.push("object"==typeof e&&e.handler?e.handler(e,f,b):e);return c(f)}var c=b.r(13),d=b.r(4);return a}},b[4]={value:function(){var a=b.r(7),c=b.r(6),d=b.r(15),e={getLatexType:function(b){return b=b.replace(/^\\/,""),a[b]?"operator":c[b]?"function":"text"},isArray:function(a){return a&&"[object Array]"===Object.prototype.toString.call(a)},getDefine:function(b){return e.extend({},a[b.replace("\\","")])},getFuncDefine:function(a){return{name:"function",params:a.replace(/^\\/,""),handler:d}},getBracketsDefine:function(b,c){return e.extend({params:[b,c]},a.brackets)},extend:function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}};return e}},b[5]={value:function(){var a=!0;return{".":a,"{":a,"}":a,"[":a,"]":a,"(":a,")":a,"|":a}}},b[6]={value:function(){return{sin:1,cos:1,arccos:1,cosh:1,det:1,inf:1,limsup:1,Pr:1,tan:1,arcsin:1,cot:1,dim:1,ker:1,ln:1,sec:1,tanh:1,arctan:1,coth:1,exp:1,lg:1,log:1,arg:1,csc:1,gcd:1,lim:1,max:1,sinh:1,deg:1,hom:1,liminf:1,min:1,sup:1}}},b[7]={value:function(){var a=b.r(22),c=b.r(11);return{"^":{name:"superscript",type:c.OP,handler:a},_:{name:"subscript",type:c.OP,handler:a},frac:{name:"fraction",type:c.FN,sign:!1,handler:b.r(14)},sqrt:{name:"radical",type:c.FN,sign:!1,handler:b.r(23)},sum:{name:"summation",type:c.FN,traversal:"rtl",handler:b.r(24)},"int":{name:"integration",type:c.FN,traversal:"rtl",handler:b.r(16)},brackets:{name:"brackets",type:c.FN,handler:b.r(12)},mathcal:{name:"mathcal",type:c.FN,sign:!1,handler:b.r(19)},mathfrak:{name:"mathfrak",type:c.FN,sign:!1,handler:b.r(20)},mathbb:{name:"mathbb",type:c.FN,sign:!1,handler:b.r(18)},mathrm:{name:"mathrm",type:c.FN,sign:!1,handler:b.r(21)}}}},b[8]={value:function(){return{"int":b.r(26),quot:b.r(27)}}},b[9]={value:function(){return{combination:b.r(29),fraction:b.r(30),"function":b.r(31),integration:b.r(32),subscript:b.r(39),superscript:b.r(41),script:b.r(37),radical:b.r(38),summation:b.r(40),brackets:b.r(28),mathcal:b.r(34),mathfrak:b.r(35),mathbb:b.r(33),mathrm:b.r(36)}}},b[10]={value:function(){return{"#":1,$:1,"%":1,_:1,"&":1,"{":1,"}":1,"^":1,"~":1}}},b[11]={value:function(){return{OP:1,FN:2}}},b[12]={value:function(){var a=b.r(5);return function(b,c,d){for(var e=0,f=b.params.length;f>e;e++)if(!(b.params[e]in a))throw new Error("Brackets: invalid params");return b.operand=b.params,b.params[2]=d.shift(),delete b.handler,delete b.params,b}}},b[13]={value:function(){return function(){return{name:"combination",operand:arguments[0]||[]}}}},b[14]={value:function(){return function(a,b,c){var d=c.shift(),e=c.shift();if(void 0===d||void 0===e)throw new Error("Frac: Syntax Error");return d.handler&&"integration"===d.name?(d=d.handler(d,b,[e]),e=c.shift()):e.handler&&"integration"===e.name&&(e=e.handler(e,b,[c.shift()])),a.operand=[d,e],delete a.handler,a}}},b[15]={value:function(){var a=b.r(17);return function(b,c,d){var e=a.exec(d);return e.expr&&e.expr.handler&&"integration"===e.expr.name&&(e.expr=e.expr.handler(e.expr,c,[d.shift()])),b.operand=[b.params,e.expr,e.superscript,e.subscript],delete b.params,delete b.handler,b}}},b[16]={value:function(){var a=b.r(17),c=b.r(11).FN;return function(b,d,e){var f=e.shift(),g=a.exec(e);return g.expr&&g.expr.type===c&&g.expr.handler&&"integration"===g.expr.name&&(g.expr=g.expr.handler(g.expr,d,[e.shift()])),b.operand=[g.expr,g.superscript,g.subscript],b.callFn={setType:[0|f]},delete b.handler,b}}},b[17]={value:function(){function a(a){var c=b(a),d=null,e={superscript:null,subscript:null};if(!c)return e;if(d=b(a),e[c.type]=c.value||null,d){if(d.type===c.type)throw new Error("Script: syntax error!");e[d.type]=d.value||null}return e}function b(a){var b=a.shift();return b?"subscript"===b.name||"superscript"===b.name?{type:b.name,value:a.shift()}:(a.unshift(b),null):null}return{exec:function(b){var c=a(b),d=b.shift();if(d&&d.name&&-1!==d.name.indexOf("script"))throw new Error("Script: syntax error!");return c.expr=d||null,c}}}},b[18]={value:function(){return function(a,b,c){var d=c.shift();return"object"==typeof d&&"combination"===d.name&&(d=d.operand.join("")),a.name="text",a.attr={_reverse:"mathbb"},a.callFn={setFamily:["KF AMS BB"]},a.operand=[d],delete a.handler,a}}},b[19]={value:function(){return function(a,b,c){var d=c.shift();return"object"==typeof d&&"combination"===d.name&&(d=d.operand.join("")),a.name="text",a.attr={_reverse:"mathcal"},a.callFn={setFamily:["KF AMS CAL"]},a.operand=[d],delete a.handler,a}}},b[20]={value:function(){return function(a,b,c){var d=c.shift();return"object"==typeof d&&"combination"===d.name&&(d=d.operand.join("")),a.name="text",a.attr={_reverse:"mathfrak"},a.callFn={setFamily:["KF AMS FRAK"]},a.operand=[d],delete a.handler,a}}},b[21]={value:function(){return function(a,b,c){var d=c.shift();return"object"==typeof d&&"combination"===d.name&&(d=d.operand.join("")),a.name="text",a.attr={_reverse:"mathrm"},a.callFn={setFamily:["KF AMS ROMAN"]},a.operand=[d],delete a.handler,a}}},b[22]={value:function(){return function(a,b,c){var d=b.pop(),e=c.shift()||null;if(!e)throw new Error("Missing script");if(d=d||"",d.name===a.name||"script"===d.name)throw new Error("script error");return"subscript"===d.name?(d.name="script",d.operand[2]=d.operand[1],d.operand[1]=e,d):"superscript"===d.name?(d.name="script",d.operand[2]=e,d):(a.operand=[d,e],delete a.handler,a)}}},b[23]={value:function(){var a=b.r(13);return function(b,c,d){var e=d.shift(),f=null,g=null;if("["===e){for(e=[];(f=d.shift())&&"]"!==f;)e.push(f);e=0===e.length?null:a(e),g=d.shift()}else g=e,e=null;return b.operand=[g,e],delete b.handler,b}}},b[24]={value:function(){var a=b.r(17),c=b.r(11).FN;return function(b,d,e){var f=a.exec(e);return f.expr&&f.expr.type===c&&f.expr.handler&&"integration"===f.expr.name&&(f.expr=f.expr.handler(f.expr,d,[e.shift()])),b.operand=[f.expr,f.superscript,f.subscript],delete b.handler,b}}},b[25]={value:function(){function a(a){if(d(a))return a.substring(1);switch(m.getLatexType(a)){case"operator":return m.getDefine(a);case"function":return m.getFuncDefine(a);default:return c(a)}}function c(a){return 0===a.indexOf("\\")?a+"\\":a}function d(a){return 0===a.indexOf("\\")?!!l[a.substring(1)]:!1}function e(a){return a.replace(/\\\s+/,"").replace(/\s*([^a-z0-9\s])\s*/gi,function(a,b){return b})}var f=b.r(43).Parser,g=b.r(1),h=b.r(8),i=b.r(42),j=b.r(7),k=b.r(9),l=b.r(10),m=b.r(4),n="\ufff8",o="\ufffc",p=new RegExp(n+"|"+o,"g"),q=new RegExp(n,"g"),r=new RegExp(o,"g");f.register("latex",f.implement({parse:function(a){var b=this.split(this.format(a));return b=this.parseToGroup(b),b=this.parseToStruct(b),this.generateTree(b)},serialization:function(a,b){return i(a,b)},expand:function(a){var b=a.parse,c=null,d=a.pre,e=a.reverse;for(var f in b)b.hasOwnProperty(f)&&(c=f.replace(/\\/g,""),j[c]=b[f]);for(var f in e)e.hasOwnProperty(f)&&(k[f.replace(/\\/g,"")]=e[f]);if(d)for(var f in d)d.hasOwnProperty(f)&&(h[f.replace(/\\/g,"")]=d[f])},format:function(a){a=e(a),a=a.replace(p,"").replace(/\\{/gi,n).replace(/\\}/gi,o);for(var b in h)h.hasOwnProperty(b)&&(a=h[b](a));return a},split:function(a){var b=[],c=/(?:\\[^a-z]\s*)|(?:\\[a-z]+\s*)|(?:[{}]\s*)|(?:[^\\{}]\s*)/gi,d=/^\s+|\s+$/g,e=null;for(a=a.replace(d,"");e=c.exec(a);)e=e[0].replace(d,""),e&&b.push(e);return b},generateTree:function(a){for(var b=[],c=null;c=a.shift();)b.push(m.isArray(c)?this.generateTree(c):c);return b=g.toRPNExpression(b),g.generateTree(b)},parseToGroup:function(a){for(var b=[],c=[b],d=0,e=0,f=0,g=a.length;g>f;f++)switch(a[f]){case"{":d++,c.push(b),b.push([]),b=b[b.length-1];break;case"}":d--,b=c.pop();break;case"\\left":e++,c.push(b),b.push([[]]),b=b[b.length-1][0],b.type="brackets",f++,b.leftBrackets=a[f].replace(q,"{").replace(r,"}");break;case"\\right":e--,f++,b.rightBrackets=a[f].replace(q,"{").replace(r,"}"),b=c.pop();break;default:b.push(a[f].replace(q,"\\{").replace(r,"\\}"))}if(0!==d)throw new Error("Group Error!");if(0!==e)throw new Error("Brackets Error!");return c[0]},parseToStruct:function(b){for(var c=[],d=0,e=b.length;e>d;d++)m.isArray(b[d])?"brackets"===b[d].type?(c.push(m.getBracketsDefine(b[d].leftBrackets,b[d].rightBrackets)),c.push(this.parseToStruct(b[d]))):c.push(this.parseToStruct(b[d])):c.push(a(b[d]));return c}}))}},b[26]={value:function(){return function(a){return a.replace(/\\(i+)nt(\b|[^a-zA-Z])/g,function(a,b,c){return"\\int "+b.length+c})}}},b[27]={value:function(){return function(a){return a.replace(/``/g,"\u201c")}}},b[28]={value:function(){return function(a){return("{"===a[0]||"}"===a[0])&&(a[0]="\\"+a[0]),("{"===a[1]||"}"===a[1])&&(a[1]="\\"+a[1]),["\\left",a[0],a[2],"\\right",a[1]].join(" ")}}},b[29]={value:function(){return function(a){return this.attr["data-root"]||this.attr["data-placeholder"]?a.join(""):"{"+a.join("")+"}"}}},b[30]={value:function(){return function(a){return"\\frac "+a[0]+" "+a[1]}}},b[31]={value:function(){return function(a){var b=["\\"+a[0]];return a[2]&&b.push("^"+a[2]),a[3]&&b.push("_"+a[3]),a[1]&&b.push(" "+a[1]),b.join("")}}},b[32]={value:function(){return function(a){var b=["\\int "];if(this.callFn&&this.callFn.setType){b=["\\"];for(var c=0,d=this.callFn.setType;d>c;c++)b.push("i");b.push("nt ")}return a[1]&&b.push("^"+a[1]),a[2]&&b.push("_"+a[2]),a[0]&&b.push(" "+a[0]),b.join("")}}},b[33]={value:function(){return function(a){return"\\mathbb{"+a[0]+"}"}}},b[34]={value:function(){return function(a){return"\\mathcal{"+a[0]+"}"}}},b[35]={value:function(){return function(a){return"\\mathfrak{"+a[0]+"}"}}},b[36]={value:function(){return function(a){return"\\mathrm{"+a[0]+"}"}}},b[37]={value:function(){return function(a){return a[0]+"^"+a[1]+"_"+a[2]}}},b[38]={value:function(){return function(a){var b=["\\sqrt"];return a[1]&&b.push("["+a[1]+"]"),b.push(" "+a[0]),b.join("")}}},b[39]={value:function(){return function(a){return a[0]+"_"+a[1]}}},b[40]={value:function(){return function(a){var b=["\\sum "];return a[1]&&b.push("^"+a[1]),a[2]&&b.push("_"+a[2]),a[0]&&b.push(" "+a[0]),b.join("")}}},b[41]={value:function(){return function(a){return a[0]+"^"+a[1]}}},b[42]={value:function(){function a(b,e){var g=[],h=null,i=null;if("object"!=typeof b)return c(b)?"\\"+b+" ":b.replace(f,function(a,b){return b+" "});"combination"===b.name&&1===b.operand.length&&"combination"===b.operand[0].name&&(b=b.operand[0]),i=b.operand;for(var j=0,k=i.length;k>j;j++)g.push(i[j]?a(i[j]):i[j]);return h=b.attr&&b.attr._reverse?b.attr._reverse:b.name,d[h].call(b,g,e)}function c(a){return!!e[a]}var d=b.r(9),e=b.r(10),f=/(\\(?:[\w]+)|(?:[^a-z]))\\/gi;return function(b,c){return a(b,c)}}},b[43]={value:function(a,b,c){function d(a){this.impl=new a,this.conf={}}function e(){this.conf={}}var f={},g={},h={extend:function(a,b){var c=null;b=[].slice.call(arguments,1);for(var d=0,e=b.length;e>d;d++){c=b[d];for(var f in c)c.hasOwnProperty(f)&&(a[f]=c[f])}},setData:function(a,b,c){if("string"==typeof b)a[b]=c;else{if("object"!=typeof b)throw new Error("invalid option");for(c in b)b.hasOwnProperty(c)&&(a[c]=b[c])}}},i={use:function(a){if(!g[a])throw new Error("unknown parser type");return this.proxy(g[a])},config:function(a,b){return h.setData(f,a,b),this},register:function(a,b){return g[a.toLowerCase()]=b,this},implement:function(a){var b=function(){},c=a.constructor||function(){},d=function(){e.call(this),c.call(this)};b.prototype=e.prototype,d.prototype=new b,delete a.constructor;for(var f in a)"constructor"!==f&&a.hasOwnProperty(f)&&(d.prototype[f]=a[f]);return d},proxy:function(a){return new d(a)}};h.extend(d.prototype,{config:function(a,b){h.setData(this.conf,a,b)},set:function(a,b){this.impl.set(a,b)},parse:function(a){var b={config:{},tree:this.impl.parse(a)};return h.extend(b.config,f,this.conf),b},serialization:function(a,b){return this.impl.serialization(a,b)},expand:function(a){this.impl.expand(a)}}),h.extend(e.prototype,{set:function(a,b){h.extend(this.conf,a,b)},parse:function(){throw new Error("Abstract function")}}),c.exports={Parser:i,ParserInterface:e}}},b[44]={value:function(){var a=b.r(43).Parser;b.r(25),window.kf.Parser=a,window.kf.Assembly=b.r(0)}};var c={"kf.start":44};!function(){try{a("kf.start")}catch(b){}}(this)}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kity-formula-render.all.js b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kity-formula-render.all.js new file mode 100644 index 0000000..8066599 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kity-formula-render.all.js @@ -0,0 +1,5757 @@ +/*! + * ==================================================== + * Kity Formula Render - v1.0.0 - 2014-07-30 + * https://github.com/kitygraph/formula + * GitHub: https://github.com/kitygraph/formula.git + * Copyright (c) 2014 Baidu Kity Group; Licensed MIT + * ==================================================== + */ + +(function () { +var _p = { + r: function(index) { + if (_p[index].inited) { + return _p[index].value; + } + if (typeof _p[index].value === "function") { + var module = { + exports: {} + }, returnValue = _p[index].value(null, module.exports, module); + _p[index].inited = true; + _p[index].value = returnValue; + if (returnValue !== undefined) { + return returnValue; + } else { + for (var key in module.exports) { + if (module.exports.hasOwnProperty(key)) { + _p[index].inited = true; + _p[index].value = module.exports; + return module.exports; + } + } + } + } else { + _p[index].inited = true; + return _p[index].value; + } + } +}; + +/*! + * canvg库封装 + * canvg官网: https://code.google.com/p/canvg/ + */ +_p[0] = { + value: function(require) { + /** + * 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; + }; + } + /* + + StackBlur - a fast almost Gaussian Blur For Canvas + + Version: 0.5 + Author: Mario Klingemann + Contact: mario@quasimondo.com + Website: http://www.quasimondo.com/StackBlurForCanvas + Twitter: @quasimondo + + In case you find this class useful - especially in commercial projects - + I am not totally unhappy for a small donation to my PayPal account + mario@quasimondo.de + + Or support me on flattr: + https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript + + Copyright (c) 2010 Mario Klingemann + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + var mul_table = [ 512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259 ]; + var shg_table = [ 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ]; + function stackBlurImage(imageID, canvasID, radius, blurAlphaChannel) { + var img = document.getElementById(imageID); + var w = img.naturalWidth; + var h = img.naturalHeight; + var canvas = document.getElementById(canvasID); + canvas.style.width = w + "px"; + canvas.style.height = h + "px"; + canvas.width = w; + canvas.height = h; + var context = canvas.getContext("2d"); + context.clearRect(0, 0, w, h); + context.drawImage(img, 0, 0); + if (isNaN(radius) || radius < 1) return; + if (blurAlphaChannel) stackBlurCanvasRGBA(canvasID, 0, 0, w, h, radius); else stackBlurCanvasRGB(canvasID, 0, 0, w, h, radius); + } + function stackBlurCanvasRGBA(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, a_sum, r_out_sum, g_out_sum, b_out_sum, a_out_sum, r_in_sum, g_in_sum, b_in_sum, a_in_sum, pr, pg, pb, pa, 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 = a_in_sum = r_sum = g_sum = b_sum = a_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]); + 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; + } + 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; + a_sum += (stack.a = pa = pixels[p + 3]) * rbs; + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + a_in_sum += pa; + stack = stack.next; + } + stackIn = stackStart; + stackOut = stackEnd; + for (x = 0; x < width; x++) { + pixels[yi + 3] = pa = a_sum * mul_sum >> 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; + } + /* + * 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.getElementsByTagName("svg"); + for (var i = 0; i < svgTags.length; i++) { + var svgTag = svgTags[i]; + var c = document.createElement("canvas"); + c.width = svgTag.clientWidth; + c.height = svgTag.clientHeight; + svgTag.parentNode.insertBefore(c, svgTag); + svgTag.parentNode.removeChild(svgTag); + var div = document.createElement("div"); + div.appendChild(svgTag); + canvg(c, div.innerHTML); + } + return; + } + opts = opts || {}; + if (typeof target == "string") { + target = document.getElementById(target); + } + // store class on canvas + if (target.svg != null) target.svg.stop(); + var svg = build(); + // on i.e. 8 for flash canvas, we can't assign the property so check for it + if (!(target.childNodes.length == 1 && target.childNodes[0].nodeName == "OBJECT")) target.svg = svg; + svg.opts = opts; + var ctx = target.getContext("2d"); + if (typeof s.documentElement != "undefined") { + // load from xml doc + svg.loadXmlDoc(ctx, s); + } else if (s.substr(0, 1) == "<") { + // load from xml string + svg.loadXml(ctx, s); + } else { + // load from url + svg.load(ctx, s); + } + }; + function build() { + var svg = {}; + svg.FRAMERATE = 30; + svg.MAX_VIRTUAL_PIXELS = 3e4; + // globals + svg.init = function(ctx) { + var uniqueId = 0; + svg.UniqueId = function() { + uniqueId++; + return "canvg" + uniqueId; + }; + svg.Definitions = {}; + svg.Styles = {}; + 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 < svg.Images.length; i++) { + if (!svg.Images[i].loaded) return false; + } + return true; + }; + // trim + svg.trim = function(s) { + return s.replace(/^\s+|\s+$/g, ""); + }; + // compress spaces + svg.compressSpaces = function(s) { + return s.replace(/[\s\r\t\n]+/gm, " "); + }; + // ajax + svg.ajax = function(url) { + var AJAX; + if (window.XMLHttpRequest) { + AJAX = new XMLHttpRequest(); + } else { + AJAX = new ActiveXObject("Microsoft.XMLHTTP"); + } + if (AJAX) { + AJAX.open("GET", url, false); + AJAX.send(null); + return AJAX.responseText; + } + return null; + }; + // parse xml + svg.parseXml = function(xml) { + if (window.DOMParser) { + var parser = new DOMParser(); + return parser.parseFromString(xml, "text/xml"); + } else { + xml = xml.replace(/]*>/, ""); + 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; + } + 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(opacity) { + var newValue = this.value; + if (opacity != null && opacity != "" && 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 + ", " + opacity + ")"; + } + } + 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; + }; + 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; + if (s.match(/px$/)) return this.numValue(); + if (s.match(/pt$/)) return this.numValue() * this.getDPI(viewPort) * (1 / 72); + 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) 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() * 1e3; + 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); + if (s.match(/grad$/)) return this.numValue() * (Math.PI / 200); + if (s.match(/rad$/)) return this.numValue(); + return this.numValue() * (Math.PI / 180); + }; + // 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 < d.length; i++) { + if (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { + if (d[i] != "inherit") f.fontStyle = d[i]; + set.fontStyle = true; + } else if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { + if (d[i] != "inherit") f.fontVariant = d[i]; + set.fontStyle = set.fontVariant = true; + } else if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) { + if (d[i] != "inherit") f.fontWeight = d[i]; + set.fontStyle = set.fontVariant = set.fontWeight = true; + } else if (!set.fontSize) { + if (d[i] != "inherit") f.fontSize = d[i].split("/")[0]; + set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; + } else { + if (d[i] != "inherit") ff += d[i]; + } + } + if (ff != "") f.fontFamily = ff; + return f; + }; + }(); + // points and paths + svg.ToNumberArray = function(s) { + var a = svg.trim(svg.compressSpaces((s || "").replace(/,/g, " "))).split(" "); + for (var i = 0; i < a.length; i++) { + a[i] = parseFloat(a[i]); + } + return a; + }; + svg.Point = function(x, y) { + this.x = x; + this.y = y; + }; + svg.Point.prototype.angleTo = function(p) { + return Math.atan2(p.y - this.y, p.x - this.x); + }; + svg.Point.prototype.applyTransform = function(v) { + var xp = this.x * v[0] + this.y * v[2] + v[4]; + var yp = this.x * v[1] + this.y * v[3] + v[5]; + this.x = xp; + this.y = yp; + }; + svg.CreatePoint = function(s) { + var a = svg.ToNumberArray(s); + return new svg.Point(a[0], a[1]); + }; + svg.CreatePath = function(s) { + var a = svg.ToNumberArray(s); + var path = []; + for (var i = 0; i < a.length; i += 2) { + path.push(new svg.Point(a[i], a[i + 1])); + } + return path; + }; + // bounding box + svg.BoundingBox = function(x1, y1, x2, y2) { + // pass in initial points if you want + this.x1 = Number.NaN; + this.y1 = Number.NaN; + this.x2 = Number.NaN; + this.y2 = Number.NaN; + this.x = function() { + return this.x1; + }; + this.y = function() { + return this.y1; + }; + this.width = function() { + return this.x2 - this.x1; + }; + this.height = function() { + return this.y2 - this.y1; + }; + this.addPoint = function(x, y) { + if (x != null) { + if (isNaN(this.x1) || isNaN(this.x2)) { + this.x1 = x; + this.x2 = x; + } + if (x < this.x1) this.x1 = x; + if (x > 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, this.p.y || 0); + }; + this.unapply = function(ctx) { + ctx.translate(-1 * this.p.x || 0, -1 * this.p.y || 0); + }; + this.applyToPoint = function(p) { + p.applyTransform([ 1, 0, 0, 1, this.p.x || 0, this.p.y || 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 * 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, this.p.y || 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, -this.p.y || 0 ]); + }; + }; + this.Type.scale = function(s) { + this.p = svg.CreatePoint(s); + this.apply = function(ctx) { + ctx.scale(this.p.x || 1, this.p.y || this.p.x || 1); + }; + this.unapply = function(ctx) { + ctx.scale(1 / this.p.x || 1, 1 / this.p.y || this.p.x || 1); + }; + this.applyToPoint = function(p) { + p.applyTransform([ this.p.x || 0, 0, 0, this.p.y || 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.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 < this.transforms.length; i++) { + this.transforms[i].apply(ctx); + } + }; + this.unapply = function(ctx) { + for (var i = this.transforms.length - 1; i >= 0; i--) { + this.transforms[i].unapply(ctx); + } + }; + this.applyToPoint = function(p) { + for (var i = 0; i < this.transforms.length; i++) { + this.transforms[i].applyToPoint(p); + } + }; + var data = svg.trim(svg.compressSpaces(v)).replace(/\)(\s?,\s?)/g, ") ").split(/\s(?=[a-z])/); + for (var i = 0; i < data.length; i++) { + var type = svg.trim(data[i].split("(")[0]); + var s = data[i].split("(")[1].replace(")", ""); + var transform = new this.Type[type](s); + transform.type = type; + this.transforms.push(transform); + } + }; + // aspect ratio + svg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) { + // aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute + aspectRatio = svg.compressSpaces(aspectRatio); + aspectRatio = aspectRatio.replace(/^defer\s/, ""); + // ignore defer + var align = aspectRatio.split(" ")[0] || "xMidYMid"; + var meetOrSlice = aspectRatio.split(" ")[1] || "meet"; + // calculate scale + var scaleX = width / desiredWidth; + var scaleY = height / desiredHeight; + var scaleMin = Math.min(scaleX, scaleY); + var scaleMax = Math.max(scaleX, scaleY); + if (meetOrSlice == "meet") { + desiredWidth *= scaleMin; + desiredHeight *= scaleMin; + } + if (meetOrSlice == "slice") { + desiredWidth *= scaleMax; + desiredHeight *= scaleMax; + } + refX = new svg.Property("refX", refX); + refY = new svg.Property("refY", refY); + if (refX.hasValue() && refY.hasValue()) { + ctx.translate(-scaleMin * refX.toPixels("x"), -scaleMin * refY.toPixels("y")); + } else { + // align + if (align.match(/^xMid/) && (meetOrSlice == "meet" && scaleMin == scaleY || meetOrSlice == "slice" && scaleMax == scaleY)) ctx.translate(width / 2 - desiredWidth / 2, 0); + if (align.match(/YMid$/) && (meetOrSlice == "meet" && scaleMin == scaleX || meetOrSlice == "slice" && scaleMax == scaleX)) ctx.translate(0, height / 2 - desiredHeight / 2); + if (align.match(/^xMax/) && (meetOrSlice == "meet" && scaleMin == scaleY || meetOrSlice == "slice" && scaleMax == scaleY)) ctx.translate(width - desiredWidth, 0); + if (align.match(/YMax$/) && (meetOrSlice == "meet" && scaleMin == scaleX || meetOrSlice == "slice" && scaleMax == scaleX)) ctx.translate(0, height - desiredHeight); + } + // scale + if (align == "none") ctx.scale(scaleX, scaleY); else if (meetOrSlice == "meet") ctx.scale(scaleMin, scaleMin); else if (meetOrSlice == "slice") ctx.scale(scaleMax, scaleMax); + // translate + ctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY); + }; + // elements + svg.Element = {}; + svg.EmptyProperty = new svg.Property("EMPTY", ""); + svg.Element.ElementBase = function(node) { + this.attributes = {}; + this.styles = {}; + this.children = []; + // get or create attribute + this.attribute = function(name, createIfNotExists) { + var a = this.attributes[name]; + if (a != null) return a; + if (createIfNotExists == true) { + a = new svg.Property(name, ""); + this.attributes[name] = a; + } + return a || svg.EmptyProperty; + }; + this.getHrefAttribute = function() { + for (var a in this.attributes) { + if (a.match(/:href$/)) { + return this.attributes[a]; + } + } + return svg.EmptyProperty; + }; + // get or create style, crawls up node tree + this.style = function(name, createIfNotExists) { + var s = this.styles[name]; + if (s != null) return s; + var a = this.attribute(name); + if (a != null && a.hasValue()) { + this.styles[name] = a; + // move up to me to cache + return a; + } + var p = this.parent; + if (p != null) { + var ps = p.style(name); + if (ps != null && ps.hasValue()) { + return ps; + } + } + if (createIfNotExists == true) { + s = new svg.Property(name, ""); + this.styles[name] = s; + } + return s || svg.EmptyProperty; + }; + // base render + this.render = function(ctx) { + // don't render display=none + if (this.style("display").value == "none") return; + // don't render visibility=hidden + if (this.attribute("visibility").value == "hidden") return; + ctx.save(); + if (this.attribute("mask").hasValue()) { + // mask + var mask = this.attribute("mask").getDefinition(); + if (mask != null) mask.apply(ctx, this); + } else if (this.style("filter").hasValue()) { + // filter + var filter = this.style("filter").getDefinition(); + if (filter != null) filter.apply(ctx, this); + } else { + this.setContext(ctx); + this.renderChildren(ctx); + this.clearContext(ctx); + } + ctx.restore(); + }; + // base set context + this.setContext = function(ctx) {}; + // base clear context + this.clearContext = function(ctx) {}; + // base render children + this.renderChildren = function(ctx) { + for (var i = 0; i < this.children.length; i++) { + this.children[i].render(ctx); + } + }; + this.addChild = function(childNode, create) { + var child = childNode; + if (create) child = svg.CreateElement(childNode); + child.parent = this; + this.children.push(child); + }; + if (node != null && node.nodeType == 1) { + //ELEMENT_NODE + // add children + for (var i = 0; i < node.childNodes.length; i++) { + var childNode = node.childNodes[i]; + if (childNode.nodeType == 1) this.addChild(childNode, true); + //ELEMENT_NODE + if (this.captureTextNodes && childNode.nodeType == 3) { + var text = childNode.nodeValue || childNode.text || ""; + if (svg.trim(svg.compressSpaces(text)) != "") { + this.addChild(new svg.Element.tspan(childNode), false); + } + } + } + // add attributes + for (var i = 0; i < node.attributes.length; i++) { + var attribute = node.attributes[i]; + this.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.nodeValue); + } + // add tag styles + var styles = svg.Styles[node.nodeName]; + if (styles != null) { + for (var name in styles) { + this.styles[name] = styles[name]; + } + } + // add class styles + if (this.attribute("class").hasValue()) { + var classes = svg.compressSpaces(this.attribute("class").value).split(" "); + for (var j = 0; j < classes.length; j++) { + styles = svg.Styles["." + classes[j]]; + if (styles != null) { + for (var name in styles) { + this.styles[name] = styles[name]; + } + } + styles = svg.Styles[node.nodeName + "." + classes[j]]; + if (styles != null) { + for (var name in styles) { + this.styles[name] = styles[name]; + } + } + } + } + // add id styles + if (this.attribute("id").hasValue()) { + var styles = svg.Styles["#" + this.attribute("id").value]; + if (styles != null) { + for (var name in styles) { + this.styles[name] = styles[name]; + } + } + } + // add inline styles + if (this.attribute("style").hasValue()) { + var styles = this.attribute("style").value.split(";"); + for (var i = 0; i < styles.length; i++) { + if (svg.trim(styles[i]) != "") { + var style = styles[i].split(":"); + var name = svg.trim(style[0]); + var value = svg.trim(style[1]); + this.styles[name] = new svg.Property(name, value); + } + } + } + // add id + if (this.attribute("id").hasValue()) { + if (svg.Definitions[this.attribute("id").value] == null) { + svg.Definitions[this.attribute("id").value] = this; + } + } + } + }; + svg.Element.RenderedElementBase = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.setContext = function(ctx) { + // fill + if (this.style("fill").isUrlDefinition()) { + var fs = this.style("fill").getFillStyleDefinition(this, this.style("fill-opacity")); + if (fs != null) ctx.fillStyle = fs; + } else if (this.style("fill").hasValue()) { + var fillStyle = this.style("fill"); + if (fillStyle.value == "currentColor") fillStyle.value = this.style("color").value; + ctx.fillStyle = fillStyle.value == "none" ? "rgba(0,0,0,0)" : fillStyle.value; + } + if (this.style("fill-opacity").hasValue()) { + var fillStyle = new svg.Property("fill", ctx.fillStyle); + fillStyle = fillStyle.addOpacity(this.style("fill-opacity").value); + ctx.fillStyle = fillStyle.value; + } + // stroke + if (this.style("stroke").isUrlDefinition()) { + var fs = this.style("stroke").getFillStyleDefinition(this, this.style("stroke-opacity")); + if (fs != null) ctx.strokeStyle = fs; + } else if (this.style("stroke").hasValue()) { + var strokeStyle = this.style("stroke"); + if (strokeStyle.value == "currentColor") strokeStyle.value = this.style("color").value; + ctx.strokeStyle = strokeStyle.value == "none" ? "rgba(0,0,0,0)" : strokeStyle.value; + } + if (this.style("stroke-opacity").hasValue()) { + var strokeStyle = new svg.Property("stroke", ctx.strokeStyle); + strokeStyle = strokeStyle.addOpacity(this.style("stroke-opacity").value); + ctx.strokeStyle = strokeStyle.value; + } + if (this.style("stroke-width").hasValue()) { + var newLineWidth = this.style("stroke-width").toPixels(); + ctx.lineWidth = newLineWidth == 0 ? .001 : newLineWidth; + } + if (this.style("stroke-linecap").hasValue()) ctx.lineCap = this.style("stroke-linecap").value; + if (this.style("stroke-linejoin").hasValue()) ctx.lineJoin = this.style("stroke-linejoin").value; + if (this.style("stroke-miterlimit").hasValue()) ctx.miterLimit = this.style("stroke-miterlimit").value; + if (this.style("stroke-dasharray").hasValue()) { + var gaps = svg.ToNumberArray(this.style("stroke-dasharray").value); + if (typeof ctx.setLineDash != "undefined") { + ctx.setLineDash(gaps); + } else if (typeof ctx.webkitLineDash != "undefined") { + ctx.webkitLineDash = gaps; + } else if (typeof ctx.mozDash != "undefined") { + ctx.mozDash = gaps; + } + var offset = this.style("stroke-dashoffset").numValueOrDefault(1); + if (typeof ctx.lineDashOffset != "undefined") { + ctx.lineDashOffset = offset; + } else if (typeof ctx.webkitLineDashOffset != "undefined") { + ctx.webkitLineDashOffset = offset; + } else if (typeof ctx.mozDashOffset != "undefined") { + ctx.mozDashOffset = offset; + } + } + // font + if (typeof ctx.font != "undefined") { + ctx.font = svg.Font.CreateFont(this.style("font-style").value, this.style("font-variant").value, this.style("font-weight").value, this.style("font-size").hasValue() ? this.style("font-size").toPixels() + "px" : "", this.style("font-family").value).toString(); + } + // transform + if (this.attribute("transform").hasValue()) { + var transform = new svg.Transform(this.attribute("transform").value); + transform.apply(ctx); + } + // clip + if (this.style("clip-path").hasValue()) { + var clip = this.style("clip-path").getDefinition(); + if (clip != null) clip.apply(ctx); + } + // opacity + if (this.style("opacity").hasValue()) { + ctx.globalAlpha = this.style("opacity").numValue(); + } + }; + }; + svg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase(); + svg.Element.PathElementBase = function(node) { + this.base = svg.Element.RenderedElementBase; + this.base(node); + this.path = function(ctx) { + if (ctx != null) ctx.beginPath(); + return new svg.BoundingBox(); + }; + this.renderChildren = function(ctx) { + this.path(ctx); + svg.Mouse.checkPath(this, ctx); + if (ctx.fillStyle != "") { + if (this.attribute("fill-rule").hasValue()) { + ctx.fill(this.attribute("fill-rule").value); + } else { + ctx.fill(); + } + } + if (ctx.strokeStyle != "") ctx.stroke(); + var markers = this.getMarkers(); + if (markers != null) { + if (this.style("marker-start").isUrlDefinition()) { + var marker = this.style("marker-start").getDefinition(); + marker.render(ctx, markers[0][0], markers[0][1]); + } + if (this.style("marker-mid").isUrlDefinition()) { + var marker = this.style("marker-mid").getDefinition(); + for (var i = 1; i < markers.length - 1; i++) { + marker.render(ctx, markers[i][0], markers[i][1]); + } + } + if (this.style("marker-end").isUrlDefinition()) { + var marker = this.style("marker-end").getDefinition(); + marker.render(ctx, markers[markers.length - 1][0], markers[markers.length - 1][1]); + } + } + }; + this.getBoundingBox = function() { + return this.path(); + }; + this.getMarkers = function() { + return null; + }; + }; + svg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase(); + // svg element + svg.Element.svg = function(node) { + this.base = svg.Element.RenderedElementBase; + this.base(node); + this.baseClearContext = this.clearContext; + this.clearContext = function(ctx) { + this.baseClearContext(ctx); + svg.ViewPort.RemoveCurrent(); + }; + this.baseSetContext = this.setContext; + this.setContext = function(ctx) { + // initial values + ctx.strokeStyle = "rgba(0,0,0,0)"; + ctx.lineCap = "butt"; + ctx.lineJoin = "miter"; + ctx.miterLimit = 4; + this.baseSetContext(ctx); + // create new view port + if (!this.attribute("x").hasValue()) this.attribute("x", true).value = 0; + if (!this.attribute("y").hasValue()) this.attribute("y", true).value = 0; + ctx.translate(this.attribute("x").toPixels("x"), this.attribute("y").toPixels("y")); + var width = svg.ViewPort.width(); + var height = svg.ViewPort.height(); + if (!this.attribute("width").hasValue()) this.attribute("width", true).value = "100%"; + if (!this.attribute("height").hasValue()) this.attribute("height", true).value = "100%"; + if (typeof this.root == "undefined") { + width = this.attribute("width").toPixels("x"); + height = this.attribute("height").toPixels("y"); + var x = 0; + var y = 0; + if (this.attribute("refX").hasValue() && this.attribute("refY").hasValue()) { + x = -this.attribute("refX").toPixels("x"); + y = -this.attribute("refY").toPixels("y"); + } + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(width, y); + ctx.lineTo(width, height); + ctx.lineTo(x, height); + ctx.closePath(); + ctx.clip(); + } + svg.ViewPort.SetCurrent(width, height); + // viewbox + if (this.attribute("viewBox").hasValue()) { + var viewBox = svg.ToNumberArray(this.attribute("viewBox").value); + var minX = viewBox[0]; + var minY = viewBox[1]; + width = viewBox[2]; + height = viewBox[3]; + svg.AspectRatio(ctx, this.attribute("preserveAspectRatio").value, svg.ViewPort.width(), width, svg.ViewPort.height(), height, minX, minY, this.attribute("refX").value, this.attribute("refY").value); + svg.ViewPort.RemoveCurrent(); + svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]); + } + }; + }; + svg.Element.svg.prototype = new svg.Element.RenderedElementBase(); + // rect element + svg.Element.rect = function(node) { + this.base = svg.Element.PathElementBase; + this.base(node); + this.path = 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"); + var rx = this.attribute("rx").toPixels("x"); + var ry = this.attribute("ry").toPixels("y"); + if (this.attribute("rx").hasValue() && !this.attribute("ry").hasValue()) ry = rx; + if (this.attribute("ry").hasValue() && !this.attribute("rx").hasValue()) rx = ry; + rx = Math.min(rx, width / 2); + ry = Math.min(ry, height / 2); + if (ctx != null) { + ctx.beginPath(); + ctx.moveTo(x + rx, y); + ctx.lineTo(x + width - rx, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + ry); + ctx.lineTo(x + width, y + height - ry); + ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); + ctx.lineTo(x + rx, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - ry); + ctx.lineTo(x, y + ry); + ctx.quadraticCurveTo(x, y, x + rx, y); + ctx.closePath(); + } + return new svg.BoundingBox(x, y, x + width, y + height); + }; + }; + svg.Element.rect.prototype = new svg.Element.PathElementBase(); + // circle element + svg.Element.circle = function(node) { + this.base = svg.Element.PathElementBase; + this.base(node); + this.path = function(ctx) { + var cx = this.attribute("cx").toPixels("x"); + var cy = this.attribute("cy").toPixels("y"); + var r = this.attribute("r").toPixels(); + if (ctx != null) { + ctx.beginPath(); + ctx.arc(cx, cy, r, 0, Math.PI * 2, true); + ctx.closePath(); + } + return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r); + }; + }; + svg.Element.circle.prototype = new svg.Element.PathElementBase(); + // ellipse element + svg.Element.ellipse = function(node) { + this.base = svg.Element.PathElementBase; + this.base(node); + this.path = function(ctx) { + var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3); + var rx = this.attribute("rx").toPixels("x"); + var ry = this.attribute("ry").toPixels("y"); + var cx = this.attribute("cx").toPixels("x"); + var cy = this.attribute("cy").toPixels("y"); + if (ctx != null) { + ctx.beginPath(); + ctx.moveTo(cx, cy - ry); + ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy); + ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry); + ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy); + ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry); + ctx.closePath(); + } + return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry); + }; + }; + svg.Element.ellipse.prototype = new svg.Element.PathElementBase(); + // line element + svg.Element.line = function(node) { + this.base = svg.Element.PathElementBase; + this.base(node); + this.getPoints = function() { + return [ new svg.Point(this.attribute("x1").toPixels("x"), this.attribute("y1").toPixels("y")), new svg.Point(this.attribute("x2").toPixels("x"), this.attribute("y2").toPixels("y")) ]; + }; + this.path = function(ctx) { + var points = this.getPoints(); + if (ctx != null) { + ctx.beginPath(); + ctx.moveTo(points[0].x, points[0].y); + ctx.lineTo(points[1].x, points[1].y); + } + return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y); + }; + this.getMarkers = function() { + var points = this.getPoints(); + var a = points[0].angleTo(points[1]); + return [ [ points[0], a ], [ points[1], a ] ]; + }; + }; + svg.Element.line.prototype = new svg.Element.PathElementBase(); + // polyline element + svg.Element.polyline = function(node) { + this.base = svg.Element.PathElementBase; + this.base(node); + this.points = svg.CreatePath(this.attribute("points").value); + this.path = function(ctx) { + var bb = new svg.BoundingBox(this.points[0].x, this.points[0].y); + if (ctx != null) { + ctx.beginPath(); + ctx.moveTo(this.points[0].x, this.points[0].y); + } + for (var i = 1; i < this.points.length; i++) { + bb.addPoint(this.points[i].x, this.points[i].y); + if (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y); + } + return bb; + }; + this.getMarkers = function() { + var markers = []; + for (var i = 0; i < this.points.length - 1; i++) { + markers.push([ this.points[i], this.points[i].angleTo(this.points[i + 1]) ]); + } + markers.push([ this.points[this.points.length - 1], markers[markers.length - 1][1] ]); + return markers; + }; + }; + svg.Element.polyline.prototype = new svg.Element.PathElementBase(); + // polygon element + svg.Element.polygon = function(node) { + this.base = svg.Element.polyline; + this.base(node); + this.basePath = this.path; + this.path = function(ctx) { + var bb = this.basePath(ctx); + if (ctx != null) { + ctx.lineTo(this.points[0].x, this.points[0].y); + ctx.closePath(); + } + return bb; + }; + }; + svg.Element.polygon.prototype = new svg.Element.polyline(); + // path element + svg.Element.path = function(node) { + this.base = svg.Element.PathElementBase; + this.base(node); + var d = this.attribute("d").value; + // TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF + d = d.replace(/,/gm, " "); + // get rid of all commas + d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2"); + // separate commands from commands + d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2"); + // separate commands from commands + d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm, "$1 $2"); + // separate commands from points + d = d.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2"); + // separate commands from points + d = d.replace(/([0-9])([+\-])/gm, "$1 $2"); + // separate digits when no comma + d = d.replace(/(\.[0-9]*)(\.)/gm, "$1 $2"); + // separate digits when no comma + d = d.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm, "$1 $3 $4 "); + // shorthand elliptical arc path syntax + d = svg.compressSpaces(d); + // compress multiple spaces + d = svg.trim(d); + this.PathParser = new function(d) { + this.tokens = d.split(" "); + this.reset = function() { + this.i = -1; + this.command = ""; + this.previousCommand = ""; + this.start = new svg.Point(0, 0); + this.control = new svg.Point(0, 0); + this.current = new svg.Point(0, 0); + this.points = []; + this.angles = []; + }; + this.isEnd = function() { + return this.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 < this.angles.length; i++) { + if (this.angles[i] == null) { + for (var j = i + 1; j < this.angles.length; j++) { + if (this.angles[j] != null) { + this.angles[i] = this.angles[j]; + break; + } + } + } + } + return this.angles; + }; + }(d); + this.path = function(ctx) { + var pp = this.PathParser; + pp.reset(); + var bb = new svg.BoundingBox(); + if (ctx != null) ctx.beginPath(); + while (!pp.isEnd()) { + pp.nextCommand(); + switch (pp.command) { + case "M": + case "m": + var p = pp.getAsCurrentPoint(); + pp.addMarker(p); + bb.addPoint(p.x, p.y); + if (ctx != null) ctx.moveTo(p.x, p.y); + pp.start = pp.current; + while (!pp.isCommandOrEnd()) { + var p = pp.getAsCurrentPoint(); + pp.addMarker(p, pp.start); + bb.addPoint(p.x, p.y); + if (ctx != null) ctx.lineTo(p.x, p.y); + } + break; + + case "L": + case "l": + while (!pp.isCommandOrEnd()) { + var c = pp.current; + var p = pp.getAsCurrentPoint(); + pp.addMarker(p, c); + bb.addPoint(p.x, p.y); + if (ctx != null) ctx.lineTo(p.x, p.y); + } + break; + + case "H": + case "h": + while (!pp.isCommandOrEnd()) { + var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y); + pp.addMarker(newP, pp.current); + pp.current = newP; + bb.addPoint(pp.current.x, pp.current.y); + if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y); + } + break; + + case "V": + case "v": + while (!pp.isCommandOrEnd()) { + var newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar()); + pp.addMarker(newP, pp.current); + pp.current = newP; + bb.addPoint(pp.current.x, pp.current.y); + if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y); + } + break; + + case "C": + case "c": + while (!pp.isCommandOrEnd()) { + var curr = pp.current; + var p1 = pp.getPoint(); + var cntrl = pp.getAsControlPoint(); + var cp = pp.getAsCurrentPoint(); + pp.addMarker(cp, cntrl, p1); + bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); + if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); + } + break; + + case "S": + case "s": + while (!pp.isCommandOrEnd()) { + var curr = pp.current; + var p1 = pp.getReflectedControlPoint(); + var cntrl = pp.getAsControlPoint(); + var cp = pp.getAsCurrentPoint(); + pp.addMarker(cp, cntrl, p1); + bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); + if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); + } + break; + + case "Q": + case "q": + while (!pp.isCommandOrEnd()) { + var curr = pp.current; + var cntrl = pp.getAsControlPoint(); + var cp = pp.getAsCurrentPoint(); + pp.addMarker(cp, cntrl, cntrl); + bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y); + if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y); + } + break; + + case "T": + case "t": + while (!pp.isCommandOrEnd()) { + var curr = pp.current; + var cntrl = pp.getReflectedControlPoint(); + pp.control = cntrl; + var cp = pp.getAsCurrentPoint(); + pp.addMarker(cp, cntrl, cntrl); + bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y); + if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y); + } + break; + + case "A": + case "a": + while (!pp.isCommandOrEnd()) { + var curr = pp.current; + var rx = pp.getScalar(); + var ry = pp.getScalar(); + var xAxisRotation = pp.getScalar() * (Math.PI / 180); + var largeArcFlag = pp.getScalar(); + var sweepFlag = pp.getScalar(); + var cp = pp.getAsCurrentPoint(); + // Conversion from endpoint to center parameterization + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + // x1', y1' + var currp = new svg.Point(Math.cos(xAxisRotation) * (curr.x - cp.x) / 2 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2, -Math.sin(xAxisRotation) * (curr.x - cp.x) / 2 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2); + // adjust radii + var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2); + if (l > 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 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (curr.y + cp.y) / 2 + 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 : -1; + var ah = a1 + dir * (ad / 2); + 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 < points.length; i++) { + markers.push([ points[i], angles[i] ]); + } + return markers; + }; + }; + svg.Element.path.prototype = new svg.Element.PathElementBase(); + // pattern element + svg.Element.pattern = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.createPattern = function(ctx, element) { + var width = this.attribute("width").toPixels("x", true); + var height = this.attribute("height").toPixels("y", true); + // render me using a temporary svg element + var tempSvg = new svg.Element.svg(); + tempSvg.attributes["viewBox"] = new svg.Property("viewBox", this.attribute("viewBox").value); + tempSvg.attributes["width"] = new svg.Property("width", width + "px"); + tempSvg.attributes["height"] = new svg.Property("height", height + "px"); + tempSvg.attributes["transform"] = new svg.Property("transform", this.attribute("patternTransform").value); + tempSvg.children = this.children; + var c = document.createElement("canvas"); + c.width = width; + c.height = height; + var cctx = c.getContext("2d"); + if (this.attribute("x").hasValue() && this.attribute("y").hasValue()) { + cctx.translate(this.attribute("x").toPixels("x", true), this.attribute("y").toPixels("y", true)); + } + // render 3x3 grid so when we transform there's no white space on edges + for (var x = -1; x <= 1; x++) { + for (var y = -1; y <= 1; y++) { + cctx.save(); + cctx.translate(x * c.width, y * c.height); + tempSvg.render(cctx); + cctx.restore(); + } + } + var pattern = ctx.createPattern(c, "repeat"); + return pattern; + }; + }; + svg.Element.pattern.prototype = new svg.Element.ElementBase(); + // marker element + svg.Element.marker = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.baseRender = this.render; + this.render = function(ctx, point, angle) { + ctx.translate(point.x, point.y); + if (this.attribute("orient").valueOrDefault("auto") == "auto") ctx.rotate(angle); + if (this.attribute("markerUnits").valueOrDefault("strokeWidth") == "strokeWidth") ctx.scale(ctx.lineWidth, ctx.lineWidth); + ctx.save(); + // render me using a temporary svg element + var tempSvg = new svg.Element.svg(); + tempSvg.attributes["viewBox"] = new svg.Property("viewBox", this.attribute("viewBox").value); + tempSvg.attributes["refX"] = new svg.Property("refX", this.attribute("refX").value); + tempSvg.attributes["refY"] = new svg.Property("refY", this.attribute("refY").value); + tempSvg.attributes["width"] = new svg.Property("width", this.attribute("markerWidth").value); + tempSvg.attributes["height"] = new svg.Property("height", this.attribute("markerHeight").value); + tempSvg.attributes["fill"] = new svg.Property("fill", this.attribute("fill").valueOrDefault("black")); + tempSvg.attributes["stroke"] = new svg.Property("stroke", this.attribute("stroke").valueOrDefault("none")); + tempSvg.children = this.children; + tempSvg.render(ctx); + ctx.restore(); + if (this.attribute("markerUnits").valueOrDefault("strokeWidth") == "strokeWidth") ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth); + if (this.attribute("orient").valueOrDefault("auto") == "auto") ctx.rotate(-angle); + ctx.translate(-point.x, -point.y); + }; + }; + svg.Element.marker.prototype = new svg.Element.ElementBase(); + // definitions element + svg.Element.defs = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.render = function(ctx) {}; + }; + svg.Element.defs.prototype = new svg.Element.ElementBase(); + // base for gradients + svg.Element.GradientBase = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.gradientUnits = this.attribute("gradientUnits").valueOrDefault("objectBoundingBox"); + this.stops = []; + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if (child.type == "stop") this.stops.push(child); + } + this.getGradient = function() {}; + this.createGradient = function(ctx, element, parentOpacityProp) { + var stopsContainer = this; + if (this.getHrefAttribute().hasValue()) { + stopsContainer = this.getHrefAttribute().getDefinition(); + } + var addParentOpacity = function(color) { + if (parentOpacityProp.hasValue()) { + var p = new svg.Property("color", color); + return p.addOpacity(parentOpacityProp.value).value; + } + return color; + }; + var g = this.getGradient(ctx, element); + if (g == null) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color); + for (var i = 0; i < stopsContainer.stops.length; i++) { + g.addColorStop(stopsContainer.stops[i].offset, addParentOpacity(stopsContainer.stops[i].color)); + } + if (this.attribute("gradientTransform").hasValue()) { + // render as transformed pattern on temporary canvas + var rootView = svg.ViewPort.viewPorts[0]; + var rect = new svg.Element.rect(); + rect.attributes["x"] = new svg.Property("x", -svg.MAX_VIRTUAL_PIXELS / 3); + rect.attributes["y"] = new svg.Property("y", -svg.MAX_VIRTUAL_PIXELS / 3); + rect.attributes["width"] = new svg.Property("width", svg.MAX_VIRTUAL_PIXELS); + rect.attributes["height"] = new svg.Property("height", svg.MAX_VIRTUAL_PIXELS); + var group = new svg.Element.g(); + group.attributes["transform"] = new svg.Property("transform", this.attribute("gradientTransform").value); + group.children = [ rect ]; + var tempSvg = new svg.Element.svg(); + tempSvg.attributes["x"] = new svg.Property("x", 0); + tempSvg.attributes["y"] = new svg.Property("y", 0); + tempSvg.attributes["width"] = new svg.Property("width", rootView.width); + tempSvg.attributes["height"] = new svg.Property("height", rootView.height); + tempSvg.children = [ group ]; + var c = document.createElement("canvas"); + c.width = rootView.width; + c.height = rootView.height; + var tempCtx = c.getContext("2d"); + tempCtx.fillStyle = g; + tempSvg.render(tempCtx); + return tempCtx.createPattern(c, "no-repeat"); + } + return g; + }; + }; + svg.Element.GradientBase.prototype = new svg.Element.ElementBase(); + // linear gradient element + svg.Element.linearGradient = function(node) { + this.base = svg.Element.GradientBase; + this.base(node); + this.getGradient = function(ctx, element) { + var bb = element.getBoundingBox(); + if (!this.attribute("x1").hasValue() && !this.attribute("y1").hasValue() && !this.attribute("x2").hasValue() && !this.attribute("y2").hasValue()) { + this.attribute("x1", true).value = 0; + this.attribute("y1", true).value = 0; + this.attribute("x2", true).value = 1; + this.attribute("y2", true).value = 0; + } + var x1 = this.gradientUnits == "objectBoundingBox" ? bb.x() + bb.width() * this.attribute("x1").numValue() : this.attribute("x1").toPixels("x"); + var y1 = this.gradientUnits == "objectBoundingBox" ? bb.y() + bb.height() * this.attribute("y1").numValue() : this.attribute("y1").toPixels("y"); + var x2 = this.gradientUnits == "objectBoundingBox" ? bb.x() + bb.width() * this.attribute("x2").numValue() : this.attribute("x2").toPixels("x"); + var y2 = this.gradientUnits == "objectBoundingBox" ? bb.y() + bb.height() * this.attribute("y2").numValue() : this.attribute("y2").toPixels("y"); + if (x1 == x2 && y1 == y2) return null; + return ctx.createLinearGradient(x1, y1, x2, y2); + }; + }; + svg.Element.linearGradient.prototype = new svg.Element.GradientBase(); + // radial gradient element + svg.Element.radialGradient = function(node) { + this.base = svg.Element.GradientBase; + this.base(node); + this.getGradient = function(ctx, element) { + var bb = element.getBoundingBox(); + if (!this.attribute("cx").hasValue()) this.attribute("cx", true).value = "50%"; + if (!this.attribute("cy").hasValue()) this.attribute("cy", true).value = "50%"; + if (!this.attribute("r").hasValue()) this.attribute("r", true).value = "50%"; + var cx = this.gradientUnits == "objectBoundingBox" ? bb.x() + bb.width() * this.attribute("cx").numValue() : this.attribute("cx").toPixels("x"); + var cy = this.gradientUnits == "objectBoundingBox" ? bb.y() + bb.height() * this.attribute("cy").numValue() : this.attribute("cy").toPixels("y"); + var fx = cx; + var fy = cy; + if (this.attribute("fx").hasValue()) { + fx = this.gradientUnits == "objectBoundingBox" ? bb.x() + bb.width() * this.attribute("fx").numValue() : this.attribute("fx").toPixels("x"); + } + if (this.attribute("fy").hasValue()) { + fy = this.gradientUnits == "objectBoundingBox" ? bb.y() + bb.height() * this.attribute("fy").numValue() : this.attribute("fy").toPixels("y"); + } + var r = this.gradientUnits == "objectBoundingBox" ? (bb.width() + bb.height()) / 2 * this.attribute("r").numValue() : this.attribute("r").toPixels(); + return ctx.createRadialGradient(fx, fy, 0, cx, cy, r); + }; + }; + svg.Element.radialGradient.prototype = new svg.Element.GradientBase(); + // gradient stop element + svg.Element.stop = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.offset = this.attribute("offset").numValue(); + if (this.offset < 0) this.offset = 0; + if (this.offset > 1) this.offset = 1; + var stopColor = this.style("stop-color"); + if (this.style("stop-opacity").hasValue()) stopColor = stopColor.addOpacity(this.style("stop-opacity").value); + 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; + 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; + } else if (this.attribute("fill").valueOrDefault("remove") == "remove" && !this.removed) { + this.removed = true; + this.getProperty().value = this.initialValue; + return true; + } else { + 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 < from.length; i++) { + newValue += from[i] + (to[i] - from[i]) * p.progress + " "; + } + return newValue; + }; + }; + 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; i < this.children.length; i++) { + var child = this.children[i]; + if (child.type == "font-face") { + this.fontFace = child; + if (child.style("font-family").hasValue()) { + svg.Definitions[child.style("font-family").value] = this; + } + } else if (child.type == "missing-glyph") this.missingGlyph = child; else if (child.type == "glyph") { + if (child.arabicForm != "") { + this.isRTL = true; + this.isArabic = true; + if (typeof this.glyphs[child.unicode] == "undefined") this.glyphs[child.unicode] = []; + this.glyphs[child.unicode][child.arabicForm] = child; + } else { + this.glyphs[child.unicode] = child; + } + } + } + }; + svg.Element.font.prototype = new svg.Element.ElementBase(); + // font-face element + svg.Element.fontface = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.ascent = this.attribute("ascent").value; + this.descent = this.attribute("descent").value; + this.unitsPerEm = this.attribute("units-per-em").numValue(); + }; + svg.Element.fontface.prototype = new svg.Element.ElementBase(); + // missing-glyph element + svg.Element.missingglyph = function(node) { + this.base = svg.Element.path; + this.base(node); + this.horizAdvX = 0; + }; + svg.Element.missingglyph.prototype = new svg.Element.path(); + // glyph element + svg.Element.glyph = function(node) { + this.base = svg.Element.path; + this.base(node); + this.horizAdvX = this.attribute("horiz-adv-x").numValue(); + this.unicode = this.attribute("unicode").value; + this.arabicForm = this.attribute("arabic-form").value; + }; + svg.Element.glyph.prototype = new svg.Element.path(); + // text element + svg.Element.text = function(node) { + this.captureTextNodes = true; + this.base = svg.Element.RenderedElementBase; + this.base(node); + this.baseSetContext = this.setContext; + this.setContext = function(ctx) { + this.baseSetContext(ctx); + if (this.style("dominant-baseline").hasValue()) ctx.textBaseline = this.style("dominant-baseline").value; + if (this.style("alignment-baseline").hasValue()) ctx.textBaseline = this.style("alignment-baseline").value; + }; + this.getBoundingBox = function() { + // TODO: implement + return new svg.BoundingBox(this.attribute("x").toPixels("x"), this.attribute("y").toPixels("y"), 0, 0); + }; + this.renderChildren = function(ctx) { + this.x = this.attribute("x").toPixels("x"); + this.y = this.attribute("y").toPixels("y"); + this.x += this.getAnchorDelta(ctx, this, 0); + for (var i = 0; i < this.children.length; i++) { + this.renderChild(ctx, this, i); + } + }; + this.getAnchorDelta = function(ctx, parent, startI) { + var textAnchor = this.style("text-anchor").valueOrDefault("start"); + if (textAnchor != "start") { + var width = 0; + for (var i = startI; i < parent.children.length; i++) { + var child = parent.children[i]; + if (i > startI && child.attribute("x").hasValue()) break; + // new group + width += child.measureTextRecursive(ctx); + } + return -1 * (textAnchor == "end" ? width : width / 2); + } + 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); + } 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"); + } 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; i < child.children.length; i++) { + this.renderChild(ctx, child, i); + } + }; + }; + svg.Element.text.prototype = new svg.Element.RenderedElementBase(); + // text base + svg.Element.TextElementBase = function(node) { + this.base = svg.Element.RenderedElementBase; + this.base(node); + this.getGlyph = function(font, text, i) { + var c = text[i]; + var glyph = null; + if (font.isArabic) { + var arabicForm = "isolated"; + if ((i == 0 || text[i - 1] == " ") && i < text.length - 2 && text[i + 1] != " ") arabicForm = "terminal"; + if (i > 0 && text[i - 1] != " " && i < text.length - 2 && text[i + 1] != " ") arabicForm = "medial"; + if (i > 0 && 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 < text.length; i++) { + var glyph = this.getGlyph(customFont, text, i); + var scale = fontSize / customFont.fontFace.unitsPerEm; + ctx.translate(this.x, this.y); + ctx.scale(scale, -scale); + var lw = ctx.lineWidth; + ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize; + if (fontStyle == "italic") ctx.transform(1, 0, .4, 1, 0, 0); + glyph.render(ctx); + if (fontStyle == "italic") ctx.transform(1, 0, -.4, 1, 0, 0); + ctx.lineWidth = lw; + ctx.scale(1 / scale, -1 / scale); + ctx.translate(-this.x, -this.y); + this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm; + if (typeof dx[i] != "undefined" && !isNaN(dx[i])) { + this.x += dx[i]; + } + } + return; + } + if (ctx.fillStyle != "") ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y); + if (ctx.strokeStyle != "") ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y); + }; + this.getText = function() {}; + this.measureTextRecursive = function(ctx) { + var width = this.measureText(ctx); + for (var i = 0; i < this.children.length; i++) { + width += this.children[i].measureTextRecursive(ctx); + } + return width; + }; + this.measureText = 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 measure = 0; + 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 < text.length; i++) { + var glyph = this.getGlyph(customFont, text, i); + measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm; + if (typeof dx[i] != "undefined" && !isNaN(dx[i])) { + measure += dx[i]; + } + } + return measure; + } + var textToMeasure = svg.compressSpaces(this.getText()); + if (!ctx.measureText) return textToMeasure.length * 10; + ctx.save(); + this.setContext(ctx); + var width = ctx.measureText(textToMeasure).width; + ctx.restore(); + return width; + }; + }; + svg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase(); + // tspan + svg.Element.tspan = function(node) { + this.captureTextNodes = true; + this.base = svg.Element.TextElementBase; + this.base(node); + this.text = node.nodeValue || 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.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 = true; + for (var i = 0; i < node.childNodes.length; i++) { + if (node.childNodes[i].nodeType != 3) this.hasText = false; + } + // this might contain text + this.text = this.hasText ? node.childNodes[0].nodeValue : ""; + this.getText = function() { + return this.text; + }; + this.baseRenderChildren = this.renderChildren; + this.renderChildren = function(ctx) { + if (this.hasText) { + // render as text element + this.baseRenderChildren(ctx); + var fontSize = new svg.Property("fontSize", svg.Font.Parse(svg.ctx.font).fontSize); + svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels("y"), this.x + this.measureText(ctx), this.y)); + } else { + // 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; + var isSvg = href.match(/\.svg$/); + svg.Images.push(this); + this.loaded = false; + if (!isSvg) { + this.img = document.createElement("img"); + var self = this; + this.img.onload = function() { + self.loaded = true; + }; + this.img.onerror = function() { + if (typeof console != "undefined") { + console.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 < this.children.length; i++) { + bb.addBoundingBox(this.children[i].getBoundingBox()); + } + return bb; + }; + }; + svg.Element.g.prototype = new svg.Element.RenderedElementBase(); + // symbol element + svg.Element.symbol = function(node) { + this.base = svg.Element.RenderedElementBase; + this.base(node); + this.baseSetContext = this.setContext; + this.setContext = function(ctx) { + this.baseSetContext(ctx); + // viewbox + if (this.attribute("viewBox").hasValue()) { + var viewBox = svg.ToNumberArray(this.attribute("viewBox").value); + var minX = viewBox[0]; + var minY = viewBox[1]; + width = viewBox[2]; + height = viewBox[3]; + svg.AspectRatio(ctx, this.attribute("preserveAspectRatio").value, this.attribute("width").toPixels("x"), width, this.attribute("height").toPixels("y"), height, minX, minY); + svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]); + } + }; + }; + svg.Element.symbol.prototype = new svg.Element.RenderedElementBase(); + // style element + svg.Element.style = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + // text, or spaces then CDATA + var css = ""; + for (var i = 0; i < node.childNodes.length; i++) { + css += node.childNodes[i].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 < cssDefs.length; i++) { + if (svg.trim(cssDefs[i]) != "") { + var cssDef = cssDefs[i].split("{"); + var cssClasses = cssDef[0].split(","); + var cssProps = cssDef[1].split(";"); + for (var j = 0; j < cssClasses.length; j++) { + var cssClass = svg.trim(cssClasses[j]); + if (cssClass != "") { + var props = {}; + for (var k = 0; k < cssProps.length; k++) { + var prop = cssProps[k].indexOf(":"); + var name = cssProps[k].substr(0, prop); + var value = cssProps[k].substr(prop + 1, cssProps[k].length - prop); + if (name != null && value != null) { + props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value)); + } + } + svg.Styles[cssClass] = props; + if (cssClass == "@font-face") { + var fontFamily = props["font-family"].value.replace(/"/g, ""); + var srcs = props["src"].value.split(","); + for (var s = 0; s < srcs.length; s++) { + if (srcs[s].indexOf('format("svg")') > 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 < fonts.length; f++) { + var font = svg.CreateElement(fonts[f]); + svg.Definitions[fontFamily] = font; + } + } + } + } + } + } + } + } + }; + svg.Element.style.prototype = new svg.Element.ElementBase(); + // use element + svg.Element.use = function(node) { + this.base = svg.Element.RenderedElementBase; + this.base(node); + this.baseSetContext = this.setContext; + this.setContext = function(ctx) { + this.baseSetContext(ctx); + if (this.attribute("x").hasValue()) ctx.translate(this.attribute("x").toPixels("x"), 0); + if (this.attribute("y").hasValue()) ctx.translate(0, this.attribute("y").toPixels("y")); + }; + this.getDefinition = function() { + var element = this.getHrefAttribute().getDefinition(); + if (this.attribute("width").hasValue()) element.attribute("width", true).value = this.attribute("width").value; + if (this.attribute("height").hasValue()) element.attribute("height", true).value = this.attribute("height").value; + return element; + }; + this.path = function(ctx) { + var element = this.getDefinition(); + if (element != null) element.path(ctx); + }; + this.getBoundingBox = function() { + var element = this.getDefinition(); + if (element != null) return element.getBoundingBox(); + }; + this.renderChildren = function(ctx) { + var element = this.getDefinition(); + if (element != null) { + // temporarily detach from parent and render + var oldParent = element.parent; + element.parent = null; + element.render(ctx); + element.parent = oldParent; + } + }; + }; + svg.Element.use.prototype = new svg.Element.RenderedElementBase(); + // mask element + svg.Element.mask = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.apply = function(ctx, element) { + // render as temp svg + 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) { + var bb = new svg.BoundingBox(); + for (var i = 0; i < this.children.length; i++) { + bb.addBoundingBox(this.children[i].getBoundingBox()); + } + var x = Math.floor(bb.x1); + var y = Math.floor(bb.y1); + var width = Math.floor(bb.width()); + var height = Math.floor(bb.height()); + } + // temporarily remove mask to avoid recursion + var mask = element.attribute("mask").value; + element.attribute("mask").value = ""; + var cMask = document.createElement("canvas"); + cMask.width = x + width; + cMask.height = y + height; + var maskCtx = cMask.getContext("2d"); + this.renderChildren(maskCtx); + var c = document.createElement("canvas"); + c.width = x + width; + c.height = y + height; + var tempCtx = c.getContext("2d"); + element.render(tempCtx); + tempCtx.globalCompositeOperation = "destination-in"; + tempCtx.fillStyle = maskCtx.createPattern(cMask, "no-repeat"); + tempCtx.fillRect(0, 0, x + width, y + height); + ctx.fillStyle = tempCtx.createPattern(c, "no-repeat"); + ctx.fillRect(0, 0, x + width, y + height); + // reassign mask + element.attribute("mask").value = mask; + }; + this.render = function(ctx) {}; + }; + svg.Element.mask.prototype = new svg.Element.ElementBase(); + // clip element + svg.Element.clipPath = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.apply = function(ctx) { + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if (typeof child.path != "undefined") { + var transform = null; + if (child.attribute("transform").hasValue()) { + transform = new svg.Transform(child.attribute("transform").value); + transform.apply(ctx); + } + child.path(ctx); + ctx.clip(); + if (transform) { + transform.unapply(ctx); + } + } + } + }; + this.render = function(ctx) {}; + }; + svg.Element.clipPath.prototype = new svg.Element.ElementBase(); + // filters + svg.Element.filter = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.apply = function(ctx, element) { + // render as temp svg + var bb = element.getBoundingBox(); + var x = Math.floor(bb.x1); + var y = Math.floor(bb.y1); + var width = Math.floor(bb.width()); + var height = Math.floor(bb.height()); + // temporarily remove filter to avoid recursion + var filter = element.style("filter").value; + element.style("filter").value = ""; + var px = 0, py = 0; + for (var i = 0; i < this.children.length; i++) { + var efd = this.children[i].extraFilterDistance || 0; + px = Math.max(px, efd); + py = Math.max(py, efd); + } + var c = document.createElement("canvas"); + c.width = width + 2 * px; + c.height = height + 2 * py; + var tempCtx = c.getContext("2d"); + tempCtx.translate(-x + px, -y + py); + element.render(tempCtx); + // apply filters + for (var i = 0; i < this.children.length; i++) { + this.children[i].apply(tempCtx, 0, 0, width + 2 * px, height + 2 * py); + } + // render on me + ctx.drawImage(c, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py); + // reassign filter + element.style("filter", true).value = filter; + }; + this.render = function(ctx) {}; + }; + svg.Element.filter.prototype = new svg.Element.ElementBase(); + svg.Element.feMorphology = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.apply = function(ctx, x, y, width, height) {}; + }; + svg.Element.feMorphology.prototype = new svg.Element.ElementBase(); + svg.Element.feColorMatrix = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + function imGet(img, x, y, width, height, rgba) { + return img[y * width * 4 + x * 4 + rgba]; + } + function imSet(img, x, y, width, height, rgba, val) { + img[y * width * 4 + x * 4 + rgba] = val; + } + this.apply = function(ctx, x, y, width, height) { + // only supporting grayscale for now per Issue 195, need to extend to all matrix + // assuming x==0 && y==0 for now + var srcData = ctx.getImageData(0, 0, width, height); + for (var y = 0; y < height; y++) { + for (var x = 0; x < width; x++) { + var r = imGet(srcData.data, x, y, width, height, 0); + var g = imGet(srcData.data, x, y, width, height, 1); + var b = imGet(srcData.data, x, y, width, height, 2); + var gray = (r + g + b) / 3; + imSet(srcData.data, x, y, width, height, 0, gray); + imSet(srcData.data, x, y, width, height, 1, gray); + imSet(srcData.data, x, y, width, height, 2, gray); + } + } + ctx.clearRect(0, 0, width, height); + ctx.putImageData(srcData, 0, 0); + }; + }; + svg.Element.feColorMatrix.prototype = new svg.Element.ElementBase(); + svg.Element.feGaussianBlur = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + this.blurRadius = Math.floor(this.attribute("stdDeviation").numValue()); + this.extraFilterDistance = this.blurRadius; + this.apply = function(ctx, x, y, width, height) { + if (typeof stackBlurCanvasRGBA == "undefined") { + if (typeof console != "undefined") { + console.log("ERROR: StackBlur.js must be included for blur to work"); + } + return; + } + // StackBlur requires canvas be on document + ctx.canvas.id = svg.UniqueId(); + ctx.canvas.style.display = "none"; + document.body.appendChild(ctx.canvas); + stackBlurCanvasRGBA(ctx.canvas.id, x, y, width, height, this.blurRadius); + document.body.removeChild(ctx.canvas); + }; + }; + svg.Element.feGaussianBlur.prototype = new svg.Element.ElementBase(); + // title element, do nothing + svg.Element.title = function(node) {}; + svg.Element.title.prototype = new svg.Element.ElementBase(); + // desc element, do nothing + svg.Element.desc = function(node) {}; + svg.Element.desc.prototype = new svg.Element.ElementBase(); + svg.Element.MISSING = function(node) { + if (typeof console != "undefined") { + console.log("ERROR: Element '" + node.nodeName + "' not yet implemented."); + } + }; + svg.Element.MISSING.prototype = new svg.Element.ElementBase(); + // element factory + svg.CreateElement = function(node) { + var className = node.nodeName.replace(/^[^:]+:/, ""); + // remove namespace + className = className.replace(/\-/g, ""); + // remove dashes + var e = null; + if (typeof svg.Element[className] != "undefined") { + e = new svg.Element[className](node); + } else { + e = new svg.Element.MISSING(node); + } + e.type = node.nodeName; + return e; + }; + // load from url + svg.load = function(ctx, url) { + svg.loadXml(ctx, svg.ajax(url)); + }; + // load from xml + svg.loadXml = function(ctx, xml) { + svg.loadXmlDoc(ctx, svg.parseXml(xml)); + }; + svg.loadXmlDoc = function(ctx, dom) { + svg.init(ctx); + var mapXY = function(p) { + var e = ctx.canvas; + while (e) { + p.x -= e.offsetLeft; + p.y -= e.offsetTop; + e = e.offsetParent; + } + if (window.scrollX) p.x += window.scrollX; + if (window.scrollY) p.y += window.scrollY; + return p; + }; + // bind mouse + if (svg.opts["ignoreMouse"] != true) { + ctx.canvas.onclick = function(e) { + var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY)); + svg.Mouse.onclick(p.x, p.y); + }; + ctx.canvas.onmousemove = function(e) { + var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY)); + svg.Mouse.onmousemove(p.x, p.y); + }; + } + var e = svg.CreateElement(dom.documentElement); + e.root = true; + // render loop + var isFirstRender = true; + var draw = function() { + svg.ViewPort.Clear(); + if (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight); + if (svg.opts["ignoreDimensions"] != true) { + // set canvas size + if (e.style("width").hasValue()) { + ctx.canvas.width = e.style("width").toPixels("x"); + ctx.canvas.style.width = ctx.canvas.width + "px"; + } + if (e.style("height").hasValue()) { + ctx.canvas.height = e.style("height").toPixels("y"); + ctx.canvas.style.height = ctx.canvas.height + "px"; + } + } + var cWidth = ctx.canvas.clientWidth || ctx.canvas.width; + var cHeight = ctx.canvas.clientHeight || ctx.canvas.height; + if (svg.opts["ignoreDimensions"] == true && e.style("width").hasValue() && e.style("height").hasValue()) { + cWidth = e.style("width").toPixels("x"); + cHeight = e.style("height").toPixels("y"); + } + svg.ViewPort.SetCurrent(cWidth, cHeight); + if (svg.opts["offsetX"] != null) e.attribute("x", true).value = svg.opts["offsetX"]; + if (svg.opts["offsetY"] != null) e.attribute("y", true).value = svg.opts["offsetY"]; + if (svg.opts["scaleWidth"] != null && svg.opts["scaleHeight"] != null) { + var xRatio = 1, yRatio = 1, viewBox = svg.ToNumberArray(e.attribute("viewBox").value); + if (e.attribute("width").hasValue()) xRatio = e.attribute("width").toPixels("x") / svg.opts["scaleWidth"]; else if (!isNaN(viewBox[2])) xRatio = viewBox[2] / svg.opts["scaleWidth"]; + if (e.attribute("height").hasValue()) yRatio = e.attribute("height").toPixels("y") / svg.opts["scaleHeight"]; else if (!isNaN(viewBox[3])) yRatio = viewBox[3] / svg.opts["scaleHeight"]; + e.attribute("width", true).value = svg.opts["scaleWidth"]; + e.attribute("height", true).value = svg.opts["scaleHeight"]; + e.attribute("viewBox", true).value = "0 0 " + cWidth * xRatio + " " + cHeight * yRatio; + e.attribute("preserveAspectRatio", true).value = "none"; + } + // clear and render + if (svg.opts["ignoreClear"] != true) { + ctx.clearRect(0, 0, cWidth, cHeight); + } + e.render(ctx); + if (isFirstRender) { + isFirstRender = false; + if (typeof svg.opts["renderCallback"] == "function") svg.opts["renderCallback"](dom); + } + }; + var waitingForImages = true; + if (svg.ImagesLoaded()) { + waitingForImages = false; + draw(); + } + svg.intervalID = setInterval(function() { + var needUpdate = false; + if (waitingForImages && svg.ImagesLoaded()) { + waitingForImages = false; + needUpdate = true; + } + // need update from mouse events? + if (svg.opts["ignoreMouse"] != true) { + needUpdate = needUpdate | svg.Mouse.hasEvents(); + } + // need update from animations? + if (svg.opts["ignoreAnimation"] != true) { + for (var i = 0; i < svg.Animations.length; i++) { + needUpdate = needUpdate | svg.Animations[i].update(1e3 / svg.FRAMERATE); + } + } + // need update from redraw? + if (typeof svg.opts["forceRedraw"] == "function") { + if (svg.opts["forceRedraw"]() == true) needUpdate = true; + } + // render if needed + if (needUpdate) { + draw(); + svg.Mouse.runEvents(); + } + }, 1e3 / svg.FRAMERATE); + }; + svg.stop = function() { + if (svg.intervalID) { + clearInterval(svg.intervalID); + } + }; + svg.Mouse = new function() { + this.events = []; + this.hasEvents = function() { + return this.events.length != 0; + }; + this.onclick = function(x, y) { + this.events.push({ + type: "onclick", + x: x, + y: y, + run: function(e) { + if (e.onclick) e.onclick(); + } + }); + }; + this.onmousemove = function(x, y) { + this.events.push({ + type: "onmousemove", + x: x, + y: y, + run: function(e) { + if (e.onmousemove) e.onmousemove(); + } + }); + }; + this.eventElements = []; + this.checkPath = function(element, ctx) { + for (var i = 0; i < this.events.length; i++) { + var e = this.events[i]; + if (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element; + } + }; + this.checkBoundingBox = function(element, bb) { + for (var i = 0; i < this.events.length; i++) { + var e = this.events[i]; + if (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element; + } + }; + this.runEvents = function() { + svg.ctx.canvas.style.cursor = ""; + for (var i = 0; i < this.events.length; i++) { + var e = this.events[i]; + var element = this.eventElements[i]; + while (element) { + e.run(element); + element = element.parent; + } + } + // done running, clear + this.events = []; + this.eventElements = []; + }; + }(); + return svg; + } + })(); + if (typeof CanvasRenderingContext2D != "undefined") { + CanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) { + canvg(this.canvas, s, { + ignoreMouse: true, + ignoreAnimation: true, + ignoreDimensions: true, + ignoreClear: true, + offsetX: dx, + offsetY: dy, + scaleWidth: dw, + scaleHeight: dh + }); + }; + } + return canvg; + } +}; + +/*! + * 输出转换器,提供输出支持 + */ +_p[1] = { + value: function(require) { + var kity = _p.r(34), canvg = _p.r(0); + return kity.createClass("Output", { + constructor: function(formula) { + this.formula = formula; + }, + toJPG: function(cb) { + toImage(this.formula, "image/jpeg", cb); + }, + toPNG: function(cb) { + toImage(this.formula, "image/png", cb); + } + }); + function toImage(formula, type, cb) { + var rectSpace = formula.container.getRenderBox(); + return getBase64DataURL(formula.node.ownerDocument, { + width: rectSpace.width, + height: rectSpace.height, + content: getSVGContent(formula.node) + }, type, cb); + } + function getBase64DataURL(doc, data, type, cb) { + var canvas = null, args = arguments, ctx = null; + if (true) { + drawToCanvas.apply(null, args); + } else { + canvas = getImageCanvas(doc, data.width, data.height, type); + ctx = canvas.getContext("2d"); + var image = new Image(); + image.onload = function() { + try { + ctx.drawImage(image, 0, 0); + cb(canvas.toDataURL(type)); + } catch (e) { + drawToCanvas.apply(null, args); + } + }; + image.src = getSVGDataURL(data.content); + } + } + function getSVGContent(svgNode) { + var tmp = svgNode.ownerDocument.createElement("div"), start = [ '' ]; + tmp.appendChild(svgNode.cloneNode(true)); + return tmp.innerHTML.replace(/]+?>/i, start.join("")).replace(/ /g, ""); + } + function getSVGDataURL(data) { + return "data:image/svg+xml;base64," + window.btoa(unescape(encodeURIComponent(data))); + } + function getImageCanvas(doc, width, height, type) { + var canvas = doc.createElement("canvas"), ctx = canvas.getContext("2d"); + canvas.width = width; + canvas.height = height; + if (type !== "image/png") { + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + return canvas; + } + function drawToCanvas(doc, data, type, cb) { + var canvas = getImageCanvas(doc, data.width, data.height, type); + canvas.style.cssText = "position: absolute; top: 0; left: 100000px; z-index: -1;"; + window.setTimeout(function() { + doc.body.appendChild(canvas); + canvg(canvas, data.content); + doc.body.removeChild(canvas); + cb(canvas.toDataURL(type)); + }, 0); + } + } +}; + +/*! + * 所有字符的列表 + */ +_p[2] = { + value: function() { + return [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "ȷ", "ı", "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "ς", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "ϑ", "ϕ", "ϖ", "Ϟ", "Ϝ", "ϵ", "ϱ", "Ϲ", "ℜ", "ℵ", "ℑ", "℧", "ℶ", "ℷ", "ℸ", "ð", "ℏ", "⅁", "ℎ", "∂", "℘", "⅌", "Ⅎ", "∁", "ℓ", "Ⓢ", "(", ")", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω", "Α", "Β", "#", "!", "$", "%", "&", "∠", "′", "‵", "★", "◆", "■", "▲", "▼", "⊤", "⊥", "♣", "♠", "♢", "♡", "∃", "∄", "♭", "♮", "♯", "∀", "∞", "∡", "∇", "¬", "∢", "√", "△", "▽", "∅", "ø", "◇", "◀", "▸", "[", "]", "{", "}", "〈", "〉", "ϰ", ",", ".", "/", ":", ";", "?", "\\", "⋮", "⋯", "⋰", "…", "@", """, "'", "|", "^", "`", "“", "_", "*", "+", "-", "∐", "⊼", "⊻", "◯", "⊡", "⊟", "⊞", "⊠", "•", "∩", "∪", "⋒", "⋓", "⋐", "⋑", "·", "▪", "◦", "⊛", "⊚", "⊖", "⊙", "⊝", "⊕", "⊗", "⊘", "±", "∓", "⋏", "⋎", "†", "‡", "⋄", "÷", "⋇", "∔", "⌭", "⋗", "⋖", "⋉", "⋊", "⋋", "⋌", "⊓", "⊔", "⊑", "⊒", "⊏", "⊐", "⋆", "×", "⊳", "⊲", "⊵", "⊴", "⊎", "∨", "∧", "≀", "<", "=", ">", "≈", "≇", "≍", "≒", "≓", "≊", "∽", "≁", "≂", "≃", "⋍", "≏", "≎", "≗", "≅", "⋞", "⋟", "≐", "≑", "≖", "⪖", "⪕", "≡", "≥", "≤", "≦", "≧", "⩾", "⩽", "≫", "≪", "≨", "≩", "⋘", "⋙", "⪇", "⪈", "⪉", "⪊", "⋧", "⋦", "⪆", "⪅", "⋛", "⋚", "⪋", "⪌", "≷", "≶", "≳", "≲", "⌮", "⌯", "≯", "≱", "≰", "≮", "⌱", "⌰", "⌲", "⌳", "≬", "⊀", "⊁", "⋠", "⋡", "≺", "≻", "≼", "≽", "≾", "≿", "⊂", "⊃", "⊈", "⊉", "⊆", "⊇", "⊊", "⊋", "⪷", "⪸", "⪯", "⪰", "⪹", "⪺", "⪵", "⪶", "⋨", "⋩", "∼", "≜", "↶", "↷", "↺", "↻", "↾", "↿", "⇂", "⇃", "⇄", "⇆", "⇈", "⇊", "⇋", "⇌", "⇍", "⇎", "⇏", "⇐", "⇑", "⇒", "⇓", "⇔", "⇕", "⇚", "⇛", "⇝", "↫", "↬", "↭", "↮", "←", "↑", "→", "↓", "↔", "↕", "↖", "↗", "↘", "↙", "↞", "↠", "↢", "↣", "↰", "↱", "⊢", "⊣", "⊨", "⊩", "⊪", "⊭", "⊯", "⊸", "⊺", "⋔", "⋪", "⋫", "⋬", "⋭", "⌈", "⌉", "⌊", "⌋", "⫋", "⫌", "⫅", "⫆", "∈", "∋", "∝", "∤", "∦", "∴", "∵", "∍", "⋈", "⌢", "⌣", "∣", "∥", "⏐", "⏑", "⏒", "⏓", "⫇", "⫈", "⊮", "⊬", "⫉", "⏔", "⏕", "⏖", "⏗", "⇇", "⇉", "↼", "↽", "⇀", "⇁", "↚", "↛", "⟵", "⟶", "⟷", "⟹", "⟸", "⟺", "≢", "≠", "∉" ]; + } +}; + +/*! + * 字符配置 + */ +_p[3] = { + value: function() { + return { + // 默认字体 + defaultFont: "KF AMS MAIN" + }; + } +}; + +/*! + * 工厂方法,创建兼容各浏览器的text实现 + */ +_p[4] = { + value: function(require) { + var kity = _p.r(34), divNode = document.createElement("div"), NAMESPACE = "http://www.w3.org/XML/1998/namespace"; + function createText(content) { + var text = new kity.Text(); + // Non-IE + if ("innerHTML" in text.node) { + text.node.setAttributeNS(NAMESPACE, "xml:space", "preserve"); + } else { + if (content.indexOf(" ") != -1) { + content = convertContent(content); + } + } + text.setContent(content); + return text; + } + /** + * 构建节点来转换内容 + */ + function convertContent(content) { + divNode.innerHTML = '' + content.replace(/\s/gi, " ") + ""; + return divNode.firstChild.firstChild.textContent; + } + return { + create: function(content) { + return createText(content); + } + }; + } +}; + +/** + * 文本 + */ +_p[5] = { + value: function(require) { + var kity = _p.r(34), FONT_CONF = _p.r(47).font, FontManager = _p.r(25), TextFactory = _p.r(4); + return kity.createClass("Text", { + base: _p.r(46), + constructor: function(content, fontFamily) { + this.callBase(); + this.fontFamily = fontFamily; + this.fontSize = 50; + this.content = content || ""; + // 移除多余的节点 + this.box.remove(); + this.translationContent = this.translation(this.content); + this.contentShape = new kity.Group(); + this.contentNode = this.createContent(); + this.contentShape.addShape(this.contentNode); + this.addShape(this.contentShape); + }, + createContent: function() { + var contentNode = TextFactory.create(this.translationContent); + contentNode.setAttr({ + "font-family": this.fontFamily, + "font-size": 50, + x: 0, + y: FONT_CONF.offset + }); + return contentNode; + }, + setFamily: function(fontFamily) { + this.fontFamily = fontFamily; + this.contentNode.setAttr("font-family", fontFamily); + }, + setFontSize: function(fontSize) { + this.fontSize = fontSize; + this.contentNode.setAttr("font-size", fontSize + "px"); + this.contentNode.setAttr("y", fontSize / 50 * FONT_CONF.offset); + }, + getBaseHeight: function() { + var chars = this.contentShape.getItems(), currentChar = null, index = 0, height = 0; + while (currentChar = chars[index]) { + height = Math.max(height, currentChar.getHeight()); + index++; + } + return height; + }, + translation: function(content) { + var fontFamily = this.fontFamily; + // 首先特殊处理掉两个相连的"`"符号 + return content.replace(/``/g, "“").replace(/\\([a-zA-Z,]+)\\/g, function(match, input) { + if (input === ",") { + return " "; + } + var data = FontManager.getCharacterValue(input, fontFamily); + if (!data) { + return ""; + } + return data; + }); + } + }); + } +}; + +/** + * 定义公式中各种对象的类型 + */ +_p[6] = { + value: function() { + return { + UNKNOWN: -1, + EXP: 0, + COMPOUND_EXP: 1, + OP: 2 + }; + } +}; + +/** + * 定义公式中上下标的类型 + */ +_p[7] = { + value: function() { + return { + SIDE: "side", + FOLLOW: "follow" + }; + } +}; + +/** + * 下标表达式 + */ +_p[8] = { + value: function(require) { + var kity = _p.r(34); + return kity.createClass("SubscriptExpression", { + base: _p.r(17), + constructor: function(operand, subscript) { + this.callBase(operand, null, subscript); + this.setFlag("Subscript"); + } + }); + } +}; + +/** + * 上标表达式 + */ +_p[9] = { + value: function(require) { + var kity = _p.r(34); + return kity.createClass("SuperscriptExpression", { + base: _p.r(17), + constructor: function(operand, superscript) { + this.callBase(operand, superscript, null); + this.setFlag("Superscript"); + } + }); + } +}; + +/** + * 二元操作表达式 + */ +_p[10] = { + value: function(require) { + var kity = _p.r(34); + return kity.createClass("BinaryExpression", { + base: _p.r(19), + constructor: function(firstOperand, lastOperand) { + this.callBase(); + this.setFirstOperand(firstOperand); + this.setLastOperand(lastOperand); + }, + setFirstOperand: function(operand) { + return this.setOperand(operand, 0); + }, + getFirstOperand: function() { + return this.getOperand(0); + }, + setLastOperand: function(operand) { + return this.setOperand(operand, 1); + }, + getLastOperand: function() { + return this.getOperand(1); + } + }); + } +}; + +/** + * 自动增长括号表达式 + */ +_p[11] = { + value: function(require) { + var kity = _p.r(34), BracketsOperator = _p.r(35); + return kity.createClass("BracketsExpression", { + base: _p.r(19), + /** + * 构造函数调用方式: + * new Constructor( 左括号, 右括号, 表达式 ) + * 或者 + * new Constructor( 括号, 表达式 ), 该构造函数转换成上面的构造函数,是: new Constructor( 括号, 括号, 表达式 ) + * @param left 左括号 + * @param right 右括号 + * @param exp 表达式 + */ + constructor: function(left, right, exp) { + this.callBase(); + this.setFlag("Brackets"); + // 参数整理 + if (arguments.length === 2) { + exp = right; + right = left; + } + this.leftSymbol = left; + this.rightSymbol = right; + this.setOperator(new BracketsOperator()); + this.setOperand(exp, 0); + }, + getLeftSymbol: function() { + return this.leftSymbol; + }, + getRightSymbol: function() { + return this.rightSymbol; + } + }); + } +}; + +/** + * 组合表达式 + * 可以组合多个表达式 + */ +_p[12] = { + value: function(require) { + var kity = _p.r(34), FONT_CONF = _p.r(47).font, CombinationOperator = _p.r(36); + return kity.createClass("CombinationExpression", { + base: _p.r(19), + constructor: function() { + this.callBase(); + this.setFlag("Combination"); + this.setOperator(new CombinationOperator()); + kity.Utils.each(arguments, function(operand, index) { + this.setOperand(operand, index); + }, this); + }, + getRenderBox: function(refer) { + var rectBox = this.callBase(refer); + if (this.getOperands().length === 0) { + rectBox.height = FONT_CONF.spaceHeight; + } + return rectBox; + }, + getBaseline: function(refer) { + var maxBaseline = 0, operands = this.getOperands(); + if (operands.length === 0) { + return this.callBase(refer); + } + kity.Utils.each(operands, function(operand) { + maxBaseline = Math.max(operand.getBaseline(refer), maxBaseline); + }); + return maxBaseline; + }, + getMeanline: function(refer) { + var minMeanline = 1e7, operands = this.getOperands(); + if (operands.length === 0) { + return this.callBase(refer); + } + kity.Utils.each(operands, function(operand) { + minMeanline = Math.min(operand.getMeanline(refer), minMeanline); + }); + return minMeanline; + } + }); + } +}; + +/** + * 分数表达式 + */ +_p[13] = { + value: function(require) { + var kity = _p.r(34), FractionOperator = _p.r(38); + return kity.createClass("FractionExpression", { + base: _p.r(10), + constructor: function(upOperand, downOperand) { + this.callBase(upOperand, downOperand); + this.setFlag("Fraction"); + this.setOperator(new FractionOperator()); + }, + /*------- 重写分数结构的baseline和mealine计算方式 */ + getBaseline: function(refer) { + var downOperand = this.getOperand(1), rectBox = downOperand.getRenderBox(refer); + return rectBox.y + downOperand.getBaselineProportion() * rectBox.height; + }, + getMeanline: function(refer) { + var upOperand = this.getOperand(0), rectBox = upOperand.getRenderBox(refer); + return upOperand.getMeanlineProportion() * rectBox.height; + } + }); + } +}; + +/** + * 函数表达式 + */ +_p[14] = { + value: function(require) { + var kity = _p.r(34), FUNC_CONF = _p.r(47).func, FunctionOperator = _p.r(39); + return kity.createClass("FunctionExpression", { + base: _p.r(19), + /** + * function表达式构造函数 + * @param funcName function名称 + * @param expr 函数表达式 + * @param sup 上标 + * @param sub 下标 + */ + constructor: function(funcName, expr, sup, sub) { + this.callBase(); + this.setFlag("Func"); + this.funcName = funcName; + this.setOperator(new FunctionOperator(funcName)); + this.setExpr(expr); + this.setSuperscript(sup); + this.setSubscript(sub); + }, + // 当前函数应用的script位置是否是在侧面 + isSideScript: function() { + return !FUNC_CONF["ud-script"][this.funcName]; + }, + setExpr: function(expr) { + return this.setOperand(expr, 0); + }, + setSuperscript: function(sub) { + return this.setOperand(sub, 1); + }, + setSubscript: function(sub) { + return this.setOperand(sub, 2); + } + }); + } +}; + +/** + * 积分表达式 + */ +_p[15] = { + value: function(require) { + var kity = _p.r(34), IntegrationOperator = _p.r(40), IntegrationExpression = kity.createClass("IntegrationExpression", { + base: _p.r(19), + /** + * 构造积分表达式 + * @param integrand 被积函数 + * @param supOperand 上限 + * @param subOperand 下限 + */ + constructor: function(integrand, superscript, subscript) { + this.callBase(); + this.setFlag("Integration"); + this.setOperator(new IntegrationOperator()); + this.setIntegrand(integrand); + this.setSuperscript(superscript); + this.setSubscript(subscript); + }, + setType: function(type) { + this.getOperator().setType(type); + return this; + }, + resetType: function() { + this.getOperator().resetType(); + return this; + }, + setIntegrand: function(integrand) { + this.setOperand(integrand, 0); + }, + setSuperscript: function(sup) { + this.setOperand(sup, 1); + }, + setSubscript: function(sub) { + this.setOperand(sub, 2); + } + }); + return IntegrationExpression; + } +}; + +/** + * 方根表达式 + */ +_p[16] = { + value: function(require) { + var kity = _p.r(34), RadicalOperator = _p.r(42); + return kity.createClass("RadicalExpression", { + base: _p.r(10), + /** + * 构造开方表达式 + * @param radicand 被开方数 + * @param exponent 指数 + */ + constructor: function(radicand, exponent) { + this.callBase(radicand, exponent); + this.setFlag("Radicand"); + this.setOperator(new RadicalOperator()); + }, + setRadicand: function(operand) { + return this.setFirstOperand(operand); + }, + getRadicand: function() { + return this.getFirstOperand(); + }, + setExponent: function(operand) { + return this.setLastOperand(operand); + }, + getExponent: function() { + return this.getLastOperand(); + } + }); + } +}; + +/** + * 上标表达式 + */ +_p[17] = { + value: function(require) { + var kity = _p.r(34), ScriptOperator = _p.r(43); + return kity.createClass("ScriptExpression", { + base: _p.r(19), + constructor: function(operand, superscript, subscript) { + this.callBase(); + this.setFlag("Script"); + this.setOperator(new ScriptOperator()); + this.setOpd(operand); + this.setSuperscript(superscript); + this.setSubscript(subscript); + }, + setOpd: function(operand) { + this.setOperand(operand, 0); + }, + setSuperscript: function(sup) { + this.setOperand(sup, 1); + }, + setSubscript: function(sub) { + this.setOperand(sub, 2); + } + }); + } +}; + +/** + * 求和表达式 + */ +_p[18] = { + value: function(require) { + var kity = _p.r(34), SummationOperator = _p.r(44); + return kity.createClass("SummationExpression", { + base: _p.r(19), + /** + * 构造求和表达式 + * @param expr 求和表达式 + * @param upOperand 上标 + * @param downOperand 下标 + */ + constructor: function(expr, superscript, subscript) { + this.callBase(); + this.setFlag("Summation"); + this.setOperator(new SummationOperator()); + this.setExpr(expr); + this.setSuperscript(superscript); + this.setSubscript(subscript); + }, + setExpr: function(expr) { + this.setOperand(expr, 0); + }, + setSuperscript: function(sup) { + this.setOperand(sup, 1); + }, + setSubscript: function(sub) { + this.setOperand(sub, 2); + } + }); + } +}; + +/** + * 复合表达式 + * @abstract + */ +_p[19] = { + value: function(require) { + var kity = _p.r(34), GTYPE = _p.r(6), Expression = _p.r(21); + return kity.createClass("CompoundExpression", { + base: _p.r(21), + constructor: function() { + this.callBase(); + this.type = GTYPE.COMPOUND_EXP; + this.operands = []; + this.operator = null; + this.operatorBox = new kity.Group(); + this.operatorBox.setAttr("data-type", "kf-editor-exp-op-box"); + this.operandBox = new kity.Group(); + this.operandBox.setAttr("data-type", "kf-editor-exp-operand-box"); + this.setChildren(0, this.operatorBox); + this.setChildren(1, this.operandBox); + }, + // 操作符存储在第1位置 + setOperator: function(operator) { + if (operator === undefined) { + return this; + } + if (this.operator) { + this.operator.remove(); + } + this.operatorBox.addShape(operator); + this.operator = operator; + this.operator.setParentExpression(this); + // 表达式关联到操作符 + operator.expression = this; + return this; + }, + getOperator: function() { + return this.operator; + }, + // 操作数存储位置是从1开始 + setOperand: function(operand, index, isWrap) { + // 不包装操作数 + if (isWrap === false) { + this.operands[index] = operand; + return this; + } + operand = Expression.wrap(operand); + if (this.operands[index]) { + this.operands[index].remove(); + } + this.operands[index] = operand; + this.operandBox.addShape(operand); + return this; + }, + getOperand: function(index) { + return this.operands[index]; + }, + getOperands: function() { + return this.operands; + }, + addedCall: function() { + this.operator.applyOperand.apply(this.operator, this.operands); + return this; + } + }); + } +}; + +/** + * 空表达式 + * 该表达式主要用途是用于站位 + */ +_p[20] = { + value: function(require) { + var kity = _p.r(34), FONT_CONF = _p.r(47).font, Expression = _p.r(21), EmptyExpression = kity.createClass("EmptyExpression", { + base: Expression, + constructor: function() { + this.callBase(); + this.setFlag("Empty"); + }, + getRenderBox: function() { + return { + width: 0, + height: FONT_CONF.spaceHeight, + x: 0, + y: 0 + }; + } + }); + EmptyExpression.isEmpty = function(target) { + return target instanceof EmptyExpression; + }; + // 注册打包函数 + Expression.registerWrap("empty", function(operand) { + if (operand === null || operand === undefined) { + return new EmptyExpression(); + } + }); + return EmptyExpression; + } +}; + +/** + * 基础表达式, 该类是表达式和操作数的高层抽象 + * @abstract + */ +_p[21] = { + value: function(require) { + var kity = _p.r(34), GTYPE = _p.r(6), FONT_CONF = _p.r(47).font, // 打包函数列表 + WRAP_FN = [], // 注册的打包函数的名称与其在注册器列表中的索引之间的对应关系 + WRAP_FN_INDEX = {}, Expression = kity.createClass("Expression", { + base: _p.r(46), + constructor: function() { + this.callBase(); + this.type = GTYPE.EXP; + // 表达式的上下偏移 + this._offset = { + top: 0, + bottom: 0 + }; + this.children = []; + this.box.fill("transparent").setAttr("data-type", "kf-editor-exp-box"); + this.box.setAttr("data-type", "kf-editor-exp-bg-box"); + this.expContent = new kity.Group(); + this.expContent.setAttr("data-type", "kf-editor-exp-content-box"); + this.addShape(this.expContent); + }, + getChildren: function() { + return this.children; + }, + getChild: function(index) { + return this.children[index] || null; + }, + getTopOffset: function() { + return this._offset.top; + }, + getBottomOffset: function() { + return this._offset.bottom; + }, + getOffset: function() { + return this._offset; + }, + setTopOffset: function(val) { + this._offset.top = val; + }, + setBottomOffset: function(val) { + this._offset.bottom = val; + }, + setOffset: function(top, bottom) { + this._offset.top = top; + this._offset.bottom = bottom; + }, + setFlag: function(flag) { + this.setAttr("data-flag", flag || "Expression"); + }, + setChildren: function(index, exp) { + // 首先清理掉之前的表达式 + if (this.children[index]) { + this.children[index].remove(); + } + this.children[index] = exp; + this.expContent.addShape(exp); + }, + getBaselineProportion: function() { + return FONT_CONF.baselinePosition; + }, + getMeanlineProportion: function() { + return FONT_CONF.meanlinePosition; + }, + getBaseline: function(refer) { + // 上偏移3px + return this.getRenderBox(refer).height * FONT_CONF.baselinePosition - 3; + }, + getMeanline: function(refer) { + // 上偏移1px + return this.getRenderBox(refer).height * FONT_CONF.meanlinePosition - 1; + }, + getAscenderline: function() { + return this.getFixRenderBox().height * FONT_CONF.ascenderPosition; + }, + getDescenderline: function() { + return this.getFixRenderBox().height * FONT_CONF.descenderPosition; + }, + translateElement: function(x, y) { + this.expContent.translate(x, y); + }, + expand: function(width, height) { + var renderBox = this.getFixRenderBox(); + this.setBoxSize(renderBox.width + width, renderBox.height + height); + }, + getBaseWidth: function() { + return this.getWidth(); + }, + getBaseHeight: function() { + return this.getHeight(); + }, + updateBoxSize: function() { + var renderBox = this.expContent.getFixRenderBox(); + this.setBoxSize(renderBox.width, renderBox.height); + }, + getBox: function() { + return this.box; + } + }); + // 表达式自动打包 + kity.Utils.extend(Expression, { + registerWrap: function(name, fn) { + WRAP_FN_INDEX[name] = WRAP_FN.length; + WRAP_FN.push(fn); + }, + revokeWrap: function(name) { + var fn = null; + if (name in WRAP_FN_INDEX) { + fn = WRAP_FN[WRAP_FN_INDEX[name]]; + WRAP_FN[WRAP_FN_INDEX[name]] = null; + delete WRAP_FN_INDEX[name]; + } + return fn; + }, + // 打包函数 + wrap: function(operand) { + var result; + kity.Utils.each(WRAP_FN, function(fn) { + if (!fn) { + return; + } + result = fn(operand); + if (result) { + return false; + } + }); + return result; + } + }); + return Expression; + } +}; + +/** + * Text表达式 + */ +_p[22] = { + value: function(require) { + var Text = _p.r(5), kity = _p.r(34), FONT_CONF = _p.r(3), Expression = _p.r(21), TextExpression = kity.createClass("TextExpression", { + base: _p.r(21), + constructor: function(content, fontFamily) { + this.callBase(); + this.fontFamily = fontFamily || FONT_CONF.defaultFont; + this.setFlag("Text"); + this.content = content + ""; + this.textContent = new Text(this.content, this.fontFamily); + this.setChildren(0, this.textContent); + this.setChildren(1, new kity.Rect(0, 0, 0, 0).fill("transparent")); + }, + setFamily: function(fontFamily) { + this.textContent.setFamily(fontFamily); + }, + setFontSize: function(fontSize) { + this.textContent.setFontSize(fontSize); + }, + addedCall: function() { + var box = this.textContent.getFixRenderBox(); + this.getChild(1).setSize(box.width, box.height); + this.updateBoxSize(); + return this; + } + }); + // 注册文本表达式的打包函数 + Expression.registerWrap("text", function(operand) { + var operandType = typeof operand; + if (operandType === "number" || operandType === "string") { + operand = new TextExpression(operand); + } + return operand; + }); + return TextExpression; + } +}; + +/*! + * 字体信息检测模板,用于检测浏览器的字体信息 + */ +_p[23] = { + value: function() { + return [ '', 'x', "" ]; + } +}; + +/*! + * 字体安装器 + */ +_p[24] = { + value: function(require) { + var kity = _p.r(34), FontManager = _p.r(25), $ = _p.r(33), FONT_CONF = _p.r(47).font, CHAR_LIST = _p.r(2), NODE_LIST = []; + return kity.createClass("FontInstaller", { + constructor: function(doc, resource) { + this.callBase(); + this.resource = resource || "../src/resource/"; + this.doc = doc; + }, + // 挂载字体 + mount: function(callback) { + var fontList = FontManager.getFontList(), count = 0, _self = this; + kity.Utils.each(fontList, function(fontInfo) { + count++; + fontInfo.meta.src = _self.resource + fontInfo.meta.src; + _self.createFontStyle(fontInfo); + preload(_self.doc, fontInfo, function() { + count--; + if (count === 0) { + complete(_self.doc, callback); + } + }); + }); + }, + createFontStyle: function(fontInfo) { + var stylesheet = this.doc.createElement("style"), tpl = '@font-face{\nfont-family: "${fontFamily}";\nsrc: url("${src}");\n}'; + stylesheet.setAttribute("type", "text/css"); + stylesheet.innerHTML = tpl.replace("${fontFamily}", fontInfo.meta.fontFamily).replace("${src}", fontInfo.meta.src); + this.doc.head.appendChild(stylesheet); + } + }); + function preload(doc, fontInfo, callback) { + $.get(fontInfo.meta.src, function(data, state) { + if (state === "success") { + applyFonts(doc, fontInfo); + } + callback(); + }); + } + function complete(doc, callback) { + window.setTimeout(function() { + initFontSystemInfo(doc); + removeTmpNode(); + callback(); + }, 100); + } + function applyFonts(doc, fontInfo) { + var node = document.createElement("div"), fontFamily = fontInfo.meta.fontFamily; + node.style.cssText = "position: absolute; top: -10000px; left: -100000px;"; + node.style.fontFamily = fontFamily; + node.innerHTML = CHAR_LIST.join(""); + doc.body.appendChild(node); + NODE_LIST.push(node); + } + /** + * 计算字体系统信息 + */ + function initFontSystemInfo(doc) { + var tmpNode = doc.createElement("div"); + tmpNode.style.cssText = "position: absolute; top: 0; left: -100000px;"; + tmpNode.innerHTML = _p.r(23).join(""); + doc.body.appendChild(tmpNode); + var rectBox = tmpNode.getElementsByTagName("text")[0].getBBox(); + // text实际占用空间 + FONT_CONF.spaceHeight = rectBox.height; + // text顶部空间 + FONT_CONF.topSpace = -rectBox.y - FONT_CONF.baseline; + FONT_CONF.bottomSpace = FONT_CONF.spaceHeight - FONT_CONF.topSpace - FONT_CONF.baseHeight; + // text偏移值 + FONT_CONF.offset = FONT_CONF.baseline + FONT_CONF.topSpace; + // baseline比例 + FONT_CONF.baselinePosition = (FONT_CONF.topSpace + FONT_CONF.baseline) / FONT_CONF.spaceHeight; + // meanline比例 + FONT_CONF.meanlinePosition = (FONT_CONF.topSpace + FONT_CONF.meanline) / FONT_CONF.spaceHeight; + // 上下延伸性比例 + FONT_CONF.ascenderPosition = FONT_CONF.topSpace / FONT_CONF.spaceHeight; + FONT_CONF.descenderPosition = (FONT_CONF.topSpace + FONT_CONF.baseHeight) / FONT_CONF.spaceHeight; + doc.body.removeChild(tmpNode); + } + function removeTmpNode() { + kity.Utils.each(NODE_LIST, function(node) { + node.parentNode.removeChild(node); + }); + NODE_LIST = []; + } + } +}; + +/*! + * 字体管理器 + */ +_p[25] = { + value: function(require) { + var FONT_LIST = {}, kity = _p.r(34), CONF = _p.r(47).font.list; + // init + (function() { + kity.Utils.each(CONF, function(fontData) { + FONT_LIST[fontData.meta.fontFamily] = fontData; + }); + })(); + return { + getFontList: function() { + return FONT_LIST; + }, + getCharacterValue: function(key, fontFamily) { + if (!FONT_LIST[fontFamily]) { + return null; + } + return FONT_LIST[fontFamily].map[key] || null; + } + }; + } +}; + +/*! + * 双线字体 + */ +_p[26] = { + value: function() { + return { + meta: { + fontFamily: "KF AMS BB", + src: "KF_AMS_BB.woff" + } + }; + } +}; + +/*! + * 手写体 + */ +_p[27] = { + value: function() { + return { + meta: { + fontFamily: "KF AMS CAL", + src: "KF_AMS_CAL.woff" + } + }; + } +}; + +/*! + * 花体 + */ +_p[28] = { + value: function() { + return { + meta: { + fontFamily: "KF AMS FRAK", + src: "KF_AMS_FRAK.woff" + } + }; + } +}; + +/*! + * 字体主文件 + */ +_p[29] = { + value: function() { + return { + meta: { + fontFamily: "KF AMS MAIN", + src: "KF_AMS_MAIN.woff" + }, + map: { + // char + Alpha: "Α", + Beta: "Β", + Gamma: "Γ", + Delta: "Δ", + Epsilon: "Ε", + Zeta: "Ζ", + Eta: "Η", + Theta: "Θ", + Iota: "Ι", + Kappa: "Κ", + Lambda: "Λ", + Mu: "Μ", + Nu: "Ν", + Xi: "Ξ", + Omicron: "Ο", + Pi: "Π", + Rho: "Ρ", + Sigma: "Σ", + Tau: "Τ", + Upsilon: "Υ", + Phi: "Φ", + Chi: "Χ", + Psi: "Ψ", + Omega: "Ω", + alpha: "α", + beta: "β", + gamma: "γ", + delta: "δ", + epsilon: "ε", + zeta: "ζ", + eta: "η", + theta: "θ", + iota: "ι", + kappa: "κ", + lambda: "λ", + mu: "μ", + nu: "ν", + xi: "ξ", + omicron: "ο", + pi: "π", + rho: "ρ", + sigma: "σ", + tau: "τ", + upsilon: "υ", + phi: "φ", + varkappa: "ϰ", + chi: "χ", + psi: "ψ", + omega: "ω", + digamma: "Ϝ", + varepsilon: "ϵ", + varrho: "ϱ", + varphi: "ϕ", + vartheta: "ϑ", + varpi: "ϖ", + varsigma: "Ϲ", + aleph: "ℵ", + beth: "ℶ", + daleth: "ℸ", + gimel: "ℷ", + eth: "ð", + hbar: "ℎ", + hslash: "ℏ", + mho: "℧", + partial: "∂", + wp: "℘", + Game: "⅁", + Bbbk: "⅌", + Finv: "Ⅎ", + Im: "ℑ", + Re: "ℜ", + complement: "∁", + ell: "ℓ", + circledS: "Ⓢ", + imath: "ı", + jmath: "ȷ", + // symbol + doublecap: "⋒", + Cap: "⋒", + doublecup: "⋓", + Cup: "⋓", + ast: "*", + divideontimes: "⋇", + rightthreetimes: "⋌", + leftthreetimes: "⋋", + cdot: "·", + odot: "⊙", + dotplus: "∔", + rtimes: "⋊", + ltimes: "⋉", + centerdot: "▪", + doublebarwedge: "⌭", + setminus: "⒁", + amalg: "∐", + circ: "◦", + bigcirc: "◯", + gtrdot: "⋗", + lessdot: "⋖", + smallsetminus: "⒅", + circledast: "⊛", + circledcirc: "⊚", + sqcap: "⊓", + sqcup: "⊔", + barwedge: "⊼", + circleddash: "⊝", + star: "⋆", + bigtriangledown: "▽", + bigtriangleup: "△", + cup: "∪", + cap: "∩", + times: "×", + mp: "∓", + pm: "±", + triangleleft: "⊲", + triangleright: "⊳", + boxdot: "⊡", + curlyvee: "⋏", + curlywedge: "⋎", + boxminus: "⊟", + boxtimes: "⊠", + ominus: "⊖", + oplus: "⊕", + oslash: "⊘", + otimes: "⊗", + uplus: "⊎", + boxplus: "⊞", + dagger: "†", + ddagger: "‡", + vee: "∨", + lor: "∨", + veebar: "⊻", + bullet: "•", + diamond: "⋄", + wedge: "∧", + land: "∧", + div: "÷", + wr: "≀", + geqq: "≧", + lll: "⋘", + llless: "⋘", + ggg: "⋙", + gggtr: "⋙", + preccurlyeq: "≼", + geqslant: "⩾", + lnapprox: "⪉", + preceq: "⪯", + gg: "≫", + lneq: "⪇", + precnapprox: "⪹", + approx: "≈", + lneqq: "≨", + precneqq: "⪵", + approxeq: "≊", + gnapprox: "⪊", + lnsim: "⋦", + precnsim: "⋨", + asymp: "≍", + gneq: "⪈", + lvertneqq: "⌮", + precsim: "≾", + backsim: "∽", + gneqq: "≩", + ncong: "≇", + risingdotseq: "≓", + backsimeq: "⋍", + gnsim: "⋧", + sim: "∼", + simeq: "≃", + bumpeq: "≏", + gtrapprox: "⪆", + ngeq: "≱", + Bumpeq: "≎", + gtreqless: "⋛", + ngeqq: "⌱", + succ: "≻", + circeq: "≗", + gtreqqless: "⪌", + ngeqslant: "⌳", + succapprox: "⪸", + cong: "≅", + gtrless: "≷", + ngtr: "≯", + succcurlyeq: "≽", + curlyeqprec: "⋞", + gtrsim: "≳", + nleq: "≰", + succeq: "⪰", + curlyeqsucc: "⋟", + gvertneqq: "⌯", + neq: "≠", + ne: "≠", + nequiv: "≢", + nleqq: "⌰", + succnapprox: "⪺", + doteq: "≐", + leq: "≤", + le: "≤", + nleqslant: "⌲", + succneqq: "⪶", + doteqdot: "≑", + Doteq: "≑", + leqq: "≦", + nless: "≮", + succnsim: "⋩", + leqslant: "⩽", + nprec: "⊀", + succsim: "≿", + eqsim: "≂", + lessapprox: "⪅", + npreceq: "⋠", + eqslantgtr: "⪖", + lesseqgtr: "⋚", + nsim: "≁", + eqslantless: "⪕", + lesseqqgtr: "⪋", + nsucc: "⊁", + triangleq: "≜", + eqcirc: "≖", + equiv: "≡", + lessgtr: "≶", + nsucceq: "⋡", + fallingdotseq: "≒", + lesssim: "≲", + prec: "≺", + geq: "≥", + ge: "≥", + ll: "≪", + precapprox: "⪷", + // arrows + uparrow: "↑", + downarrow: "↓", + updownarrow: "↕", + Uparrow: "⇑", + Downarrow: "⇓", + Updownarrow: "⇕", + circlearrowleft: "↺", + circlearrowright: "↻", + curvearrowleft: "↶", + curvearrowright: "↷", + downdownarrows: "⇊", + downharpoonleft: "⇃", + downharpoonright: "⇂", + leftarrow: "←", + gets: "←", + Leftarrow: "⇐", + leftarrowtail: "↢", + leftharpoondown: "↽", + leftharpoonup: "↼", + leftleftarrows: "⇇", + leftrightarrow: "↔", + Leftrightarrow: "⇔", + leftrightarrows: "⇄", + leftrightharpoons: "⇋", + leftrightsquigarrow: "↭", + Lleftarrow: "⇚", + looparrowleft: "↫", + looparrowright: "↬", + multimap: "⊸", + nLeftarrow: "⇍", + nRightarrow: "⇏", + nLeftrightarrow: "⇎", + nearrow: "↗", + nleftarrow: "↚", + nleftrightarrow: "↮", + nrightarrow: "↛", + nwarrow: "↖", + rightarrow: "→", + to: "→", + Rightarrow: "⇒", + rightarrowtail: "↣", + rightharpoondown: "⇁", + rightharpoonup: "⇀", + rightleftarrows: "⇆", + rightleftharpoons: "⇌", + rightrightarrows: "⇉", + rightsquigarrow: "⇝", + Rrightarrow: "⇛", + searrow: "↘", + swarrow: "↙", + twoheadleftarrow: "↞", + twoheadrightarrow: "↠", + upharpoonleft: "↿", + upharpoonright: "↾", + restriction: "↾", + upuparrows: "⇈", + Lsh: "↰", + Rsh: "↱", + longleftarrow: "⟵", + longrightarrow: "⟶", + Longleftarrow: "⟸", + Longrightarrow: "⟹", + implies: "⟹", + longleftrightarrow: "⟷", + Longleftrightarrow: "⟺", + // relation + backepsilon: "∍", + because: "∵", + therefore: "∴", + between: "≬", + blacktriangleleft: "◀", + blacktriangleright: "▸", + dashv: "⊣", + bowtie: "⋈", + frown: "⌢", + "in": "∈", + notin: "∉", + mid: "∣", + parallel: "∥", + models: "⊨", + ni: "∋", + owns: "∋", + nmid: "∤", + nparallel: "∦", + nshortmid: "⏒", + nshortparallel: "⏓", + nsubseteq: "⊈", + nsubseteqq: "⫇", + nsupseteq: "⊉", + nsupseteqq: "⫈", + ntriangleleft: "⋪", + ntrianglelefteq: "⋬", + ntriangleright: "⋫", + ntrianglerighteq: "⋭", + nvdash: "⊬", + nVdash: "⊮", + nvDash: "⊭", + nVDash: "⊯", + perp: "⊥", + pitchfork: "⋔", + propto: "∝", + shortmid: "⏐", + shortparallel: "⏑", + smile: "⌣", + sqsubset: "⊏", + sqsubseteq: "⊑", + sqsupset: "⊐", + sqsupseteq: "⊒", + subset: "⊂", + Subset: "⋐", + subseteq: "⊆", + subseteqq: "⫅", + subsetneq: "⊊", + subsetneqq: "⫋", + supset: "⊃", + Supset: "⋑", + supseteq: "⊇", + supseteqq: "⫆", + supsetneq: "⊋", + supsetneqq: "⫌", + trianglelefteq: "⊴", + trianglerighteq: "⊵", + varpropto: "⫉", + varsubsetneq: "⏔", + varsubsetneqq: "⏖", + varsupsetneq: "⏕", + varsupsetneqq: "⏗", + vdash: "⊢", + Vdash: "⊩", + vDash: "⊨", + Vvdash: "⊪", + vert: "|", + Vert: "ǁ", + "|": "ǁ", + "{": "{", + "}": "}", + backslash: "\\", + langle: "〈", + rangle: "〉", + lceil: "⌈", + rceil: "⌉", + lbrace: "{", + rbrace: "}", + lfloor: "⌊", + rfloor: "⌋", + cdots: "⋯", + ddots: "⋰", + vdots: "⋮", + dots: "…", + ldots: "…", + "#": "#", + bot: "⊥", + angle: "∠", + backprime: "‵", + bigstar: "★", + blacklozenge: "◆", + blacksquare: "■", + blacktriangle: "▲", + blacktriangledown: "▼", + clubsuit: "♣", + diagdown: "⒁", + diagup: "⒂", + diamondsuit: "♢", + emptyset: "ø", + exists: "∃", + flat: "♭", + forall: "∀", + heartsuit: "♡", + infty: "∞", + lozenge: "◇", + measuredangle: "∡", + nabla: "∇", + natural: "♮", + neg: "¬", + lnot: "¬", + nexists: "∄", + prime: "′", + sharp: "♯", + spadesuit: "♠", + sphericalangle: "∢", + surd: "√", + top: "⊤", + varnothing: "∅", + triangle: "△", + triangledown: "▽" + } + }; + } +}; + +/*! + * 罗马字体 + */ +_p[30] = { + value: function() { + return { + meta: { + fontFamily: "KF AMS ROMAN", + src: "KF_AMS_ROMAN.woff" + } + }; + } +}; + +/** + * 公式对象,表达式容器 + */ +_p[31] = { + value: function(require) { + var kity = _p.r(34), GTYPE = _p.r(6), FontManager = _p.r(25), FontInstaller = _p.r(24), DEFAULT_OPTIONS = { + fontsize: 50, + autoresize: true, + padding: [ 0 ] + }, Output = _p.r(1), EXPRESSION_INTERVAL = 10, ExpressionWrap = kity.createClass("ExpressionWrap", { + constructor: function(exp, config) { + this.wrap = new kity.Group(); + this.bg = new kity.Rect(0, 0, 0, 0).fill("transparent"); + this.exp = exp; + this.config = config; + this.wrap.setAttr("data-type", "kf-exp-wrap"); + this.bg.setAttr("data-type", "kf-exp-wrap-bg"); + this.wrap.addShape(this.bg); + this.wrap.addShape(this.exp); + }, + getWrapShape: function() { + return this.wrap; + }, + getExpression: function() { + return this.exp; + }, + getBackground: function() { + return this.bg; + }, + resize: function() { + var padding = this.config.padding, expBox = this.exp.getFixRenderBox(); + if (padding.length === 1) { + padding[1] = padding[0]; + } + this.bg.setSize(padding[1] * 2 + expBox.width, padding[0] * 2 + expBox.height); + this.exp.translate(padding[1], padding[0]); + } + }), Formula = kity.createClass("Formula", { + base: _p.r(32), + constructor: function(container, config) { + this.callBase(container); + this.expressions = []; + this.fontInstaller = new FontInstaller(this); + this.config = kity.Utils.extend({}, DEFAULT_OPTIONS, config); + this.initEnvironment(); + this.initInnerFont(); + }, + getContentContainer: function() { + return this.container; + }, + initEnvironment: function() { + this.zoom = this.config.fontsize / 50; + if ("width" in this.config) { + this.setWidth(this.config.width); + } + if ("height" in this.config) { + this.setHeight(this.config.height); + } + this.node.setAttribute("font-size", DEFAULT_OPTIONS.fontsize); + }, + initInnerFont: function() { + var fontList = FontManager.getFontList(), _self = this; + kity.Utils.each(fontList, function(fontInfo) { + createFontStyle(fontInfo); + }); + function createFontStyle(fontInfo) { + var stylesheet = _self.doc.createElement("style"), tpl = '@font-face{font-family: "${fontFamily}";font-style: normal;src: url("${src}") format("woff");}'; + stylesheet.setAttribute("type", "text/css"); + stylesheet.innerHTML = tpl.replace("${fontFamily}", fontInfo.meta.fontFamily).replace("${src}", fontInfo.meta.src); + _self.resourceNode.appendChild(stylesheet); + } + }, + insertExpression: function(expression, index) { + var expWrap = this.wrap(expression); + // clear zoom + this.container.clearTransform(); + this.expressions.splice(index, 0, expWrap.getWrapShape()); + this.addShape(expWrap.getWrapShape()); + notifyExpression.call(this, expWrap.getExpression()); + expWrap.resize(); + correctOffset.call(this); + this.resetZoom(); + this.config.autoresize && this.resize(); + }, + appendExpression: function(expression) { + this.insertExpression(expression, this.expressions.length); + }, + resize: function() { + var renderBox = this.container.getRenderBox("paper"); + this.node.setAttribute("width", renderBox.width); + this.node.setAttribute("height", renderBox.height); + }, + resetZoom: function() { + var zoomLevel = this.zoom / this.getBaseZoom(); + if (zoomLevel !== 0) { + this.container.scale(zoomLevel); + } + }, + wrap: function(exp) { + return new ExpressionWrap(exp, this.config); + }, + clear: function() { + this.callBase(); + this.expressions = []; + }, + clearExpressions: function() { + kity.Utils.each(this.expressions, function(exp) { + exp.remove(); + }); + this.expressions = []; + }, + toJPG: function(cb) { + new Output(this).toJPG(cb); + }, + toPNG: function(cb) { + new Output(this).toPNG(cb); + } + }); + kity.Utils.extend(Formula, { + registerFont: function(fontData) { + FontManager.registerFont(fontData); + } + }); + // 调整表达式之间的偏移 + function correctOffset() { + var exprOffset = 0; + kity.Utils.each(this.expressions, function(expr) { + var box = null; + if (!expr) { + return; + } + expr.setMatrix(new kity.Matrix(1, 0, 0, 1, 0, 0)); + box = expr.getFixRenderBox(); + expr.translate(0 - box.x, exprOffset); + exprOffset += box.height + EXPRESSION_INTERVAL; + }); + return this; + } + // 通知表达式已接入到paper + function notifyExpression(expression) { + var len = 0; + if (!expression) { + return; + } + if (expression.getType() === GTYPE.EXP) { + for (var i = 0, len = expression.getChildren().length; i < len; i++) { + notifyExpression(expression.getChild(i)); + } + } else if (expression.getType() === GTYPE.COMPOUND_EXP) { + // 操作数处理 + for (var i = 0, len = expression.getOperands().length; i < len; i++) { + notifyExpression(expression.getOperand(i)); + } + // 处理操作符 + notifyExpression(expression.getOperator()); + } + expression.addedCall && expression.addedCall(); + } + return Formula; + } +}; + +/** + * 公式专用paper + */ +_p[32] = { + value: function(require) { + var kity = _p.r(34); + return kity.createClass("FPaper", { + base: kity.Paper, + constructor: function(container) { + this.callBase(container); + this.doc = container.ownerDocument; + this.container = new kity.Group(); + this.container.setAttr("data-type", "kf-container"); + this.background = new kity.Group(); + this.background.setAttr("data-type", "kf-bg"); + this.baseZoom = 1; + this.zoom = 1; + this.base("addShape", this.background); + this.base("addShape", this.container); + }, + getZoom: function() { + return this.zoom; + }, + getBaseZoom: function() { + return this.baseZoom; + }, + addShape: function(shape, pos) { + return this.container.addShape(shape, pos); + }, + getBackground: function() { + return this.background; + }, + removeShape: function(pos) { + return this.container.removeShape(pos); + }, + clear: function() { + return this.container.clear(); + } + }); + } +}; + +/** + * jquery + */ +_p[33] = { + value: function() { + if (!window.jQuery) { + throw new Error("Missing jQuery"); + } + return window.jQuery; + } +}; + +/** + * kity库封包 + */ +_p[34] = { + value: function() { + if (!window.kity) { + throw new Error("Missing Kity Graphic Lib"); + } + return window.kity; + } +}; + +/** + * 小括号操作符:() + */ +_p[35] = { + value: function(require) { + var kity = _p.r(34), Text = _p.r(5); + return kity.createClass("BracketsOperator", { + base: _p.r(41), + constructor: function() { + this.callBase("Brackets"); + }, + applyOperand: function(exp) { + generate.call(this, exp); + } + }); + function generate(exp) { + var left = this.getParentExpression().getLeftSymbol(), right = this.getParentExpression().getRightSymbol(), fontSize = exp.getFixRenderBox().height, group = new kity.Group(), offset = 0, leftOp = new Text(left, "KF AMS MAIN").fill("black"), rightOp = new Text(right, "KF AMS MAIN").fill("black"); + leftOp.setFontSize(fontSize); + rightOp.setFontSize(fontSize); + this.addOperatorShape(group.addShape(leftOp).addShape(rightOp)); + offset += leftOp.getFixRenderBox().width; + exp.translate(offset, 0); + offset += exp.getFixRenderBox().width; + rightOp.translate(offset, 0); + } + } +}; + +/** + * 组合操作符 + * 操作多个表达式组合在一起 + */ +_p[36] = { + value: function(require) { + var kity = _p.r(34); + return kity.createClass("CombinationOperator", { + base: _p.r(41), + constructor: function() { + this.callBase("Combination"); + }, + applyOperand: function() { + // 偏移量 + var offsetX = 0, // 操作数 + operands = arguments, // 操作对象最大高度 + maxHeight = 0, // 垂直距离最大偏移 + maxOffsetTop = 0, maxOffsetBottom = 0, cached = [], // 偏移集合 + offsets = []; + kity.Utils.each(operands, function(operand) { + var box = operand.getFixRenderBox(), offsetY = operand.getOffset(); + box.height -= offsetY.top + offsetY.bottom; + cached.push(box); + offsets.push(offsetY); + maxOffsetTop = Math.max(offsetY.top, maxOffsetTop); + maxOffsetBottom = Math.max(offsetY.bottom, maxOffsetBottom); + maxHeight = Math.max(box.height, maxHeight); + }); + kity.Utils.each(operands, function(operand, index) { + var box = cached[index]; + operand.translate(offsetX - box.x, (maxHeight - (box.y + box.height)) / 2 + maxOffsetBottom - offsets[index].bottom); + offsetX += box.width; + }); + this.parentExpression.setOffset(maxOffsetTop, maxOffsetBottom); + this.parentExpression.updateBoxSize(); + } + }); + } +}; + +/*! + * 上下标控制器 + */ +_p[37] = { + value: function(require) { + var kity = _p.r(34), EmptyExpression = _p.r(20), defaultOptions = { + subOffset: 0, + supOffset: 0, + // 上下标的默认缩放值 + zoom: .66 + }; + return kity.createClass("ScriptController", { + constructor: function(opObj, target, sup, sub, options) { + this.observer = opObj.getParentExpression(); + this.target = target; + this.sup = sup; + this.sub = sub; + this.options = kity.Utils.extend({}, defaultOptions, options); + }, + // 上下标记 + applyUpDown: function() { + var target = this.target, sup = this.sup, sub = this.sub, options = this.options; + sup.scale(options.zoom); + sub.scale(options.zoom); + var targetBox = target.getFixRenderBox(); + if (EmptyExpression.isEmpty(sup) && EmptyExpression.isEmpty(sub)) { + return { + width: targetBox.width, + height: targetBox.height, + top: 0, + bottom: 0 + }; + } else { + // 上标 + if (!EmptyExpression.isEmpty(sup) && EmptyExpression.isEmpty(sub)) { + return this.applyUp(target, sup); + } else if (EmptyExpression.isEmpty(sup) && !EmptyExpression.isEmpty(sub)) { + return this.applyDown(target, sub); + } else { + return this.applyUpDownScript(target, sup, sub); + } + } + }, + /** + * 返回应用上下标后的空间占用情况,其中的key各自的意义是: + * top: 上空间偏移 + * bottom: 下空间偏移 + * width: 当前整个图形的实际占用空间的width + * height: 当前整个图形的实际占用空间的height + * @returns {*} + */ + applySide: function() { + var target = this.target, sup = this.sup, sub = this.sub; + if (EmptyExpression.isEmpty(sup) && EmptyExpression.isEmpty(sub)) { + var targetRectBox = target.getRenderBox(this.observer); + return { + width: targetRectBox.width, + height: targetRectBox.height, + top: 0, + bottom: 0 + }; + } else { + // 下标处理 + if (EmptyExpression.isEmpty(sup) && !EmptyExpression.isEmpty(sub)) { + return this.applySideSub(target, sub); + } else if (!EmptyExpression.isEmpty(sup) && EmptyExpression.isEmpty(sub)) { + return this.applySideSuper(target, sup); + } else { + return this.applySideScript(target, sup, sub); + } + } + }, + applySideSuper: function(target, sup) { + sup.scale(this.options.zoom); + var targetRectBox = target.getRenderBox(this.observer), supRectBox = sup.getRenderBox(this.observer), targetMeanline = target.getMeanline(this.observer), supBaseline = sup.getBaseline(this.observer), positionline = targetMeanline, diff = supBaseline - positionline, space = { + top: 0, + bottom: 0, + width: targetRectBox.width + supRectBox.width, + height: targetRectBox.height + }; + sup.translate(targetRectBox.width, 0); + if (this.options.supOffset) { + sup.translate(this.options.supOffset, 0); + } + if (diff > 0) { + target.translate(0, diff); + space.bottom = diff; + space.height += diff; + } else { + sup.translate(0, -diff); + } + return space; + }, + applySideSub: function(target, sub) { + sub.scale(this.options.zoom); + var targetRectBox = target.getRenderBox(this.observer), subRectBox = sub.getRenderBox(this.observer), subOffset = sub.getOffset(), targetBaseline = target.getBaseline(this.observer), // 下标定位线 + subPosition = (subRectBox.height + subOffset.top + subOffset.bottom) / 2, diff = targetRectBox.height - targetBaseline - subPosition, space = { + top: 0, + bottom: 0, + width: targetRectBox.width + subRectBox.width, + height: targetRectBox.height + }; + // 定位下标位置 + sub.translate(targetRectBox.width, subOffset.top + targetBaseline - subPosition); + if (this.options.subOffset) { + sub.translate(this.options.subOffset, 0); + } + if (diff < 0) { + space.top = -diff; + space.height -= diff; + } + return space; + }, + applySideScript: function(target, sup, sub) { + sup.scale(this.options.zoom); + sub.scale(this.options.zoom); + var targetRectBox = target.getRenderBox(this.observer), subRectBox = sub.getRenderBox(this.observer), supRectBox = sup.getRenderBox(this.observer), targetMeanline = target.getMeanline(this.observer), targetBaseline = target.getBaseline(this.observer), supBaseline = sup.getBaseline(this.observer), // 上下标都存在时, 下标的定位以上伸线为准 + subAscenderline = sub.getAscenderline(this.observer), supPosition = targetMeanline, subPosition = targetMeanline + (targetBaseline - targetMeanline) * 2 / 3, topDiff = supPosition - supBaseline, bottomDiff = targetRectBox.height - subPosition - (subRectBox.height - subAscenderline), space = { + top: 0, + bottom: 0, + width: targetRectBox.width + Math.max(subRectBox.width, supRectBox.width), + height: targetRectBox.height + }; + sup.translate(targetRectBox.width, topDiff); + sub.translate(targetRectBox.width, subPosition - subAscenderline); + if (this.options.supOffset) { + sup.translate(this.options.supOffset, 0); + } + if (this.options.subOffset) { + sub.translate(this.options.subOffset, 0); + } + // 定位纠正 + if (topDiff > 0) { + if (bottomDiff < 0) { + targetRectBox.height -= bottomDiff; + space.top = -bottomDiff; + } + } else { + target.translate(0, -topDiff); + sup.translate(0, -topDiff); + sub.translate(0, -topDiff); + space.height -= topDiff; + if (bottomDiff > 0) { + space.bottom = -topDiff; + } else { + space.height -= bottomDiff; + // 比较上下偏移, 获取正确的偏移值 + topDiff = -topDiff; + bottomDiff = -bottomDiff; + if (topDiff > bottomDiff) { + space.bottom = topDiff - bottomDiff; + } else { + space.top = bottomDiff - topDiff; + } + } + } + return space; + }, + applyUp: function(target, sup) { + var supBox = sup.getFixRenderBox(), targetBox = target.getFixRenderBox(), space = { + width: Math.max(targetBox.width, supBox.width), + height: supBox.height + targetBox.height, + top: 0, + bottom: supBox.height + }; + sup.translate((space.width - supBox.width) / 2, 0); + target.translate((space.width - targetBox.width) / 2, supBox.height); + return space; + }, + applyDown: function(target, sub) { + var subBox = sub.getFixRenderBox(), targetBox = target.getFixRenderBox(), space = { + width: Math.max(targetBox.width, subBox.width), + height: subBox.height + targetBox.height, + top: subBox.height, + bottom: 0 + }; + sub.translate((space.width - subBox.width) / 2, targetBox.height); + target.translate((space.width - targetBox.width) / 2, 0); + return space; + }, + applyUpDownScript: function(target, sup, sub) { + var supBox = sup.getFixRenderBox(), subBox = sub.getFixRenderBox(), targetBox = target.getFixRenderBox(), space = { + width: Math.max(targetBox.width, supBox.width, subBox.width), + height: supBox.height + subBox.height + targetBox.height, + top: 0, + bottom: 0 + }; + sup.translate((space.width - supBox.width) / 2, 0); + target.translate((space.width - targetBox.width) / 2, supBox.height); + sub.translate((space.width - subBox.width) / 2, supBox.height + targetBox.height); + return space; + } + }); + } +}; + +/** + * 分数操作符 + */ +_p[38] = { + value: function(require) { + var kity = _p.r(34), ZOOM = _p.r(47).zoom; + return kity.createClass("FractionOperator", { + base: _p.r(41), + constructor: function() { + this.callBase("Fraction"); + }, + applyOperand: function(upOperand, downOperand) { + upOperand.scale(ZOOM); + downOperand.scale(ZOOM); + var upWidth = Math.ceil(upOperand.getWidth()), downWidth = Math.ceil(downOperand.getWidth()), upHeight = Math.ceil(upOperand.getHeight()), downHeight = Math.ceil(downOperand.getHeight()), // 分数线overflow值 + overflow = 3, // 整体padding + padding = 1, maxWidth = Math.max(upWidth, downWidth), maxHeight = Math.max(upHeight, downHeight), operatorShape = generateOperator(maxWidth, overflow); + this.addOperatorShape(operatorShape); + upOperand.translate((maxWidth - upWidth) / 2 + overflow, 0); + operatorShape.translate(0, upHeight + 1); + // 下部不需要偏移 + downOperand.translate((maxWidth - downWidth) / 2 + overflow, upHeight + operatorShape.getHeight() + 1 * 2); + this.parentExpression.setOffset(maxHeight - upHeight, maxHeight - downHeight); + this.parentExpression.expand(padding * 2, padding * 2); + this.parentExpression.translateElement(padding, padding); + } + }); + function generateOperator(width, overflow) { + return new kity.Rect(width + overflow * 2, 1).fill("black"); + } + } +}; + +/** + * 函数操作符 + */ +_p[39] = { + value: function(require) { + var kity = _p.r(34), Text = _p.r(5), ScriptController = _p.r(37); + return kity.createClass("FunctionOperator", { + base: _p.r(41), + constructor: function(funcName) { + this.callBase("Function: " + funcName); + this.funcName = funcName; + }, + /* + * 积分操作符应用操作数 + * @param expr 函数表达式 + * @param sup 上限 + * @param sub 下限 + */ + applyOperand: function(expr, sup, sub) { + var opShape = generateOperator.call(this), expBox = expr.getFixRenderBox(), scriptHanlder = this.parentExpression.isSideScript() ? "applySide" : "applyUpDown", space = new ScriptController(this, opShape, sup, sub, { + zoom: .5 + })[scriptHanlder](), padding = 5, diff = (space.height + space.top + space.bottom - expBox.height) / 2; + // 应用偏移, 使图形在正确的位置上 + opShape.translate(0, space.top); + sup.translate(0, space.top); + sub.translate(0, space.top); + if (diff >= 0) { + expr.translate(space.width + padding, diff); + } else { + diff = -diff; + opShape.translate(0, diff); + sup.translate(0, diff); + sub.translate(0, diff); + expr.translate(space.width + padding, 0); + } + // 只扩展左边, 不扩展右边, 所以padding不 *2 + this.parentExpression.expand(padding, padding * 2); + this.parentExpression.translateElement(padding, padding); + } + }); + /* 返回操作符对象 */ + function generateOperator() { + var opShape = new Text(this.funcName, "KF AMS ROMAN"); + this.addOperatorShape(opShape); + // 为操作符图形创建baseline和meanline方法 + opShape.getBaseline = function() { + return opShape.getFixRenderBox().height; + }; + opShape.getMeanline = function() { + return 0; + }; + return opShape; + } + } +}; + +/** + * 积分操作符:∫ + */ +_p[40] = { + value: function(require) { + var kity = _p.r(34), ScriptController = _p.r(37); + return kity.createClass("IntegrationOperator", { + base: _p.r(41), + constructor: function(type) { + this.callBase("Integration"); + // 默认是普通单重积分 + this.opType = type || 1; + }, + setType: function(type) { + this.opType = type | 0; + }, + // 重置类型 + resetType: function() { + this.opType = 1; + }, + applyOperand: function(exp, sup, sub) { + var opShape = this.getOperatorShape(), padding = 3, expBox = exp.getFixRenderBox(), space = new ScriptController(this, opShape, sup, sub, { + supOffset: 3, + subOffset: -15 + }).applySide(), diff = (space.height + space.top - expBox.height) / 2; + opShape.translate(0, space.top); + sup.translate(0, space.top); + sub.translate(0, space.top); + if (diff >= 0) { + exp.translate(space.width + padding, diff); + } else { + diff = -diff; + opShape.translate(0, diff); + sup.translate(0, diff); + sub.translate(0, diff); + exp.translate(space.width + padding, 0); + } + this.parentExpression.expand(padding, padding * 2); + this.parentExpression.translateElement(padding, padding); + }, + getOperatorShape: function() { + var pathData = "M1.318,48.226c0,0,0.044,0.066,0.134,0.134c0.292,0.313,0.626,0.447,1.006,0.447c0.246,0.022,0.358-0.044,0.604-0.268 c0.782-0.782,1.497-2.838,2.324-6.727c0.514-2.369,0.938-4.693,1.586-8.448C8.559,24.068,9.9,17.878,11.978,9.52 c0.917-3.553,1.922-7.576,3.866-8.983C16.247,0.246,16.739,0,17.274,0c1.564,0,2.503,1.162,2.592,2.57 c0,0.827-0.424,1.386-1.273,1.386c-0.671,0-1.229-0.514-1.229-1.251c0-0.805,0.514-1.095,1.185-1.274 c0.022,0-0.291-0.29-0.425-0.379c-0.201-0.134-0.514-0.224-0.737-0.224c-0.067,0-0.112,0-0.157,0.022 c-0.469,0.134-0.983,0.939-1.453,2.234c-0.537,1.475-0.961,3.174-1.631,6.548c-0.424,2.101-0.693,3.464-1.229,6.727 c-1.608,9.185-2.949,15.487-5.006,23.756c-0.514,2.034-0.849,3.24-1.207,4.335c-0.559,1.698-1.162,2.95-1.811,3.799 c-0.514,0.715-1.385,1.408-2.436,1.408c-1.363,0-2.391-1.185-2.458-2.592c0-0.804,0.447-1.363,1.273-1.363 c0.671,0,1.229,0.514,1.229,1.251C2.503,47.757,1.989,48.047,1.318,48.226z", group = new kity.Group(), opGroup = new kity.Group(), opShape = new kity.Path(pathData).fill("black"), opBox = new kity.Rect(0, 0, 0, 0).fill("transparent"), tmpShape = null; + opGroup.addShape(opShape); + group.addShape(opBox); + group.addShape(opGroup); + this.addOperatorShape(group); + for (var i = 1; i < this.opType; i++) { + tmpShape = new kity.Use(opShape).translate(opShape.getWidth() / 2 * i, 0); + opGroup.addShape(tmpShape); + } + opGroup.scale(1.6); + tmpShape = null; + // 为操作符图形创建baseline和meanline方法 + group.getBaseline = function() { + return opGroup.getFixRenderBox().height; + }; + group.getMeanline = function() { + return 10; + }; + return group; + } + }); + } +}; + +/** + * 操作符抽象类 + * @abstract + */ +_p[41] = { + value: function(require) { + var kity = _p.r(34), GTYPE = _p.r(6); + return kity.createClass("Operator", { + base: _p.r(46), + constructor: function(operatorName) { + this.callBase(); + this.type = GTYPE.OP; + // 该操作符所属的表达式 + this.parentExpression = null; + // 操作符名称 + this.operatorName = operatorName; + // 操作符图形 + this.operatorShape = new kity.Group(); + this.addShape(this.operatorShape); + }, + applyOperand: function() { + throw new Error("applyOperand is abstract"); + }, + setParentExpression: function(exp) { + this.parentExpression = exp; + }, + getParentExpression: function() { + return this.parentExpression; + }, + clearParentExpression: function() { + this.parentExpression = null; + }, + // 提供给具体实现类附加其绘制的操作符图形的接口 + addOperatorShape: function(shpae) { + return this.operatorShape.addShape(shpae); + }, + getOperatorShape: function() { + return this.operatorShape; + } + }); + } +}; + +/** + * 开方操作符 + */ +_p[42] = { + value: function(require) { + var kity = _p.r(34), // 符号图形属性 + // 线条宽度 + SHAPE_DATA_WIDTH = 1, // 计算公式 + radians = 2 * Math.PI / 360, sin15 = Math.sin(15 * radians), cos15 = Math.cos(15 * radians), tan15 = Math.tan(15 * radians); + return kity.createClass("RadicalOperator", { + base: _p.r(41), + constructor: function() { + this.callBase("Radical"); + }, + applyOperand: function(radicand, exponent) { + generateOperator.call(this, radicand, exponent); + } + }); + // 根据给定的操作数生成操作符的pathData + // radicand 表示被开方数 + // exponent 表示指数 + function generateOperator(radicand, exponent) { + var decoration = generateDecoration(radicand), vLine = generateVLine(radicand), padding = 5, hLine = generateHLine(radicand); + this.addOperatorShape(decoration); + this.addOperatorShape(vLine); + this.addOperatorShape(hLine); + adjustmentPosition.call(this, mergeShape(decoration, vLine, hLine), this.operatorShape, radicand, exponent); + this.parentExpression.expand(0, padding * 2); + this.parentExpression.translateElement(0, padding); + } + // 生成根号中的左边装饰部分 + function generateDecoration(radicand) { + var shape = new kity.Path(), // 命名为a以便于精简表达式 + a = SHAPE_DATA_WIDTH, h = radicand.getHeight() / 3, drawer = shape.getDrawer(); + // 根号尾部左上角开始 + drawer.moveTo(0, cos15 * a * 6); + drawer.lineBy(sin15 * a, cos15 * a); + drawer.lineBy(cos15 * a * 3, -sin15 * a * 3); + drawer.lineBy(tan15 * h, h); + drawer.lineBy(sin15 * a * 3, -cos15 * a * 3); + drawer.lineBy(-sin15 * h, -h); + drawer.close(); + return shape.fill("black"); + } + // 根据操作数生成根号的竖直线部分 + function generateVLine(operand) { + var shape = new kity.Path(), // * 0.9 是为了在视觉上使斜线部分不至于太高 + h = operand.getHeight() * .9, drawer = shape.getDrawer(); + drawer.moveTo(tan15 * h, 0); + drawer.lineTo(0, h); + drawer.lineBy(sin15 * SHAPE_DATA_WIDTH * 3, cos15 * SHAPE_DATA_WIDTH * 3); + drawer.lineBy(tan15 * h + sin15 * SHAPE_DATA_WIDTH * 3, -(h + 3 * SHAPE_DATA_WIDTH * cos15)); + drawer.close(); + return shape.fill("black"); + } + // 根据操作数生成根号的水平线部分 + function generateHLine(operand) { + // 表达式宽度 + var w = operand.getWidth() + 2 * SHAPE_DATA_WIDTH; + return new kity.Rect(w, 2 * SHAPE_DATA_WIDTH).fill("black"); + } + // 合并根号的各个部分, 并返回根号的关键点位置数据 + function mergeShape(decoration, vLine, hLine) { + var decoBox = decoration.getFixRenderBox(), vLineBox = vLine.getFixRenderBox(); + vLine.translate(decoBox.width - sin15 * SHAPE_DATA_WIDTH * 3, 0); + decoration.translate(0, vLineBox.height - decoBox.height); + vLineBox = vLine.getFixRenderBox(); + hLine.translate(vLineBox.x + vLineBox.width - SHAPE_DATA_WIDTH / cos15, 0); + // 返回关键点数据 + return { + x: vLineBox.x + vLineBox.width - SHAPE_DATA_WIDTH / cos15, + y: 0 + }; + } + // 调整整个根号表达式的各个部分: 位置、操作符、被开方数、指数 + function adjustmentPosition(position, operator, radicand, exponent) { + var exponentBox = null, opOffset = { + x: 0, + y: 0 + }, opBox = operator.getFixRenderBox(); + exponent.scale(.66); + exponentBox = exponent.getFixRenderBox(); + if (exponentBox.width > 0 && exponentBox.height > 0) { + opOffset.y = exponentBox.height - opBox.height / 2; + // 指数不超出根号, 则移动指数 + if (opOffset.y < 0) { + exponent.translate(0, -opOffset.y); + opOffset.y = 0; + } + opOffset.x = exponentBox.width + opBox.height / 2 * tan15 - position.x; + } + operator.translate(opOffset.x, opOffset.y); + radicand.translate(opOffset.x + position.x + SHAPE_DATA_WIDTH, opOffset.y + 2 * SHAPE_DATA_WIDTH); + } + } +}; + +/** + * 上下标操作符 + */ +_p[43] = { + value: function(require) { + var kity = _p.r(34), ScriptController = _p.r(37); + return kity.createClass("ScriptOperator", { + base: _p.r(41), + constructor: function(operatorName) { + this.callBase(operatorName || "Script"); + }, + applyOperand: function(operand, sup, sub) { + var padding = 1, parent = this.parentExpression, space = new ScriptController(this, operand, sup, sub).applySide(); + this.getOperatorShape(); + space && parent.setOffset(space.top, space.bottom); + parent.expand(4, padding * 2); + parent.translateElement(2, padding); + } + }); + } +}; + +/** + * 求和操作符:∑ + */ +_p[44] = { + value: function(require) { + var kity = _p.r(34), ScriptController = _p.r(37); + return kity.createClass("SummationOperator", { + base: _p.r(41), + constructor: function() { + this.callBase("Summation"); + this.displayType = "equation"; + }, + applyOperand: function(expr, sup, sub) { + var opShape = this.getOperatorShape(), expBox = expr.getFixRenderBox(), padding = 0, space = new ScriptController(this, opShape, sup, sub).applyUpDown(), diff = (space.height - space.top - space.bottom - expBox.height) / 2; + if (diff >= 0) { + expr.translate(space.width + padding, diff + space.bottom); + } else { + diff = -diff; + opShape.translate(0, diff); + sup.translate(0, diff); + sub.translate(0, diff); + expr.translate(space.width + padding, space.bottom); + } + this.parentExpression.setOffset(space.top, space.bottom); + this.parentExpression.expand(padding, padding * 2); + this.parentExpression.translateElement(padding, padding); + }, + getOperatorShape: function() { + var pathData = "M0.672,33.603c-0.432,0-0.648,0-0.648-0.264c0-0.024,0-0.144,0.24-0.432l12.433-14.569L0,0.96c0-0.264,0-0.72,0.024-0.792 C0.096,0.024,0.12,0,0.672,0h28.371l2.904,6.745h-0.6C30.531,4.8,28.898,3.72,28.298,3.336c-1.896-1.2-3.984-1.608-5.28-1.8 c-0.216-0.048-2.4-0.384-5.617-0.384H4.248l11.185,15.289c0.168,0.24,0.168,0.312,0.168,0.36c0,0.12-0.048,0.192-0.216,0.384 L3.168,31.515h14.474c4.608,0,6.96-0.624,7.464-0.744c2.76-0.72,5.305-2.352,6.241-4.848h0.6l-2.904,7.681H0.672z", operatorShape = new kity.Path(pathData).fill("black"), opBgShape = new kity.Rect(0, 0, 0, 0).fill("transparent"), group = new kity.Group(), opRenderBox = null; + group.addShape(opBgShape); + group.addShape(operatorShape); + operatorShape.scale(1.6); + this.addOperatorShape(group); + opRenderBox = operatorShape.getFixRenderBox(); + if (this.displayType === "inline") { + operatorShape.translate(5, 15); + opBgShape.setSize(opRenderBox.width + 10, opRenderBox.height + 25); + } else { + operatorShape.translate(2, 5); + opBgShape.setSize(opRenderBox.width + 4, opRenderBox.height + 8); + } + return group; + } + }); + } +}; + +/*! + * 资源管理器 + * 负责管理资源的加载,并在资源ready之后提供Formula构造器 + */ +_p[45] = { + value: function(require) { + var kity = _p.r(34), cbList = [], RES_CONF = _p.r(47).resource, FontInstall = _p.r(24), Formula = _p.r(31), // 资源管理器就绪状态 + __readyState = false, // 资源管理器是否已启动 + inited = false; + return { + // 初始化 + ready: function(cb, options) { + if (!inited) { + inited = true; + init(options); + } + if (__readyState) { + window.setTimeout(function() { + cb(Formula); + }, 0); + } else { + cbList.push(cb); + } + } + }; + /** + * 资源初始化 + */ + function init(options) { + options = kity.Utils.extend({}, RES_CONF, options); + if (!/^(https?:)?\/\//.test(options.path)) { + options.path = getFullPath(options.path); + } + new FontInstall(document, options.path).mount(complete); + } + function complete() { + kity.Utils.each(cbList, function(cb) { + cb(Formula); + }); + } + function getFullPath(path) { + var pathname = location.pathname.split("/"), pathPart; + pathname.length -= 1; + pathname = pathname.join("/") + "/"; + pathPart = [ location.protocol, "//", location.host, pathname, path.replace(/^\//, "") ]; + return pathPart.join(""); + } + } +}; + +/*! + * 所有符号的基类 + * @abstract + */ +_p[46] = { + value: function(require) { + var kity = _p.r(34), GTYPE = _p.r(6); + return kity.createClass("SignGroup", { + base: kity.Group, + constructor: function() { + this.callBase(); + this.box = new kity.Rect(0, 0, 0, 0); + this.type = GTYPE.UNKNOWN; + this.addShape(this.box); + this.zoom = 1; + }, + setZoom: function(zoom) { + this.zoom = zoom; + }, + getZoom: function() { + return this.zoom; + }, + setBoxSize: function(w, h) { + return this.box.setSize(w, h); + }, + setBoxWidth: function(w) { + return this.box.setWidth(w); + }, + setBoxHeight: function(h) { + return this.box.setHeight(h); + }, + getType: function() { + return this.type; + }, + getBaseHeight: function() { + return this.getHeight(); + }, + getBaseWidth: function() { + return this.getWidth(); + }, + addedCall: function() {} + }); + } +}; + +/*! + * 系统项目配置文件. + */ +_p[47] = { + value: function(require) { + return { + zoom: .66, + font: { + meanline: Math.round(380 / 1e3 * 50), + baseline: Math.round(800 / 1e3 * 50), + baseHeight: 50, + // 系统字体列表 + list: [ _p.r(29), _p.r(27), _p.r(28), _p.r(26), _p.r(30) ] + }, + /*------------------------- 资源配置*/ + resource: { + path: "src/resource/" + }, + // 函数相关配置 + func: { + // 上下标在函数名上下两侧的函数列表 + "ud-script": { + lim: true + } + } + }; + } +}; + +/*! + * 启动代码 + */ +_p[48] = { + value: function(require) { + window.kf = { + // base + ResourceManager: _p.r(45), + Operator: _p.r(41), + // expression + Expression: _p.r(21), + CompoundExpression: _p.r(19), + TextExpression: _p.r(22), + EmptyExpression: _p.r(20), + CombinationExpression: _p.r(12), + FunctionExpression: _p.r(14), + FractionExpression: _p.r(13), + IntegrationExpression: _p.r(15), + RadicalExpression: _p.r(16), + ScriptExpression: _p.r(17), + SuperscriptExpression: _p.r(9), + SubscriptExpression: _p.r(8), + SummationExpression: _p.r(18), + // Brackets expressoin + BracketsExpression: _p.r(11) + }; + } +}; + +var moduleMapping = { + "kf.start": 48 +}; + +function use(name) { + _p.r([ moduleMapping[name] ]); +} +/** + * 模块暴露 + */ + +( function ( global ) { + + var oldGetRenderBox = kity.Shape.getRenderBox; + + kity.extendClass(kity.Shape, { + getFixRenderBox: function () { + return this.getRenderBox( this.container.container ); + }, + + getTranslate: function () { + return this.transform.translate; + } + }); + + // build环境中才含有use + try { + use( 'kf.start' ); + } catch ( e ) { + } + +} )( this ); +})(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kityformula-editor.all.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kityformula-editor.all.min.js new file mode 100644 index 0000000..332ca58 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kityformula-editor.all.min.js @@ -0,0 +1,12 @@ +/*! + * ==================================================== + * Kity Formula Editor - v1.0.0 - 2014-09-03 + * https://github.com/kitygraph/formula + * GitHub: https://github.com/kitygraph/formula.git + * Copyright (c) 2014 Baidu Kity Group; Licensed MIT + * ==================================================== + */ +!function(){function a(a){b.r([c[a]])}var b={r:function(a){if(b[a].inited)return b[a].value;if("function"!=typeof b[a].value)return b[a].inited=!0,b[a].value;var c={exports:{}},d=b[a].value(null,c.exports,c);if(b[a].inited=!0,b[a].value=d,void 0!==d)return d;for(var e in c.exports)if(c.exports.hasOwnProperty(e))return b[a].inited=!0,b[a].value=c.exports,c.exports}};b[0]={value:function(){function a(d,e,f,g){return g=0|g,g>b?f:(g++,c.each(f,function(b,f){d?!b||"object"!=typeof b&&"function"!=typeof b?e[f]=b:(e[f]=e[f]||(c.isArray(b)?[]:{}),e[f]=a(d,e[f],b,g)):e[f]=b}),e)}var b=10,c={extend:function(b,d){var e=!1;if("boolean"==typeof b?(e=b,b=d,d=[].splice.call(arguments,2)):d=[].splice.call(arguments,1),!b)throw new Error("Utils: extend, target can not be empty");return c.each(d,function(c){(c&&"object"==typeof c||"function"==typeof c)&&a(e,b,c)}),b},contains:function(a,b){return a.contains?a.contains(b):a.compareDocumentPosition?!!(16&a.compareDocumentPosition(b)):void 0},getRect:function(a){return a.getBoundingClientRect()},isArray:function(a){return a&&"[object Array]"==={}.toString.call(a)},isString:function(a){return"string"==typeof a},proxy:function(a,b){return function(){return a.apply(b,arguments)}},each:function(a,b){if(a)if("length"in a&&"number"==typeof a.length)for(var c=0,d=a.length;d>c&&b.call(null,a[c],c,a)!==!1;c++);else for(var e in a)if(a.hasOwnProperty(e)&&b.call(null,a[e],e,a)===!1)break}};return c}},b[1]={value:function(){var a=b.r(20);return a.createClass("Component",{constructor:function(){}})}},b[2]={value:function(){function a(){return++d}var c={},d=0,e=!0,f=b.r(3),g=b.r(0),h=function(a){var b=a.type,d=a.target,f=this.__kfe_eid,h=/^(?:before|after)/.test(b),j=c[f][b];return h||(i.trigger(d,"before"+b),e!==!1)?(g.each(j,function(b){return b&&b.call(d,a)===!1?e=!1:void 0}),void(h||i.trigger(d,"after"+b))):(e=!0,!1)},i={addEvent:function(b,d,e){var f=!0,g=null;b.__kfe_eid||(f=!1,b.__kfe_eid=a(),c[b.__kfe_eid]={}),g=c[b.__kfe_eid],g[d]||(f=!1,g[d]=[]),g[d].push(e),f||b.addEventListener(d,h,!1)},trigger:function(a,b,c){c=c||f.createEvent(b,c),a.dispatchEvent(c)}};return i}},b[3]={value:function(){return{createEvent:function(a){var b=document.createEvent("Event");return b.initEvent(a,!0,!0),b}}}},b[4]={value:function(){var a={},c=b.r(0);return c.extend(a,c,b.r(2)),a}},b[5]={value:function(){var a=b.r(20),c=b.r(8),d=a.createClass("ControllerComponent",{constructor:function(a){this.kfEditor=a,this.components={},this.initComponents()},initComponents:function(){this.components.listener=new c(this,this.kfEditor)}});return d}},b[6]={value:function(){var a={32:"\\,","s+219":"\\{","s+221":"\\}",220:"\\backslash","s+51":"\\#","s+52":"\\$","s+53":"\\%","s+54":"\\^","s+55":"\\&","s+189":"\\_","s+192":"\\~"};return{getReplaceString:function(b){return a[b]||null}}}},b[7]={value:function(){var a=b.r(20),c=b.r(4),d=b.r(6),e={LEFT:37,RIGHT:39,DELETE:8,INPUT:229};return a.createClass("InputComponent",{constructor:function(a,b){this.parentComponent=a,this.kfEditor=b,this.inputBox=this.createInputBox(),this.initServices(),this.initCommands(),this.initEvent()},initServices:function(){this.kfEditor.registerService("control.update.input",this,{updateInput:this.updateInput}),this.kfEditor.registerService("control.insert.string",this,{insertStr:this.insertStr})},initCommands:function(){this.kfEditor.registerCommand("focus",this,this.focus)},createInputBox:function(){var a=this.kfEditor.getContainer(),b=this.kfEditor.getDocument().createElement("input");return b.className="kf-editor-input-box",b.type="text",b.isTrusted=!1,a.appendChild(b),b},focus:function(){var a=null;this.inputBox.focus(),this.kfEditor.requestService("syntax.has.cursor.info")||(a=this.kfEditor.requestService("syntax.get.root.group.info"),this.kfEditor.requestService("syntax.update.record.cursor",{groupId:a.id,startOffset:0,endOffset:a.content.length}),this.kfEditor.requestService("control.update.input")),this.kfEditor.requestService("control.reselect")},setUntrusted:function(){this.inputBox.isTrusted=!1},setTrusted:function(){this.inputBox.isTrusted=!0},updateInput:function(){var a=this.kfEditor.requestService("syntax.serialization");this.setUntrusted(),this.inputBox.value=a.str,this.inputBox.selectionStart=a.startOffset,this.inputBox.selectionEnd=a.endOffset,this.inputBox.focus(),this.setTrusted()},insertStr:function(a){var b=this.kfEditor.requestService("syntax.serialization"),c=b.str;c=c.substring(0,b.startOffset)+" "+a+" "+c.substring(b.endOffset),this.restruct(c),this.updateInput(),this.kfEditor.requestService("ui.update.canvas.view")},initEvent:function(){var a=this;c.addEvent(this.inputBox,"keydown",function(b){var c=!1;if(b.ctrlKey)return void a.processUserCtrl(b);switch(b.keyCode){case e.INPUT:return;case e.LEFT:b.preventDefault(),a.leftMove(),c=!0;break;case e.RIGHT:b.preventDefault(),a.rightMove(),c=!0;break;case e.DELETE:b.preventDefault(),a.delete(),c=!0}c&&a.kfEditor.requestService("ui.update.canvas.view"),a.pretreatmentInput(b)||b.preventDefault()}),c.addEvent(this.inputBox,"input",function(){a.processingInput()}),c.addEvent(this.inputBox,"blur",function(){a.kfEditor.requestService("ui.toolbar.disable"),a.kfEditor.requestService("ui.toolbar.close"),a.kfEditor.requestService("control.cursor.hide"),a.kfEditor.requestService("render.clear.select")}),c.addEvent(this.inputBox,"focus",function(){a.kfEditor.requestService("ui.toolbar.enable"),this.isTrusted&&a.kfEditor.requestService("control.reselect")}),c.addEvent(this.inputBox,"paste",function(a){a.preventDefault()})},hasRootplaceholder:function(){return this.kfEditor.requestService("syntax.has.root.placeholder")},leftMove:function(){this.hasRootplaceholder()||(this.kfEditor.requestService("syntax.cursor.move.left"),this.update())},rightMove:function(){this.hasRootplaceholder()||(this.kfEditor.requestService("syntax.cursor.move.right"),this.update())},"delete":function(){var a=null;this.hasRootplaceholder()||(a=this.kfEditor.requestService("syntax.delete.group"),a?(this.updateInput(),this.processingInput()):(this.updateInput(),this.kfEditor.requestService("control.reselect")))},processUserCtrl:function(a){switch(a.preventDefault(),a.keyCode){case 65:this.kfEditor.requestService("control.select.all");break;case 83:this.kfEditor.requestService("print.image")}},pretreatmentInput:function(a){var b=this.getKeyCode(a),c=d.getReplaceString(b);return null===c?!0:(this.insertStr(c),!1)},getKeyCode:function(a){return(a.shiftKey?"s+":"")+a.keyCode},processingInput:function(){this.restruct(this.inputBox.value),this.kfEditor.requestService("ui.update.canvas.view")},restruct:function(a){this.kfEditor.requestService("render.draw",a),this.kfEditor.requestService("control.reselect")},update:function(){this.updateInput(),this.kfEditor.requestService("control.reselect")}})}},b[8]={value:function(){var a=b.r(20),c=b.r(9),d=b.r(7),e=b.r(10);return a.createClass("MoveComponent",{constructor:function(a,b){this.parentComponent=a,this.kfEditor=b,this.components={},this.initComponents()},initComponents:function(){this.components.location=new c(this,this.kfEditor),this.components.selection=new e(this,this.kfEditor),this.components.input=new d(this,this.kfEditor)}})}},b[9]={value:function(){function a(a){return a.getBoundingClientRect()}var c=b.r(20);return c.createClass("LocationComponent",{constructor:function(a,b){this.parentComponent=a,this.kfEditor=b,this.paper=this.getPaper(),this.cursorShape=this.createCursor(),this.initServices(),this.initEvent()},getPaper:function(){return this.kfEditor.requestService("render.get.paper")},initServices:function(){this.kfEditor.registerService("control.cursor.relocation",this,{relocationCursor:this.updateCursor}),this.kfEditor.registerService("control.cursor.hide",this,{hideCursor:this.hideCursor}),this.kfEditor.registerService("control.reselect",this,{reselect:this.reselect}),this.kfEditor.registerService("control.get.cursor.location",this,{getCursorLocation:this.getCursorLocation})},createCursor:function(){var a=new c.Rect(1,0,0,0).fill("black");return a.setAttr("style","display: none"),this.paper.addShape(a),a},initEvent:function(){var a=this.kfEditor.request("ui.canvas.container.event"),b=this;a.on("mousedown",function(a){a.preventDefault(),b.updateCursorInfo(a),b.kfEditor.requestService("control.update.input"),b.reselect()})},updateCursorInfo:function(a){var b=null,c=null,d=-1;return this.kfEditor.requestService("syntax.has.root.placeholder")?(this.kfEditor.requestService("syntax.update.record.cursor",{groupId:this.kfEditor.requestService("syntax.get.root.group.info").id,startOffset:0,endOffset:1}),!1):(b=this.kfEditor.requestService("position.get.wrap",a.target),b&&this.kfEditor.requestService("syntax.is.placeholder.node",b.id)?(c=this.kfEditor.requestService("position.get.group.info",b),void this.kfEditor.requestService("syntax.update.record.cursor",c.group.id,c.index,c.index+1)):(c=this.kfEditor.requestService("position.get.group",a.target),null===c&&(c=this.kfEditor.requestService("syntax.get.root.group.info")),d=this.getIndex(a.clientX,c),void this.kfEditor.requestService("syntax.update.record.cursor",c.id,d)))},hideCursor:function(){this.cursorShape.setAttr("style","display: none")},reselect:function(){var a=this.kfEditor.requestService("syntax.get.record.cursor"),b=null;return this.hideCursor(),this.kfEditor.requestService("syntax.is.select.placeholder")?(b=this.kfEditor.requestService("syntax.get.group.content",a.groupId),void this.kfEditor.requestService("render.select.group",b.content[a.startOffset].id)):void(a.startOffset===a.endOffset?(this.updateCursor(),this.kfEditor.requestService("render.tint.current.cursor")):this.kfEditor.requestService("render.select.current.cursor"))},updateCursor:function(){var b=this.kfEditor.requestService("syntax.get.record.cursor");if(b.startOffset!==b.endOffset)return void this.hideCursor();var c=this.kfEditor.requestService("syntax.get.group.content",b.groupId),d=0===b.endOffset,e=d?0:b.endOffset-1,f=c.content[e],g=a(this.paper.container.node),h=0,i=a(f),j=this.cursorShape.getTransform(this.cursorShape),k=this.kfEditor.requestService("render.get.canvas.zoom"),l=this.paper.getZoom();this.cursorShape.setHeight(i.height/k/l),h=d?i.left-2:i.left+i.width-2,h-=g.left,j.m.e=Math.floor(h/k/l)+.5,j.m.f=(i.top-g.top)/k/l,this.cursorShape.setMatrix(j),this.cursorShape.setAttr("style","display: block")},getCursorLocation:function(){var a=this.cursorShape.getRenderBox("paper");return{x:a.x,y:a.y}},getIndex:function(b,c){for(var d=-1,e=c.content,f=null,g=e.length-1,h=null;g>=0;g--)if(d=g,h=e[g],f=a(h),f.leftthis.startPoint.x,e={},f=null,g=!1,h=this.startGroup,i=null,j=this.getGroupInof(b,a);j.groupInfo.id===h.groupInfo.id?(e={groupId:j.groupInfo.id,startOffset:h.offset,endOffset:j.offset},this.startGroupIsPlaceholder&&(d?e.startOffset===e.endOffset&&(e.endOffset+=1):e.startOffset+=1)):c.contains(h.groupInfo.groupObj,j.groupInfo.groupObj)?e={groupId:h.groupInfo.id,startOffset:h.offset,endOffset:this.getIndex(h.groupInfo.groupObj,a,b)}:c.contains(j.groupInfo.groupObj,h.groupInfo.groupObj)?(e={groupId:j.groupInfo.id,startOffset:this.kfEditor.requestService("position.get.index",j.groupInfo.groupObj,h.groupInfo.groupObj),endOffset:j.offset},d||(e.startOffset+=1)):(f=this.getCommunityGroup(h.groupInfo,j.groupInfo),f.startOffset===f.endOffset?f.endOffset+=1:(i=f.group.content[f.endOffset],g=this.kfEditor.requestService("position.get.area",i,b),g&&(f.endOffset+=1),d||(f.startOffset+=1)),e={groupId:f.group.id,startOffset:f.startOffset,endOffset:f.endOffset}),this.kfEditor.requestService("syntax.update.record.cursor",e.groupId,e.startOffset,e.endOffset),this.kfEditor.requestService("control.reselect")},updateSelectionByTarget:function(a){var b=this.kfEditor.requestService("position.get.parent.group",a),c=null,d={};if(null!==b){if(this.kfEditor.requestService("syntax.is.root.node",b.id))return void this.selectAll();this.kfEditor.requestService("syntax.is.virtual.node",b.id)?(c=this.kfEditor.requestService("position.get.group.info",b.groupObj),d={groupId:c.group.id,startOffset:c.index,endOffset:c.index+1}):d={groupId:b.id,startOffset:0,endOffset:b.content.length},this.kfEditor.requestService("syntax.update.record.cursor",d),this.kfEditor.requestService("control.reselect"),this.kfEditor.requestService("control.update.input")}},selectAll:function(){var a=this.kfEditor.requestService("syntax.get.root.group.info"),b={groupId:a.id,startOffset:0,endOffset:a.content.length};this.kfEditor.requestService("syntax.update.record.cursor",b),this.kfEditor.requestService("control.reselect"),this.kfEditor.requestService("control.update.input")},getGroupInof:function(a,b){var c=this.kfEditor.requestService("position.get.group",b);null===c&&(c=this.kfEditor.requestService("syntax.get.root.group.info"));var d=this.kfEditor.requestService("position.get.location.info",a,c);return{groupInfo:c,offset:d}},getIndex:function(a,b,d){var e=this.kfEditor.requestService("position.get.index",a,b),f=this.kfEditor.requestService("syntax.get.group.content",a.id),g=f.content[e],h=c.getRect(g);return h.left+h.width/2k;k++)i=b.operand[k],h(b)?e(a,k,b,i):f(a,k,b,i);return b}function c(){return q+ ++s}function d(a,b){a.isResetId?b.attr["data-root"]="true":b.attr["data-type"]=r.VIRTUAL}function e(b,c,d,e){"brackets"===d.name&&2>c||("function"!==d.name||0!==c)&&(d.attr["data-type"]=r.VIRTUAL,e?"string"==typeof e?(d.operand[c]=j(b),d.operand[c].operand[0]=e):i(e)?(d.operand[c]=j(b),d.operand[c].operand[0]=a(b,e,d.operand[c])):d.operand[c]=a(b,e,d):d.operand[c]=e)}function f(b,c,d,e){d.attr["data-type"]=r.GROUP,d.operand[c]=e&&"string"!=typeof e?"text"===e.name?e:a(b,e,d):e}function g(a){var b=1;if(a.length>3)return!1;for(var c=0,d=a.length;d>c;c++)a[c]!==m&&a[c]&&"placeholder"===a[c].name&&b--;return!b}function h(a){return!!n[a.name]}function i(a){return"placeholder"===a.name}function j(a){return{name:p,attr:{"data-type":r.GROUP,id:a.getGroupId()},operand:[]}}var k=b.r(19).Parser,l=b.r(20),m=b.r(29).cursorCharacter,n=b.r(22),o=b.r(29).rootPlaceholder.content,p="combination",q="_kf_editor_",r=b.r(11),s=0,t=l.createClass("Parser",{constructor:function(a){this.kfEditor=a,this.callBase(),this.kfParser=k.use("latex"),this.initKFormulExtension(),this.pid=c(),this.groupRecord=0,this.tree=null,this.isResetId=!0,this.initServices()},parse:function(b,c){var d=null;return this.isResetId=!!c,this.isResetId&&this.resetGroupId(),d=this.kfParser.parse(b),a(this,d.tree),d},serialization:function(a){return this.kfParser.serialization(a)},initServices:function(){this.kfEditor.registerService("parser.parse",this,{parse:this.parse}),this.kfEditor.registerService("parser.latex.serialization",this,{serialization:this.serialization})},getKFParser:function(){return this.kfParser},initKFormulExtension:function(){b.r(17).ext(this)},resetGroupId:function(){this.groupRecord=0},getGroupId:function(){return this.pid+"_"+ ++this.groupRecord}});return t}},b[22]={value:function(){return{radical:!0,fraction:!0,summation:!0,integration:!0,placeholder:!0,script:!0,superscript:!0,subscript:!0,brackets:!0,"function":!0}}},b[23]={value:function(){function a(b,c,d){var e=null;return b.ownerSVGElement?(b=b.parentNode,e=b.tagName.toLowerCase(),b&&"body"!==e&&"svg"!==e?"kf-editor-group"===b.getAttribute("data-type")?b:c&&"kf-editor-virtual-group"===b.getAttribute("data-type")?b:d&&null!==b.getAttribute("data-flag")?b:a(b,c,d):null):null}var c=b.r(20),d=b.r(4),e=c.createClass("PositionComponenet",{constructor:function(a){this.kfEditor=a,this.initServices()},initServices:function(){this.kfEditor.registerService("position.get.group",this,{getGroupByTarget:this.getGroupByTarget}),this.kfEditor.registerService("position.get.index",this,{getIndexByTargetInGroup:this.getIndexByTargetInGroup}),this.kfEditor.registerService("position.get.location.info",this,{getLocationInfo:this.getLocationInfo}),this.kfEditor.registerService("position.get.parent.group",this,{getParentGroupByTarget:this.getParentGroupByTarget}),this.kfEditor.registerService("position.get.wrap",this,{getWrap:this.getWrap}),this.kfEditor.registerService("position.get.area",this,{getAreaByCursorInGroup:this.getAreaByCursorInGroup}),this.kfEditor.registerService("position.get.group.info",this,{getGroupInfoByNode:this.getGroupInfoByNode}),this.kfEditor.registerService("position.get.parent.info",this,{getParentInfoByNode:this.getParentInfoByNode})},getGroupByTarget:function(b){var c=a(b,!1,!1);return c?this.kfEditor.requestService("syntax.get.group.content",c.id):null},getIndexByTargetInGroup:function(a,b){var e=this.kfEditor.requestService("syntax.get.group.content",a.id),f=-1;return c.Utils.each(e.content,function(a,c){return f=c,d.contains(a,b)?!1:void 0}),f},getAreaByCursorInGroup:function(a,b){var c=d.getRect(a);return c.left+c.width/2=0;g--)if(c=g,h=e[g],f=d.getRect(h),f.leftg&&(c.index=g,!d.contains(f.content[g],b));g++);return c.group=f,c},getParentInfoByNode:function(b){var c=a(b,!0,!1);return c=this.kfEditor.requestService("syntax.get.group.content",c.id),{group:c,index:c.content.indexOf(b)}}});return e}},b[24]={value:function(){var a=b.r(20);return a.createClass("Printer",{constructor:function(a){this.kfEditor=a,this.initServices(),this.initCommands()},initServices:function(){this.kfEditor.registerService("print.image",this,{printImage:this.printImage})},initCommands:function(){this.kfEditor.registerCommand("get.image.data",this,this.getImageData)},printImage:function(){var a=this.kfEditor.requestService("render.get.paper");this._formatCanvas(),a.toPNG(function(a){document.body.innerHTML=''}),this._restoreCanvas()},getImageData:function(a){var b=this.kfEditor.requestService("render.get.canvas"),c=this.kfEditor.requestService("render.get.paper");this._formatCanvas(),c.toPNG(function(c){a({width:b.width,height:b.height,img:c})}),this._restoreCanvas()},_formatCanvas:function(){var a=this.kfEditor.requestService("render.get.canvas"),b=a.container.getRenderBox();a.node.setAttribute("width",b.width),a.node.setAttribute("height",b.height),this.kfEditor.requestService("render.clear.canvas.transform"),this.kfEditor.requestService("control.cursor.hide"),this.kfEditor.requestService("render.clear.select")},_restoreCanvas:function(){var a=this.kfEditor.requestService("render.get.canvas");a.node.setAttribute("width","100%"),a.node.setAttribute("height","100%"),this.kfEditor.requestService("render.revert.canvas.transform"),this.kfEditor.requestService("control.cursor.relocation"),this.kfEditor.requestService("render.reselect")}})}},b[25]={value:function(){var a=b.r(20),c=b.r(19).Assembly,d={autoresize:!1,fontsize:50,padding:[20,50]},e=a.createClass("RenderComponent",{base:b.r(1),constructor:function(b,c){this.callBase(),this.options=a.Utils.extend({},d,c),this.kfEditor=b,this.assembly=null,this.formula=null,this.relDisabled=!1,this.canvasZoom=1,this.record={select:{},cursor:{},canvas:{}},this.initCanvas(),this.initServices(),this.initCommands()},initCanvas:function(){var a=this.kfEditor.requestService("ui.get.canvas.container"),b=this.kfEditor.getFormulaClass();this.assembly=new c(new b(a,this.options)),this.formula=this.assembly.formula,this.setCanvasToCenter()},setCanvasOffset:function(a,b){var c=this.formula.getViewBox();b=void 0!==b?b:-c.height/2,this.formula.setViewBox(a,b,c.width,c.height)},setCanvasToCenter:function(){var a=this.formula.getViewBox();this.formula.setViewBox(-a.width/2,-a.height/2,a.width,a.height)},initServices:function(){this.kfEditor.registerService("render.get.canvas",this,{getCanvas:this.getCanvas}),this.kfEditor.registerService("render.get.content.size",this,{getContentSize:this.getContentSize}),this.kfEditor.registerService("render.clear.canvas.transform",this,{clearCanvasOffset:this.clearCanvasTransform}),this.kfEditor.registerService("render.set.canvas.offset",this,{setCanvasOffset:this.setCanvasOffset}),this.kfEditor.registerService("render.set.canvas.to.center",this,{setCanvasToCenter:this.setCanvasToCenter}),this.kfEditor.registerService("render.revert.canvas.transform",this,{revertCanvasTransform:this.revertCanvasTransform}),this.kfEditor.registerService("render.relocation",this,{relocation:this.relocation}),this.kfEditor.registerService("render.disable.relocation",this,{disableRelocation:this.disableRelocation}),this.kfEditor.registerService("render.enable.relocation",this,{enableRelocation:this.enableRelocation}),this.kfEditor.registerService("render.select.group.content",this,{selectGroupContent:this.selectGroupContent}),this.kfEditor.registerService("render.select.group",this,{selectGroup:this.selectGroup}),this.kfEditor.registerService("render.select.group.all",this,{selectAllGroup:this.selectAllGroup}),this.kfEditor.registerService("render.tint.current.cursor",this,{tintCurrentGroup:this.tintCurrentGroup}),this.kfEditor.registerService("render.select.current.cursor",this,{selectCurrentCursor:this.selectCurrentCursor}),this.kfEditor.registerService("render.reselect",this,{reselect:this.reselect}),this.kfEditor.registerService("render.clear.select",this,{clearSelect:this.clearSelect}),this.kfEditor.registerService("render.set.canvas.zoom",this,{setCanvasZoom:this.setCanvasZoom}),this.kfEditor.registerService("render.get.canvas.zoom",this,{getCanvasZoom:this.getCanvasZoom}),this.kfEditor.registerService("render.get.paper.offset",this,{getPaperOffset:this.getPaperOffset}),this.kfEditor.registerService("render.draw",this,{render:this.render}),this.kfEditor.registerService("render.insert.string",this,{insertString:this.insertString}),this.kfEditor.registerService("render.insert.group",this,{insertGroup:this.insertGroup}),this.kfEditor.registerService("render.get.paper",this,{getPaper:this.getPaper})},initCommands:function(){this.kfEditor.registerCommand("render",this,function(a){this.render(a),this.kfEditor.requestService("ui.update.canvas.view")}),this.kfEditor.registerCommand("getPaper",this,this.getPaper)},relocation:function(){this.relDisabled?this.relocationToLeft():this.relocationToCenter()},relocationToCenter:function(){var a=this.formula.container.getRenderBox();this.formula.container.setTranslate(-a.width/2,-a.height/2),this.setCanvasToCenter()},relocationToLeft:function(){var a=this.formula.container.getRenderBox();this.formula.container.setTranslate(0,-a.height/2),this.setCanvasOffset(0)},selectGroup:function(a){var b=this.kfEditor.requestService("syntax.get.group.object",a);this.clearSelect(),b.node.getAttribute("data-root")||(this.record.select.lastSelect=b,b.select())},selectGroupContent:function(a){null!==a.groupObj.getAttribute("data-placeholder")&&(a={id:a.content[0].id});var b=this.kfEditor.requestService("syntax.get.group.object",a.id);this.clearSelect(),this.record.select.lastSelect=b,b.node.getAttribute("data-root")||b.select()},selectAllGroup:function(a){null!==a.groupObj.getAttribute("data-placeholder")&&(a={id:a.content[0].id});var b=this.kfEditor.requestService("syntax.get.group.object",a.id);this.clearSelect(),this.record.select.lastSelect=b,b.selectAll()},selectCurrentCursor:function(){var a=this.kfEditor.requestService("syntax.get.record.cursor"),b=this.kfEditor.requestService("syntax.get.group.object",a.groupId),c=null,d=-1,e=0,f=Math.min(a.startOffset,a.endOffset),g=Math.max(a.startOffset,a.endOffset);this.clearSelect(),this.record.select.lastSelect=b;for(var h=f,i=g;i>h;h++)c=b.getOperand(h).getRenderBox(b),-1==d&&(d=c.x),e+=c.width;b.setBoxWidth(e),b.selectAll(),b.getBox().setTranslate(d,0)},tintCurrentGroup:function(){var a=this.kfEditor.requestService("syntax.get.record.cursor").groupId,b=this.kfEditor.requestService("syntax.get.group.object",a),c=this.kfEditor.requestService("syntax.is.placeholder.node",a);this.clearSelect(),b.node.getAttribute("data-root")||(c&&(b=this.kfEditor.requestService("syntax.get.group.object",b.operands[0].node.id)),this.record.select.lastSelect=b,b.select())},reselect:function(){var a=this.kfEditor.requestService("syntax.get.record.cursor"),b=null;b=this.kfEditor.requestService("syntax.get.group.object",a.groupId),this.clearSelect(),this.record.select.lastSelect=b,b.node.getAttribute("data-root")||b.select() +},clearSelect:function(){var a=null,b=this.record.select.lastSelect;b&&b.node.ownerSVGElement&&(b.unselect(),a=b.getRenderBox(b),b.setBoxWidth(a.width),b.getBox().setTranslate(0,0))},getPaper:function(){return this.formula},render:function(a){var b=this.kfEditor.requestService("parser.parse",a,!0),c=this.assembly.regenerateBy(b);this.kfEditor.requestService("syntax.update.objtree",c)},enableRelocation:function(){this.relDisabled=!1},disableRelocation:function(){this.relDisabled=!0},setCanvasZoom:function(a){var b=this.formula.getViewPort();this.canvasZoom=a,b.zoom=a,this.formula.setViewPort(b)},getCanvas:function(){return this.formula},getContentSize:function(){return this.formula.container.getRenderBox()},clearCanvasTransform:function(){var a=this.record.canvas;a.viewBox=this.formula.getViewBox(),a.contentOffset=this.formula.container.getTranslate(),this.setCanvasToCenter(),this.formula.node.removeAttribute("viewBox"),this.formula.container.setTranslate(0,0)},revertCanvasTransform:function(){var a=this.record.canvas,b=a.viewBox;return b?(this.formula.setViewBox(b.x,b.y,b.width,b.height),this.formula.container.setTranslate(a.contentOffset),a.viewBox=null,void(a.contentOffset=null)):!1},getCanvasZoom:function(){return this.canvasZoom}});return e}},b[26]={value:function(){var a=b.r(20);return a.createClass("DeleteComponent",{constructor:function(a,b){this.parentComponent=a,this.kfEditor=b},deleteGroup:function(){var a=this.parentComponent.getCursorRecord(),b=this.parentComponent.getObjectTree(),c=b.mapping[a.groupId].strGroup;return a.startOffset!==a.endOffset?this.parentComponent.isSelectPlaceholder()?this.parentComponent.isRootTree(c)?!1:(a=this.selectParentContainer(a.groupId),this.parentComponent.updateCursor(a),!1):this.deleteSelection(c,a):0===a.startOffset?this.parentComponent.isRootTree(c)?!1:(a=this.selectParentContainer(a.groupId),this.parentComponent.updateCursor(a),!1):c.operand.length>1?(a=this.deletePrevGroup(c,a),this.parentComponent.updateCursor(a),a.startOffset===a.endOffset?!0:!1):(a.startOffset=0,a.endOffset=1,c.operand[0].attr&&this.parentComponent.isGroupNode(c.operand[0].attr.id)?(this.parentComponent.updateCursor(a),!1):(c.operand[0]={name:"placeholder",operand:[]},this.parentComponent.updateCursor(a),!0))},deletePrevGroup:function(a,b){var c=b.startOffset-1,d=a.operand[c];return this.parentComponent.isLeafTree(d)?(a.operand.splice(c,1),b.startOffset-=1,b.endOffset-=1):b.startOffset-=1,b},deleteSelection:function(a,b){return 0===b.startOffset&&b.endOffset===a.operand.length?(a.operand.length=1,a.operand[0]={name:"placeholder",operand:[]},b.endOffset=1):(a.operand.splice(b.startOffset,b.endOffset-b.startOffset),b.endOffset=b.startOffset),this.parentComponent.updateCursor(b),!0},selectParentContainer:function(a){var b=this.parentComponent.getGroupObject(a).node,c=this.kfEditor.requestService("position.get.group",b),d=this.kfEditor.requestService("position.get.index",c.groupObj,b);return{groupId:c.id,startOffset:d,endOffset:d+1}}})}},b[27]={value:function(){function a(a){var b=null,c=this.parentComponent,f=null;return f=c.getGroupContent(a.groupId),c.isSelectPlaceholder()?e(this,f.content[a.startOffset],p.LEFT):(a.startOffset===a.endOffset?a.startOffset>0?(b=f.content[a.startOffset-1],l(b)?a=d(this,b,p.LEFT):(a.startOffset-=1,m(b)||(a.endOffset=a.startOffset))):a=e(this,f.groupObj,p.LEFT):(a.startOffset=Math.min(a.startOffset,a.endOffset),a.endOffset=a.startOffset),a)}function c(a){var b=null,c=this.parentComponent,f=null;return f=c.getGroupContent(a.groupId),c.isSelectPlaceholder()?e(this,f.content[a.startOffset],p.RIGHT):(a.startOffset===a.endOffset?a.startOffset1)return{groupId:d.group.id,startOffset:0,endOffset:0};d=c.requestService("position.get.parent.info",d.group.groupObj)}return k(d.group.groupObj)?{groupId:d.group.id,startOffset:d.index,endOffset:d.index}:(b=d.group.content[d.index-1],l(b)?k(b)?f(a,b):f(a,b):n(b)?g(a,b):{groupId:d.group.id,startOffset:d.index,endOffset:d.index})}function h(a,b){var c=a.parentComponent,d=null,e=null;if(l(b)){if(d=c.getGroupContent(b.id),e=d.content[0],k(b))return k(e)?h(a,e):m(e)?{groupId:b.id,startOffset:0,endOffset:1}:{groupId:b.id,startOffset:0,endOffset:0};for(;!k(e)&&!m(e)&&!n(e);)d=c.getGroupContent(e.id),e=d.content[0];return m(e)?{groupId:e.id,startOffset:0,endOffset:0}:n(e)?i(a,e):h(a,e)}return null}function i(a,b){var c=a.kfEditor,d=a.parentComponent,e=null,f=null;if(j(b))return null;for(e=c.requestService("position.get.parent.info",b);e.index===e.group.content.length-1;){if(j(e.group.groupObj))return{groupId:e.group.id,startOffset:e.group.content.length,endOffset:e.group.content.length};if(k(e.group.groupObj)&&e.group.content.length>1)return{groupId:e.group.id,startOffset:e.group.content.length,endOffset:e.group.content.length};e=c.requestService("position.get.parent.info",e.group.groupObj)}return b=e.group.content[e.index+1],n(b)?i(a,b):k(b)?(f=d.getGroupContent(b.id),d.isPlaceholder(f.content[0].id)?{groupId:b.id,startOffset:0,endOffset:1}:{groupId:b.id,startOffset:0,endOffset:0}):{groupId:e.group.id,startOffset:e.index+1,endOffset:e.index+1}}function j(a){return!!a.getAttribute("data-root")}function k(a){return"kf-editor-group"===a.getAttribute("data-type")}function l(a){var b=a.getAttribute("data-type");return"kf-editor-group"===b||"kf-editor-virtual-group"===b}function m(a){return"Placeholder"===a.getAttribute("data-flag")}function n(a){return"Empty"===a.getAttribute("data-flag")}var o=b.r(20),p={LEFT:"left",RIGHT:"right"};return o.createClass("MoveComponent",{constructor:function(a,b){this.parentComponent=a,this.kfEditor=b},leftMove:function(){var b=this.parentComponent.getCursorRecord();b=a.call(this,b),b&&this.parentComponent.updateCursor(b)},rightMove:function(){var a=this.parentComponent.getCursorRecord();a=c.call(this,a),a&&this.parentComponent.updateCursor(a)}})}},b[28]={value:function(){var a=b.r(20),c=b.r(27),d=b.r(26),e=b.r(29).cursorCharacter,f=b.r(11),g=a.createClass("SyntaxComponenet",{constructor:function(a){this.kfEditor=a,this.record={cursor:{group:null,startOffset:-1,endOffset:-1}},this.components={},this.objTree=null,this.initComponents(),this.initServices(),this.initCommands()},initComponents:function(){this.components.move=new c(this,this.kfEditor),this.components.delete=new d(this,this.kfEditor)},initServices:function(){this.kfEditor.registerService("syntax.update.objtree",this,{updateObjTree:this.updateObjTree}),this.kfEditor.registerService("syntax.get.objtree",this,{getObjectTree:this.getObjectTree}),this.kfEditor.registerService("syntax.get.group.object",this,{getGroupObject:this.getGroupObject}),this.kfEditor.registerService("syntax.is.root.node",this,{isRootNode:this.isRootNode}),this.kfEditor.registerService("syntax.is.group.node",this,{isGroupNode:this.isGroupNode}),this.kfEditor.registerService("syntax.is.virtual.node",this,{isVirtualNode:this.isVirtualNode}),this.kfEditor.registerService("syntax.is.placeholder.node",this,{isPlaceholder:this.isPlaceholder}),this.kfEditor.registerService("syntax.is.select.placeholder",this,{isSelectPlaceholder:this.isSelectPlaceholder}),this.kfEditor.registerService("syntax.has.root.placeholder",this,{hasRootplaceholder:this.hasRootplaceholder}),this.kfEditor.registerService("syntax.valid.brackets",this,{isBrackets:this.isBrackets}),this.kfEditor.registerService("syntax.get.group.content",this,{getGroupContent:this.getGroupContent}),this.kfEditor.registerService("syntax.get.root.group.info",this,{getRootGroupInfo:this.getRootGroupInfo}),this.kfEditor.registerService("syntax.get.root",this,{getRootObject:this.getRootObject}),this.kfEditor.registerService("syntax.update.record.cursor",this,{updateCursor:this.updateCursor}),this.kfEditor.registerService("syntax.update.selection",this,{updateSelection:this.updateSelection}),this.kfEditor.registerService("syntax.get.record.cursor",this,{getCursorRecord:this.getCursorRecord}),this.kfEditor.registerService("syntax.has.cursor.info",this,{hasCursorInfo:this.hasCursorInfo}),this.kfEditor.registerService("syntax.serialization",this,{serialization:this.serialization}),this.kfEditor.registerService("syntax.cursor.move.left",this,{leftMove:this.leftMove}),this.kfEditor.registerService("syntax.cursor.move.right",this,{rightMove:this.rightMove}),this.kfEditor.registerService("syntax.delete.group",this,{deleteGroup:this.deleteGroup})},initCommands:function(){this.kfEditor.registerCommand("get.source",this,this.getSource),this.kfEditor.registerCommand("content.is.empty",this,this.isEmpty)},updateObjTree:function(a){var b=a.select;b&&b.groupId&&this.updateCursor(b.groupId,b.startOffset,b.endOffset),this.objTree=a},hasCursorInfo:function(){return null!==this.record.cursor.group},isRootNode:function(a){return this.objTree.mapping.root.strGroup.attr.id===a},isGroupNode:function(a){var b=this.objTree.mapping[a].strGroup.attr["data-type"];return b===f.GROUP||b===f.VIRTUAL},isVirtualNode:function(a){return this.objTree.mapping[a].strGroup.attr["data-type"]===f.VIRTUAL},isPlaceholder:function(a){var b=this.objTree.mapping[a];return b?(b=b.objGroup.node,"Placeholder"===b.getAttribute("data-flag")):!1},isBrackets:function(a){return!!this.objTree.mapping[a].objGroup.node.getAttribute("data-brackets")},hasRootplaceholder:function(){return"placeholder"===this.objTree.mapping.root.strGroup.operand[0].name},isSelectPlaceholder:function(){var a=this.record.cursor,b=null;return a.endOffset-a.startOffset!==1?!1:(b=this.getGroupContent(a.groupId),this.isPlaceholder(b.content[a.startOffset].id)?!0:!1)},isLeafTree:function(a){return"string"==typeof a},isRootTree:function(a){return a.attr&&a.attr["data-root"]},getObjectTree:function(){return this.objTree},getGroupObject:function(a){return this.objTree.mapping[a].objGroup||null},getCursorRecord:function(){return a.Utils.extend({},this.record.cursor)||null},getGroupContent:function(b){var c=this.objTree.mapping[b],d=[],e=c.objGroup.operands,f=e.length-1,g="rtl"!==c.strGroup.traversal;return a.Utils.each(e,function(a,b){g?d.push(a.node):d[f-b]=a.node}),{id:b,traversal:c.strGroup.traversal||"ltr",groupObj:c.objGroup.node,content:d}},getRootObject:function(){return this.objTree.mapping.root.objGroup},getRootGroupInfo:function(){var a=this.objTree.mapping.root.strGroup.attr.id;return this.getGroupContent(a)},updateSelection:function(a){var b=this.objTree.mapping[a.id],c=b.strGroup,d=null,f=null,g=null,h=-1,i=-1;if(d=a,f=b,"combination"===c.name)this.record.cursor={groupId:d.id,startOffset:0,endOffset:c.operand.length},c.operand.unshift(e),c.operand.push(e);else{for(;"combination"!==f.strGroup.name||1===d.content;)a=d,b=f,d=this.kfEditor.requestService("position.get.parent.group",b.objGroup.node),f=this.objTree.mapping[d.id];var j=[].indexOf.call(d.content,a.groupObj);this.record.cursor={groupId:d.id,startOffset:j,endOffset:j+1},f.strGroup.operand.splice(j+1,0,e),f.strGroup.operand.splice(j,0,e)}return g=this.kfEditor.requestService("parser.latex.serialization",this.objTree.parsedTree),h=g.indexOf(e),g=g.replace(e,""),i=g.indexOf(e),f.strGroup.operand.splice(this.record.cursor.startOffset,1),f.strGroup.operand.splice(this.record.cursor.endOffset,1),{str:g,startOffset:h,endOffset:i}},getSource:function(){return this.serialization().str.replace(e,"").replace(e,"")},isEmpty:function(){return this.hasRootplaceholder()},serialization:function(){var a=this.record.cursor,b=this.objTree.mapping[a.groupId],c=b.strGroup,d=null,f=-1,g=-1;return f=Math.min(a.endOffset,a.startOffset),g=Math.max(a.endOffset,a.startOffset),c.operand.splice(g,0,e),c.operand.splice(f,0,e),g+=1,d=this.kfEditor.requestService("parser.latex.serialization",this.objTree.parsedTree),c.operand.splice(g,1),c.operand.splice(f,1),f=d.indexOf(e),a.startOffset===a.endOffset&&(d=d.replace(e,"")),g=d.lastIndexOf(e),{str:d,startOffset:f,endOffset:g}},updateCursor:function(a,b,c){var d=null;1===arguments.length&&(c=a.endOffset,b=a.startOffset,a=a.groupId),void 0===c&&(c=b),b>c&&(d=c,c=b,b=d),this.record.cursor={groupId:a,startOffset:b,endOffset:c}},leftMove:function(){this.components.move.leftMove()},rightMove:function(){this.components.move.rightMove()},deleteGroup:function(){return this.components.delete.deleteGroup()},insertSubtree:function(a){var b=this.record.cursor,c=0,d=0,e=null,f=0;this.isPlaceholder(b.groupId)?this.replaceTree(a):(c=Math.min(b.startOffset,b.endOffset),d=Math.max(b.startOffset,b.endOffset),f=d-c,e=this.objTree.mapping[b.groupId].strGroup,e.operand.splice(c,f,a),b.startOffset+=1,b.endOffset=b.startOffset)},replaceTree:function(a){var b=this.record.cursor,c=this.objTree.mapping[b.groupId].objGroup.node,d=this.kfEditor.requestService("position.get.parent.info",c),e=this.objTree.mapping[d.group.id].strGroup;e.operand[d.index]=a,b.groupId=d.group.id,b.startOffset=d.index+1,b.endOffset=d.index+1}});return g}},b[29]={value:function(){return{cursorCharacter:"\uf155",rootPlaceholder:{color:"#666",content:"\u5728\u6b64\u5904\u952e\u5165\u516c\u5f0f",fontsize:16},scrollbar:{padding:5,step:150}}}},b[30]={value:function(){return{"\\pm":{x:5,y:0},"\\infty":{x:42,y:0},"=":{x:79,y:0},"\\sim":{x:116,y:0},"\\times":{x:153,y:0},"\\div":{x:190,y:0},"!":{x:227,y:0},"<":{x:264,y:0},"\\ll":{x:301,y:0},">":{x:338,y:0},"\\gg":{x:375,y:0},"\\leq":{x:412,y:0},"\\geq":{x:449,y:0},"\\mp":{x:486,y:0},"\\cong":{x:523,y:0},"\\equiv":{x:560,y:0},"\\propto":{x:597,y:0},"\\approx":{x:634,y:0},"\\forall":{x:671,y:0},"\\partial":{x:708,y:0},"\\surd":{x:745,y:0},"\\cup":{x:782,y:0},"\\cap":{x:819,y:0},"\\varnothing":{x:856,y:0},"%":{x:893,y:0},"\\circ":{x:930,y:0},"\\exists":{x:967,y:0},"\\nexists":{x:1004,y:0},"\\in":{x:1041,y:0},"\\ni":{x:1078,y:0},"\\gets":{x:5,y:37},"\\uparrow":{x:42,y:37},"\\to":{x:79,y:37},"\\downarrow":{x:116,y:37},"\\leftrightarrow":{x:153,y:37},"\\therefore":{x:190,y:37},"\\because":{x:227,y:37},"+":{x:264,y:37},"-":{x:301,y:37},"\\neg":{x:338,y:37},"\\ast":{x:375,y:37},"\\cdot":{x:412,y:37},"\\vdots":{x:449,y:37},"\\ddots":{x:486,y:37},"\\aleph":{x:523,y:37},"\\beth":{x:560,y:37},"\\blacksquare":{x:597,y:37},"\\alpha":{x:634,y:37},"\\beta":{x:671,y:37},"\\gamma":{x:708,y:37},"\\delta":{x:745,y:37},"\\epsilon":{x:782,y:37},"\\zeta":{x:819,y:37},"\\eta":{x:856,y:37},"\\theta":{x:893,y:37},"\\iota":{x:930,y:37},"\\kappa":{x:967,y:37},"\\lambda":{x:1004,y:37},"\\mu":{x:1041,y:37},"\\nu":{x:1078,y:37},"\\xi":{x:5,y:74},"\\omicron":{x:42,y:74},"\\pi":{x:79,y:74},"\\rho":{x:116,y:74},"\\sigma":{x:153,y:74},"\\tau":{x:190,y:74},"\\upsilon":{x:227,y:74},"\\phi":{x:264,y:74},"\\chi":{x:301,y:74},"\\psi":{x:338,y:74},"\\omega":{x:375,y:74},"\\Alpha":{x:412,y:74},"\\Beta":{x:449,y:74},"\\Gamma":{x:486,y:74},"\\Delta":{x:523,y:74},"\\Epsilon":{x:560,y:74},"\\Zeta":{x:597,y:74},"\\Eta":{x:634,y:74},"\\Theta":{x:671,y:74},"\\Iota":{x:708,y:74},"\\Kappa":{x:745,y:74},"\\Lambda":{x:782,y:74},"\\Mu":{x:819,y:74},"\\Nu":{x:856,y:74},"\\Xi":{x:893,y:74},"\\Omicron":{x:930,y:74},"\\Pi":{x:967,y:74},"\\Rho":{x:1004,y:74},"\\Sigma":{x:1041,y:74},"\\Tau":{x:1078,y:74},"\\Upsilon":{x:5,y:111},"\\Phi":{x:42,y:111},"\\Chi":{x:79,y:111},"\\Psi":{x:116,y:111},"\\Omega":{x:153,y:111},"\\digamma":{x:190,y:111},"\\varepsilon":{x:227,y:111},"\\varkappa":{x:264,y:111},"\\varphi":{x:301,y:111},"\\varpi":{x:338,y:111},"\\varrho":{x:375,y:111},"\\varsigma":{x:412,y:111},"\\vartheta":{x:449,y:111},"\\neq":{x:486,y:111},"\\nless":{x:523,y:111},"\\ngtr":{x:560,y:111},"\\nleq":{x:597,y:111},"\\ngeq":{x:634,y:111},"\\nsim":{x:671,y:111},"\\lneqq":{x:708,y:111},"\\gneqq":{x:745,y:111},"\\nprec":{x:782,y:111},"\\nsucc":{x:819,y:111},"\\notin":{x:856,y:111},"\\nsubseteq":{x:893,y:111},"\\nsupseteq":{x:930,y:111},"\\subsetneq":{x:967,y:111},"\\supsetneq":{x:1004,y:111},"\\lnsim":{x:1041,y:111},"\\gnsim":{x:1078,y:111},"\\precnsim":{x:5,y:148},"\\succnsim":{x:42,y:148},"\\ntriangleleft":{x:79,y:148},"\\ntriangleright":{x:116,y:148},"\\ntrianglelefteq":{x:153,y:148},"\\ntrianglerighteq":{x:190,y:148},"\\nmid":{x:227,y:148},"\\nparallel":{x:264,y:148},"\\nvdash":{x:301,y:148},"\\nVdash":{x:338,y:148},"\\nvDash":{x:375,y:148},"\\nVDash":{x:412,y:148},"\\daleth":{x:449,y:148},"\\gimel":{x:486,y:148},"\\complement":{x:523,y:148},"\\ell":{x:560,y:148},"\\eth":{x:597,y:148},"\\hbar":{x:634,y:148},"\\hslash":{x:671,y:148},"\\mho":{x:708,y:148},"\\wp":{x:745,y:148},"\\circledS":{x:782,y:148},"\\Bbbk":{x:819,y:148},"\\Finv":{x:856,y:148},"\\Game":{x:893,y:148},"\\Im":{x:930,y:148},"\\Re":{x:967,y:148},"\\updownarrow":{x:1004,y:148},"\\Leftarrow":{x:1041,y:148},"\\Rightarrow":{x:1078,y:148},"\\Uparrow":{x:5,y:185},"\\Downarrow":{x:42,y:185},"\\Leftrightarrow":{x:79,y:185},"\\Updownarrow":{x:116,y:185},"\\longleftarrow":{x:153,y:185},"\\longrightarrow":{x:190,y:185},"\\longleftrightarrow":{x:227,y:185},"\\Longleftarrow":{x:264,y:185},"\\Longrightarrow":{x:301,y:185},"\\Longleftrightarrow":{x:338,y:185},"\\nearrow":{x:375,y:185},"\\nwarrow":{x:412,y:185},"\\searrow":{x:449,y:185},"\\swarrow":{x:486,y:185},"\\nleftarrow":{x:523,y:185},"\\nrightarrow":{x:560,y:185},"\\nLeftarrow":{x:597,y:185},"\\nRightarrow":{x:634,y:185},"\\nLeftrightarrow":{x:671,y:185},"\\leftharpoonup":{x:708,y:185},"\\leftharpoondown":{x:745,y:185},"\\rightharpoonup":{x:782,y:185},"\\rightharpoondown":{x:819,y:185},"\\upharpoonleft":{x:856,y:185},"\\upharpoonright":{x:893,y:185},"\\downharpoonleft":{x:930,y:185},"\\downharpoonright":{x:967,y:185},"\\leftrightharpoons":{x:1004,y:185},"\\rightleftharpoons":{x:1041,y:185},"\\leftleftarrows":{x:1078,y:185},"\\rightrightarrows":{x:5,y:222},"\\upuparrows":{x:42,y:222},"\\downdownarrows":{x:79,y:222},"\\leftrightarrows":{x:116,y:222},"\\rightleftarrows":{x:153,y:222},"\\looparrowleft":{x:190,y:222},"\\looparrowright":{x:227,y:222},"\\leftarrowtail":{x:264,y:222},"\\rightarrowtail":{x:301,y:222},"\\Lsh":{x:338,y:222},"\\Rsh":{x:375,y:222},"\\Lleftarrow":{x:412,y:222},"\\Rrightarrow":{x:449,y:222},"\\curvearrowleft":{x:486,y:222},"\\curvearrowright":{x:523,y:222},"\\circlearrowleft":{x:560,y:222},"\\circlearrowright":{x:597,y:222},"\\multimap":{x:634,y:222},"\\leftrightsquigarrow":{x:671,y:222},"\\twoheadleftarrow":{x:708,y:222},"\\twoheadrightarrow":{x:745,y:222},"\\rightsquigarrow":{x:782,y:222},"\\mathcal{A}":{x:819,y:222},"\\mathcal{B}":{x:856,y:222},"\\mathcal{C}":{x:893,y:222},"\\mathcal{D}":{x:930,y:222},"\\mathcal{E}":{x:967,y:222},"\\mathcal{F}":{x:1004,y:222},"\\mathcal{G}":{x:1041,y:222},"\\mathcal{H}":{x:1078,y:222},"\\mathcal{I}":{x:5,y:259},"\\mathcal{J}":{x:42,y:259},"\\mathcal{K}":{x:79,y:259},"\\mathcal{L}":{x:116,y:259},"\\mathcal{M}":{x:153,y:259},"\\mathcal{N}":{x:190,y:259},"\\mathcal{O}":{x:227,y:259},"\\mathcal{P}":{x:264,y:259},"\\mathcal{Q}":{x:301,y:259},"\\mathcal{R}":{x:338,y:259},"\\mathcal{S}":{x:375,y:259},"\\mathcal{T}":{x:412,y:259},"\\mathcal{U}":{x:449,y:259},"\\mathcal{V}":{x:486,y:259},"\\mathcal{W}":{x:523,y:259},"\\mathcal{X}":{x:560,y:259},"\\mathcal{Y}":{x:597,y:259},"\\mathcal{Z}":{x:634,y:259},"\\mathfrak{A}":{x:671,y:259},"\\mathfrak{B}":{x:708,y:259},"\\mathfrak{C}":{x:745,y:259},"\\mathfrak{D}":{x:782,y:259},"\\mathfrak{E}":{x:819,y:259},"\\mathfrak{F}":{x:856,y:259},"\\mathfrak{G}":{x:893,y:259},"\\mathfrak{H}":{x:930,y:259},"\\mathfrak{I}":{x:967,y:259},"\\mathfrak{J}":{x:1004,y:259},"\\mathfrak{K}":{x:1041,y:259},"\\mathfrak{L}":{x:1078,y:259},"\\mathfrak{M}":{x:5,y:296},"\\mathfrak{N}":{x:42,y:296},"\\mathfrak{O}":{x:79,y:296},"\\mathfrak{P}":{x:116,y:296},"\\mathfrak{Q}":{x:153,y:296},"\\mathfrak{R}":{x:190,y:296},"\\mathfrak{S}":{x:227,y:296},"\\mathfrak{T}":{x:264,y:296},"\\mathfrak{U}":{x:301,y:296},"\\mathfrak{V}":{x:338,y:296},"\\mathfrak{W}":{x:375,y:296},"\\mathfrak{X}":{x:412,y:296},"\\mathfrak{Y}":{x:449,y:296},"\\mathfrak{Z}":{x:486,y:296},"\\mathfrak{a}":{x:523,y:296},"\\mathfrak{b}":{x:560,y:296},"\\mathfrak{c}":{x:597,y:296},"\\mathfrak{d}":{x:634,y:296},"\\mathfrak{e}":{x:671,y:296},"\\mathfrak{f}":{x:708,y:296},"\\mathfrak{g}":{x:745,y:296},"\\mathfrak{h}":{x:782,y:296},"\\mathfrak{i}":{x:819,y:296},"\\mathfrak{j}":{x:856,y:296},"\\mathfrak{k}":{x:893,y:296},"\\mathfrak{l}":{x:930,y:296},"\\mathfrak{m}":{x:967,y:296},"\\mathfrak{n}":{x:1004,y:296},"\\mathfrak{o}":{x:1041,y:296},"\\mathfrak{p}":{x:1078,y:296},"\\mathfrak{q}":{x:5,y:333},"\\mathfrak{r}":{x:42,y:333},"\\mathfrak{s}":{x:79,y:333},"\\mathfrak{t}":{x:116,y:333},"\\mathfrak{u}":{x:153,y:333},"\\mathfrak{v}":{x:190,y:333},"\\mathfrak{w}":{x:227,y:333},"\\mathfrak{x}":{x:264,y:333},"\\mathfrak{y}":{x:301,y:333},"\\mathfrak{z}":{x:338,y:333},"\\mathbb{A}":{x:375,y:333},"\\mathbb{B}":{x:412,y:333},"\\mathbb{C}":{x:449,y:333},"\\mathbb{D}":{x:486,y:333},"\\mathbb{E}":{x:523,y:333},"\\mathbb{F}":{x:560,y:333},"\\mathbb{G}":{x:597,y:333},"\\mathbb{H}":{x:634,y:333},"\\mathbb{I}":{x:671,y:333},"\\mathbb{J}":{x:708,y:333},"\\mathbb{K}":{x:745,y:333},"\\mathbb{L}":{x:782,y:333},"\\mathbb{M}":{x:819,y:333},"\\mathbb{N}":{x:856,y:333},"\\mathbb{O}":{x:893,y:333},"\\mathbb{P}":{x:930,y:333},"\\mathbb{Q}":{x:967,y:333},"\\mathbb{R}":{x:1004,y:333},"\\mathbb{S}":{x:1041,y:333},"\\mathbb{T}":{x:1078,y:333},"\\mathbb{U}":{x:5,y:370},"\\mathbb{V}":{x:42,y:370},"\\mathbb{W}":{x:79,y:370},"\\mathbb{X}":{x:116,y:370},"\\mathbb{Y}":{x:153,y:370},"\\mathbb{Z}":{x:190,y:370},"\\mathrm{A}":{x:227,y:370},"\\mathrm{B}":{x:264,y:370},"\\mathrm{C}":{x:301,y:370},"\\mathrm{D}":{x:338,y:370},"\\mathrm{E}":{x:375,y:370},"\\mathrm{F}":{x:412,y:370},"\\mathrm{G}":{x:449,y:370},"\\mathrm{H}":{x:486,y:370},"\\mathrm{I}":{x:523,y:370},"\\mathrm{J}":{x:560,y:370},"\\mathrm{K}":{x:597,y:370},"\\mathrm{L}":{x:634,y:370},"\\mathrm{M}":{x:671,y:370},"\\mathrm{N}":{x:708,y:370},"\\mathrm{O}":{x:745,y:370},"\\mathrm{P}":{x:782,y:370},"\\mathrm{Q}":{x:819,y:370},"\\mathrm{R}":{x:856,y:370},"\\mathrm{S}":{x:893,y:370},"\\mathrm{T}":{x:930,y:370},"\\mathrm{U}":{x:967,y:370},"\\mathrm{V}":{x:1004,y:370},"\\mathrm{W}":{x:1041,y:370},"\\mathrm{X}":{x:1078,y:370},"\\mathrm{Y}":{x:5,y:407},"\\mathrm{Z}":{x:42,y:407},"\\mathrm{a}":{x:79,y:407},"\\mathrm{b}":{x:116,y:407},"\\mathrm{c}":{x:153,y:407},"\\mathrm{d}":{x:190,y:407},"\\mathrm{e}":{x:227,y:407},"\\mathrm{f}":{x:264,y:407},"\\mathrm{g}":{x:301,y:407},"\\mathrm{h}":{x:338,y:407},"\\mathrm{i}":{x:375,y:407},"\\mathrm{j}":{x:412,y:407},"\\mathrm{k}":{x:449,y:407},"\\mathrm{l}":{x:486,y:407},"\\mathrm{m}":{x:523,y:407},"\\mathrm{n}":{x:560,y:407},"\\mathrm{o}":{x:597,y:407},"\\mathrm{p}":{x:634,y:407},"\\mathrm{q}":{x:671,y:407},"\\mathrm{r}":{x:708,y:407},"\\mathrm{s}":{x:745,y:407},"\\mathrm{t}":{x:782,y:407},"\\mathrm{u}":{x:819,y:407},"\\mathrm{v}":{x:856,y:407},"\\mathrm{w}":{x:893,y:407},"\\mathrm{x}":{x:930,y:407},"\\mathrm{y}":{x:967,y:407},"\\mathrm{z}":{x:1004,y:407}}}},b[31]={value:function(){var a=b.r(4),c=b.r(20),d={min:1,max:2},e=c.createClass("ScrollZoomController",{constructor:function(b,c,e,f){this.kfEditor=c,this.target=e,this.zoom=1,this.step=.05,this.options=a.extend({},d,f),this.initEvent()},initEvent:function(){var b=this.kfEditor,c=this,d=this.options.min,e=this.options.max,f=this.step;a.addEvent(this.target,"mousewheel",function(a){a.preventDefault(),a.wheelDelta<0?c.zoom-=c.zoom*f:c.zoom+=c.zoom*f,c.zoom=Math.max(c.zoom,d),c.zoom=Math.min(c.zoom,e),b.requestService("render.set.canvas.zoom",c.zoom)})}});return e}},b[32]={value:function(){return{VIEW_STATE:{NO_OVERFLOW:0,OVERFLOW:1},scrollbar:{step:50,thumbMinSize:50}}}},b[33]={value:function(){return{"x=\\frac {-b\\pm\\sqrt {b^2-4ac}}{2a}":{pos:{x:0,y:0},size:{width:310,height:73}},"{\\placeholder/\\placeholder}":{pos:{x:315,y:0},size:{width:56,height:75}},"\\frac \\placeholder\\placeholder":{pos:{x:376,y:0},size:{width:56,height:75}},"a^2+b^2=c^2":{pos:{x:437,y:0},size:{width:310,height:73}},"{\\left(x+a\\right)}^2=\\sum^n_{k=0}{\\left(^n_k\\right)x^ka^{n-k}}":{pos:{x:752,y:0},size:{width:310,height:73}},"\\frac {dy}{dx}":{pos:{x:1067,y:0},size:{width:56,height:75}},"\\frac {\\Delta y}{\\Delta x}":{pos:{x:1128,y:0},size:{width:56,height:75}},"\\frac {\\delta y}{\\delta x}":{pos:{x:1189,y:0},size:{width:56,height:75}},"\\frac \\pi 2":{pos:{x:1250,y:0},size:{width:56,height:75}},"\\placeholder^\\placeholder":{pos:{x:1311,y:0},size:{width:56,height:75}},"\\placeholder^\\placeholder_\\placeholder":{pos:{x:1372,y:0},size:{width:56,height:75}},"\\placeholder_\\placeholder":{pos:{x:1433,y:0},size:{width:56,height:75}},"{^\\placeholder_\\placeholder\\placeholder}":{pos:{x:1494,y:0},size:{width:56,height:75}},"e^{-i\\omega t}":{pos:{x:1555,y:0},size:{width:56,height:75}},"x^2":{pos:{x:1616,y:0},size:{width:56,height:75}},"{}^n_1Y":{pos:{x:1677,y:0},size:{width:56,height:75}},"\\sqrt \\placeholder":{pos:{x:1738,y:0},size:{width:56,height:75}},"\\sqrt [\\placeholder] \\placeholder":{pos:{x:1799,y:0},size:{width:56,height:75}},"\\sqrt [2] \\placeholder":{pos:{x:1860,y:0},size:{width:56,height:75}},"\\sqrt [3] \\placeholder":{pos:{x:1921,y:0},size:{width:56,height:75}},"\\frac {-b\\pm\\sqrt{b^2-4ac}}{2a}":{pos:{x:1982,y:0},size:{width:137,height:75}},"\\sqrt {a^2+b^2}":{pos:{x:2124,y:0},size:{width:137,height:75}},"\\int \\placeholder":{pos:{x:2266,y:0},size:{width:56,height:75}},"\\int^\\placeholder_\\placeholder\\placeholder":{pos:{x:2327,y:0},size:{width:56,height:75}},"\\iint\\placeholder":{pos:{x:2388,y:0},size:{width:56,height:75}},"\\iint^\\placeholder_\\placeholder\\placeholder":{pos:{x:2449,y:0},size:{width:56,height:75}},"\\iiint\\placeholder":{pos:{x:2510,y:0},size:{width:56,height:75}},"\\iiint^\\placeholder_\\placeholder\\placeholder":{pos:{x:2571,y:0},size:{width:56,height:75}},"\\sum\\placeholder":{pos:{x:2632,y:0},size:{width:56,height:75}},"\\sum^\\placeholder_\\placeholder\\placeholder":{pos:{x:2693,y:0},size:{width:56,height:75}},"\\sum_\\placeholder\\placeholder":{pos:{x:2754,y:0},size:{width:56,height:75}},"\\left(\\placeholder\\right)":{pos:{x:2815,y:0},size:{width:56,height:75}},"\\left[\\placeholder\\right]":{pos:{x:2876,y:0},size:{width:56,height:75}},"\\left\\{\\placeholder\\right\\}":{pos:{x:2937,y:0},size:{width:56,height:75}},"\\left|\\placeholder\\right|":{pos:{x:2998,y:0},size:{width:56,height:75}},"\\sin\\placeholder":{pos:{x:3059,y:0},size:{width:56,height:75}},"\\cos\\placeholder":{pos:{x:3120,y:0},size:{width:56,height:75}},"\\tan\\placeholder":{pos:{x:3181,y:0},size:{width:56,height:75}},"\\csc\\placeholder":{pos:{x:3242,y:0},size:{width:56,height:75}},"\\sec\\placeholder":{pos:{x:3303,y:0},size:{width:56,height:75}},"\\cot\\placeholder":{pos:{x:3364,y:0},size:{width:56,height:75}},"\\sin\\theta":{pos:{x:3425,y:0},size:{width:56,height:75}},"\\cos{2x}":{pos:{x:3486,y:0},size:{width:56,height:75}},"\\tan\\theta=\\frac {\\sin\\theta}{\\cos\\theta}":{pos:{x:3547,y:0},size:{width:137,height:75}}}}},b[34]={value:function(){function a(a){var b=[],c=a.path,d=a.values;return e.Utils.each(d,function(a){var d=a,e=a;"string"!=typeof a?(d=a.img,e=a.key):e="\\"+a,b.push({item:{show:""+c+d.toLowerCase()+".png",val:e}})}),b}var c=b.r(41),d=b.r(40),e=b.r(20),f=[{type:c.DRAPDOWN_BOX,options:{button:{label:"\u9884\u8bbe
                                  ",className:"yushe-btn",icon:"assets/images/toolbar/button/fx.png",iconSize:{w:40}},box:{width:367,group:[{title:"\u9884\u8bbe\u516c\u5f0f",items:[{title:"\u9884\u8bbe\u516c\u5f0f",content:[{label:"\u4e8c\u6b21\u516c\u5f0f",item:{show:"assets/images/toolbar/ys/1.png",val:"x=\\frac {-b\\pm\\sqrt {b^2-4ac}}{2a}"}},{label:"\u4e8c\u9879\u5f0f\u5b9a\u7406",item:{show:"assets/images/toolbar/ys/2.png",val:"{\\left(x+a\\right)}^2=\\sum^n_{k=0}{\\left(^n_k\\right)x^ka^{n-k}}"}},{label:"\u52fe\u80a1\u5b9a\u7406",item:{show:"assets/images/toolbar/ys/3.png",val:"a^2+b^2=c^2"}}]}]}]}}},{type:c.DELIMITER},{type:c.AREA,options:{box:{fixOffset:!0,width:527,type:d.OVERLAP,group:[{title:"\u57fa\u7840\u6570\u5b66",items:[]},{title:"\u5e0c\u814a\u5b57\u6bcd",items:[]},{title:"\u6c42\u53cd\u5173\u7cfb\u8fd0\u7b97\u7b26",items:[]},{title:"\u5b57\u6bcd\u7c7b\u7b26\u53f7",items:[]},{title:"\u7bad\u5934",items:[]},{title:"\u624b\u5199\u4f53",items:[]}]}}},{type:c.DELIMITER},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u5206\u6570
                                  ",icon:"assets/images/toolbar/button/frac.png"},box:{width:332,group:[{title:"\u5206\u6570",items:[{title:"\u5206\u6570",content:[{item:{show:"assets/images/toolbar/frac/1.png",val:"\\frac \\placeholder\\placeholder"}},{item:{show:"assets/images/toolbar/frac/2.png",val:"{\\placeholder/\\placeholder}"}}]},{title:"\u5e38\u7528\u5206\u6570",content:[{item:{show:"assets/images/toolbar/frac/c1.png",val:"\\frac {dy}{dx}"}},{item:{show:"assets/images/toolbar/frac/c2.png",val:"\\frac {\\Delta y}{\\Delta x}"}},{item:{show:"assets/images/toolbar/frac/c4.png",val:"\\frac {\\delta y}{\\delta x}"}},{item:{show:"assets/images/toolbar/frac/c5.png",val:"\\frac \\pi 2"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u4e0a\u4e0b\u6807
                                  ",icon:"assets/images/toolbar/button/script.png"},box:{width:332,group:[{title:"\u4e0a\u6807\u548c\u4e0b\u6807",items:[{title:"\u4e0a\u6807\u548c\u4e0b\u6807",content:[{item:{show:"assets/images/toolbar/script/1.png",val:"\\placeholder^\\placeholder"}},{item:{show:"assets/images/toolbar/script/2.png",val:"\\placeholder_\\placeholder"}},{item:{show:"assets/images/toolbar/script/3.png",val:"\\placeholder^\\placeholder_\\placeholder"}},{item:{show:"assets/images/toolbar/script/4.png",val:"{^\\placeholder_\\placeholder\\placeholder}"}}]},{title:"\u5e38\u7528\u7684\u4e0a\u6807\u548c\u4e0b\u6807",content:[{item:{show:"assets/images/toolbar/script/c1.png",val:"e^{-i\\omega t}"}},{item:{show:"assets/images/toolbar/script/c2.png",val:"x^2"}},{item:{show:"assets/images/toolbar/script/c3.png",val:"{}^n_1Y"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u6839\u5f0f
                                  ",icon:"assets/images/toolbar/button/sqrt.png"},box:{width:342,group:[{title:"\u6839\u5f0f",items:[{title:"\u6839\u5f0f",content:[{item:{show:"assets/images/toolbar/sqrt/1.png",val:"\\sqrt \\placeholder"}},{item:{show:"assets/images/toolbar/sqrt/2.png",val:"\\sqrt [\\placeholder] \\placeholder"}},{item:{show:"assets/images/toolbar/sqrt/3.png",val:"\\sqrt [2] \\placeholder"}},{item:{show:"assets/images/toolbar/sqrt/4.png",val:"\\sqrt [3] \\placeholder"}}]},{title:"\u5e38\u7528\u6839\u5f0f",content:[{item:{show:"assets/images/toolbar/sqrt/c1.png",val:"\\frac {-b\\pm\\sqrt{b^2-4ac}}{2a}"}},{item:{show:"assets/images/toolbar/sqrt/c2.png",val:"\\sqrt {a^2+b^2}"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u79ef\u5206
                                  ",icon:"assets/images/toolbar/button/int.png"},box:{width:332,group:[{title:"\u79ef\u5206",items:[{title:"\u79ef\u5206",content:[{item:{show:"assets/images/toolbar/int/1.png",val:"\\int \\placeholder"}},{item:{show:"assets/images/toolbar/int/2.png",val:"\\int^\\placeholder_\\placeholder\\placeholder"}},{item:{show:"assets/images/toolbar/int/3.png",val:"\\iint\\placeholder"}},{item:{show:"assets/images/toolbar/int/4.png",val:"\\iint^\\placeholder_\\placeholder\\placeholder"}},{item:{show:"assets/images/toolbar/int/5.png",val:"\\iiint\\placeholder"}},{item:{show:"assets/images/toolbar/int/6.png",val:"\\iiint^\\placeholder_\\placeholder\\placeholder"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u5927\u578b
                                  \u8fd0\u7b97\u7b26",icon:"assets/images/toolbar/button/sum.png"},box:{width:332,group:[{title:"\u6c42\u548c",items:[{title:"\u6c42\u548c",content:[{item:{show:"assets/images/toolbar/large/1.png",val:"\\sum\\placeholder"}},{item:{show:"assets/images/toolbar/large/2.png",val:"\\sum^\\placeholder_\\placeholder\\placeholder"}},{item:{show:"assets/images/toolbar/large/3.png",val:"\\sum_\\placeholder\\placeholder"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u62ec\u53f7
                                  ",icon:"assets/images/toolbar/button/brackets.png"},box:{width:332,group:[{title:"\u65b9\u62ec\u53f7",items:[{title:"\u65b9\u62ec\u53f7",content:[{item:{show:"assets/images/toolbar/brackets/1.png",val:"\\left(\\placeholder\\right)"}},{item:{show:"assets/images/toolbar/brackets/2.png",val:"\\left[\\placeholder\\right]"}},{item:{show:"assets/images/toolbar/brackets/3.png",val:"\\left\\{\\placeholder\\right\\}"}},{item:{show:"assets/images/toolbar/brackets/4.png",val:"\\left|\\placeholder\\right|"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u51fd\u6570
                                  ",icon:"assets/images/toolbar/button/sin.png"},box:{width:340,group:[{title:"\u51fd\u6570",items:[{title:"\u4e09\u89d2\u51fd\u6570",content:[{item:{show:"assets/images/toolbar/func/1.png",val:"\\sin\\placeholder"}},{item:{show:"assets/images/toolbar/func/2.png",val:"\\cos\\placeholder"}},{item:{show:"assets/images/toolbar/func/3.png",val:"\\tan\\placeholder"}},{item:{show:"assets/images/toolbar/func/4.png",val:"\\csc\\placeholder"}},{item:{show:"assets/images/toolbar/func/5.png",val:"\\sec\\placeholder"}},{item:{show:"assets/images/toolbar/func/6.png",val:"\\cot\\placeholder"}}]},{title:"\u5e38\u7528\u51fd\u6570",content:[{item:{show:"assets/images/toolbar/func/c1.png",val:"\\sin\\theta"}},{item:{show:"assets/images/toolbar/func/c2.png",val:"\\sin{2x}"}},{item:{show:"assets/images/toolbar/func/c3.png",val:"\\tan\\theta=\\frac {\\sin\\theta}{\\cos\\theta}"}}]}]}]}}}]; +return function(){var b=["pm","infty",{key:"=",img:"eq"},"sim","times","div",{key:"!",img:"tanhao"},{key:"<",img:"lt"},"ll",{key:">",img:"gt"},"gg","leq","geq","mp","cong","equiv","propto","approx","forall","partial","surd","cup","cap","varnothing",{key:"%",img:"baifenhao"},"circ","exists","nexists","in","ni","gets","uparrow","to","downarrow","leftrightarrow","therefore","because",{key:"+",img:"plus"},{key:"-",img:"minus"},"neg","ast","cdot","vdots","ddots","aleph","beth","blacksquare"],c=f[2].options.box.group[0].items;c.push({title:"\u57fa\u7840\u6570\u5b66",content:a({path:"assets/images/toolbar/char/math/",values:b})})}(),function(){var b=[{title:"\u5c0f\u5199",values:["alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigma","tau","upsilon","phi","chi","psi","omega"]},{title:"\u5927\u5199",values:["Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega"]},{title:"\u53d8\u4f53",values:["digamma","varepsilon","varkappa","varphi","varpi","varrho","varsigma","vartheta"]}],c=f[2].options.box.group[1].items;c.push({title:b[0].title,content:a({path:"assets/images/toolbar/char/greek/lower/",values:b[0].values})}),c.push({title:b[1].title,content:a({path:"assets/images/toolbar/char/greek/upper/",values:b[1].values})}),c.push({title:b[2].title,content:a({path:"assets/images/toolbar/char/greek/misc/",values:b[2].values})})}(),function(){var b=[{title:"\u6c42\u53cd\u5173\u7cfb\u8fd0\u7b97\u7b26",values:["neq","nless","ngtr","nleq","ngeq","nsim","lneqq","gneqq","nprec","nsucc","notin","nsubseteq","nsupseteq","subsetneq","supsetneq","lnsim","gnsim","precnsim","succnsim","ntriangleleft","ntriangleright","ntrianglelefteq","ntrianglerighteq","nmid","nparallel","nvdash",{key:"\\nVdash",img:"nvdash-1"},{key:"\\nvDash",img:"nvdash-2"},{key:"\\nVDash",img:"nvdash-3"},"nexists"]}],c=f[2].options.box.group[2].items;c.push({title:b[0].title,content:a({path:"assets/images/toolbar/char/not/",values:b[0].values})})}(),function(){var b=["aleph","beth","daleth","gimel","complement","ell","eth","hbar","hslash","mho","partial","wp","circledS","Bbbk","Finv","Game","Im","Re"],c=f[2].options.box.group[3].items;c.push({title:"\u5b57\u6bcd\u7c7b\u7b26\u53f7",content:a({path:"assets/images/toolbar/alphabetic/",values:b})})}(),function(){var b=["gets","to","uparrow","downarrow","leftrightarrow","updownarrow",{key:"\\Leftarrow",img:"u-leftarrow"},{key:"\\Rightarrow",img:"u-rightarrow"},{key:"\\Uparrow",img:"u-uparrow"},{key:"\\Downarrow",img:"u-downarrow"},{key:"\\Leftrightarrow",img:"u-leftrightarrow"},{key:"\\Updownarrow",img:"u-updownarrow"},"longleftarrow","longrightarrow","longleftrightarrow",{key:"\\Longleftarrow",img:"u-longleftarrow"},{key:"\\Longrightarrow",img:"u-longrightarrow"},{key:"\\Longleftrightarrow",img:"u-longleftrightarrow"},"nearrow","nwarrow","searrow","swarrow","nleftarrow","nrightarrow",{key:"\\nLeftarrow",img:"u-nleftarrow"},{key:"\\nRightarrow",img:"u-nrightarrow"},{key:"\\nLeftrightarrow",img:"u-nleftrightarrow"},"leftharpoonup","leftharpoondown","rightharpoonup","rightharpoondown","upharpoonleft","upharpoonright","downharpoonleft","downharpoonright","leftrightharpoons","rightleftharpoons","leftleftarrows","rightrightarrows","upuparrows","downdownarrows","leftrightarrows","rightleftarrows","looparrowleft","looparrowright","leftarrowtail","rightarrowtail",{key:"\\Lsh",img:"u-lsh"},{key:"\\Rsh",img:"u-rsh"},{key:"\\Lleftarrow",img:"u-lleftarrow"},{key:"\\Rrightarrow",img:"u-rrightarrow"},"curvearrowleft","curvearrowright","circlearrowleft","circlearrowright","multimap","leftrightsquigarrow","twoheadleftarrow","twoheadrightarrow","rightsquigarrow"],c=f[2].options.box.group[4].items;c.push({title:"\u7bad\u5934",content:a({path:"assets/images/toolbar/arrow/",values:b})})}(),function(){var b=[{title:"\u624b\u5199\u4f53",values:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]},{title:"\u82b1\u4f53",values:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]},{title:"\u53cc\u7ebf",values:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]},{title:"\u7f57\u9a6c",values:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]}],c=f[2].options.box.group[5].items;e.Utils.each(b[0].values,function(a,c){b[0].values[c]={key:"\\mathcal{"+a+"}",img:a.toLowerCase()}}),e.Utils.each(b[1].values,function(a,c){b[1].values[c]={key:"\\mathfrak{"+a+"}",img:a.replace(/[A-Z]/,function(a){return"u"+a.toLowerCase()})}}),e.Utils.each(b[2].values,function(a,c){b[2].values[c]={key:"\\mathbb{"+a+"}",img:a.toLowerCase()}}),e.Utils.each(b[3].values,function(a,c){b[3].values[c]={key:"\\mathrm{"+a+"}",img:a.replace(/[A-Z]/,function(a){return"u"+a.toLowerCase()})}}),c.push({title:b[0].title,content:a({path:"assets/images/toolbar/char/cal/",values:b[0].values})}),c.push({title:b[1].title,content:a({path:"assets/images/toolbar/char/frak/",values:b[1].values})}),c.push({title:b[2].title,content:a({path:"assets/images/toolbar/char/bb/",values:b[2].values})}),c.push({title:b[3].title,content:a({path:"assets/images/toolbar/char/rm/",values:b[3].values})})}(),window.iconConfig=f,f}},b[35]={value:function(){function a(a,b){var c=[];return g.Utils.each(a,function(a){a.length>1&&(a="\\"+a),c.push({key:a,img:b,pos:e[a]})}),c}var c=b.r(41),d=b.r(40),e=b.r(30),f=b.r(33),g=b.r(20),h=[{type:c.DRAPDOWN_BOX,options:{button:{label:"\u9884\u8bbe
                                  ",className:"yushe-btn",icon:{src:"kityformula/assets/images/toolbar/btn.png",x:0,y:0},iconSize:{w:40}},box:{width:367,group:[{title:"\u9884\u8bbe\u516c\u5f0f",items:[{title:"\u9884\u8bbe\u516c\u5f0f",content:[{label:"\u4e8c\u6b21\u516c\u5f0f",item:{val:"x=\\frac {-b\\pm\\sqrt {b^2-4ac}}{2a}"}},{label:"\u4e8c\u9879\u5f0f\u5b9a\u7406",item:{val:"{\\left(x+a\\right)}^2=\\sum^n_{k=0}{\\left(^n_k\\right)x^ka^{n-k}}"}},{label:"\u52fe\u80a1\u5b9a\u7406",item:{val:"a^2+b^2=c^2"}}]}]}]}}},{type:c.DELIMITER},{type:c.AREA,options:{box:{fixOffset:!0,width:527,type:d.OVERLAP,group:[{title:"\u57fa\u7840\u6570\u5b66",items:[]},{title:"\u5e0c\u814a\u5b57\u6bcd",items:[]},{title:"\u6c42\u53cd\u5173\u7cfb\u8fd0\u7b97\u7b26",items:[]},{title:"\u5b57\u6bcd\u7c7b\u7b26\u53f7",items:[]},{title:"\u7bad\u5934",items:[]},{title:"\u624b\u5199\u4f53",items:[]}]}}},{type:c.DELIMITER},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u5206\u6570
                                  ",icon:{src:"kityformula/assets/images/toolbar/btn.png",x:45,y:0}},box:{width:332,group:[{title:"\u5206\u6570",items:[{title:"\u5206\u6570",content:[{item:{val:"\\frac \\placeholder\\placeholder"}},{item:{val:"{\\placeholder/\\placeholder}"}}]},{title:"\u5e38\u7528\u5206\u6570",content:[{item:{val:"\\frac {dy}{dx}"}},{item:{val:"\\frac {\\Delta y}{\\Delta x}"}},{item:{val:"\\frac {\\delta y}{\\delta x}"}},{item:{val:"\\frac \\pi 2"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u4e0a\u4e0b\u6807
                                  ",icon:{src:"kityformula/assets/images/toolbar/btn.png",x:82,y:0}},box:{width:332,group:[{title:"\u4e0a\u6807\u548c\u4e0b\u6807",items:[{title:"\u4e0a\u6807\u548c\u4e0b\u6807",content:[{item:{val:"\\placeholder^\\placeholder"}},{item:{val:"\\placeholder_\\placeholder"}},{item:{val:"\\placeholder^\\placeholder_\\placeholder"}},{item:{val:"{^\\placeholder_\\placeholder\\placeholder}"}}]},{title:"\u5e38\u7528\u7684\u4e0a\u6807\u548c\u4e0b\u6807",content:[{item:{val:"e^{-i\\omega t}"}},{item:{val:"x^2"}},{item:{val:"{}^n_1Y"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u6839\u5f0f
                                  ",icon:{src:"kityformula/assets/images/toolbar/btn.png",x:119,y:0}},box:{width:342,group:[{title:"\u6839\u5f0f",items:[{title:"\u6839\u5f0f",content:[{item:{val:"\\sqrt \\placeholder"}},{item:{val:"\\sqrt [\\placeholder] \\placeholder"}},{item:{val:"\\sqrt [2] \\placeholder"}},{item:{val:"\\sqrt [3] \\placeholder"}}]},{title:"\u5e38\u7528\u6839\u5f0f",content:[{item:{val:"\\frac {-b\\pm\\sqrt{b^2-4ac}}{2a}"}},{item:{val:"\\sqrt {a^2+b^2}"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u79ef\u5206
                                  ",icon:{src:"kityformula/assets/images/toolbar/btn.png",x:156,y:0}},box:{width:332,group:[{title:"\u79ef\u5206",items:[{title:"\u79ef\u5206",content:[{item:{val:"\\int \\placeholder"}},{item:{val:"\\int^\\placeholder_\\placeholder\\placeholder"}},{item:{val:"\\iint\\placeholder"}},{item:{val:"\\iint^\\placeholder_\\placeholder\\placeholder"}},{item:{val:"\\iiint\\placeholder"}},{item:{val:"\\iiint^\\placeholder_\\placeholder\\placeholder"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u5927\u578b
                                  \u8fd0\u7b97\u7b26",icon:{src:"kityformula/assets/images/toolbar/btn.png",x:193,y:0}},box:{width:332,group:[{title:"\u6c42\u548c",items:[{title:"\u6c42\u548c",content:[{item:{val:"\\sum\\placeholder"}},{item:{val:"\\sum^\\placeholder_\\placeholder\\placeholder"}},{item:{val:"\\sum_\\placeholder\\placeholder"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u62ec\u53f7
                                  ",icon:{src:"kityformula/assets/images/toolbar/btn.png",x:230,y:0}},box:{width:332,group:[{title:"\u65b9\u62ec\u53f7",items:[{title:"\u65b9\u62ec\u53f7",content:[{item:{val:"\\left(\\placeholder\\right)"}},{item:{val:"\\left[\\placeholder\\right]"}},{item:{val:"\\left\\{\\placeholder\\right\\}"}},{item:{val:"\\left|\\placeholder\\right|"}}]}]}]}}},{type:c.DRAPDOWN_BOX,options:{button:{label:"\u51fd\u6570
                                  ",icon:{src:"kityformula/assets/images/toolbar/btn.png",x:267,y:0}},box:{width:340,group:[{title:"\u51fd\u6570",items:[{title:"\u4e09\u89d2\u51fd\u6570",content:[{item:{val:"\\sin\\placeholder"}},{item:{val:"\\cos\\placeholder"}},{item:{val:"\\tan\\placeholder"}},{item:{val:"\\csc\\placeholder"}},{item:{val:"\\sec\\placeholder"}},{item:{val:"\\cot\\placeholder"}}]},{title:"\u5e38\u7528\u51fd\u6570",content:[{item:{val:"\\sin\\theta"}},{item:{val:"\\cos{2x}"}},{item:{val:"\\tan\\theta=\\frac {\\sin\\theta}{\\cos\\theta}"}}]}]}]}}}];return function(){var a=[],b="kityformula/assets/images/toolbar/other.png",d=[];g.Utils.each(h,function(b){b.type!==c.DELIMITER&&(b=b.options.box.group,a=a.concat(b))}),g.Utils.each(a,function(a){a=a.items;for(var b=0,c=a.length;c>b;b++)d=d.concat(a[b].content)}),g.Utils.each(d,function(a){var c=f[a.item.val];c&&(a.item.img=b,a.item.pos=c.pos,a.item.size=c.size)})}(),function(){var b=["pm","infty","=","sim","times","div","!","<","ll",">","gg","leq","geq","mp","cong","equiv","propto","approx","forall","partial","surd","cup","cap","varnothing","%","circ","exists","nexists","in","ni","gets","uparrow","to","downarrow","leftrightarrow","therefore","because","+","-","neg","ast","cdot","vdots","aleph","beth","blacksquare"],c=h[2].options.box.group[0].items;c.push({title:"\u57fa\u7840\u6570\u5b66",content:a(b,"kityformula/assets/images/toolbar/char.png")})}(),function(){var b=[{title:"\u5c0f\u5199",values:["alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigma","tau","upsilon","phi","chi","psi","omega"]},{title:"\u5927\u5199",values:["Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega"]},{title:"\u53d8\u4f53",values:["digamma","varepsilon","varkappa","varphi","varpi","varrho","varsigma","vartheta"]}],c=h[2].options.box.group[1].items;c.push({title:b[0].title,content:a(b[0].values,"kityformula/assets/images/toolbar/char.png")}),c.push({title:b[1].title,content:a(b[1].values,"kityformula/assets/images/toolbar/char.png")}),c.push({title:b[2].title,content:a(b[2].values,"kityformula/assets/images/toolbar/char.png")})}(),function(){var b=[{title:"\u6c42\u53cd\u5173\u7cfb\u8fd0\u7b97\u7b26",values:["neq","nless","ngtr","nleq","ngeq","nsim","lneqq","gneqq","nprec","nsucc","notin","nsubseteq","nsupseteq","subsetneq","supsetneq","lnsim","gnsim","precnsim","succnsim","ntriangleleft","ntriangleright","ntrianglelefteq","ntrianglerighteq","nmid","nparallel","nvdash","nVdash","nvDash","nVDash","nexists"]}],c=h[2].options.box.group[2].items;c.push({title:b[0].title,content:a(b[0].values,"kityformula/assets/images/toolbar/char.png")})}(),function(){var b=["aleph","beth","daleth","gimel","complement","ell","eth","hbar","hslash","mho","partial","wp","circledS","Bbbk","Finv","Game","Im","Re"],c=h[2].options.box.group[3].items;c.push({title:"\u5b57\u6bcd\u7c7b\u7b26\u53f7",content:a(b,"kityformula/assets/images/toolbar/char.png")})}(),function(){var b=["gets","to","uparrow","downarrow","leftrightarrow","updownarrow","Leftarrow","Rightarrow","Uparrow","Downarrow","Leftrightarrow","Updownarrow","longleftarrow","longrightarrow","longleftrightarrow","Longleftarrow","Longrightarrow","Longleftrightarrow","nearrow","nwarrow","searrow","swarrow","nleftarrow","nrightarrow","nLeftarrow","nRightarrow","nLeftrightarrow","leftharpoonup","leftharpoondown","rightharpoonup","rightharpoondown","upharpoonleft","upharpoonright","downharpoonleft","downharpoonright","leftrightharpoons","rightleftharpoons","leftleftarrows","rightrightarrows","upuparrows","downdownarrows","leftrightarrows","rightleftarrows","looparrowleft","looparrowright","leftarrowtail","rightarrowtail","Lsh","Rsh","Lleftarrow","Rrightarrow","curvearrowleft","curvearrowright","circlearrowleft","circlearrowright","multimap","leftrightsquigarrow","twoheadleftarrow","twoheadrightarrow","rightsquigarrow"],c=h[2].options.box.group[4].items;c.push({title:"\u7bad\u5934",content:a(b,"kityformula/assets/images/toolbar/char.png")})}(),function(){var b=[{title:"\u624b\u5199\u4f53",values:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]},{title:"\u82b1\u4f53",values:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]},{title:"\u53cc\u7ebf",values:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]},{title:"\u7f57\u9a6c",values:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]}],c=h[2].options.box.group[5].items;g.Utils.each(b[0].values,function(a,c){b[0].values[c]="mathcal{"+a+"}"}),g.Utils.each(b[1].values,function(a,c){b[1].values[c]="mathfrak{"+a+"}"}),g.Utils.each(b[2].values,function(a,c){b[2].values[c]="mathbb{"+a+"}"}),g.Utils.each(b[3].values,function(a,c){b[3].values[c]="mathrm{"+a+"}"}),c.push({title:b[0].title,content:a(b[0].values,"kityformula/assets/images/toolbar/char.png")}),c.push({title:b[1].title,content:a(b[1].values,"kityformula/assets/images/toolbar/char.png")}),c.push({title:b[2].title,content:a(b[2].values,"kityformula/assets/images/toolbar/char.png")}),c.push({title:b[3].title,content:a(b[3].values,"kityformula/assets/images/toolbar/char.png")})}(),h}},b[36]={value:function(){function a(a,b,f){switch(a){case i.DRAPDOWN_BOX:return c(b,f);case i.DELIMITER:return d(b);case i.AREA:return e(b,f)}}function c(a,b){return new g.DrapdownBox(a,b)}function d(a){return new g.Delimiter(a)}function e(a,b){return new g.Area(a,b)}var f=b.r(20),g=b.r(48),h=b.r(47),i=b.r(41),j=f.createClass("Tollbar",{constructor:function(a,b,c){this.kfEditor=b,this.uiComponent=a,this.elementList=c,this.elements=[],this.initToolbarElements(),this.initServices(),this.initEvent()},initServices:function(){this.kfEditor.registerService("ui.toolbar.disable",this,{disableToolbar:this.disableToolbar}),this.kfEditor.registerService("ui.toolbar.enable",this,{enableToolbar:this.enableToolbar}),this.kfEditor.registerService("ui.toolbar.close",this,{closeToolbar:this.closeToolbar})},initEvent:function(){var a=this;h.on(this.uiComponent.toolbarContainer,"mousedown",function(a){a.preventDefault()}),h.on(this.uiComponent.toolbarContainer,"mousewheel",function(a){a.preventDefault()}),h.on(this.kfEditor.getContainer(),"mousedown",function(){a.notify("closeAll")}),h.subscribe("data.select",function(b){a.insertSource(b)})},insertSource:function(a){this.kfEditor.requestService("control.insert.string",a)},disableToolbar:function(){f.Utils.each(this.elements,function(a){a.disable&&a.disable()})},enableToolbar:function(){f.Utils.each(this.elements,function(a){a.enable&&a.enable()})},getContainer:function(){return this.kfEditor.requestService("ui.get.canvas.container")},closeToolbar:function(){this.closeElement()},notify:function(a){switch(a){case"closeAll":case"closeOther":return void this.closeElement(arguments[1])}},closeElement:function(a){f.Utils.each(this.elements,function(b){b!=a&&b.hide&&b.hide()})},initToolbarElements:function(){var b=this.elements,c=this.uiComponent.toolbarContainer.ownerDocument,d=this;f.Utils.each(this.elementList,function(e){var f=a(e.type,c,e.options);b.push(f),d.appendElement(f)})},appendElement:function(a){a.setToolbar(this),a.attachTo(this.uiComponent.toolbarContainer)}});return j}},b[37]={value:function(){var a=b.r(20),c="kf-editor-ui-",d=66,e=b.r(47),f=b.r(38),g=a.createClass("Area",{constructor:function(a,b){this.options=b,this.doc=a,this.toolbar=null,this.disabled=!0,this.panelIndex=0,this.maxPanelIndex=0,this.currentItemCount=0,this.lineMaxCount=9,this.element=this.createArea(),this.container=this.createContainer(),this.panel=this.createPanel(),this.buttonContainer=this.createButtonContainer(),this.button=this.createButton(),this.mountPoint=this.createMountPoint(),this.moveDownButton=this.createMoveDownButton(),this.moveUpButton=this.createMoveUpButton(),this.boxObject=this.createBox(),this.mergeElement(),this.mount(),this.setListener(),this.initEvent()},initEvent:function(){var a=this;e.on(this.button,"mousedown",function(b){b.preventDefault(),b.stopPropagation(),1!==b.which||a.disabled||(a.showMount(),a.toolbar.notify("closeOther",a))}),e.on(this.moveDownButton,"mousedown",function(b){b.preventDefault(),b.stopPropagation(),1!==b.which||a.disabled||(a.nextPanel(),a.toolbar.notify("closeOther",a))}),e.on(this.moveUpButton,"mousedown",function(b){b.preventDefault(),b.stopPropagation(),1!==b.which||a.disabled||(a.prevPanel(),a.toolbar.notify("closeOther",a))}),e.delegate(this.container,".kf-editor-ui-area-item","mousedown",function(b){b.preventDefault(),1!==b.which||a.disabled||e.publish("data.select",this.getAttribute("data-value"))}),this.boxObject.initEvent()},disable:function(){this.disabled=!0,this.boxObject.disable(),e.getClassList(this.element).remove(c+"enabled")},enable:function(){this.disabled=!1,this.boxObject.enable(),e.getClassList(this.element).add(c+"enabled")},setListener:function(){var a=this;this.boxObject.setSelectHandler(function(b){e.publish("data.select",b),a.hide()}),this.boxObject.setChangeHandler(function(){a.updateContent()})},createArea:function(){var a=e.ele(this.doc,"div",{className:c+"area"});return"width"in this.options&&(a.style.width=this.options.width+"px"),a},checkMaxPanelIndex:function(){this.maxPanelIndex=Math.ceil(this.currentItemCount/this.lineMaxCount/2)},updateContent:function(){var b=this.boxObject.getOverlapContent(),d=0,e=null,f=0,g=0,h=this.lineMaxCount,i=[];this.panel.innerHTML="",a.Utils.each(b,function(b){var j=b.content;a.Utils.each(j,function(a){f=Math.floor(d/h),g=d%h,d++,e="top: "+(33*f+5)+"px; left: "+(32*g+5)+"px;",i.push('
                                  ')})}),this.currentItemCount=d,this.panelIndex=0,this.panel.style.top=0,this.panel.innerHTML=i.join(""),this.checkMaxPanelIndex(),this.updatePanelButtonState()},mount:function(){this.boxObject.mountTo(this.mountPoint)},showMount:function(){this.mountPoint.style.display="block",this.boxObject.updateSize()},hideMount:function(){this.mountPoint.style.display="none"},hide:function(){this.hideMount(),this.boxObject.hide()},createButton:function(){return e.ele(this.doc,"div",{className:c+"area-button"})},createMoveDownButton:function(){return e.ele(this.doc,"div",{className:c+"movedown-button",content:""})},createMoveUpButton:function(){return e.ele(this.doc,"div",{className:c+"moveup-button",content:""})},createMountPoint:function(){return e.ele(this.doc,"div",{className:c+"area-mount"})},createBox:function(){return new f(this.doc,this.options.box)},createContainer:function(){return e.ele(this.doc,"div",{className:c+"area-container"})},createPanel:function(){return e.ele(this.doc,"div",{className:c+"area-panel"})},createButtonContainer:function(){return e.ele(this.doc,"div",{className:c+"area-button-container"})},mergeElement:function(){this.buttonContainer.appendChild(this.moveUpButton),this.buttonContainer.appendChild(this.moveDownButton),this.buttonContainer.appendChild(this.button),this.container.appendChild(this.panel),this.element.appendChild(this.container),this.element.appendChild(this.buttonContainer),this.element.appendChild(this.mountPoint)},disablePanelUp:function(){this.disabledUp=!0,e.getClassList(this.moveUpButton).add("kf-editor-ui-disabled")},enablePanelUp:function(){this.disabledUp=!1,e.getClassList(this.moveUpButton).remove("kf-editor-ui-disabled")},disablePanelDown:function(){this.disabledDown=!0,e.getClassList(this.moveDownButton).add("kf-editor-ui-disabled")},enablePanelDown:function(){this.disabledDown=!1,e.getClassList(this.moveDownButton).remove("kf-editor-ui-disabled")},updatePanelButtonState:function(){0===this.panelIndex?this.disablePanelUp():this.enablePanelUp(),this.panelIndex+1>=this.maxPanelIndex?this.disablePanelDown():this.enablePanelDown()},nextPanel:function(){this.disabledDown||this.panelIndex+1>=this.maxPanelIndex||(this.panelIndex++,this.panel.style.top=-this.panelIndex*d+"px",this.updatePanelButtonState())},prevPanel:function(){this.disabledUp||0!==this.panelIndex&&(this.panelIndex--,this.panel.style.top=-this.panelIndex*d+"px",this.updatePanelButtonState())},setToolbar:function(a){this.toolbar=a,this.boxObject.setToolbar(a)},attachTo:function(a){a.appendChild(this.element),this.updateContent(),this.updatePanelButtonState()}});return g}},b[38]={value:function(){function a(a,b,c){var d=[];return h.Utils.each(b,function(b){d.push(new q(c,a,b))}),d}function c(a){return j.ele(a,"div",{className:i+"overlap-container"})}function d(a,b){return new m(a,{className:"overlap-button",label:"",fixOffset:b.fixOffset})}function e(a,b){return new n(a,b)}function f(a){return a.getBoundingClientRect()}function g(a){var b="background: url( "+a.img+" ) no-repeat ";return b+=-a.pos.x+"px ",b+=-a.pos.y+"px;",b+=" width: "+a.size.width+"px;",b+=" height: "+a.size.height+"px;"}var h=b.r(20),i="kf-editor-ui-",j=b.r(47),k=b.r(40),l=b.r(42),m=b.r(39),n=b.r(45),o=20,p=h.createClass("Box",{constructor:function(a,b){this.options=b,this.toolbar=null,this.options.type=this.options.type||k.DETACHED,this.doc=a,this.itemPanels=null,this.overlapButtonObject=null,this.overlapIndex=-1,this.element=this.createBox(),this.groupContainer=this.createGroupContainer(),this.itemGroups=this.createItemGroup(),this.mergeElement()},createBox:function(){var a=j.ele(this.doc,"div",{className:i+"box"});return"width"in this.options&&(a.style.width=this.options.width+"px"),a},setToolbar:function(a){this.toolbar=a,this.overlapButtonObject&&this.overlapButtonObject.setToolbar(a)},updateSize:function(){var a=j.getRectBox(this.toolbar.getContainer()),b=30,c=j.getRectBox(this.element);if(this.options.type===k.DETACHED){if(c.bottom<=a.bottom)return void(this.element.scrollTop=0);this.element.style.height=c.height-(c.bottom-a.bottom+b)+"px"}else{var d=this.getCurrentItemPanel(),e=null;if(d.scrollTop=0,c.bottom<=a.bottom)return;e=f(d),d.style.height=a.bottom-e.top-b+"px"}},initEvent:function(){var a="."+i+"box-item",b=this;j.delegate(this.groupContainer,a,"mousedown",function(a){a.preventDefault(),1===a.which&&b.onselectHandler&&b.onselectHandler(this.getAttribute("data-value"))}),j.on(this.element,"mousedown",function(a){a.stopPropagation(),a.preventDefault()}),j.on(this.element,"mousewheel",function(a){a.preventDefault(),a.stopPropagation(),b.scroll(a.originalEvent.wheelDelta)})},getNode:function(){return this.element},setSelectHandler:function(a){this.onselectHandler=a},scroll:function(a){0>a?this.scrollDown():(this.scrollUp(),this.element.scrollTop-=20)},scrollDown:function(){this.options.type===k.DETACHED?this.element.scrollTop+=o:this.getCurrentItemPanel().scrollTop+=o},scrollUp:function(){this.options.type===k.DETACHED?this.element.scrollTop-=o:this.getCurrentItemPanel().scrollTop-=o},setChangeHandler:function(a){this.onchangeHandler=a},onchangeHandler:function(){},createGroupContainer:function(){return j.ele(this.doc,"div",{className:i+"box-container"})},getPositionInfo:function(){return j.getRectBox(this.element)},createItemGroup:function(){var a=this.createGroup();switch(this.options.type){case k.DETACHED:return a.items[0];case k.OVERLAP:return this.createOverlapGroup(a)}return null},enable:function(){this.overlapButtonObject&&this.overlapButtonObject.enable()},disable:function(){this.overlapButtonObject&&this.overlapButtonObject.disable()},hide:function(){this.overlapButtonObject&&this.overlapButtonObject.hideMount()},getOverlapContent:function(){return this.options.type!==k.OVERLAP?null:this.options.group[this.overlapIndex].items},createOverlapGroup:function(a){var b=a.title,f=this,g=c(this.doc),k=d(this.doc,{fixOffset:this.options.fixOffset}),l=e(this.doc,{width:150,items:b}),m=j.ele(this.doc,"div",{className:i+"wrap-group"});return this.overlapButtonObject=k,k.mount(l),k.initEvent(),l.initEvent(),h.Utils.each(a.items,function(b,c){var d=m.cloneNode(!1);h.Utils.each(b,function(a){d.appendChild(a)}),a.items[c]=d}),this.itemPanels=a.items,l.setSelectHandler(function(c,d){f.overlapIndex=c,k.setLabel(b[c]),k.hideMount(),a.items[d].style.display="none",a.items[c].style.display="block",c!==d&&f.updateSize(),f.onchangeHandler(c)}),g.appendChild(k.getNode()),h.Utils.each(a.items,function(a,b){b>0&&(a.style.display="none"),g.appendChild(a)}),l.select(0),[g]},getCurrentItemPanel:function(){return this.itemPanels[this.overlapIndex]},getGroupList:function(){var a=[];return h.Utils.each(this.options.group,function(b){a.push(b.title)}),{width:150,items:a}},createGroup:function(){var b=this.doc,c=[],d={title:[],items:[]},e=null,f=null,g=k.DETACHED===this.options.type?l.BIG:l.SMALL,m=null;return e=j.ele(this.doc,"div",{className:i+"box-group"}),m=e.cloneNode(!1),m.className=i+"box-group-item-container",h.Utils.each(this.options.group,function(k){d.title.push(k.title||""),c=[],h.Utils.each(k.items,function(d){e=e.cloneNode(!1),m=m.cloneNode(!1),f=j.ele(b,"div",{className:i+"box-group-title",content:d.title}),e.appendChild(f),e.appendChild(m),h.Utils.each(a(b,d.content,g),function(a){a.appendTo(m)}),c.push(e)}),d.items.push(c)}),d},mergeElement:function(){var a=this.groupContainer;this.element.appendChild(a),h.Utils.each(this.itemGroups,function(b){a.appendChild(b)})},mountTo:function(a){a.appendChild(this.element)},appendTo:function(a){a.appendChild(this.element)}}),q=h.createClass("BoxItem",{constructor:function(a,b,c){this.type=a,this.doc=b,this.options=c,this.element=this.createItem(),this.labelNode=this.createLabel(),this.contentNode=this.createContent(),this.mergeElement()},getNode:function(){return this.element},createItem:function(){var a=j.ele(this.doc,"div",{className:i+"box-item"});return a},createLabel:function(){var a=null;if("label"in this.options)return a=j.ele(this.doc,"div",{className:i+"box-item-label",content:this.options.label})},getContent:function(){},createContent:function(){switch(this.type){case l.BIG:return this.createBigContent();case l.SMALL:return this.createSmallContent()}},createBigContent:function(){var a=this.doc,b=j.ele(a,"div",{className:i+"box-item-content"}),c=i+"box-item-val",d=this.options.item,e=null,f=g(d);return e=j.ele(a,"div",{className:c}),e.innerHTML='
                                  ',this.element.setAttribute("data-value",d.val),b.appendChild(e),b},createSmallContent:function(){var a=this.doc,b=j.ele(a,"div",{className:i+"box-item-content"}),c=i+"box-item-val",d=this.options,e=null;return e=j.ele(a,"div",{className:c}),e.style.background="url( "+d.img+" )",e.style.backgroundPosition=-d.pos.x+"px "+-d.pos.y+"px",this.element.setAttribute("data-value",d.key),b.appendChild(e),b},mergeElement:function(){this.labelNode&&this.element.appendChild(this.labelNode),this.element.appendChild(this.contentNode)},appendTo:function(a){a.appendChild(this.element)}});return p}},b[39]={value:function(){function a(a){var b="url( "+a.src+" ) no-repeat ";return b+=-a.x+"px ",b+=-a.y+"px"}var c=b.r(20),d="kf-editor-ui-",e=7,f={iconSize:{w:32,h:32}},g=b.r(47),h=c.createClass("Button",{constructor:function(a,b){this.options=c.Utils.extend({},f,b),this.eventState=!1,this.toolbar=null,this.displayState=!1,this.fixOffset=b.fixOffset||!1,this.doc=a,this.element=this.createButton(),this.disabled=!0,this.mountElement=null,this.icon=this.createIcon(),this.label=this.createLabel(),this.sign=this.createSign(),this.mountPoint=this.createMountPoint(),this.mergeElement()},initEvent:function(){var a=this;this.eventState||(this.eventState=!0,g.on(this.element,"mousedown",function(b){b.preventDefault(),b.stopPropagation(),1===b.which&&(a.disabled||(a.toggleSelect(),a.toggleMountElement()))}))},setToolbar:function(a){this.toolbar=a},toggleMountElement:function(){this.displayState?this.hideMount():this.showMount()},setLabel:function(a){var b="";this.sign&&(b='
                                  '),this.label.innerHTML=a+b},toggleSelect:function(){g.getClassList(this.element).toggle(d+"button-in")},unselect:function(){g.getClassList(this.element).remove(d+"button-in")},select:function(){g.getClassList(this.element).add(d+"button-in")},show:function(){this.select(),this.showMount()},hide:function(){this.unselect(),this.hideMount()},showMount:function(){if(this.displayState=!0,this.mountPoint.style.display="block",this.fixOffset){var a=this.element.getBoundingClientRect();this.mountElement.setOffset(a.left+e,a.bottom)}var b=this.toolbar.getContainer(),c=null,d=g.getRectBox(b),f=this.mountElement.getPositionInfo();f.right>d.right&&(c=g.getRectBox(this.element),this.mountPoint.style.left=c.right-f.right-1+"px"),this.mountElement.updateSize&&this.mountElement.updateSize()},hideMount:function(){this.displayState=!1,this.mountPoint.style.display="none"},getNode:function(){return this.element},mount:function(a){this.mountElement=a,a.mountTo(this.mountPoint)},createButton:function(){var a=g.ele(this.doc,"div",{className:d+"button"});return this.options.className&&(a.className+=" "+d+this.options.className),a},createIcon:function(){if(!this.options.icon)return null;var b=g.ele(this.doc,"div",{className:d+"button-icon"});return"string"==typeof this.options.icon?b.style.backgroundImage="url("+this.options.icon+") no-repeat":b.style.background=a(this.options.icon),this.options.iconSize.w&&(b.style.width=this.options.iconSize.w+"px"),this.options.iconSize.h&&(b.style.height=this.options.iconSize.h+"px"),b},createLabel:function(){var a=g.ele(this.doc,"div",{className:d+"button-label",content:this.options.label});return a},createSign:function(){return this.options.sign===!1?null:g.ele(this.doc,"div",{className:d+"button-sign"})},createMountPoint:function(){return g.ele(this.doc,"div",{className:d+"button-mount-point"})},disable:function(){this.disabled=!0,g.getClassList(this.element).remove(d+"enabled") +},enable:function(){this.disabled=!1,g.getClassList(this.element).add(d+"enabled")},mergeElement:function(){this.icon&&this.element.appendChild(this.icon),this.element.appendChild(this.label),this.sign&&this.label.appendChild(this.sign),this.element.appendChild(this.mountPoint)}});return h}},b[40]={value:function(){return{DETACHED:1,OVERLAP:2}}},b[41]={value:function(){return{DRAPDOWN_BOX:1,AREA:2,DELIMITER:3}}},b[42]={value:function(){return{BIG:1,SMALL:2}}},b[43]={value:function(){var a=b.r(20),c="kf-editor-ui-",d=b.r(47),e=a.createClass("Delimiter",{constructor:function(a){this.doc=a,this.element=this.createDilimiter()},setToolbar:function(){},createDilimiter:function(){var a=d.ele(this.doc,"div",{className:c+"delimiter"});return a.appendChild(d.ele(this.doc,"div",{className:c+"delimiter-line"})),a},attachTo:function(a){a.appendChild(this.element)}});return e}},b[44]={value:function(){var a=b.r(20),c=b.r(47),d=b.r(39),e=b.r(38),f=a.createClass("DrapdownBox",{constructor:function(a,b){this.options=b,this.toolbar=null,this.doc=a,this.buttonElement=this.createButton(),this.element=this.buttonElement.getNode(),this.boxElement=this.createBox(),this.buttonElement.mount(this.boxElement),this.initEvent()},initEvent:function(){var a=this;c.on(this.element,"mousedown",function(b){b.preventDefault(),b.stopPropagation(),a.toolbar.notify("closeOther",a)}),this.buttonElement.initEvent(),this.boxElement.initEvent(),this.boxElement.setSelectHandler(function(b){c.publish("data.select",b),a.buttonElement.hide()})},disable:function(){this.buttonElement.disable()},enable:function(){this.buttonElement.enable()},setToolbar:function(a){this.toolbar=a,this.buttonElement.setToolbar(a),this.boxElement.setToolbar(a)},createButton:function(){return new d(this.doc,this.options.button)},show:function(){this.buttonElement.show()},hide:function(){this.buttonElement.hide()},createBox:function(){return new e(this.doc,this.options.box)},attachTo:function(a){a.appendChild(this.element)}});return f}},b[45]={value:function(){var a=b.r(20),c="kf-editor-ui-",d=b.r(47),e=a.createClass("List",{constructor:function(a,b){this.options=b,this.doc=a,this.onselectHandler=null,this.currentSelect=-1,this.element=this.createBox(),this.itemGroups=this.createItems(),this.mergeElement()},onselectHandler:function(){},setSelectHandler:function(a){this.onselectHandler=a},createBox:function(){var a=d.ele(this.doc,"div",{className:c+"list"}),b=d.ele(this.doc,"div",{className:c+"list-bg"});return"width"in this.options&&(a.style.width=this.options.width+"px"),a.appendChild(b),a},select:function(a){var b=this.currentSelect;-1===b&&(b=a),this.unselect(b),this.currentSelect=a,d.getClassList(this.itemGroups.items[a]).add(c+"list-item-select"),this.onselectHandler(a,b)},unselect:function(a){d.getClassList(this.itemGroups.items[a]).remove(c+"list-item-select")},setOffset:function(a,b){this.element.style.left=a+"px",this.element.style.top=b+"px"},initEvent:function(){var a="."+c+"list-item",b=this;d.delegate(this.itemGroups.container,a,"mousedown",function(a){a.preventDefault(),1===a.which&&b.select(this.getAttribute("data-index"))}),d.on(this.element,"mousedown",function(a){a.stopPropagation(),a.preventDefault()})},getPositionInfo:function(){return d.getRectBox(this.element)},createItems:function(){var b=this.doc,e=null,f=null,g=null,h=[],i=null;return e=d.ele(this.doc,"div",{className:c+"list-item"}),i=e.cloneNode(!1),i.className=c+"list-item-container",a.Utils.each(this.options.items,function(a,j){f=e.cloneNode(!1),g=e.cloneNode(!1),g.className=c+"list-item-icon",f.appendChild(g),f.appendChild(d.ele(b,"text",a)),f.setAttribute("data-index",j),h.push(f),i.appendChild(f)}),{container:i,items:h}},mergeElement:function(){this.element.appendChild(this.itemGroups.container)},mountTo:function(a){a.appendChild(this.element)}});return e}},b[46]={value:function(){function a(a,b,c){var d=a.createElement(b),e='
                                  ';return d.className=r+c,"thumb"===c&&(c=r+c,d.innerHTML=e.replace("$1",c+"-left").replace("$2",c+"-right")),d}function c(a){return a.getBoundingClientRect()}function d(a){q.addEvent(a,"mousedown",function(a){a.preventDefault()})}function d(a){q.addEvent(a.container,"mousedown",function(a){a.preventDefault()})}function e(a){q.addEvent(a.widgets.track,"mousedown",function(b){h(this,a,b)})}function f(a){q.addEvent(a.widgets.leftButton,"mousedown",function(){j(a,-p.step)}),q.addEvent(a.widgets.rightButton,"mousedown",function(){j(a,p.step)})}function g(a){var b=!1,c=0,d=0,e=a.values.trackWidth;q.addEvent(a.widgets.thumb,"mousedown",function(e){e.preventDefault(),e.stopPropagation(),b=!0,c=e.clientX,d=a.thumbLocationX}),q.addEvent(a.container.ownerDocument,"mouseup",function(){b=!1,c=0,d=0}),q.addEvent(a.container.ownerDocument,"mousemove",function(f){if(b){var g=f.clientX-c,h=d+g,j=a.values.thumbWidth;0>h?h=0:h+j>e&&(h=e-j),i(a,h)}})}function h(a,b,d){var e=c(a),f=b.values,g=f.viewWidth/(f.contentWidth-f.viewWidth)*f.trackWidth,h=d.clientX-e.left;h>f.offset?f.offset+g>f.trackWidth?k(b,f.trackWidth):k(b,f.offset+g):f.offset-g<0?k(b,0):k(b,f.offset-g)}function i(a,b){var c=a.values,d=c.trackWidth-c.thumbWidth,e=Math.floor(b/d*c.trackWidth);a.updateOffset(e),a.thumbLocationX=b,a.widgets.thumb.style.left=b+"px"}function j(a,b){var c=a.leftOverflow+b;0>c?c=0:c>a.values.scrollWidth&&(c=a.values.scrollWidth),m(a,c)}function k(a,b){var c=a.values,d=b/c.trackWidth,e=c.trackWidth-c.thumbWidth,f=0;f=Math.floor(d*e),0>b&&(b=0,f=0),a.updateOffset(b),a.widgets.thumb.style.left=f+"px",a.thumbLocationX=f}function l(a,b){var c=a.values,d=0,e=0;d=b/(c.contentWidth-c.viewWidth),e=Math.floor(d*c.trackWidth),k(a,e)}function m(a,b){var c=a.values,d=b/(c.contentWidth-c.viewWidth);k(a,d*c.trackWidth)}var n=b.r(20),o=b.r(32).scrollbar,p=b.r(29).scrollbar,q=b.r(4),r="kf-editor-ui-";return n.createClass("Scrollbar",{constructor:function(a,b){this.uiComponent=a,this.kfEditor=b,this.widgets=null,this.container=this.uiComponent.scrollbarContainer,this.state=!1,this.values={offset:0,left:0,viewWidth:0,contentWidth:0,trackWidth:0,thumbWidth:0,scrollWidth:0},this.thumbLocationX=0,this.leftOverflow=0,this.rightOverflow=0,this.isExpand=!0,this.initWidget(),this.mountWidget(),this.initSize(),this.hide(),this.initServices(),this.initEvent(),this.updateHandler=function(){}},initWidget:function(){var b=this.container.ownerDocument;this.widgets={leftButton:a(b,"div","left-button"),rightButton:a(b,"div","right-button"),track:a(b,"div","track"),thumb:a(b,"div","thumb"),thumbBody:a(b,"div","thumb-body")}},initSize:function(){var a=c(this.widgets.leftButton).width,b=c(this.widgets.rightButton).width;this.values.viewWidth=c(this.container).width,this.values.trackWidth=this.values.viewWidth-a-b,this.widgets.track.style.width=this.values.trackWidth+"px"},initServices:function(){this.kfEditor.registerService("ui.show.scrollbar",this,{showScrollbar:this.show}),this.kfEditor.registerService("ui.hide.scrollbar",this,{hideScrollbar:this.hide}),this.kfEditor.registerService("ui.update.scrollbar",this,{updateScrollbar:this.update}),this.kfEditor.registerService("ui.set.scrollbar.update.handler",this,{setUpdateHandler:this.setUpdateHandler}),this.kfEditor.registerService("ui.relocation.scrollbar",this,{relocation:this.relocation})},initEvent:function(){d(this),e(this),g(this),f(this)},mountWidget:function(){var a=this.widgets,b=this.container;for(var c in a)a.hasOwnProperty(c)&&b.appendChild(a[c]);a.thumb.appendChild(a.thumbBody),a.track.appendChild(a.thumb)},show:function(){this.state=!0,this.container.style.display="block"},hide:function(){this.state=!1,this.container.style.display="none"},update:function(a){var b=this.values.trackWidth,c=0;return this.isExpand=a>this.values.contentWidth,this.values.contentWidth=a,this.values.scrollWidth=a-this.values.viewWidth,b>=a?void this.hide():(c=Math.max(Math.ceil(b*b/a),o.thumbMinSize),this.values.thumbWidth=c,this.widgets.thumb.style.width=c+"px",void(this.widgets.thumbBody.style.width=c-10+"px"))},setUpdateHandler:function(a){this.updateHandler=a},updateOffset:function(a){var b=this.values;b.offset=a,b.left=a/b.trackWidth,this.leftOverflow=b.left*(b.contentWidth-b.viewWidth),this.rightOverflow=b.contentWidth-b.viewWidth-this.leftOverflow,this.updateHandler(b.left,b.offset,b)},relocation:function(){var a=this.kfEditor.requestService("control.get.cursor.location"),b=p.padding,c=this.values.contentWidth,d=this.values.viewWidth,e=this.values.left*(c-d),f=0;a.xe+d?(a.x+=b,a.x>c&&(a.x=c),f=a.x-d,l(this,f)):this.isExpand?m(this,this.leftOverflow):m(this,c-d-this.rightOverflow)}})}},b[47]={value:function(){function a(a){this.node=a,this.classes=a.className.replace(/^\s+|\s+$/g,"").split(/\s+/)}var c=b.r(14),d=b.r(20),e={},f={ele:function(a,b,c){var d=null;return"text"===b?a.createTextNode(c):(d=a.createElement(b),c.className&&(d.className=c.className),c.content&&(d.innerHTML=c.content),d)},getRectBox:function(a){return a.getBoundingClientRect()},on:function(a,b,d){return c(a).on(b,d),this},delegate:function(a,b,d,e){return c(a).delegate(b,d,e),this},publish:function(a,b){var c=e[a];c&&(b=[].slice.call(arguments,1),d.Utils.each(c,function(a){a.apply(null,b)}))},subscribe:function(a,b){e[a]||(e[a]=[]),e[a].push(b)},getClassList:function(b){return b.classList||new a(b)}};return a.prototype={constructor:a,contains:function(a){return-1!==this.classes.indexOf(a)},add:function(a){return-1==this.classes.indexOf(a)&&this.classes.push(a),this._update(),this},remove:function(a){var b=this.classes.indexOf(a);return-1!==b&&(this.classes.splice(b,1),this._update()),this},toggle:function(a){var b=this.contains(a)?"remove":"add";return this[b](a)},_update:function(){this.node.className=this.classes.join(" ")}},f}},b[48]={value:function(){return{DrapdownBox:b.r(44),Delimiter:b.r(43),Area:b.r(37)}}},b[49]={value:function(){function a(a){return h.ele(a,"div",{className:"kf-editor-toolbar"})}function c(a){return h.ele(a,"div",{className:"kf-editor-inner-toolbar"})}function d(a){var b=a.createElement("div");return b.className="kf-editor-edit-area",b.style.width="80%",b.style.height="800px",b}function e(a){var b=a.createElement("div");return b.className="kf-editor-canvas-container",b}function f(a){var b=a.createElement("div");return b.className="kf-editor-edit-scrollbar",b}var g=b.r(20),h=b.r(47),i=b.r(4),j=b.r(32).VIEW_STATE,k=b.r(46),l=b.r(36),m=(b.r(31),b.r(35)),n=g.createClass("UIComponent",{constructor:function(b,g){var h=null;this.options=g,this.container=b.getContainer(),h=this.container.ownerDocument,this.components={},this.canvasRect=null,this.viewState=j.NO_OVERFLOW,this.kfEditor=b,this.toolbarWrap=a(h),this.toolbarContainer=c(h),this.editArea=d(h),this.canvasContainer=e(h),this.scrollbarContainer=f(h),this.toolbarWrap.appendChild(this.toolbarContainer),this.container.appendChild(this.toolbarWrap),this.editArea.appendChild(this.canvasContainer),this.container.appendChild(this.editArea),this.container.appendChild(this.scrollbarContainer),this.initComponents(),this.initServices(),this.initEvent(),this.updateContainerSize(this.container,this.toolbarWrap,this.editArea,this.canvasContainer),this.initScrollEvent()},initComponents:function(){this.components.toolbar=new l(this,this.kfEditor,m),this.components.scrollbar=new k(this,this.kfEditor)},updateContainerSize:function(a,b,c){var d=a.getBoundingClientRect(),e=b.getBoundingClientRect();c.style.width=d.width+"px",c.style.height=d.bottom-e.bottom+"px"},initServices:function(){this.kfEditor.registerService("ui.get.canvas.container",this,{getCanvasContainer:this.getCanvasContainer}),this.kfEditor.registerService("ui.update.canvas.view",this,{updateCanvasView:this.updateCanvasView}),this.kfEditor.registerService("ui.canvas.container.event",this,{on:this.addEvent,off:this.removeEvent,trigger:this.trigger,fire:this.trigger})},initEvent:function(){},initScrollEvent:function(){var a=this;this.kfEditor.requestService("ui.set.scrollbar.update.handler",function(b,c,d){c=Math.floor(b*(d.contentWidth-d.viewWidth)),a.kfEditor.requestService("render.set.canvas.offset",c)})},getCanvasContainer:function(){return this.canvasContainer},addEvent:function(a,b){i.addEvent(this.canvasContainer,a,b)},removeEvent:function(){},trigger:function(a){i.trigger(this.canvasContainer,a)},updateCanvasView:function(){var a=this.kfEditor.requestService("render.get.canvas"),b=a.getContentContainer(),c=null;null===this.canvasRect&&(this.canvasRect=this.canvasContainer.getBoundingClientRect()),c=b.getRenderBox("paper"),c.width>this.canvasRect.width?(this.viewState===j.NO_OVERFLOW&&(this.toggleViewState(),this.kfEditor.requestService("ui.show.scrollbar"),this.kfEditor.requestService("render.disable.relocation")),this.kfEditor.requestService("render.relocation"),this.kfEditor.requestService("ui.update.scrollbar",c.width),this.kfEditor.requestService("ui.relocation.scrollbar")):(this.viewState===j.OVERFLOW&&(this.toggleViewState(),this.kfEditor.requestService("ui.hide.scrollbar"),this.kfEditor.requestService("render.enable.relocation")),this.kfEditor.requestService("render.relocation"))},toggleViewState:function(){this.viewState=this.viewState===j.NO_OVERFLOW?j.OVERFLOW:j.NO_OVERFLOW}});return n}},b[50]={value:function(){var a=b.r(12),c=b.r(13);a.registerComponents("ui",b.r(49)),a.registerComponents("parser",b.r(21)),a.registerComponents("render",b.r(25)),a.registerComponents("position",b.r(23)),a.registerComponents("syntax",b.r(28)),a.registerComponents("control",b.r(5)),a.registerComponents("print",b.r(24)),kf.EditorFactory=c}};var c={"kf.start":50};!function(){try{a("kf.start")}catch(b){}}(this)}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kitygraph.all.js b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kitygraph.all.js new file mode 100644 index 0000000..153d6e1 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/js/kitygraph.all.js @@ -0,0 +1,8572 @@ +/*! + * ==================================================== + * kity - v2.0.5 - 2015-11-12 + * https://github.com/fex-team/kity + * GitHub: https://github.com/fex-team/kity.git + * Copyright (c) 2015 Baidu FEX; Licensed BSD + * ==================================================== + */ + +(function () { +var _p = { + r: function(index) { + if (_p[index].inited) { + return _p[index].value; + } + if (typeof _p[index].value === "function") { + var module = { + exports: {} + }, returnValue = _p[index].value(null, module.exports, module); + _p[index].inited = true; + _p[index].value = returnValue; + if (returnValue !== undefined) { + return returnValue; + } else { + for (var key in module.exports) { + if (module.exports.hasOwnProperty(key)) { + _p[index].inited = true; + _p[index].value = module.exports; + return module.exports; + } + } + } + } else { + _p[index].inited = true; + return _p[index].value; + } + } +}; + +//src/animate/animator.js +/** + * @fileOverview + * + * 提供基本的动画支持 + */ +_p[0] = { + value: function(require) { + function parseTime(str) { + var value = parseFloat(str, 10); + if (/ms/.test(str)) { + return value; + } + if (/s/.test(str)) { + return value * 1e3; + } + if (/min/.test(str)) { + return value * 60 * 1e3; + } + return value; + } + var Timeline = _p.r(8); + var easingTable = _p.r(1); + /** + * @class kity.Animator + * @catalog animate + * @description 表示一个动画启动器,可以作用于不同的对象进行动画 + */ + var Animator = _p.r(11).createClass("Animator", { + /** + * @constructor + * @for kity.Animator + * @catalog animate + * + * @grammar new kity.Animator(beginValue, finishValue, setter) + * @grammar new kity.Animator(option) + * + * @param {any} beginValue|opt.beginValue + * 动画的起始值,允许的类型有数字、数组、字面量、kity.Point、kity.Vector、kity.Box、kity.Matrix + * + * @param {any} finishValue|opt.beginValue + * 动画的结束值,类型应于起始值相同 + * + * @param {Function} setter|opt.setter + * 值的使用函数,接受三个参数: function(target, value, timeline) + * target {object} 动画的目标 + * value {any} 动画的当前值 + * timeline {kity.Timeline} 动画当前的时间线对象 + */ + constructor: function(beginValue, finishValue, setter) { + if (arguments.length == 1) { + var opt = arguments[0]; + this.beginValue = opt.beginValue; + this.finishValue = opt.finishValue; + this.setter = opt.setter; + } else { + this.beginValue = beginValue; + this.finishValue = finishValue; + this.setter = setter; + } + }, + /** + * @method start() + * @for kity.Animator + * @description 使用当前的动画器启动在指定目标上启动动画 + * + * @grammar start(target, duration, easing, delay, callback) => {kity.Timeline} + * @grammar start(target, option) => {kity.Timeline} + * + * @param {object} target + * 启动动画的目标 + * + * @param {Number|String} duration|option.duration + * [Optional] 动画的持续时间,如 300、"300ms"、"1.5min" + * + * @param {String|Function} easing|option.easing + * [Optional] 动画使用的缓动函数,如 "ease"、"linear"、"swing" + * + * @param {Number|String} delay|option.delay + * [Optional] 动画的播放延迟时间 + * + * @param {Function} callback|option.callback + * [Optional] 动画结束后的回调函数 + * + * @example + * + * ```js + * var turnRed = new kity.Animator( + * new kity.Color('yellow'), + * new kity.Color('red'), + * function(target, value) { + * target.fill(value); + * }); + * + * turnRed.start(rect, 300, 'ease', function() { + * console.log('I am red!'); + * }); + * ``` + */ + start: function(target, duration, easing, delay, callback) { + if (arguments.length === 2 && typeof duration == "object") { + easing = duration.easing; + delay = duration.delay; + callback = duration.callback; + duration = duration.duration; + } + if (arguments.length === 4 && typeof delay == "function") { + callback = delay; + delay = 0; + } + var timeline = this.create(target, duration, easing, callback); + delay = parseTime(delay); + if (delay > 0) { + setTimeout(function() { + timeline.play(); + }, delay); + } else { + timeline.play(); + } + return timeline; + }, + /** + * @method create() + * @for kity.Animator + * @description 使用当前的动画器为指定目标创建时间线 + * + * @grammar create(target, duration, easing, callback) => {kity.Timeline} + * + * @param {object} target 要创建的时间线的目标 + * @param {Number|String} duration 要创建的时间线的长度,如 300、"5s"、"0.5min" + * @param {String|Function} easing 要创建的时间线的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 时间线播放结束之后的回调函数 + * + * @example + * + * ```js + * var expand = new kity.Animator({ + * beginValue: function(target) { + * return target.getBox(); + * }, + * finishValue: function(target) { + * return target.getBox().expand(100, 100, 100, 100); + * }, + * setter: function(target, value) { + * target.setBox(value) + * } + * }); + * + * var timeline = expand.create(rect, 300); + * timeline.repeat(3).play(); + * ``` + */ + create: function(target, duration, easing, callback) { + var timeline; + duration = duration && parseTime(duration) || Animator.DEFAULT_DURATION; + easing = easing || Animator.DEFAULT_EASING; + if (typeof easing == "string") { + easing = easingTable[easing]; + } + timeline = new Timeline(this, target, duration, easing); + if (typeof callback == "function") { + timeline.on("finish", callback); + } + return timeline; + }, + /** + * @method reverse() + * @for kity.Animator + * @grammar reverse() => {kity.Animator} + * @description 创建一个与当前动画器相反的动画器 + * + * @example + * + * ```js + * var turnYellow = turnRed.reverse(); + * ``` + */ + reverse: function() { + return new Animator(this.finishValue, this.beginValue, this.setter); + } + }); + Animator.DEFAULT_DURATION = 300; + Animator.DEFAULT_EASING = "linear"; + var Shape = _p.r(60); + _p.r(11).extendClass(Shape, { + /** + * @method animate() + * @for kity.Shape + * @description 在图形上播放使用指定的动画器播放动画,如果图形当前有动画正在播放,则会加入播放队列 + * + * @grammar animate(animator, duration, easing, delay, callback) + * + * @param {object} animator 播放动画使用的动画器 + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + * + * @example + * + * ```js + * rect.animate(turnRed, 300); // turnRect 是一个动画器 + * rect.animate(expand, 500); // turnRect 播放结束后播放 expand + * ``` + */ + animate: function(animator, duration, easing, delay, callback) { + var queue = this._KityAnimateQueue = this._KityAnimateQueue || []; + var timeline = animator.create(this, duration, easing, callback); + function dequeue() { + queue.shift(); + if (queue.length) { + setTimeout(queue[0].t.play.bind(queue[0].t), queue[0].d); + } + } + timeline.on("finish", dequeue); + queue.push({ + t: timeline, + d: delay + }); + if (queue.length == 1) { + setTimeout(timeline.play.bind(timeline), delay); + } + return this; + }, + /** + * @method timeline() + * @for kity.Shape + * @description 获得当前正在播放的动画的时间线 + * + * @grammar timeline() => {kity.Timeline} + * + * @example + * + * ```js + * rect.timeline().repeat(2); + * ``` + */ + timeline: function() { + return this._KityAnimateQueue[0].t; + }, + /** + * @method stop() + * @for kity.Shape + * @description 停止当前正在播放的动画 + * + * @grammar stop() => {this} + * + * @example + * + * ```js + * rect.stop(); // 停止 rect 上的动画 + * ``` + */ + stop: function() { + var queue = this._KityAnimateQueue; + if (queue) { + while (queue.length) { + queue.shift().t.stop(); + } + } + return this; + } + }); + return Animator; + } +}; + +//src/animate/easing.js +/** + * Kity Animate Easing modified from jQuery Easing + * Author: techird + * Changes: + * 1. make easing functions standalone + * 2. remove the 'x' parameter + */ +/* ============================================================ + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Open source under the BSD License. + * + * Copyright © 2008 George McGinley Smith + * All rights reserved. + * https://raw.github.com/danro/jquery-easing/master/LICENSE + * ======================================================== */ +_p[1] = { + value: function(require, exports, module) { + var easings = { + // t: current_time, b: begin_value, c: change_value, d: duration + linear: function(t, b, c, d) { + return c * (t / d) + b; + }, + swing: function(t, b, c, d) { + return easings.easeOutQuad(t, b, c, d); + }, + ease: function(t, b, c, d) { + return easings.easeInOutCubic(t, b, c, d); + }, + easeInQuad: function(t, b, c, d) { + return c * (t /= d) * t + b; + }, + easeOutQuad: function(t, b, c, d) { + return -c * (t /= d) * (t - 2) + b; + }, + easeInOutQuad: function(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t + b; + return -c / 2 * (--t * (t - 2) - 1) + b; + }, + easeInCubic: function(t, b, c, d) { + return c * (t /= d) * t * t + b; + }, + easeOutCubic: function(t, b, c, d) { + return c * ((t = t / d - 1) * t * t + 1) + b; + }, + easeInOutCubic: function(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; + return c / 2 * ((t -= 2) * t * t + 2) + b; + }, + easeInQuart: function(t, b, c, d) { + return c * (t /= d) * t * t * t + b; + }, + easeOutQuart: function(t, b, c, d) { + return -c * ((t = t / d - 1) * t * t * t - 1) + b; + }, + easeInOutQuart: function(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; + return -c / 2 * ((t -= 2) * t * t * t - 2) + b; + }, + easeInQuint: function(t, b, c, d) { + return c * (t /= d) * t * t * t * t + b; + }, + easeOutQuint: function(t, b, c, d) { + return c * ((t = t / d - 1) * t * t * t * t + 1) + b; + }, + easeInOutQuint: function(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; + return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; + }, + easeInSine: function(t, b, c, d) { + return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; + }, + easeOutSine: function(t, b, c, d) { + return c * Math.sin(t / d * (Math.PI / 2)) + b; + }, + easeInOutSine: function(t, b, c, d) { + return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; + }, + easeInExpo: function(t, b, c, d) { + return t === 0 ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; + }, + easeOutExpo: function(t, b, c, d) { + return t == d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; + }, + easeInOutExpo: function(t, b, c, d) { + if (t === 0) return b; + if (t == d) return b + c; + if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; + return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function(t, b, c, d) { + return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; + }, + easeOutCirc: function(t, b, c, d) { + return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; + }, + easeInOutCirc: function(t, b, c, d) { + if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; + return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; + }, + easeInElastic: function(t, b, c, d) { + var s = 1.70158; + var p = 0; + var a = c; + if (t === 0) return b; + if ((t /= d) == 1) return b + c; + if (!p) p = d * .3; + if (a < Math.abs(c)) { + a = c; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(c / a); + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; + }, + easeOutElastic: function(t, b, c, d) { + var s = 1.70158; + var p = 0; + var a = c; + if (t === 0) return b; + if ((t /= d) == 1) return b + c; + if (!p) p = d * .3; + if (a < Math.abs(c)) { + a = c; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(c / a); + return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b; + }, + easeInOutElastic: function(t, b, c, d) { + var s = 1.70158; + var p = 0; + var a = c; + if (t === 0) return b; + if ((t /= d / 2) == 2) return b + c; + if (!p) p = d * (.3 * 1.5); + if (a < Math.abs(c)) { + a = c; + var s = p / 4; + } else var s = p / (2 * Math.PI) * Math.asin(c / a); + if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b; + }, + easeInBack: function(t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c * (t /= d) * t * ((s + 1) * t - s) + b; + }, + easeOutBack: function(t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; + }, + easeInOutBack: function(t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b; + return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b; + }, + easeInBounce: function(t, b, c, d) { + return c - easings.easeOutBounce(d - t, 0, c, d) + b; + }, + easeOutBounce: function(t, b, c, d) { + if ((t /= d) < 1 / 2.75) { + return c * (7.5625 * t * t) + b; + } else if (t < 2 / 2.75) { + return c * (7.5625 * (t -= 1.5 / 2.75) * t + .75) + b; + } else if (t < 2.5 / 2.75) { + return c * (7.5625 * (t -= 2.25 / 2.75) * t + .9375) + b; + } else { + return c * (7.5625 * (t -= 2.625 / 2.75) * t + .984375) + b; + } + }, + easeInOutBounce: function(t, b, c, d) { + if (t < d / 2) return easings.easeInBounce(t * 2, 0, c, d) * .5 + b; + return easings.easeOutBounce(t * 2 - d, 0, c, d) * .5 + c * .5 + b; + } + }; + return easings; + } +}; + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright © 2001 Robert Penner + * 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. + * + * Neither the name of the author nor the names of contributors may 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 THE + * COPYRIGHT OWNER OR CONTRIBUTORS 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. + * + */ +//src/animate/frame.js +/** + * @fileOverview + * + * 提供动画帧的基本支持 + */ +_p[2] = { + value: function(require, exports) { + // 原生动画帧方法 polyfill + var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || function(fn) { + return setTimeout(fn, 1e3 / 60); + }; + var cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame || window.clearTimeout; + // 上一个请求的原生动画帧 id + var frameRequestId; + // 等待执行的帧动作的集合,这些帧的方法将在下个原生动画帧同步执行 + var pendingFrames = []; + /** + * 添加一个帧到等待集合中 + * + * 如果添加的帧是序列的第一个,至少有一个帧需要被执行,则会请求一个原生动画帧来执行 + */ + function pushFrame(frame) { + if (pendingFrames.push(frame) === 1) { + frameRequestId = requestAnimationFrame(executePendingFrames); + } + } + /** + * 执行所有等待帧 + */ + function executePendingFrames() { + var frames = pendingFrames; + pendingFrames = []; + while (frames.length) { + executeFrame(frames.pop()); + } + frameRequestId = 0; + } + /** + * @method kity.requestFrame + * @catalog animate + * @grammar kity.requestFrame(action) => {frame} + * @description 请求一个帧,执行指定的动作。动作回调提供一些有用的信息 + * + * @param {Function} action + * + * 要执行的动作,该动作回调有一个参数 frame,其中: + * + * frame.time {Number} + * 动作执行时的时间戳(ms) + * + * frame.index {Number} + * 当前执行的帧的编号(首帧为 0) + * + * frame.dur {Number} + * 上一帧至当前帧经过的时间,单位 ms + * + * frame.elapsed {Number} + * 从首帧开始到当前帧经过的时间,单位 ms + * + * frame.action {Number} + * 指向当前的帧处理函数 + * + * frame.next() + * 表示下一帧继续执行。如果不调用该方法,将不会执行下一帧。 + * + * @example + * + * ```js + * kity.requestFrame(function(frame) { + * console.log('平均帧率:' + frame.elapsed / (frame.index + 1)); + * + * // 更新或渲染动作 + * + * frame.next(); //继续执行下一帧 + * }); + * ``` + */ + function requestFrame(action) { + var frame = initFrame(action); + pushFrame(frame); + return frame; + } + /** + * @method kity.releaseFrame + * @catalog animate + * @grammar kity.releaseFrame(frame) + * @description 释放一个已经请求过的帧,如果该帧在等待集合里,将移除,下个动画帧不会执行释放的帧 + * + * @param {frame} frame 使用 kity.requestFrame() 返回的帧 + * + * @example + * + * ```js + * var frame = kity.requestFrame(function() {....}); + * kity.releaseFrame(frame); + * ``` + */ + function releaseFrame(frame) { + var index = pendingFrames.indexOf(frame); + if (~index) { + pendingFrames.splice(index, 1); + } + if (pendingFrames.length === 0) { + cancelAnimationFrame(frameRequestId); + } + } + /** + * 初始化一个帧,主要用于后续计算 + */ + function initFrame(action) { + var frame = { + index: 0, + time: +new Date(), + elapsed: 0, + action: action, + next: function() { + pushFrame(frame); + } + }; + return frame; + } + /** + * 执行一个帧动作 + */ + function executeFrame(frame) { + // 当前帧时间错 + var time = +new Date(); + // 当上一帧到当前帧经过的时间 + var dur = time - frame.time; + // + // http://stackoverflow.com/questions/13133434/requestanimationframe-detect-stop + // 浏览器最小化或切换标签,requestAnimationFrame 不会执行。 + // 检测时间超过 200 ms(频率小于 5Hz ) 判定为计时器暂停,重置为一帧长度 + // + if (dur > 200) { + dur = 1e3 / 60; + } + frame.dur = dur; + frame.elapsed += dur; + frame.time = time; + frame.action.call(null, frame); + frame.index++; + } + // 暴露 + exports.requestFrame = requestFrame; + exports.releaseFrame = releaseFrame; + } +}; + +//src/animate/motionanimator.js +/** + * @fileOverview + * + * 路径动画器,可以让一个物体沿着某个轨迹运动 + */ +_p[3] = { + value: function(require) { + var Animator = _p.r(0); + var g = _p.r(34); + var Path = _p.r(46); + var Shape = _p.r(60); + /** + * @class kity.MotionAnimator + * @catalog animate + * @base kity.Animator + * @description 路径动画器,可以让一个物体沿着某个轨迹运动 + * + * @example + * + * ```js + * var motionAnimator = new MotionAnimator('M0,0C100,0,100,0,100,100L200,200'); + * motionAnimator.start(rect, 3000); + * ``` + */ + var MotionAnimator = _p.r(11).createClass("MotionAnimator", { + base: Animator, + /** + * @constructor + * @for kity.MotionAnimator + * @grammar new kity.MotionAnimator(path, doRotate) + * @param {kity.Path|String|PathSegment} path 运动的轨迹,或者是 kity.Path 对象 + * @param {boolean} doRotate 是否让运动的目标沿着路径的切线方向旋转 + */ + constructor: function(path, doRotate) { + var me = this; + this.callBase({ + beginValue: 0, + finishValue: 1, + setter: function(target, value) { + var path = me.motionPath instanceof Path ? me.motionPath.getPathData() : me.motionPath; + var point = g.pointAtPath(path, value); + target.setTranslate(point.x, point.y); + if (this.doRotate) target.setRotate(point.tan.getAngle()); + } + }); + /** + * @property doRotate + * @for kity.MotionAnimator + * @type {boolean} + * @description 是否让运动的目标沿着路径的切线方向旋转 + * + * @example + * + * ```js + * motionAnimator.doRotate = true; // 目标沿着切线方向旋转 + * ``` + */ + this.doRotate = doRotate; + /** + * @property motionPath + * @for kity.MotionAnimator + * @type {kity.Path|String|PathSegment} + * @description 运动沿着的路径,可以在动画过程中更新 + */ + this.motionPath = path; + } + }); + _p.r(11).extendClass(Shape, { + /** + * @method motion() + * @catalog animate + * @for kity.Shape + * @description 让图形沿着指定的路径运动 + * + * @grammar motion(path, duration, easing, delay, callback) => this + * + * @param {kity.Path|String|PathSegment} path 运动的轨迹,或者是 kity.Path 对象 + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + motion: function(path, duration, easing, delay, callback) { + return this.animate(new MotionAnimator(path), duration, easing, delay, callback); + } + }); + return MotionAnimator; + } +}; + +//src/animate/opacityanimator.js +/** + * @fileOverview + * + * 透明度动画器,让图形动画过度到指定的透明度。 + */ +_p[4] = { + value: function(require) { + var Animator = _p.r(0); + /** + * @class kity.OpacityAnimator + * @catalog animate + * @base kity.Animator + * @description 透明度动画器,让图形动画过度到指定的透明度 + */ + var OpacityAnimator = _p.r(11).createClass("OpacityAnimator", { + base: Animator, + /** + * @constructor + * @for kity.OpacityAnimator + * @grammar new kity.OpacityAnimator(opacity) + * + * @param {Number} opacity 目标透明度,取值范围 0 - 1 + */ + constructor: function(opacity) { + this.callBase({ + beginValue: function(target) { + return target.getOpacity(); + }, + finishValue: opacity, + setter: function(target, value) { + target.setOpacity(value); + } + }); + } + }); + var Shape = _p.r(60); + _p.r(11).extendClass(Shape, { + /** + * @method fxOpacity() + * @catalog animate + * @for kity.Shape + * @description 让图形的透明度以动画的形式过渡到指定的值 + * + * @grammar fxOpacity(opacity, duration, easing, delay, callback) => {this} + * + * @param {Number} opacity 动画的目标透明度 + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + fxOpacity: function(opacity, duration, easing, delay, callback) { + return this.animate(new OpacityAnimator(opacity), duration, easing, delay, callback); + }, + /** + * @method fadeTo() + * @catalog animate + * @for kity.Shape + * @description 让图形的透明度以动画的形式过渡到指定的值 + * + * @grammar fadeTo(opacity, duration, easing, delay, callback) => {this} + * + * @param {Number} opacity 动画的目标透明度 + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + fadeTo: function() { + return this.fxOpacity.apply(this, arguments); + }, + /** + * @method fadeIn() + * @catalog animate + * @for kity.Shape + * @description 让图形淡入 + * + * @grammar fadeIn(duration, easing, delay, callback) => {this} + * + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + fadeIn: function() { + return this.fxOpacity.apply(this, [ 1 ].concat([].slice.call(arguments))); + }, + /** + * @method fadeOut() + * @catalog animate + * @for kity.Shape + * @description 让图形淡出 + * + * @grammar fadeIn(duration, easing, delay, callback) => {this} + * + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + fadeOut: function() { + return this.fxOpacity.apply(this, [ 0 ].concat([].slice.call(arguments))); + } + }); + return OpacityAnimator; + } +}; + +//src/animate/pathanimator.js +/** + * @fileOverview + * + * 路径补间动画器,让图形从一个形状变为另一个形状 + */ +_p[5] = { + value: function(require) { + var Animator = _p.r(0); + var g = _p.r(34); + /** + * @catalog animate + * + * @class kity.PathAnimator + * @base kity.Animator + * @description 路径补间动画器,让图形从一个形状变为另一个形状 + * + * @example + * + * ```js + * var path = new kity.Path('M0,0L0,100'); + * var pa = new kity.PathAnimator('M0,0C100,0,100,0,100,100'); + * pa.start(path, 300); + * ``` + */ + var PathAnimator = _p.r(11).createClass("OpacityAnimator", { + base: Animator, + /** + * @constructor + * @for kity.PathAnimator + * + * @grammar new kity.Path.Animator(path) + * + * @param {String|PathSegment} path 目标形状的路径数据 + * + */ + constructor: function(path) { + this.callBase({ + beginValue: function(target) { + this.beginPath = target.getPathData(); + return 0; + }, + finishValue: 1, + setter: function(target, value) { + target.setPathData(g.pathTween(this.beginPath, path, value)); + } + }); + } + }); + var Path = _p.r(46); + _p.r(11).extendClass(Path, { + /** + * @catalog animate + * + * @method fxPath() + * @for kity.Shape + * @description 以动画的形式把路径变换为新路径 + * + * @grammar fxPath(path, duration, easing, delay, callback) => {this} + * + * @param {String|PathSegment} path 要变换新路径 + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + fxPath: function(path, duration, easing, delay, callback) { + return this.animate(new PathAnimator(path), duration, easing, delay, callback); + } + }); + return PathAnimator; + } +}; + +//src/animate/rotateanimator.js +/** + * @fileOverview + * + * 提供支持目标旋转的动画器 + */ +_p[6] = { + value: function(require) { + var Animator = _p.r(0); + /** + * @class kity.RotateAnimator + * @base Animator + * @description 提供支持目标旋转的动画器 + */ + var RotateAnimator = _p.r(11).createClass("RotateAnimator", { + base: Animator, + /** + * @constructor + * @for kity.RotateAnimator + * + * @grammar new kity.RotateAnimator(deg, ax, ay) + * + * @param {Number} deg 要旋转的角度 + */ + constructor: function(deg) { + this.callBase({ + beginValue: 0, + finishValue: deg, + setter: function(target, value, timeline) { + var delta = timeline.getDelta(); + target.rotate(delta, ax, ay); + } + }); + } + }); + var Shape = _p.r(60); + _p.r(11).extendClass(Shape, { + /** + * @method fxRotate() + * @for kity.Shape + * @description 让目标以动画旋转指定的角度 + * + * @grammar fxRotate(deg, duration, easing, delay) => {this} + * + * @param {Number} deg 要旋转的角度 + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + fxRotate: function(deg, duration, easing, delay, callback) { + return this.animate(new RotateAnimator(deg), duration, easing, delay, callback); + } + }); + return RotateAnimator; + } +}; + +//src/animate/scaleanimator.js +/** + * @fileOverview + * + * 提供支持目标缩放的动画器 + */ +_p[7] = { + value: function(require) { + var Animator = _p.r(0); + /** + * @class kity.ScaleAnimator + * @base kity.Animator + * @description 提供支持目标缩放的动画器 + */ + var ScaleAnimator = _p.r(11).createClass("ScaleAnimator", { + base: Animator, + /** + * @constructor + * @for kity.ScaleAnimator + * + * @grammar new kity.ScaleAnimator(sx, sy) + * @param {Number} sx x 轴的缩放比例 + * @param {Number} sy y 轴的缩放比例 + */ + constructor: function(sx, sy) { + this.callBase({ + beginValue: 0, + finishValue: 1, + setter: function(target, value, timeline) { + var delta = timeline.getDelta(); + var kx = Math.pow(sx, delta); + var ky = Math.pow(sy, delta); + target.scale(ky, kx); + } + }); + } + }); + var Shape = _p.r(60); + _p.r(11).extendClass(Shape, { + /** + * @method fxScale + * @for kity.Shape + * @description 动画缩放当前的图形 + * + * @grammar fxScale(sx, sy, duration, easing, delay, callback) => {this} + * + * @param {Number} sx x 轴的缩放比例 + * @param {Number} sy y 轴的缩放比例 + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + fxScale: function(sx, sy, duration, easing, delay, callback) { + return this.animate(new ScaleAnimator(sx, sy), duration, easing, delay, callback); + } + }); + return ScaleAnimator; + } +}; + +//src/animate/timeline.js +/** + * @fileOverview + * + * 动画时间线的实现 + */ +_p[8] = { + value: function(require) { + var EventHandler = _p.r(33); + var utils = _p.r(12); + var frame = _p.r(2); + function getPercentValue(b, f, p) { + return utils.paralle(b, f, function(b, f) { + return b + (f - b) * p; + }); + } + function getDelta(v1, v2) { + return utils.paralle(v1, v2, function(v1, v2) { + return v2 - v1; + }); + } + function TimelineEvent(timeline, type, param) { + this.timeline = timeline; + this.target = timeline.target; + this.type = type; + for (var name in param) { + if (param.hasOwnProperty(name)) { + this[name] = param[name]; + } + } + } + /** + * @class kity.Timeline + * @catalog animate + * @mixins EventHandler + * @description 动画时间线 + */ + var Timeline = _p.r(11).createClass("Timeline", { + mixins: [ EventHandler ], + /** + * @constructor + * @for kity.Timeline + * @private + * @description 时间线应该由动画器进行构造,不应手动创建 + * + */ + constructor: function(animator, target, duration, easing) { + this.callMixin(); + this.target = target; + this.time = 0; + this.duration = duration; + this.easing = easing; + this.animator = animator; + this.beginValue = animator.beginValue; + this.finishValue = animator.finishValue; + this.setter = animator.setter; + this.status = "ready"; + }, + /** + * @private + * + * 让时间线进入下一帧 + */ + nextFrame: function(frame) { + if (this.status != "playing") { + return; + } + this.time += frame.dur; + this.setValue(this.getValue()); + if (this.time >= this.duration) { + this.timeUp(); + } + frame.next(); + }, + /** + * @method getPlayTime() + * @for kity.Timeline + * @grammar getPlayTime() => {Number} + * @description 获得当前播放的时间,取值区间为 [0, duration] + */ + getPlayTime: function() { + return this.rollbacking ? this.duration - this.time : this.time; + }, + /** + * @method getTimeProportion() + * @for kity.Timeline + * @grammar getTimeProportion() => {Number} + * @description 获得当前播放时间的比例,取值区间为 [0, 1] + */ + getTimeProportion: function() { + return this.getPlayTime() / this.duration; + }, + /** + * @method getValueProportion() + * @for kity.Timeline + * @grammar getValueProportion() => {Number} + * @description 获得当前播放时间对应值的比例,取值区间为 [0, 1];该值实际上是时间比例值经过缓动函数计算之后的值。 + */ + getValueProportion: function() { + return this.easing(this.getPlayTime(), 0, 1, this.duration); + }, + /** + * @method getValue() + * @for kity.Timeline + * @grammar getValue() => {any} + * @description 返回当前播放时间对应的值。 + */ + getValue: function() { + var b = this.beginValue; + var f = this.finishValue; + var p = this.getValueProportion(); + return getPercentValue(b, f, p); + }, + /** + * @private + * + * 把值通过动画器的 setter 设置到目标上 + */ + setValue: function(value) { + this.lastValue = this.currentValue; + this.currentValue = value; + this.setter.call(this.target, this.target, value, this); + }, + /** + * @method getDelta() + * @for kity.Timeline + * @grammar getDelta() => {any} + * @description 返回当前值和上一帧的值的差值 + */ + getDelta: function() { + this.lastValue = this.lastValue === undefined ? this.beginValue : this.lastValue; + return getDelta(this.lastValue, this.currentValue); + }, + /** + * @method play() + * @for kity.Timeline + * @grammar play() => {this} + * @description 让时间线播放,如果时间线还没开始,或者已停止、已结束,则重头播放;如果是已暂停,从暂停的位置继续播放 + */ + play: function() { + var lastStatus = this.status; + this.status = "playing"; + switch (lastStatus) { + case "ready": + if (utils.isFunction(this.beginValue)) { + this.beginValue = this.beginValue.call(this.target, this.target); + } + if (utils.isFunction(this.finishValue)) { + this.finishValue = this.finishValue.call(this.target, this.target); + } + this.time = 0; + this.setValue(this.beginValue); + this.frame = frame.requestFrame(this.nextFrame.bind(this)); + break; + + case "finished": + case "stoped": + this.time = 0; + this.frame = frame.requestFrame(this.nextFrame.bind(this)); + break; + + case "paused": + this.frame.next(); + } + /** + * @event play + * @for kity.Timeline + * @description 在时间线播放后触发 + * + * @param {String} event.lastStatus + * 表示播放前的上一个状态,可能取值为 'ready'、'finished'、'stoped'、'paused' + */ + this.fire("play", new TimelineEvent(this, "play", { + lastStatus: lastStatus + })); + return this; + }, + /** + * @method pause() + * @for kity.Timeline + * @description 暂停当前的时间线 + * + * @grammar pause() => {this} + */ + pause: function() { + this.status = "paused"; + /** + * @event pause + * @for kity.Timeline + * @description 暂停事件,在时间线暂停时触发 + */ + this.fire("pause", new TimelineEvent(this, "pause")); + frame.releaseFrame(this.frame); + return this; + }, + /** + * @method stop() + * @for kity.Timeline + * @description 停止当前时间线 + * + * @grammar stop() => {this} + */ + stop: function() { + this.status = "stoped"; + this.setValue(this.finishValue); + this.rollbacking = false; + /** + * @event stop + * @for kity.Timeline + * @description 停止时间,在时间线停止时触发 + */ + this.fire("stop", new TimelineEvent(this, "stop")); + frame.releaseFrame(this.frame); + return this; + }, + /** + * @private + * + * 播放结束之后的处理 + */ + timeUp: function() { + if (this.repeatOption) { + this.time = 0; + if (this.rollback) { + if (this.rollbacking) { + this.decreaseRepeat(); + this.rollbacking = false; + } else { + this.rollbacking = true; + /** + * @event rollback + * @for kity.Timeline + * @description 回滚事件,在时间线回滚播放开始的时候触发 + */ + this.fire("rollback", new TimelineEvent(this, "rollback")); + } + } else { + this.decreaseRepeat(); + } + if (!this.repeatOption) { + this.finish(); + } else { + /** + * @event repeat + * @for kity.Timeline + * @description 循环事件,在时间线循环播放开始的时候触发 + */ + this.fire("repeat", new TimelineEvent(this, "repeat")); + } + } else { + this.finish(); + } + }, + /** + * @private + * + * 决定播放结束的处理 + */ + finish: function() { + this.setValue(this.finishValue); + this.status = "finished"; + /** + * @event finish + * @for kity.Timeline + * @description 结束事件,在时间线播放结束后触发(包括重复和回滚都结束) + */ + this.fire("finish", new TimelineEvent(this, "finish")); + frame.releaseFrame(this.frame); + }, + /** + * @private + * + * 循环次数递减 + */ + decreaseRepeat: function() { + if (this.repeatOption !== true) { + this.repeatOption--; + } + }, + /** + * @method repeat() + * @for kity.Timeline + * @description 设置时间线的重复选项 + * + * @grammar repeat(repeat, rollback) => {this} + * + * @param {Number|Boolean} repeat + * 是否重复播放,设置为 true 无限循环播放,设置数值则循环指定的次数 + * @param {Boolean} rollback + * 指示是否要回滚播放。 + * 如果设置为真,一次事件到 duration 则一个来回算一次循环次数,否则播放完成一次算一次循环次数 + * + */ + repeat: function(repeat, rollback) { + this.repeatOption = repeat; + this.rollback = rollback; + return this; + } + }); + Timeline.requestFrame = frame.requestFrame; + Timeline.releaseFrame = frame.releaseFrame; + return Timeline; + } +}; + +//src/animate/translateanimator.js +/** + * @fileOverview + * + * 提供让图形移动的动画器 + */ +_p[9] = { + value: function(require) { + var Animator = _p.r(0); + /** + * @class kity.TranslateAnimator + * @base kity.Animator + * @description 提供让图形移动的动画器 + */ + var TranslateAnimator = _p.r(11).createClass("TranslateAnimator", { + base: Animator, + /** + * @constructor + * @for kity.TranslateAnimator + * @grammar new kity.TranslateAnimator(x, y) + * @param {Number} x x 方向上需要移动的距离 + * @param {Number} y y 方向上需要移动的距离 + */ + constructor: function(x, y) { + this.callBase({ + x: 0, + y: 0 + }, { + x: x, + y: y + }, function(target, value, timeline) { + var delta = timeline.getDelta(); + target.translate(delta.x, delta.y); + }); + } + }); + var Shape = _p.r(60); + _p.r(11).extendClass(Shape, { + /** + * @method fxTranslate() + * @for kity.Shape + * @description 让目标以动画平移指定的距离 + * + * @grammar fxTranslate(x, y, duration, easing, delay, callback) => {this} + * + * @param {Number} x x 方向上需要移动的距离 + * @param {Number} y y 方向上需要移动的距离 + * @param {Number|String} duration 动画的播放长度,如 300、"5s"、"0.5min" + * @param {Number|String} delay 动画播放前的延时 + * @param {String|Function} easing 动画播放使用的缓动函数,如 'ease'、'linear'、'swing' + * @param {Function} callback 播放结束之后的回调函数 + */ + fxTranslate: function(x, y, duration, easing, delay, callback) { + return this.animate(new TranslateAnimator(x, y), duration, easing, delay, callback); + } + }); + return TranslateAnimator; + } +}; + +//src/core/browser.js +/** + * @fileOverview + * + * 提供浏览器判断的一些字段 + */ +_p[10] = { + value: function() { + /** + * @class kity.Browser + * @catalog core + * @static + * @description 提供浏览器信息 + */ + var browser = function() { + var agent = navigator.userAgent.toLowerCase(), opera = window.opera, browser; + // 浏览器对象 + browser = { + /** + * @property platform + * @description 获取浏览器所在系统,"Win"->Windows;"Mac"->Mac;"Lux"->Linux + * @type {String} + */ + platform: function(navigator) { + var _p = { + win32: "Win", + macintel: "Mac" + }; + return _p[navigator.platform.toLowerCase()] || "Lux"; + }(navigator), + /** + * 猎豹,区分两种不同内核 + */ + lb: function(agent) { + if (~agent.indexOf("lbbrowser")) { + return ~agent.indexOf("msie") ? "ie" : "chrome"; + } + return false; + }(agent), + /** + * 搜狗 + */ + sg: /se[\s\S]+metasr/.test(agent), + /** + * 百度 + */ + bd: !!~agent.indexOf("bidubrowser"), + /** + * edge浏览器 + */ + edge: !!~agent.indexOf("edge"), + /** + * chrome初始化为false + * @type {Boolean} + */ + chrome: false, + /** + * @property opera + * @for kity.Browser + * @description 判断是否为 Opera 浏览器 + * @type {boolean} + */ + opera: !!opera && opera.version, + /** + * @property webkit + * @for kity.Browser + * @description 判断是否为 Webkit 内核的浏览器 + * @type {boolean} + */ + webkit: agent.indexOf(" applewebkit/") > -1, + /** + * @property mac + * @for kity.Browser + * @description 判断是否为 Mac 下的浏览器 + * @type {boolean} + */ + mac: agent.indexOf("macintosh") > -1 + }; + /** + * @property ie + * @for kity.Browser + * @description 判断是否为 IE 浏览器 + * @type {boolean} + */ + browser.ie = !browser.lb && /(msie\s|trident.*rv:)([\w.]+)/.test(agent); + browser.gecko = navigator.product == "Gecko" && !browser.webkit && !browser.opera && !browser.ie; + var version = 0; + // Internet Explorer 6.0+ + if (browser.ie) { + version = (agent.match(/(msie\s|trident.*rv:)([\w.]+)/)[2] || 0) * 1; + browser.ie11Compat = document.documentMode == 11; + browser.ie9Compat = document.documentMode == 9; + } + // Gecko. + if (browser.gecko) { + var geckoRelease = agent.match(/rv:([\d\.]+)/); + if (geckoRelease) { + geckoRelease = geckoRelease[1].split("."); + version = geckoRelease[0] * 1e4 + (geckoRelease[1] || 0) * 100 + (geckoRelease[2] || 0) * 1; + } + } + // 排除其他chrome内核的浏览器的干扰 + if (/chrome\/(\d+\.\d)/i.test(agent) && !browser.bd && !browser.opera && !browser.lb && !browser.sg && !browser.edge) { + /** + * @property chrome + * @for kity.Browser + * @description 判断是否为 Chrome 浏览器 + * @type {boolean} + */ + browser.chrome = +RegExp["$1"]; + } + if (/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && !/chrome/i.test(agent)) { + browser.safari = +(RegExp["$1"] || RegExp["$2"]); + } + // Opera 9.50+ + if (browser.opera) version = parseFloat(opera.version()); + // WebKit 522+ (Safari 3+) + if (browser.webkit) version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]); + // 搜狗版本号无从得知 + // 猎豹版本号无从得知 + // 百度 + if (browser.bd) version = parseFloat(agent.match(/bidubrowser\/(\d+)/)[1]); + // Opera 9.50+ + if (browser.opera) version = parseFloat(agent.match(/opr\/(\d+)/)[1]); + // edge + if (browser.edge) version = parseFloat(agent.match(/edge\/(\d+)/)[1]); + /** + * @property version + * @for kity.Browser + * @description 获取当前浏览器的版本 + * @type {Number} + */ + browser.version = version; + browser.isCompatible = !browser.mobile && (browser.ie && version >= 6 || browser.gecko && version >= 10801 || browser.opera && version >= 9.5 || browser.air && version >= 1 || browser.webkit && version >= 522 || false); + return browser; + }(); + return browser; + } +}; + +//src/core/class.js +/** + * @fileOverview + * + * 提供 Kity 的 OOP 支持 + */ +_p[11] = { + value: function(require, exports) { + /** + * @class kity.Class + * @catalog core + * @description 所有 kity 类的基类 + * @abstract + */ + function Class() {} + exports.Class = Class; + Class.__KityClassName = "Class"; + /** + * @method base() + * @for kity.Class + * @protected + * @grammar base(name, args...) => {any} + * @description 调用父类指定名称的函数 + * @param {string} name 函数的名称 + * @param {parameter} args... 传递给父类函数的参数 + * + * @example + * + * ```js + * var Person = kity.createClass('Person', { + * toString: function() { + * return 'I am a person'; + * } + * }); + * + * var Male = kity.createClass('Male', { + * base: Person, + * + * toString: function() { + * return 'I am a man'; + * }, + * + * speak: function() { + * return this.base('toString') + ',' + this.toString(); + * } + * }) + * ``` + */ + Class.prototype.base = function(name) { + var caller = arguments.callee.caller; + var method = caller.__KityMethodClass.__KityBaseClass.prototype[name]; + return method.apply(this, Array.prototype.slice.call(arguments, 1)); + }; + /** + * @method callBase() + * @for kity.Class + * @protected + * @grammar callBase(args...) => {any} + * @description 调用父类同名函数 + * @param {parameter} args... 传递到父类同名函数的参数 + * + * @example + * + * ```js + * var Animal = kity.createClass('Animal', { + * constructor: function(name) { + * this.name = name; + * }, + * toString: function() { + * return 'I am an animal name ' + this.name; + * } + * }); + * + * var Dog = kity.createClass('Dog', { + * constructor: function(name) { + * this.callBase(name); + * }, + * toString: function() { + * return this.callBase() + ', a dog'; + * } + * }); + * + * var dog = new Dog('Dummy'); + * console.log(dog.toString()); // "I am an animal name Dummy, a dog"; + * ``` + */ + Class.prototype.callBase = function() { + var caller = arguments.callee.caller; + var method = caller.__KityMethodClass.__KityBaseClass.prototype[caller.__KityMethodName]; + return method.apply(this, arguments); + }; + Class.prototype.mixin = function(name) { + var caller = arguments.callee.caller; + var mixins = caller.__KityMethodClass.__KityMixins; + if (!mixins) { + return this; + } + var method = mixins[name]; + return method.apply(this, Array.prototype.slice.call(arguments, 1)); + }; + Class.prototype.callMixin = function() { + var caller = arguments.callee.caller; + var methodName = caller.__KityMethodName; + var mixins = caller.__KityMethodClass.__KityMixins; + if (!mixins) { + return this; + } + var method = mixins[methodName]; + if (methodName == "constructor") { + for (var i = 0, l = method.length; i < l; i++) { + method[i].call(this); + } + return this; + } else { + return method.apply(this, arguments); + } + }; + /** + * @method pipe() + * @for kity.Class + * @grammar pipe() => {this} + * @description 以当前对象为上线文以及管道函数的第一个参数,执行一个管道函数 + * @param {Function} fn 进行管道操作的函数 + * + * @example + * + * ```js + * var rect = new kity.Rect().pipe(function() { + * this.setWidth(500); + * this.setHeight(300); + * }); + * ``` + */ + Class.prototype.pipe = function(fn) { + if (typeof fn == "function") { + fn.call(this, this); + } + return this; + }; + /** + * @method getType() + * @for kity.Class + * @grammar getType() => {string} + * @description 获得对象的类型 + * + * @example + * + * ```js + * var rect = new kity.Rect(); + * var circle = new kity.Circle(); + * + * console.log(rect.getType()); // "Rect" + * console.log(rect.getType()); // "Circle" + * ``` + */ + Class.prototype.getType = function() { + return this.__KityClassName; + }; + /** + * @method getClass() + * @for kity.Class + * @grammar getClass() => {Class} + * @description 获得对象的类 + * + * @example + * + * ```js + * var rect = new kity.Rect(); + * + * console.log(rect.getClass() === kity.Rect); // true + * console.log(rect instanceof kity.Rect); // true + * ``` + */ + Class.prototype.getClass = function() { + return this.constructor; + }; + // 检查基类是否调用了父类的构造函数 + // 该检查是弱检查,假如调用的代码被注释了,同样能检查成功(这个特性可用于知道建议调用,但是出于某些原因不想调用的情况) + function checkBaseConstructorCall(targetClass, classname) { + var code = targetClass.toString(); + if (!/this\.callBase/.test(code)) { + throw new Error(classname + " : 类构造函数没有调用父类的构造函数!为了安全,请调用父类的构造函数"); + } + } + var KITY_INHERIT_FLAG = "__KITY_INHERIT_FLAG_" + +new Date(); + function inherit(constructor, BaseClass, classname) { + var KityClass = eval("(function " + classname + "( __inherit__flag ) {" + "if( __inherit__flag != KITY_INHERIT_FLAG ) {" + "KityClass.__KityConstructor.apply(this, arguments);" + "}" + "this.__KityClassName = KityClass.__KityClassName;" + "})"); + KityClass.__KityConstructor = constructor; + KityClass.prototype = new BaseClass(KITY_INHERIT_FLAG); + for (var methodName in BaseClass.prototype) { + if (BaseClass.prototype.hasOwnProperty(methodName) && methodName.indexOf("__Kity") !== 0) { + KityClass.prototype[methodName] = BaseClass.prototype[methodName]; + } + } + KityClass.prototype.constructor = KityClass; + return KityClass; + } + function mixin(NewClass, mixins) { + if (false === mixins instanceof Array) { + return NewClass; + } + var i, length = mixins.length, proto, method; + NewClass.__KityMixins = { + constructor: [] + }; + for (i = 0; i < length; i++) { + proto = mixins[i].prototype; + for (method in proto) { + if (false === proto.hasOwnProperty(method) || method.indexOf("__Kity") === 0) { + continue; + } + if (method === "constructor") { + // constructor 特殊处理 + NewClass.__KityMixins.constructor.push(proto[method]); + } else { + NewClass.prototype[method] = NewClass.__KityMixins[method] = proto[method]; + } + } + } + return NewClass; + } + function extend(BaseClass, extension) { + if (extension.__KityClassName) { + extension = extension.prototype; + } + for (var methodName in extension) { + if (extension.hasOwnProperty(methodName) && methodName.indexOf("__Kity") && methodName != "constructor") { + var method = BaseClass.prototype[methodName] = extension[methodName]; + method.__KityMethodClass = BaseClass; + method.__KityMethodName = methodName; + } + } + return BaseClass; + } + /** + * @method kity.createClass() + * @grammar kity.createClass(classname, defines) => {Class} + * @description 创建一个类 + * @param {string} classname 类名,用于调试的时候查看,可选 + * @param {object} defines 类定义 + * defines.base {Class} + * 定义的类的基类,如果不配置,则表示基类为 kity.Class + * defines.mixins {Class[]} + * 定义的类要融合的类列表 + * defines.constructor {Function} + * 定义类的构造函数,如果父类显式定义了构造函数,需要在构造函数中使用 callBase() 方法调用父类的构造函数 + * defines.* {Function} + * 定义类的其它函数 + * + * @example 创建一个类 + * + * ```js + * var Animal = kity.createClass('Animal', { + * constructor: function(name) { + * this.name = name; + * }, + * toString: function() { + * return this.name; + * } + * }); + * + * var a = new Animal('kity'); + * console.log(a.toString()); // "kity" + * ``` + * + * @example 继承一个类 + * + * ```js + * var Cat = kity.createClass('Cat', { + * base: Animal, + * constructor: function(name, color) { + * // 调用父类构造函数 + * this.callBase(name); + * }, + * toString: function() { + * return 'A ' + this.color + ' cat, ' + this.callBase(); + * } + * }); + * + * var cat = new Cat('kity', 'black'); + * console.log(cat.toString()); // "A black cat, kity" + * ``` + * + * @example 混合类的能力 + * ```js + * var Walkable = kity.createClass('Walkable', { + * constructor: function() { + * this.speed = 'fast'; + * }, + * walk: function() { + * console.log('I am walking ' + this.speed); + * } + * }); + * + * var Dog = kity.createClass('Dog', { + * base: Animal, + * mixins: [Walkable], + * constructor: function(name) { + * this.callBase(name); + * this.callMixins(); + * } + * }); + * + * var dog = new Dog('doggy'); + * console.log(dog.toString() + ' say:'); + * dog.walk(); + * ``` + */ + exports.createClass = function(classname, defines) { + var constructor, NewClass, BaseClass; + if (arguments.length === 1) { + defines = arguments[0]; + classname = "AnonymousClass"; + } + BaseClass = defines.base || Class; + if (defines.hasOwnProperty("constructor")) { + constructor = defines.constructor; + if (BaseClass != Class) { + checkBaseConstructorCall(constructor, classname); + } + } else { + constructor = function() { + this.callBase.apply(this, arguments); + this.callMixin.apply(this, arguments); + }; + } + NewClass = inherit(constructor, BaseClass, classname); + NewClass = mixin(NewClass, defines.mixins); + NewClass.__KityClassName = constructor.__KityClassName = classname; + NewClass.__KityBaseClass = constructor.__KityBaseClass = BaseClass; + NewClass.__KityMethodName = constructor.__KityMethodName = "constructor"; + NewClass.__KityMethodClass = constructor.__KityMethodClass = NewClass; + // 下面这些不需要拷贝到原型链上 + delete defines.mixins; + delete defines.constructor; + delete defines.base; + NewClass = extend(NewClass, defines); + return NewClass; + }; + /** + * @method kity.extendClass() + * @grammar kity.extendClass(clazz, extension) => {Class} + * @description 拓展一个已有的类 + * + * @example + * + * ```js + * kity.extendClass(Dog, { + * spark: function() { + * console.log('wao wao wao!'); + * } + * }); + * + * new Dog().spark(); // "wao wao wao!"; + * ``` + */ + exports.extendClass = extend; + } +}; + +//src/core/utils.js +/** + * @fileOverview + * + * 一些常用的工具方法 + */ +_p[12] = { + value: function() { + /** + * @class kity.Utils + * @catalog core + * @static + * @description 提供常用的工具方法 + */ + var utils = { + /** + * @method each() + * @for kity.Utils + * @grammar each(obj, interator, context) + * @param {Object|Array} obj 要迭代的对象或数组 + * @param {Function} iterator 迭代函数 + * @param {Any} context 迭代函数的上下文 + * + * @example 迭代数组 + * + * ```js + * kity.Utils.each([1, 2, 3, 4, 5], function(value, index, array) { + * console.log(value, index); + * }); + * // 1, 0 + * // 2, 1 + * // 3, 2 + * // 4, 3 + * // 5, 4 + * ``` + * + * @example 迭代对象 + * + * ```js + * var obj = { + * name: 'kity', + * version: '1.2.1' + * }; + * var param = []; + * kity.Utils.each(obj, function(value, key, obj) { + * param.push(key + '=' + value); + * }); + * console.log(param.join('&')); // "name=kity&version=1.2.1" + * ``` + */ + each: function each(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; + } + } + } + } + }, + /** + * @method extend() + * @for kity.Utils + * @grammar extend(target, sources..., notCover) => {object} + * @description 把源对象的属性合并到目标对象上 + * @param {object} target 目标对象 + * @param {parameter} sources 源对象 + * @param {boolean} notCover 是否不要覆盖源对象已有的属性 + * + * @example + * + * ```js + * var a = { + * key1: 'a1', + * key2: 'a2' + * }; + * + * var b = { + * key2: 'b2', + * key3: 'b3' + * }; + * + * var c = { + * key4: 'c4' + * }; + * + * var d = kity.extend(a, b, c); + * + * console.log(d === a); // true + * console.log(a); // {key1: 'a1', key2: 'b2', key3: 'b3', key4: 'c4'} + * ``` + */ + extend: function extend(t) { + 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; + }, + /** + * @method deepExtend() + * @for kity.Utils + * @grammar deepExtend(target, sources..., notCover) + * @description 把源对象的属性合并到目标对象上,如果属性是对象,会递归合并 + * @param {object} target 目标对象 + * @param {parameter} sources 源对象 + * @param {boolean} notCover 是否不要覆盖源对象已有的属性 + */ + deepExtend: 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)) { + if (this.isObject(t[k]) && this.isObject(x[k])) { + this.deepExtend(t[k], x[k], notCover); + } else { + t[k] = x[k]; + } + } + } + } + return t; + }, + /** + * @method clone() + * @for kity.Utils + * @grammar clone(obj) => {object} + * @description 返回一个对象的克隆副本(非深度复制) + * @param {object} obj 要克隆的对象 + * + * @example + * + * ```js + * var source = { + * key1: { + * key2: 'value2' + * }, + * key3: 'value3' + * }; + * + * var target = kity.Utils.clone(source); + * + * console.log(target === source); // false + * console.log(target.key1 === source.key1); // true + * console.log(target.key3 === source.key3); // true + * ``` + */ + clone: function clone(obj) { + var cloned = {}; + for (var m in obj) { + if (obj.hasOwnProperty(m)) { + cloned[m] = obj[m]; + } + } + return cloned; + }, + /** + * @method copy() + * @for kity.Utils + * @grammar copy(obj) => {object} + * @description 返回一个对象的拷贝副本(深度复制) + * @param {object} obj 要拷贝的对象 + * + * @example + * + * ```js + * var source = { + * key1: { + * key2: 'value2' + * }, + * key3: 'value3' + * }; + * + * var target = kity.Utils.copy(source); + * + * console.log(target === source); // false + * console.log(target.key1 === source.key1); // false + * console.log(target.key3 === source.key3); // true,因为是值类型 + * ``` + */ + copy: function copy(obj) { + if (typeof obj !== "object") return obj; + if (typeof obj === "function") return null; + return JSON.parse(JSON.stringify(obj)); + }, + queryPath: function(path, obj) { + var arr = path.split("."); + var i = 0, tmp = obj, l = arr.length; + while (i < l) { + if (arr[i] in tmp) { + tmp = tmp[arr[i]]; + i++; + if (i >= l || tmp === undefined) { + return tmp; + } + } else { + return undefined; + } + } + }, + getValue: function(value, defaultValue) { + return value !== undefined ? value : defaultValue; + }, + /** + * @method flatten() + * @for kity.Utils + * @grammar flatten(arr) => {Array} + * @description 返回给定数组的扁平化版本 + * @param {Array} arr 要扁平化的数组 + * + * @example + * + * ```js + * var flattened = kity.Utils.flatten([[1, 2], [2, 3], [[4, 5], [6, 7]]]); + * console.log(flattened); // [1, 2, 3, 4, 5, 6, 7]; + * ``` + */ + flatten: function flatten(arr) { + var result = [], length = arr.length, i; + for (i = 0; i < length; i++) { + if (arr[i] instanceof Array) { + result = result.concat(utils.flatten(arr[i])); + } else { + result.push(arr[i]); + } + } + return result; + }, + /** + * @method paralle() + * @for kity.Utils + * @grammar paralle() => {Any} + * + * @description 平行地对 v1 和 v2 进行指定的操作 + * + * 如果 v1 是数字,那么直接进行 op 操作 + * 如果 v1 是对象,那么返回一个对象,其元素是 v1 和 v2 同键值的每个元素平行地进行 op 操作的结果 + * 如果 v1 是数组,那么返回一个数组,其元素是 v1 和 v2 同索引的每个元素平行地进行 op 操作的结果 + * + * @param {Number|Object|Array} v1 第一个操作数 + * @param {Number|Object|Array} v2 第二个操作数 + * @param {Function} op 操作函数 + * + * + * + * @example + * + * ```js + * var a = { + * value1: 1, + * value2: 2, + * value3: [3, 4, 5] + * }; + * + * var b = { + * value1: 2, + * value2: 3, + * value3: [4, 5, 6] + * }; + * + * var c = kity.Utils.paralle(a, b, function(v1, v2) { + * return v1 + v2; + * }); + * + * console.log(c.value1); // 3 + * console.log(c.value2); // 5 + * console.log(c.value3); // [7, 9, 11] + * + * ``` + */ + paralle: function paralle(v1, v2, op) { + var Class, field, index, name, value; + // 数组 + if (v1 instanceof Array) { + value = []; + for (index = 0; index < v1.length; index++) { + value.push(utils.paralle(v1[index], v2[index], op)); + } + return value; + } + // 对象 + if (v1 instanceof Object) { + // 如果值是一个支持原始表示的实例,获取其原始表示 + Class = v1.getClass && v1.getClass(); + if (Class && Class.parse) { + v1 = v1.valueOf(); + v2 = v2.valueOf(); + value = utils.paralle(v1, v2, op); + value = Class.parse(value); + } else { + value = {}; + for (name in v1) { + if (v1.hasOwnProperty(name) && v2.hasOwnProperty(name)) { + value[name] = utils.paralle(v1[name], v2[name], op); + } + } + } + return value; + } + // 是否数字 + if (false === isNaN(parseFloat(v1))) { + return op(v1, v2); + } + return value; + }, + /** + * 创建 op 操作的一个平行化版本 + */ + parallelize: function parallelize(op) { + return function(v1, v2) { + return utils.paralle(v1, v2, op); + }; + } + }; + /** + * @method isString() + * @for kity.Utils + * @grammar isString(unknown) => {boolean} + * @description 判断一个值是否为字符串类型 + * @param {any} unknown 要判断的值 + */ + /** + * @method isFunction() + * @for kity.Utils + * @grammar isFunction(unknown) => {boolean} + * @description 判断一个值是否为函数类型 + * @param {any} unknown 要判断的值 + */ + /** + * @method isArray() + * @for kity.Utils + * @grammar isArray(unknown) => {boolean} + * @description 判断一个值是否为数组类型 + * @param {any} unknown 要判断的值 + */ + /** + * @method isNumber() + * @for kity.Utils + * @grammar isNumber(unknown) => {boolean} + * @description 判断一个值是否为数字类型 + * @param {any} unknown 要判断的值 + */ + /** + * @method isRegExp() + * @for kity.Utils + * @grammar isRegExp(unknown) => {boolean} + * @description 判断一个值是否为正则表达式类型 + * @param {any} unknown 要判断的值 + */ + /** + * @method isObject() + * @for kity.Utils + * @grammar isObject(unknown) => {boolean} + * @description 判断一个值是否为对象类型 + * @param {any} unknown 要判断的值 + */ + /** + * @method isBoolean() + * @for kity.Utils + * @grammar isBoolean(unknown) => {boolean} + * @description 判断一个值是否为布尔类型 + * @param {any} unknown 要判断的值 + */ + utils.each([ "String", "Function", "Array", "Number", "RegExp", "Object", "Boolean" ], function(v) { + utils["is" + v] = function typeCheck(obj) { + return Object.prototype.toString.apply(obj) == "[object " + v + "]"; + }; + }); + return utils; + } +}; + +//src/filter/effect/colormatrixeffect.js +/** + * 颜色矩阵运算效果封装 + */ +_p[13] = { + value: function(require, exports, module) { + var Effect = _p.r(16), Utils = _p.r(12); + var ColorMatrixEffect = _p.r(11).createClass("ColorMatrixEffect", { + base: Effect, + constructor: function(type, input) { + this.callBase(Effect.NAME_COLOR_MATRIX); + this.set("type", Utils.getValue(type, ColorMatrixEffect.TYPE_MATRIX)); + this.set("in", Utils.getValue(input, Effect.INPUT_SOURCE_GRAPHIC)); + } + }); + Utils.extend(ColorMatrixEffect, { + // 类型常量 + TYPE_MATRIX: "matrix", + TYPE_SATURATE: "saturate", + TYPE_HUE_ROTATE: "hueRotate", + TYPE_LUMINANCE_TO_ALPHA: "luminanceToAlpha", + // 矩阵常量 + MATRIX_ORIGINAL: "10000010000010000010".split("").join(" "), + MATRIX_EMPTY: "00000000000000000000".split("").join(" ") + }); + return ColorMatrixEffect; + } +}; + +//src/filter/effect/compositeeffect.js +/** + * 高斯模糊效果封装 + */ +_p[14] = { + value: function(require, exports, module) { + var Effect = _p.r(16), Utils = _p.r(12); + var CompositeEffect = _p.r(11).createClass("CompositeEffect", { + base: Effect, + constructor: function(operator, input, input2) { + this.callBase(Effect.NAME_COMPOSITE); + this.set("operator", Utils.getValue(operator, CompositeEffect.OPERATOR_OVER)); + if (input) { + this.set("in", input); + } + if (input2) { + this.set("in2", input2); + } + } + }); + Utils.extend(CompositeEffect, { + // operator 常量 + OPERATOR_OVER: "over", + OPERATOR_IN: "in", + OPERATOR_OUT: "out", + OPERATOR_ATOP: "atop", + OPERATOR_XOR: "xor", + OPERATOR_ARITHMETIC: "arithmetic" + }); + return CompositeEffect; + } +}; + +//src/filter/effect/convolvematrixeffect.js +/** + * 像素级别的矩阵卷积运算效果封装 + */ +_p[15] = { + value: function(require, exports, module) { + var Effect = _p.r(16), Utils = _p.r(12); + var ConvolveMatrixEffect = _p.r(11).createClass("ConvolveMatrixEffect", { + base: Effect, + constructor: function(edgeMode, input) { + this.callBase(Effect.NAME_CONVOLVE_MATRIX); + this.set("edgeMode", Utils.getValue(edgeMode, ConvolveMatrixEffect.MODE_DUPLICATE)); + this.set("in", Utils.getValue(input, Effect.INPUT_SOURCE_GRAPHIC)); + } + }); + Utils.extend(ConvolveMatrixEffect, { + MODE_DUPLICATE: "duplicate", + MODE_WRAP: "wrap", + MODE_NONE: "none" + }); + return ConvolveMatrixEffect; + } +}; + +//src/filter/effect/effect.js +/* + * 效果类 + * 该类型的对象不存储任何内部属性, 所有操作都是针对该类对象所维护的节点进行的 + */ +_p[16] = { + value: function(require, exports, module) { + var svg = _p.r(67), Effect = _p.r(11).createClass("Effect", { + constructor: function(type) { + this.node = svg.createNode(type); + }, + getId: function() { + return this.node.id; + }, + setId: function(id) { + this.node.id = id; + return this; + }, + set: function(key, value) { + this.node.setAttribute(key, value); + return this; + }, + get: function(key) { + return this.node.getAttribute(key); + }, + getNode: function() { + return this.node; + }, + // 返回该效果的result + toString: function() { + return this.node.getAttribute("result") || ""; + } + }); + _p.r(12).extend(Effect, { + // 特效名称常量 + NAME_GAUSSIAN_BLUR: "feGaussianBlur", + NAME_OFFSET: "feOffset", + NAME_COMPOSITE: "feComposite", + NAME_COLOR_MATRIX: "feColorMatrix", + NAME_CONVOLVE_MATRIX: "feConvolveMatrix", + // 输入常量 + INPUT_SOURCE_GRAPHIC: "SourceGraphic", + INPUT_SOURCE_ALPHA: "SourceAlpha", + INPUT_BACKGROUND_IMAGE: "BackgroundImage", + INPUT_BACKGROUND_ALPHA: "BackgroundAlpha", + INPUT_FILL_PAINT: "FillPaint", + INPUT_STROKE_PAINT: "StrokePaint" + }); + return Effect; + } +}; + +//src/filter/effect/gaussianblureffect.js +/** + * 高斯模糊效果封装 + */ +_p[17] = { + value: function(require, exports, module) { + var Effect = _p.r(16), Utils = _p.r(12); + return _p.r(11).createClass("GaussianblurEffect", { + base: Effect, + constructor: function(stdDeviation, input) { + this.callBase(Effect.NAME_GAUSSIAN_BLUR); + this.set("stdDeviation", Utils.getValue(stdDeviation, 1)); + this.set("in", Utils.getValue(input, Effect.INPUT_SOURCE_GRAPHIC)); + } + }); + } +}; + +//src/filter/effect/offseteffect.js +/** + * 偏移效果封装 + */ +_p[18] = { + value: function(require, exports, module) { + var Effect = _p.r(16), Utils = _p.r(12); + return _p.r(11).createClass("OffsetEffect", { + base: Effect, + constructor: function(dx, dy, input) { + this.callBase(Effect.NAME_OFFSET); + this.set("dx", Utils.getValue(dx, 0)); + this.set("dy", Utils.getValue(dy, 0)); + this.set("in", Utils.getValue(input, Effect.INPUT_SOURCE_GRAPHIC)); + } + }); + } +}; + +//src/filter/effectcontainer.js +/* + * Effect所用的container + */ +_p[19] = { + value: function(require) { + return _p.r(11).createClass("EffectContainer", { + base: _p.r(29), + addEffect: function(point, pos) { + return this.addItem.apply(this, arguments); + }, + prependEffect: function() { + return this.prependItem.apply(this, arguments); + }, + appendEffect: function() { + return this.appendItem.apply(this, arguments); + }, + removeEffect: function(pos) { + return this.removeItem.apply(this, arguments); + }, + addEffects: function() { + return this.addItems.apply(this, arguments); + }, + setEffects: function() { + return this.setItems.apply(this, arguments); + }, + getEffect: function() { + return this.getItem.apply(this, arguments); + }, + getEffects: function() { + return this.getItems.apply(this, arguments); + }, + getFirstEffect: function() { + return this.getFirstItem.apply(this, arguments); + }, + getLastEffect: function() { + return this.getLastItem.apply(this, arguments); + }, + handleAdd: function(effectItem, pos) { + var count = this.getEffects().length, nextEffectItem = this.getItem(pos + 1); + // 最后一个节点, 直接追加 + if (count === pos + 1) { + this.node.appendChild(effectItem.getNode()); + return; + } + this.node.insertBefore(effectItem.getNode(), nextEffectItem.getNode()); + } + }); + } +}; + +//src/filter/filter.js +/** + * Filter 基类 + */ +_p[20] = { + value: function(require, exports, module) { + var svg = _p.r(67); + var Class = _p.r(11); + var Filter = Class.createClass("Filter", { + mixins: [ _p.r(19) ], + constructor: function(x, y, width, height) { + this.node = svg.createNode("filter"); + if (x !== undefined) { + this.set("x", x); + } + if (y !== undefined) { + this.set("y", y); + } + if (width !== undefined) { + this.set("width", width); + } + if (height !== undefined) { + this.set("height", height); + } + }, + getId: function() { + return this.id; + }, + setId: function(id) { + this.node.id = id; + return this; + }, + set: function(key, value) { + this.node.setAttribute(key, value); + return this; + }, + get: function(key) { + return this.node.getAttribute(key); + }, + getNode: function() { + return this.node; + } + }); + var Shape = _p.r(60); + Class.extendClass(Shape, { + applyFilter: function(filter) { + var filterId = filter.get("id"); + if (filterId) { + this.node.setAttribute("filter", "url(#" + filterId + ")"); + } + return this; + } + }); + return Filter; + } +}; + +//src/filter/gaussianblurfilter.js +/* + * 高斯模糊滤镜 + */ +_p[21] = { + value: function(require, exports, module) { + var GaussianblurEffect = _p.r(17); + return _p.r(11).createClass("GaussianblurFilter", { + base: _p.r(20), + constructor: function(stdDeviation) { + this.callBase(); + this.addEffect(new GaussianblurEffect(stdDeviation)); + } + }); + } +}; + +//src/filter/projectionfilter.js +/* + * 投影滤镜 + */ +_p[22] = { + value: function(require, exports, module) { + var GaussianblurEffect = _p.r(17), Effect = _p.r(16), ColorMatrixEffect = _p.r(13), Color = _p.r(28), Utils = _p.r(12), CompositeEffect = _p.r(14), OffsetEffect = _p.r(18); + return _p.r(11).createClass("ProjectionFilter", { + base: _p.r(20), + constructor: function(stdDeviation, dx, dy) { + this.callBase(); + this.gaussianblurEffect = new GaussianblurEffect(stdDeviation, Effect.INPUT_SOURCE_ALPHA); + this.gaussianblurEffect.set("result", "gaussianblur"); + this.addEffect(this.gaussianblurEffect); + this.offsetEffect = new OffsetEffect(dx, dy, this.gaussianblurEffect); + this.offsetEffect.set("result", "offsetBlur"); + this.addEffect(this.offsetEffect); + this.colorMatrixEffect = new ColorMatrixEffect(ColorMatrixEffect.TYPE_MATRIX, this.offsetEffect); + this.colorMatrixEffect.set("values", ColorMatrixEffect.MATRIX_ORIGINAL); + this.colorMatrixEffect.set("result", "colorOffsetBlur"); + this.addEffect(this.colorMatrixEffect); + this.compositeEffect = new CompositeEffect(CompositeEffect.OPERATOR_OVER, Effect.INPUT_SOURCE_GRAPHIC, this.colorMatrixEffect); + this.addEffect(this.compositeEffect); + }, + // 设置投影颜色 + setColor: function(color) { + var matrix = null, originMatrix = null, colorValue = []; + if (Utils.isString(color)) { + color = Color.parse(color); + } + if (!color) { + return this; + } + matrix = ColorMatrixEffect.MATRIX_EMPTY.split(" "); + colorValue.push(color.get("r")); + colorValue.push(color.get("g")); + colorValue.push(color.get("b")); + // rgb 分量更改 + for (var i = 0, len = colorValue.length; i < len; i++) { + matrix[i * 5 + 3] = colorValue[i] / 255; + } + // alpha 分量更改 + matrix[18] = color.get("a"); + this.colorMatrixEffect.set("values", matrix.join(" ")); + return this; + }, + // 设置投影透明度 + setOpacity: function(opacity) { + var matrix = this.colorMatrixEffect.get("values").split(" "); + matrix[18] = opacity; + this.colorMatrixEffect.set("values", matrix.join(" ")); + return this; + }, + // 设置阴影偏移量 + setOffset: function(dx, dy) { + this.setOffsetX(dx); + this.setOffsetY(dy); + }, + setOffsetX: function(dx) { + this.offsetEffect.set("dx", dx); + }, + setOffsetY: function(dy) { + this.offsetEffect.set("dy", dy); + }, + setDeviation: function(deviation) { + this.gaussianblurEffect.set("stdDeviation", deviation); + } + }); + } +}; + +//src/graphic/bezier.js +/** + * @fileOverview + * + * 贝塞尔曲线 + */ +_p[23] = { + value: function(require, exports, module) { + /** + * @class kity.Bezier + * @mixins kity.PointContainer + * @base kity.Path + * @description 绘制和使用贝塞尔曲线。贝塞尔曲线作为一个贝塞尔点的容器,任何贝塞尔点的改变都会更改贝塞尔曲线的外观 + */ + return _p.r(11).createClass("Bezier", { + mixins: [ _p.r(51) ], + base: _p.r(46), + /** + * @constructor + * @for kity.Bezier + * + * @grammar new kity.Bezier(bezierPoints) + * + * @param {kity.BezierPoints[]} bezierPoints 贝塞尔点集合,每个元素应该是 {kity.BezierPoint} 类型 + * + * @example + * + * ```js + * var bezier = new kity.Bezier([ + * new kity.BezierPoint(0, 0).setForward(100, 0), + * new kity.BezierPoint(100, 100).setBackward(100, 0) + * ]); + * ``` + */ + constructor: function(bezierPoints) { + this.callBase(); + bezierPoints = bezierPoints || []; + this.changeable = true; + this.setBezierPoints(bezierPoints); + }, + /** + * @method getBezierPoints() + * @for kity.Bezier + * @description 返回当前贝塞尔曲线的贝塞尔点集合 + * + * @grammar getBezierPoints() => {kity.BezierPoints[]} + * + */ + getBezierPoints: function() { + return this.getPoints(); + }, + /** + * @method setBezierPoints() + * @for kity.Bezier + * @description 设置当前贝塞尔曲线的贝塞尔点集合 + * + * @grammar setBeizerPoints(bezierPoints) => {this} + * + * @param {kity.BezierPoint[]} bezierPoints 贝塞尔点集合 + */ + setBezierPoints: function(bezierPoints) { + return this.setPoints(bezierPoints); + }, + //当点集合发生变化时采取的动作 + onContainerChanged: function() { + if (this.changeable) { + this.update(); + } + }, + update: function() { + var drawer = null, bezierPoints = this.getBezierPoints(); + //单独的一个点不画任何图形 + if (bezierPoints.length < 2) { + return; + } + drawer = this.getDrawer(); + drawer.clear(); + var vertex = bezierPoints[0].getVertex(), forward = null, backward = null; + drawer.moveTo(vertex.x, vertex.y); + for (var i = 1, len = bezierPoints.length; i < len; i++) { + vertex = bezierPoints[i].getVertex(); + backward = bezierPoints[i].getBackward(); + forward = bezierPoints[i - 1].getForward(); + drawer.bezierTo(forward.x, forward.y, backward.x, backward.y, vertex.x, vertex.y); + } + return this; + } + }); + } +}; + +//src/graphic/bezierpoint.js +/** + * @fileOverview + * + * 表示一个贝塞尔点 + */ +_p[24] = { + value: function(require, exports, module) { + var ShapePoint = _p.r(63); + var Vector = _p.r(73); + /** + * @class kity.BezierPoint + * + * @description 表示一个贝塞尔点 + * 一个贝塞尔点由顶点坐标(曲线经过的点)、前方控制点、后方控制点表示 + */ + var BezierPoint = _p.r(11).createClass("BezierPoint", { + /** + * @constructor + * @for kity.BezierPoint + * + * @description 创建一个具有默认顶点坐标的贝塞尔点,两个控制点的坐标和顶点一致 + * + * @param {Number} x 顶点的 x 坐标 + * @param {Number} y 顶点的 y 坐标 + * @param {Boolean} isSmooth 指示当前贝塞尔点是否光滑,光滑会约束顶点和两个控制点共线 + */ + constructor: function(x, y, isSmooth) { + //顶点 + this.vertex = new ShapePoint(x, y); + //控制点 + this.forward = new ShapePoint(x, y); + this.backward = new ShapePoint(x, y); + //是否平滑 + this.setSmooth(isSmooth === undefined || isSmooth); + this.setSymReflaction(true); + }, + /** + * @method clone() + * @for kity.BezierPoint + * @description 返回贝塞尔点的一份拷贝 + * + * @grammar clone() => {kity.BezierPoint} + */ + clone: function() { + var newPoint = new BezierPoint(), tmp = null; + tmp = this.getVertex(); + newPoint.setVertex(tmp.x, tmp.y); + tmp = this.getForward(); + newPoint.setForward(tmp.x, tmp.y); + tmp = this.getBackward(); + newPoint.setBackward(tmp.x, tmp.y); + newPoint.setSymReflaction(this.isSymReflaction); + newPoint.setSmooth(this.isSmooth()); + return newPoint; + }, + /** + * @method setVertex() + * @for kity.BezierPoint + * @description 设置贝塞尔点的顶点坐标,注意,控制点的坐标不会跟着变化。希望控制点的坐标跟着变化,请用 moveTo() 方法 + * + * @grammar setVertex(x, y) => {this} + * + * @param {Number} x 顶点的 x 坐标 + * @param {Number} y 顶点的 y 坐标 + */ + setVertex: function(x, y) { + this.vertex.setPoint(x, y); + this.update(); + return this; + }, + /** + * @method moveTo() + * @for kity.BezierPoint + * @description 同步移动整个贝塞尔点,使顶点的移动到指定的坐标中。控制点的位置相对顶点坐标固定。 + * + * @grammar moveTo() => {this} + * + * @param {Number} x 顶点的目标 x 坐标 + * @param {Number} y 顶点的目标 y 坐标 + * + */ + moveTo: function(x, y) { + var oldForward = this.forward.getPoint(), oldBackward = this.backward.getPoint(), oldVertex = this.vertex.getPoint(), //移动距离 + distance = { + left: x - oldVertex.x, + top: y - oldVertex.y + }; + // 更新 + this.forward.setPoint(oldForward.x + distance.left, oldForward.y + distance.top); + this.backward.setPoint(oldBackward.x + distance.left, oldBackward.y + distance.top); + this.vertex.setPoint(x, y); + this.update(); + }, + /** + * @method setForward() + * @for kity.BezierPoint + * @description 设置前方控制点的位置,如果贝塞尔点光滑,后方控制点会跟着联动 + * + * @grammar setForward(x, y) => {this} + * + * @param {Number} x 前方控制点的 x 坐标 + * @param {Number} y 前方控制点的 y 坐标 + */ + setForward: function(x, y) { + this.forward.setPoint(x, y); + //更新后置点 + if (this.smooth) { + this.updateAnother(this.forward, this.backward); + } + this.update(); + this.lastControlPointSet = this.forward; + return this; + }, + /** + * @method setBackward() + * @for kity.BezierPoint + * @description 设置后方控制点的位置,如果贝塞尔点光滑,前方控制点会跟着联动 + * + * @grammar setBackward(x, y) => {this} + * + * @param {Number} x 后方控制点的 x 坐标 + * @param {Number} y 后方控制点的 y 坐标 + */ + setBackward: function(x, y) { + this.backward.setPoint(x, y); + //更新前置点 + if (this.smooth) { + this.updateAnother(this.backward, this.forward); + } + this.update(); + this.lastControlPointSet = this.backward; + return this; + }, + /** + * @method setSymReflaction() + * @for kity.BezierPoint + * @description 设定是否镜像两个控制点的位置 + * + * @grammar setSymReflaction(value) => {this} + * + * @param {boolean} value 如果设置为 true,且贝塞尔点光滑,两个控制点离顶点的距离相等 + */ + setSymReflaction: function(value) { + this.symReflaction = value; + if (this.smooth) this.setSmooth(true); + return this; + }, + /** + * @method isSymReflaction() + * @for kity.BezierPoint + * @description 当前贝塞尔点的两个控制点是否被镜像约束 + * + * @grammar isSymReflaction() => {boolean} + */ + isSymReflaction: function() { + return this.symReflaction; + }, + /** + * @private + * + * 根据前方控制点或后方控制点更新另一方 + */ + updateAnother: function(p, q) { + var v = this.getVertex(), pv = Vector.fromPoints(p.getPoint(), v), vq = Vector.fromPoints(v, q.getPoint()); + vq = pv.normalize(this.isSymReflaction() ? pv.length() : vq.length()); + q.setPoint(v.x + vq.x, v.y + vq.y); + return this; + }, + /** + * @method setSmooth() + * @for kity.BezierPoint + * @description 设置贝塞尔点是否光滑,光滑会约束顶点和两个控制点共线 + * + * @param {Boolean} isSmooth 设置为 true 让贝塞尔点光滑 + */ + setSmooth: function(isSmooth) { + var lc; + this.smooth = !!isSmooth; + if (this.smooth && (lc = this.lastControlPointSet)) { + this.updateAnother(lc, lc == this.forward ? this.backward : this.forward); + } + return this; + }, + /** + * @method isSmooth() + * @for kity.BezierPoint + * @description 判断贝塞尔点是否光滑 + * + * @grammar isSmooth() => {boolean} + */ + isSmooth: function() { + return this.smooth; + }, + /** + * @method getVertex() + * @for kity.BezierPoint + * @description 获得当前贝塞尔点的顶点 + * + * @grammar getVertex() => {kity.ShapePoint} + */ + getVertex: function() { + return this.vertex.getPoint(); + }, + /** + * @method getForward() + * @for kity.BezierPoint + * @description 获得当前贝塞尔点的前方控制点 + * + * @grammar getForward() => {kity.ShapePoint} + */ + getForward: function() { + return this.forward.getPoint(); + }, + /** + * @method getBackward() + * @for kity.BezierPoint + * @description 获得当前贝塞尔点的后方控制点 + * + * @grammar getBackward() => {kity.ShapePoint} + */ + getBackward: function() { + return this.backward.getPoint(); + }, + /** + * @private + * + * 联动更新相关的贝塞尔曲线 + */ + update: function() { + if (!this.container) { + return this; + } + //新增参数 this, 把当前引起变化的点传递过去, 以便有需要的地方可以获取到引起变化的源 + if (this.container.update) this.container.update(this); + } + }); + return BezierPoint; + } +}; + +//src/graphic/box.js +/** + * @fileOverview + * + * 表示一个矩形区域 + */ +_p[25] = { + value: function(require, exports, module) { + /** + * @class kity.Box + * @description 表示一个矩形区域 + */ + var Box = _p.r(11).createClass("Box", { + /** + * @constructor + * @for kity.Box + * + * @grammar new kity.Box(x, y, width, height) + * @grammar new kity.Box(box) + * + * @param {Number} x|box.x 矩形区域的 x 坐标 + * @param {Number} y|box.y 矩形区域的 y 坐标 + * @param {Number} width|box.width 矩形区域的宽度 + * @param {Number} height|box.height 矩形区域的高度 + * + * @example + * + * ```js + * var box = new kity.Box(10, 20, 50, 50); + * var box2 = new kity.Box({x: 10, y: 20, width: 50, height: 50}); + * ``` + */ + constructor: function(x, y, width, height) { + var box = arguments[0]; + if (box && typeof box === "object") { + x = box.x; + y = box.y; + width = box.width; + height = box.height; + } + if (width < 0) { + x -= width = -width; + } + if (height < 0) { + y -= height = -height; + } + /** + * @property x + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的 x 坐标 + */ + this.x = x || 0; + /** + * @property y + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的 y 坐标 + */ + this.y = y || 0; + /** + * @property width + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的宽度 + */ + this.width = width || 0; + /** + * @property height + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的高度 + */ + this.height = height || 0; + /** + * @property left + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的最左侧坐标,等价于 x 的值 + */ + this.left = this.x; + /** + * @property right + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的最右侧坐标,等价于 x + width 的值 + */ + this.right = this.x + this.width; + /** + * @property top + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的最上侧坐标,等价于 y 的值 + */ + this.top = this.y; + /** + * @property bottom + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的最下侧坐标,等价于 y + height 的值 + */ + this.bottom = this.y + this.height; + /** + * @property cx + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的中心 x 坐标 + */ + this.cx = this.x + this.width / 2; + /** + * @property cy + * @for kity.Box + * @type {Number} + * @readOnly + * @description 矩形区域的中心 y 坐标 + */ + this.cy = this.y + this.height / 2; + }, + /** + * @method getRangeX() + * @for kity.Box + * @description 获得矩形区域的 x 值域 + * + * @grammar getRangeX() => {Number[]} + * + * @example + * + * var box = new kity.Box(10, 10, 30, 50); + * console.log(box.getRangeX()); // [10, 40] + */ + getRangeX: function() { + return [ this.left, this.right ]; + }, + /** + * @method getRangeY() + * @for kity.Box + * @description 获得矩形区域的 y 值域 + * + * @grammar getRangeY() => {Number[]} + * + * @example + * + * var box = new kity.Box(10, 10, 30, 50); + * console.log(box.getRangeY()); // [10, 60] + */ + getRangeY: function() { + return [ this.top, this.bottom ]; + }, + /** + * @method merge() + * @for kity.Box + * @description 把当前矩形区域和指定的矩形区域合并,返回一个新的矩形区域(即包含两个源矩形区域的最小矩形区域) + * + * @grammar merge(another) => {kity.Box} + * @param {kity.Box} another 要合并的矩形区域 + * + * @example + * + * ```js + * var box1 = new kity.Box(10, 10, 50, 50); + * var box2 = new kity.Box(30, 30, 50, 50); + * var box3 = box1.merge(box2); + * console.log(box3.valueOf()); // [10, 10, 70, 70] + * ``` + */ + merge: function(another) { + if (this.isEmpty()) { + return new Box(another.x, another.y, another.width, another.height); + } + var left = Math.min(this.left, another.left), right = Math.max(this.right, another.right), top = Math.min(this.top, another.top), bottom = Math.max(this.bottom, another.bottom); + return new Box(left, top, right - left, bottom - top); + }, + /** + * @method intersect() + * @for kity.Box + * @description 求当前矩形区域和指定的矩形区域重叠的矩形区域 + * + * @grammar intersect(another) => {kity.Box} + * @param {kity.Box} another 要求重叠的矩形区域 + * + * @example + * + * ```js + * var box1 = new kity.Box(10, 10, 50, 50); + * var box2 = new kity.Box(30, 30, 50, 50); + * var box3 = box1.intersect(box2); + * console.log(box3.valueOf()); // [30, 30, 20, 20] + * ``` + */ + intersect: function(another) { + if (!another instanceof Box) { + another = new Box(another); + } + var left = Math.max(this.left, another.left), right = Math.min(this.right, another.right), top = Math.max(this.top, another.top), bottom = Math.min(this.bottom, another.bottom); + if (left > right || top > bottom) return new Box(); + return new Box(left, top, right - left, bottom - top); + }, + /** + * @method expand() + * @for kity.Box + * @description 扩展(或收缩)当前的盒子,返回新的盒子 + * + * @param {Number} top + * 矩形区域的上边界往上扩展的值;如果是负数,则上边界往下收缩 + * + * @param {Number} right + * [Optional] 矩形区域的右边界往右拓展的值; + * 如果是负数,则右边界往左收缩; + * 如果不设置该值,使用和 top 同样的值。 + * + * @param {Number} bottom + * [Optional] 矩形区域的下边界往下拓展的值; + * 如果是负数,则下边界往上收缩; + * 如果不设置该值,使用和 top 同样的值。 + * + * @param {Number} left + * [Optional] 矩形区域的左边界往左拓展的值; + * 如果是负数,则左边界往右收缩; + * 如果不设置该值,使用和 right 同样的值。 + * + * @example + * + * ```js + * var box = new kity.Box(10, 10, 20, 20); + * var box1 = box.expand(10); // [0, 0, 40, 40] + * var box2 = box.expand(10, 20); // [0, -10, 40, 60] + * var box3 = box.expand(1, 2, 3, 4); // [9, 8, 24, 26] + * ``` + */ + expand: function(top, right, bottom, left) { + if (arguments.length < 1) { + return new Box(this); + } + if (arguments.length < 2) { + right = top; + } + if (arguments.length < 3) { + bottom = top; + } + if (arguments.length < 4) { + left = right; + } + var x = this.left - left, y = this.top - top, width = this.width + right, height = this.height + top; + return new Box(x, y, width, height); + }, + /** + * @method valueOf() + * @for kity.Box + * @description 返回当前盒子的数组表示 + * + * @grammar valueOf() => {Number[]} + * + * @example + * + * ```js + * var box = new kity.Box(0, 0, 200, 50); + * console.log(box.valueOf()); // [0, 0, 200, 50] + * ``` + */ + valueOf: function() { + return [ this.x, this.y, this.width, this.height ]; + }, + /** + * @method toString() + * @for kity.Box + * @description 返回当前盒子的字符串表示 + * + * @grammar toString() => {String} + * + * @example + * + * ```js + * var box = new kity.Box(0, 0, 200, 50); + * console.log(box.toString()); // "0 0 200 50" + */ + toString: function() { + return this.valueOf().join(" "); + }, + /** + * @method isEmpty() + * @for kity.Box + * @description 判断当前盒子是否具有尺寸(面积大 + * + * @grammar isEmpty() => {boolean} + * + * @example + * ```js + * var box = new kity.Box(0, 0, 0, 100000); + * console.log(box.isEmpty()); // true + * ``` + */ + isEmpty: function() { + return !this.width || !this.height; + } + }); + /** + * @method parse() + * @static + * @for kity.Box + * @description 解析一个字符串或数组为 kity.Box 对象 + * + * @grammar kity.Box.parse(any) => {kity.Box} + * + * @param {Number[]|String} any 要解析的字符串或数组 + * + * @example + * + * ```js + * console.log(kity.Box.parse('0 0 100 200')); + * console.log(kity.Box.parse([0, 0, 100, 200])); + * ``` + */ + Box.parse = function(any) { + if (typeof any == "string") { + return Box.parse(any.split(/[\s,]+/).map(parseFloat)); + } + if (any instanceof Array) { + return new Box(any[0], any[1], any[2], any[3]); + } + if ("x" in any) return new Box(any); + return null; + }; + return Box; + } +}; + +//src/graphic/circle.js +/** + * @fileOverview + * + * 绘制和使用圆形 + */ +_p[26] = { + value: function(require, exports, module) { + /** + * @class kity.Circle + * @base kity.Ellipse + * @description 表示一个圆形 + */ + return _p.r(11).createClass("Circle", { + base: _p.r(32), + /** + * @constructor + * @for kity.Circle + * + * @grammar new kity.Circle(radius, cx, cy) + * + * @param {Number} radius 半径 + * @param {Number} cx 圆心 x 坐标 + * @param {Number} cy 圆心 y 坐标 + */ + constructor: function(radius, cx, cy) { + this.callBase(radius, radius, cx, cy); + }, + /** + * @method + * @for kity.Circle + * @description 获取圆形的半径 + * + * @grammar getRadius() => {Number} + */ + getRadius: function() { + return this.getRadiusX(); + }, + /** + * @method + * @for kity.Circle + * @description 设置圆形的半径 + * + * @grammar setRadius() => {this} + * + * @param {Number} radius 半径大小 + */ + setRadius: function(radius) { + return this.callBase(radius, radius); + } + }); + } +}; + +//src/graphic/clip.js +/** + * @fileOverview + * + * 支持图形裁切 + */ +_p[27] = { + value: function(require, exports, module) { + var Class = _p.r(11); + var Shape = _p.r(60); + /** + * @class kity.Clip + * @base kity.Resource + * @mixins kity.ShapeContainer + * + * @description 创建图形裁切,用于裁切目标图形 + */ + var Clip = Class.createClass("Clip", { + base: Shape, + mixins: [ _p.r(61) ], + /** + * @constructor + * @for kity.Clip + * + * @grammar new kity.Clip(paper) + * + * @param {kity.Paper} paper 资源所属的文档 + * + * @example + * + * ```js + * var circle = paper.put(new kity.Circle(100).fill('yellow')); + * var clip = new kity.Clip(paper); + * clip.addShape(new kity.Circle(100, 50, 0)); + * clip.clip(circle); + * ``` + */ + constructor: function(paper) { + this.callBase("clipPath", paper); + }, + /** + * @method clip() + * @for kity.Clip + * @description 将裁切应用到指定的图形上,应用之后,目标图形将显示与裁切形状重合的部分 + * + * @grammar clip(shape) => {this} + * + * @param {kity.Shape} shape 要应用裁切的图形 + */ + clip: function(shape) { + shape.getNode().setAttribute("clip-path", this); + return this; + } + }); + Class.extendClass(Shape, { + /** + * @method clipWidth() + * @for kity.Shape + * + * @grammar clipWidth(clip) => {this} + * + * @param {kity.Clip|kity.Shape} clip 要用于裁切当前图形的图形; + * 如果 clip 本身是一个裁切对象(kity.Clip 类型),则直接裁切; + * 否则将创建新的裁切包含给定的图形,然后对当前图形进行裁切 + * + * @example + * + * ```js + * var circle = paper.put(new kity.Circle(100)); + * var rect = paper.put(new kity.Rect(100, 100, -100, 0)); + * + * circle.clipWidth(rect); + * ``` + */ + clipWith: function(clip) { + if (clip instanceof Shape) { + clip = new Clip(clip.getPaper()).addShape(clip); + } + clip.clip(this); + return this; + } + }); + return Clip; + } +}; + +//src/graphic/color.js +/** + * @fileOverview + * + * 提供颜色支持 + */ +_p[28] = { + value: function(require, exports, module) { + var Utils = _p.r(12), StandardColor = _p.r(64), ColorUtils = {}, /** + * @class kity.Color + * @description 表示一个颜色 + */ + Color = _p.r(11).createClass("Color", { + /** + * @constructor + * @for kity.Color + * + * @grammar new kity.Color(r, g, b) + * @grammar new kity.Color(r, g, b, a) + * @grammar new kity.Color(colorString) + * + * @param {Number} r 红色分量,取值 0 - 255 + * @param {Number} g 绿色分量,取值 0 - 255 + * @param {Number} b 蓝色分量,取值 0 - 255 + * @param {Number} a 透明度(可选),取值 0 - 100 + * @param {String} colorString 一个代表颜色的字符串,可以是: + * 熟知颜色表:如 'red', 'yellow' + * HEX 表示:如 '#368', '#123456' + * RGB 表示:如 'RGB(200, 200, 0)', 'RGBA(200, 200, 200, .5)' + * HSL 表示:如 'HSL(100, 60%, 80%)', 'HSLA(100, 60%, 80%, .5)' + */ + constructor: function() { + var colorValue = null; + //parse构造 + if (typeof arguments[0] === "string") { + colorValue = ColorUtils.parseToValue(arguments[0]); + //解析失败 + if (colorValue === null) { + colorValue = { + r: 0, + g: 0, + b: 0, + h: 0, + s: 0, + l: 0, + a: 1 + }; + } + } else { + colorValue = { + r: arguments[0] | 0, + g: arguments[1] | 0, + b: arguments[2] | 0, + //alpha 默认为1 + a: arguments[3] === undefined ? 1 : parseFloat(arguments[3]) + }; + colorValue = ColorUtils.overflowFormat(colorValue); + //获取hsl分量 + colorValue = Utils.extend(colorValue, ColorUtils.rgbValueToHslValue(colorValue)); + } + this._color = colorValue; + }, + /** + * @method set() + * @for kity.Color + * + * @description 设置当前颜色某个分量的值 + * + * @grammar set(name, value) => {this} + * + * @param {string} name 要设置的颜色通道的名称 + * r: 红色(Red),取值范围 [0, 255] + * g: 绿色(Green),取值范围 [0, 255] + * b: 蓝色(Blue),取值范围 [0, 255] + * a: 透明度(Alpha),取值范围 [0, 1] + * h: 色环角度(Hue),取值范围 [0, 359] + * s: 饱和度(Saturation),取值范围 [0, 100] + * l: 亮度(Lightness),取值范围 [0, 100] + * r、g、b 值和 h、s、l 值会联动修改 + * @param {number} value 要设置的值 + */ + set: function(name, value) { + var values = null; + //设置的值非法 + if (!Color._MAX_VALUE[name]) { + throw new Error("Color set(): Illegal parameter"); + } + if (name !== "a") { + value = Math.floor(value); + } + if (name == "h") { + value = (value + 360) % 360; + } + this._color[name] = Math.max(Color._MIN_VALUE[name], Math.min(Color._MAX_VALUE[name], value)); + if ("rgb".indexOf(name) !== -1) { + this._color = Utils.extend(this._color, ColorUtils.rgbValueToHslValue(this._color)); + } else if ("hsl".indexOf(name) !== -1) { + this._color = Utils.extend(this._color, ColorUtils.hslValueToRGBValue(this._color)); + } + return this; + }, + /** + * @method inc() + * + * @description 返回新的颜色,表示当前颜色增加指定通道的值之后的颜色 + * + * @grammar inc(name, value) => {this} + * + * @param {string} name 要增加的通道的名称,具体含义请查看 set 方法 + * @param {number} value 增量值 + */ + inc: function(name, value) { + value = this.get(name) + value; + if (name == "h") { + value = (value + 360) % 360; + } else { + value = Math.min(Color._MAX_VALUE[name], value); + value = Math.max(Color._MIN_VALUE[name], value); + } + return this.clone().set(name, value); + }, + /** + * @method dec() + * @for kity.Color + * + * @description 返回新的颜色,表示当前颜色减少指定通道的值之后的颜色 + * + * @grammar dec(name, value) => {this} + * + * @param {string} name 要减少值的通道的名称,具体含义请查看 set 方法 + * @param {number} value 减量值 + */ + dec: function(name, value) { + return this.inc(name, -value); + }, + /** + * @method clone() + * @for kity.Color + * + * @description 返回当前颜色的一个拷贝 + * + * @grammar clone() => {kity.Color} + */ + clone: function() { + return new Color(this.toRGBA()); + }, + /** + * @method get() + * @for kity.Color + * + * @description 返回当前颜色指定的分量 + * + * @grammar get() => {number} + */ + get: function(name) { + if (!Color._MAX_VALUE[name]) { + return null; + } + return this._color[name]; + }, + getValues: function() { + return Utils.clone(this._color); + }, + /** + * @method valueOf() + * @for kity.Color + * + * @description 返回当前颜色的一个字面量表示 + * + * @return {plain} 颜色字面量,其结构为: + * { + * r: 0, + * g: 0, + * b: 0, + * a: 0, + * h: 0, + * s: 0, + * l: 0 + * } + */ + valueOf: function() { + return this.getValues(); + }, + /** + * @method toRGB() + * @for kity.Color + * + * @description 返回当前颜色的 RGB 表示,如果颜色有透明度,将抛弃透明度属性(想要保留请使用 toRGBA())方法。 + * + * @grammar toRGB() => {string} + */ + toRGB: function() { + return ColorUtils.toString(this._color, "rgb"); + }, + /** + * @method toRGBA() + * @for kity.Color + * + * @description 返回当前颜色的 RGBA 表示 + * + * @grammar toRGBA() => {string} + */ + toRGBA: function() { + return ColorUtils.toString(this._color, "rgba"); + }, + /** + * @method toHEX() + * @for kity.Color + * + * @description 返回当前颜色的 HEX 表示,如果颜色有透明度,将抛弃透明度属性(想要保留请使用 toRGBA())方法。 + * + * @grammar toHEX() => {string} + */ + toHEX: function() { + return ColorUtils.toString(this._color, "hex"); + }, + /** + * @method toHSL() + * @for kity.Color + * + * @description 返回当前颜色的 HSL 表示,如果颜色有透明度,将抛弃透明度属性(想要保留请使用 toHSLA())方法。 + * + * @grammar toHSL() => {string} + */ + toHSL: function() { + return ColorUtils.toString(this._color, "hsl"); + }, + /** + * @method toHSLA() + * @for kity.Color + * + * @description 返回当前颜色的 HSLA 表示 + * + * @grammar toHSLA() => {string} + */ + toHSLA: function() { + return ColorUtils.toString(this._color, "hsla"); + }, + /** + * @method toString() + * @for kity.Color + * + * @description 返回当前颜色的 RGB 或 RGBA 表示,如果颜色有透明度,将使用 RGBA 形式,否则是 RGB 形式 + * @grammar toString() => {string} + */ + toString: function() { + if (this._color.a === 1) { + return this.toRGB(); + } + return this.toRGBA(); + } + }); + //Color 静态方法 + Utils.extend(Color, { + //各分量可表示的最大值 + _MAX_VALUE: { + r: 255, + g: 255, + b: 255, + h: 360, + s: 100, + l: 100, + a: 1 + }, + //各分量最小值 + _MIN_VALUE: { + r: 0, + g: 0, + b: 0, + h: 0, + s: 0, + l: 0, + a: 0 + }, + //分量常量 + R: "r", + G: "g", + B: "b", + H: "h", + S: "s", + L: "l", + A: "a", + /** + * @method parse() + * @static + * @for kity.Color + * + * @description 解析一个颜色字符串为 kity.Color 对象 + * + * @grammar kity.Color.parse(valStr) + * + * @param {string} valStr 一个代表颜色的字符串,可以是: + * 熟知颜色表:如 'red', 'yellow' + * HEX 表示:如 '#368', '#123456' + * RGB 表示:如 'RGB(200, 200, 0)', 'RGBA(200, 200, 200, .5)' + * HSL 表示:如 'HSL(100, 60%, 80%)', 'HSLA(100, 60%, 80%, .5)' + */ + parse: function(valStr) { + var rgbValue; + if (Utils.isString(valStr)) { + rgbValue = ColorUtils.parseToValue(valStr); + } + if (Utils.isObject(valStr) && "r" in valStr) { + rgbValue = valStr; + } + //解析失败, 返回一个默认color实例 + if (rgbValue === null) { + return new Color(); + } + return new Color(rgbValue.r, rgbValue.g, rgbValue.b, rgbValue.a); + }, + /** + * @method createHSL() + * @for kity.Color + * @static + * + * @description 创建一个 HSL 颜色 + * + * @grammar kity.Color.createHSL(h, s, l) => {kity.Color} + * + * @param {number} h 色环(Hue)分量值,取值范围 [0, 359] + * @param {number} s 饱和度(Saturation)分量值,取值范围 [0, 100] + * @param {number} l 亮度(Lighteness)分量值,取值范围 [0, 100] + */ + createHSL: function(h, s, l) { + return Color.createHSLA(h, s, l, 1); + }, + /** + * @method createHSLA() + * @for kity.Color + * @static + * + * @description 创建一个 HSLA 颜色 + * + * @grammar kity.Color.createHSLA(h, s, l, a) => {kity.Color} + * + * @param {number} h 色环(Hue)分量值,取值范围 [0, 359] + * @param {number} s 饱和度(Saturation)分量值,取值范围 [0, 100] + * @param {number} l 亮度(Lighteness)分量值,取值范围 [0, 100] + * @param {number} a 透明度(Alpha)分量值,取值范围 [0, 1] + */ + createHSLA: function(h, s, l, a) { + var colorValue = null; + s += "%"; + l += "%"; + colorValue = [ "hsla(" + h, s, l, a + ")" ]; + return Color.parse(colorValue.join(", ")); + }, + /** + * @method createRGB() + * @for kity.Color + * @static + * + * @description 创建一个 RGB 颜色 + * + * @grammar kity.Color.createRGB(r, g, b) => {kity.Color} + * + * @param {number} r 红色(Red)分量值,取值范围 [0, 255] + * @param {number} g 绿色(Green)分量值,取值范围 [0, 255] + * @param {number} b 蓝色(Blue)分量值,取值范围 [0, 255] + */ + createRGB: function(r, g, b) { + return Color.createRGBA(r, g, b, 1); + }, + /** + * @method createRGBA() + * @for kity.Color + * @static + * + * @description 创建一个 RGBA 颜色 + * + * @grammar kity.Color.createRGBA(r, g, b, a) => {kity.Color} + * + * @param {number} r 红色(Red)分量值,取值范围 [0, 255] + * @param {number} g 绿色(Green)分量值,取值范围 [0, 255] + * @param {number} b 蓝色(Blue)分量值,取值范围 [0, 255] + * @param {number} a 透明度(Alpha)分量值,取值范围 [0, 1] + */ + createRGBA: function(r, g, b, a) { + return new Color(r, g, b, a); + } + }); + //内部工具对象 + Utils.extend(ColorUtils, { + parseToValue: function(valStr) { + var rgbaValue = {}; + /* 优先检测在调色板中是否有对应的颜色 */ + valStr = StandardColor.EXTEND_STANDARD[valStr] || StandardColor.COLOR_STANDARD[valStr] || valStr; + /* 颜色转换 */ + //hex格式 + if (/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(valStr)) { + rgbaValue = ColorUtils.hexToValue(valStr); + } else if (/^(rgba?)/i.test(valStr)) { + rgbaValue = ColorUtils.rgbaToValue(valStr); + } else if (/^(hsla?)/i.test(valStr)) { + rgbaValue = ColorUtils.hslaToValue(valStr); + } else { + return null; + } + return ColorUtils.overflowFormat(rgbaValue); + }, + hexToValue: function(hexStr) { + var result = {}, keys = [ "r", "g", "b" ]; + if (/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(hexStr)) { + hexStr = RegExp.$1.split(""); + Utils.each(keys, function(key, index) { + if (hexStr.length === 3) { + result[key] = ColorUtils.toNumber(hexStr[index] + hexStr[index]); + } else { + result[key] = ColorUtils.toNumber(hexStr[index * 2] + hexStr[index * 2 + 1]); + } + }); + //转换出hsl值 + result = Utils.extend(result, ColorUtils.rgbValueToHslValue(result)); + result.a = 1; + return result; + } + return null; + }, + rgbaToValue: function(rgbaStr) { + var result = {}, hasAlpha = false, keys = [ "r", "g", "b" ]; + if (/^(rgba?)/i.test(rgbaStr)) { + hasAlpha = RegExp.$1.length === 4; + rgbaStr = rgbaStr.replace(/^rgba?/i, "").replace(/\s+/g, "").replace(/[^0-9,.]/g, "").split(","); + Utils.each(keys, function(key, index) { + result[key] = rgbaStr[index] | 0; + }); + //转换出hsl值 + result = Utils.extend(result, ColorUtils.rgbValueToHslValue(result)); + result.a = hasAlpha ? parseFloat(rgbaStr[3]) : 1; + return result; + } + return null; + }, + hslaToValue: function(hslaStr) { + var result = {}, hasAlpha = false; + if (/^(hsla?)/i.test(hslaStr)) { + hasAlpha = RegExp.$1.length === 4; + hslaStr = hslaStr.replace(/^hsla?/i, "").replace(/\s+/g, "").replace(/[^0-9,.]/g, "").split(","); + //记录hsl值 + result.h = hslaStr[0] | 0; + result.s = hslaStr[1] | 0; + result.l = hslaStr[2] | 0; + //转换出rgb值 + result = Utils.extend(result, ColorUtils.hslValueToRGBValue(result)); + //hsl值转换为rgb值 + result = ColorUtils.hslValueToRGBValue(result); + result.a = hasAlpha ? parseFloat(hslaStr[3]) : 1; + return result; + } + return null; + }, + //hsl值对象转换为rgb值对象 + hslValueToRGBValue: function(hslValue) { + function trans(v1, v2, vH) { + if (vH < 0) { + vH += 1; + } else if (vH > 1) { + vH -= 1; + } + if (6 * vH < 1) { + return v1 + (v2 - v1) * 6 * vH; + } else if (2 * vH < 1) { + return v2; + } else if (3 * vH < 2) { + return v1 + (v2 - v1) * ((2 / 3 - vH) * 6); + } + return v1; + } + var q = null, p = null, result = {}; + hslValue = Utils.extend({}, hslValue); + hslValue.h = hslValue.h / 360; + hslValue.s = hslValue.s / 100; + hslValue.l = hslValue.l / 100; + //分量计算 + if (hslValue.s === 0) { + result.r = result.g = result.b = hslValue.l; + } else { + if (hslValue.l < .5) { + q = hslValue.l * (1 + hslValue.s); + } else { + q = hslValue.l + hslValue.s - hslValue.l * hslValue.s; + } + p = 2 * hslValue.l - q; + result.r = trans(p, q, hslValue.h + 1 / 3); + result.g = trans(p, q, hslValue.h); + result.b = trans(p, q, hslValue.h - 1 / 3); + } + result.r = Math.min(Math.round(result.r * 255), 255); + result.g = Math.min(Math.round(result.g * 255), 255); + result.b = Math.min(Math.round(result.b * 255), 255); + return result; + }, + //rgb值对象转换为hsl值对象 + rgbValueToHslValue: function(rgbValue) { + var max = null, min = null, result = {}; + rgbValue = Utils.extend({}, rgbValue); + rgbValue.r = rgbValue.r / 255; + rgbValue.g = rgbValue.g / 255; + rgbValue.b = rgbValue.b / 255; + max = Math.max(rgbValue.r, rgbValue.g, rgbValue.b); + min = Math.min(rgbValue.r, rgbValue.g, rgbValue.b); + //h分量计算 + if (max === min) { + result.h = 0; + } else if (max === rgbValue.r) { + if (rgbValue.g >= rgbValue.b) { + result.h = 60 * (rgbValue.g - rgbValue.b) / (max - min); + } else { + result.h = 60 * (rgbValue.g - rgbValue.b) / (max - min) + 360; + } + } else if (max === rgbValue.g) { + result.h = 60 * (rgbValue.b - rgbValue.r) / (max - min) + 120; + } else if (max === rgbValue.b) { + result.h = 60 * (rgbValue.r - rgbValue.g) / (max - min) + 240; + } + //l分量计算 + result.l = (max + min) / 2; + //s分量计算 + if (result.l === 0 || max === min) { + result.s = 0; + } else if (result.l > 0 && result.l <= .5) { + result.s = (max - min) / (max + min); + } else { + result.s = (max - min) / (2 - max - min); + } + //格式化hsl结果 + result.h = Math.round(result.h); + result.s = Math.round(result.s * 100); + result.l = Math.round(result.l * 100); + return result; + }, + toString: function(colorValue, type) { + var vals = []; + colorValue = Utils.extend({}, colorValue); + if (type.indexOf("hsl") !== -1) { + colorValue.s += "%"; + colorValue.l += "%"; + } + if (type !== "hex") { + Utils.each(type.split(""), function(key) { + vals.push(colorValue[key]); + }); + return (type + "(" + vals.join(", ") + ")").toLowerCase(); + } else { + vals.push(ColorUtils.toHexValue(+colorValue.r)); + vals.push(ColorUtils.toHexValue(+colorValue.g)); + vals.push(ColorUtils.toHexValue(+colorValue.b)); + return ("#" + vals.join("")).toLowerCase(); + } + }, + //16进制的2个数字转化为10进制, 如果转化失败, 返回0 + toNumber: function(value) { + return Number("0x" + value) | 0; + }, + toHexValue: function(value) { + var result = value.toString(16); + return result.length === 1 ? "0" + result : result; + }, + //溢出控制 + overflowFormat: function(value) { + var tmpValue = Utils.extend({}, value), keys = "rgba"; + Utils.each(keys.split(""), function(key) { + if (!tmpValue.hasOwnProperty(key)) { + return; + } + //上溢出 + tmpValue[key] = Math.min(Color._MAX_VALUE[key], tmpValue[key]); + //下溢出 + tmpValue[key] = Math.max(Color._MIN_VALUE[key], tmpValue[key]); + }); + return tmpValue; + } + }); + return Color; + } +}; + +//src/graphic/container.js +_p[29] = { + value: function(require, exports, module) { + function itemRemove() { + this.container.removeItem(this); + return this; + } + return _p.r(11).createClass("Container", { + getItems: function() { + return this.items || (this.items = []); + }, + getItem: function(index) { + return this.getItems()[index]; + }, + getFirstItem: function() { + return this.getItem(0); + }, + getLastItem: function() { + return this.getItem(this.getItems().length - 1); + }, + indexOf: function(item) { + return this.getItems().indexOf(item); + }, + eachItem: function(fn) { + var items = this.getItems(), length = items.length, i; + for (i = 0; i < length; i++) { + fn.call(this, i, items[i]); + } + return this; + }, + addItem: function(item, pos, noEvent) { + var items = this.getItems(), length = items.length; + if (~items.indexOf(item)) { + return this; + } + if (!(pos >= 0 && pos < length)) { + pos = length; + } + items.splice(pos, 0, item); + if (typeof item === "object") { + item.container = this; + item.remove = itemRemove; + } + this.handleAdd(item, pos); + if (!noEvent) { + this.onContainerChanged("add", [ item ]); + } + return this; + }, + addItems: function(items) { + for (var i = 0, l = items.length; i < l; i++) { + this.addItem(items[i], -1, true); + } + this.onContainerChanged("add", items); + return this; + }, + setItems: function(items) { + return this.clear().addItems(items); + }, + appendItem: function(item) { + return this.addItem(item); + }, + prependItem: function(item) { + return this.addItem(item, 0); + }, + removeItem: function(pos, noEvent) { + if (typeof pos !== "number") { + return this.removeItem(this.indexOf(pos)); + } + var items = this.getItems(), length = items.length, item = items[pos]; + if (item === undefined) { + return this; + } + items.splice(pos, 1); + if (item.container) { + delete item.container; + } + if (item.remove) { + delete item.remove; + } + this.handleRemove(item, pos); + if (!noEvent) { + this.onContainerChanged("remove", [ item ]); + } + return this; + }, + clear: function() { + var removed = []; + var item; + while (item = this.getFirstItem()) { + removed.push(item); + this.removeItem(0, true); + } + this.onContainerChanged("remove", removed); + return this; + }, + onContainerChanged: function(type, items) {}, + handleAdd: function(item, index) {}, + handleRemove: function(item, index) {} + }); + } +}; + +//src/graphic/curve.js +/* + * 曲线 + * */ +_p[30] = { + value: function(require, exports, module) { + var Utils = _p.r(12), CurveUtil = { + /* + * 获取由两个以上的点组成的曲线的平移线 + * @param points 曲线上的点的集合, 集合中的点的数量必须大于2 + * @return 平移线数组 + */ + getCurvePanLines: function(points, smoothFactor) { + //计算原始点的中点坐标 + var centerPoints = CurveUtil.getCenterPoints(points), //注意:计算中点连线的中点坐标, 得出平移线 + panLines = CurveUtil.getPanLine(points.length, centerPoints); + //平移线移动到顶点 + return CurveUtil.getMovedPanLines(points, panLines, smoothFactor); + }, + /* + * 计算给定点集合的连线的中点 + * @param points + */ + getCenterPoints: function(points) { + var centerPoints = {}, key = null; + for (var i = 0, j = 0, len = points.length; i < len; i++) { + //j是下一个点的索引 + j = i === len - 1 ? 0 : i + 1; + key = i + "," + j; + //计算中点坐标 + centerPoints[key] = { + x: (points[i].x + points[j].y) / 2, + y: (points[i].x + points[j].y) / 2 + }; + } + return centerPoints; + }, + /* + * 对getCenterPoints()接口获取到的数据做处理, 计算出各个顶点对应的平移线数据 + * @param length 集合中点的个数 + * @param points 点集合, 该集合应该是getCenterPoints()接口返回的数据 + */ + getPanLine: function(length, points) { + var result = {}, //顶点索引 + pointIndex = null; + for (var i = 0, j; i < length; i++) { + var point1 = null, point2 = null; + //计算当前点 + j = (i + 1) % length; + //保存当前处理的顶点索引 + pointIndex = j; + point1 = points[i + "," + j]; + //计算下一个点 + i = j; + j = (i + 1) % length; + point2 = points[i + "," + j]; + result[pointIndex] = { + points: [ { + x: point1.x, + y: point1.y + }, { + x: point2.x, + y: point2.y + } ], + center: { + x: (point1.x + point2.x) / 2, + y: (point1.y + point2.y) / 2 + } + }; + //还原i值 + i = (pointIndex + length - 1) % length; + } + return result; + }, + /* + * 计算平移线移动到顶点后的位置 + * @param points 顶点集合 + * @param panLines 平移线集合 + */ + getMovedPanLines: function(points, panLines, smoothFactor) { + var result = {}; + Utils.each(points, function(point, index) { + //当前平移线 + var currentPanLine = panLines[index], //平移线中点 + center = currentPanLine.center, //移动距离 + distance = { + x: center.x - point.x, + y: center.y - point.y + }; + var currentResult = result[index] = { + points: [], + center: { + x: point.x, + y: point.y + } + }; + //计算控制点到顶点的距离, 并且应用平滑系数到距离上 + Utils.each(currentPanLine.points, function(controlPoint, index) { + var moved = { + x: controlPoint.x - distance.x, + y: controlPoint.y - distance.y + }; + var vertex = currentResult.center; + var dx = moved.x - vertex.x; + var dy = moved.y - vertex.y; + moved.x = vertex.x + smoothFactor * dx; + moved.y = vertex.y + smoothFactor * dy; + currentResult.points.push(moved); + }); + }); + return result; + } + }; + return _p.r(11).createClass("Curve", { + base: _p.r(46), + mixins: [ _p.r(51) ], + constructor: function(points, isColse) { + this.callBase(); + this.setPoints(points || []); + this.closeState = !!isColse; + this.changeable = true; + this.smoothFactor = 1; + this.update(); + }, + //当点集合发生变化时采取的动作 + onContainerChanged: function() { + if (this.changeable) { + this.update(); + } + }, + setSmoothFactor: function(factor) { + this.smoothFactor = factor < 0 ? 0 : factor; + this.update(); + return this; + }, + getSmoothFactor: function() { + return this.smoothFactor; + }, + update: function() { + var points = this.getPoints(), withControlPoints = null, drawer = this.getDrawer(), curPoint = null, curControlPoint = null, prevControlPoint = null; + drawer.clear(); + if (points.length === 0) { + return this; + } else { + drawer.moveTo(points[0]); + } + if (points.length === 1) { + return this; + } + if (points.length === 2) { + drawer.lineTo(points[1]); + return this; + } + //获取已转换过后的带控制点的所有点 + withControlPoints = CurveUtil.getCurvePanLines(points, this.getSmoothFactor()); + for (var i = 1, len = points.length; i < len; i++) { + //当前顶点 + curPoint = withControlPoints[i].center; + //当前控制点 + if (this.closeState || i != len - 1) { + curControlPoint = withControlPoints[i].points[0]; + } else { + //非闭合状态下最后一个点的处理 + curControlPoint = withControlPoints[i].center; + } + if (this.closeState || i != 1) { + prevControlPoint = withControlPoints[i - 1].points[1]; + } else { + //非闭合状态下第一个点的处理 + prevControlPoint = withControlPoints[i - 1].center; + } + drawer.bezierTo(prevControlPoint.x, prevControlPoint.y, curControlPoint.x, curControlPoint.y, curPoint.x, curPoint.y); + } + //处理闭合 + if (this.closeState) { + curPoint = withControlPoints[0].center; + curControlPoint = withControlPoints[0].points[0]; + prevControlPoint = withControlPoints[points.length - 1].points[1]; + drawer.bezierTo(prevControlPoint.x, prevControlPoint.y, curControlPoint.x, curControlPoint.y, curPoint.x, curPoint.y); + } + return this; + }, + close: function() { + this.closeState = true; + return this.update(); + }, + open: function() { + this.closeState = false; + return this.update(); + }, + isClose: function() { + return !!this.closeState; + } + }); + } +}; + +//src/graphic/data.js +_p[31] = { + value: function(require, exports, module) { + return _p.r(11).createClass("Data", { + constructor: function() { + this._data = {}; + }, + setData: function(name, value) { + this._data[name] = value; + return this; + }, + getData: function(name) { + return this._data[name]; + }, + removeData: function(name) { + delete this._data[name]; + return this; + } + }); + } +}; + +//src/graphic/ellipse.js +_p[32] = { + value: function(require, exports, module) { + var Utils = _p.r(12), Point = _p.r(50); + return _p.r(11).createClass("Ellipse", { + base: _p.r(46), + constructor: function(rx, ry, cx, cy) { + this.callBase(); + this.rx = rx || 0; + this.ry = ry || 0; + this.cx = cx || 0; + this.cy = cy || 0; + this.update(); + }, + update: function() { + var rx = this.rx, ry = this.ry, x1 = this.cx + rx, x2 = this.cx - rx, y = this.cy; + var drawer = this.getDrawer(); + drawer.clear(); + drawer.moveTo(x1, y); + drawer.arcTo(rx, ry, 0, 1, 1, x2, y); + drawer.arcTo(rx, ry, 0, 1, 1, x1, y); + return this; + }, + getRadius: function() { + return { + x: this.rx, + y: this.ry + }; + }, + getRadiusX: function() { + return this.rx; + }, + getRadiusY: function() { + return this.ry; + }, + getCenter: function() { + return new Point(this.cx, this.cy); + }, + getCenterX: function() { + return this.cx; + }, + getCenterY: function() { + return this.cy; + }, + setRadius: function(rx, ry) { + this.rx = rx; + this.ry = ry; + return this.update(); + }, + setRadiusX: function(rx) { + this.rx = rx; + return this.update(); + }, + setRadiusY: function(ry) { + this.ry = ry; + return this.update(); + }, + setCenter: function(cx, cy) { + if (arguments.length == 1) { + var p = Point.parse(arguments[0]); + cx = p.x; + cy = p.y; + } + this.cx = cx; + this.cy = cy; + return this.update(); + }, + setCenterX: function(cx) { + this.cx = cx; + return this.update(); + }, + setCenterY: function(cy) { + this.cy = cy; + return this.update(); + } + }); + } +}; + +//src/graphic/eventhandler.js +/* + * kity event 实现 + */ +_p[33] = { + value: function(require, exports, module) { + // polyfill + (function() { + function CustomEvent(event, params) { + params = params || { + bubbles: false, + cancelable: false, + detail: undefined + }; + var evt = document.createEvent("CustomEvent"); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } + CustomEvent.prototype = window.Event.prototype; + window.CustomEvent = CustomEvent; + })(); + var Utils = _p.r(12), ShapeEvent = _p.r(62); + // 内部处理器缓存 + var INNER_HANDLER_CACHE = {}, // 用户处理器缓存 + USER_HANDLER_CACHE = {}, guid = 0; + // 添加事件统一入口 + function _addEvent(type, handler, isOnce) { + isOnce = !!isOnce; + if (Utils.isString(type)) { + type = type.match(/\S+/g); + } + Utils.each(type, function(currentType) { + listen.call(this, this.node, currentType, handler, isOnce); + }, this); + return this; + } + // 移除事件统一入口 + function _removeEvent(type, handler) { + var userHandlerList = null, eventId = this._EVNET_UID, isRemoveAll = handler === undefined; + userHandlerList = USER_HANDLER_CACHE[eventId][type]; + //移除指定的监听器 + if (!isRemoveAll) { + isRemoveAll = true; + Utils.each(userHandlerList, function removeKityEvent(fn, index) { + if (fn === handler) { + // 不能结束, 需要查找完整个list, 避免丢失移除多次绑定同一个处理器的情况 + delete userHandlerList[index]; + } else { + isRemoveAll = false; + } + }); + } + //删除所有监听器 + if (isRemoveAll) { + deleteDomEvent(this.node, type, INNER_HANDLER_CACHE[eventId][type]); + delete USER_HANDLER_CACHE[eventId][type]; + delete INNER_HANDLER_CACHE[eventId][type]; + } + return this; + } + // 执行绑定, 该方法context为shape或者mixin了eventhandler的对象 + function listen(node, type, handler, isOnce) { + var eid = this._EVNET_UID, targetObject = this; + // 初始化内部监听器 + if (!INNER_HANDLER_CACHE[eid]) { + INNER_HANDLER_CACHE[eid] = {}; + } + if (!INNER_HANDLER_CACHE[eid][type]) { + // 内部监听器 + INNER_HANDLER_CACHE[eid][type] = function kityEventHandler(e) { + e = new ShapeEvent(e || window.event); + Utils.each(USER_HANDLER_CACHE[eid][type], function executeKityEvent(fn) { + var result; + if (fn) { + result = fn.call(targetObject, e); + //once 绑定, 执行完后删除 + if (isOnce) { + targetObject.off(type, fn); + } + } + // 如果用户handler里return了false, 则该节点上的此后的同类型事件将不再执行 + return result; + }, targetObject); + }; + } + // 初始化用户监听器列表 + if (!USER_HANDLER_CACHE[eid]) { + USER_HANDLER_CACHE[eid] = {}; + } + if (!USER_HANDLER_CACHE[eid][type]) { + USER_HANDLER_CACHE[eid][type] = [ handler ]; + // 绑定对应类型的事件 + // dom对象利用dom event进行处理, 非dom对象, 由消息分发机制处理 + if (!!node && "on" + type in node) { + bindDomEvent(node, type, INNER_HANDLER_CACHE[eid][type]); + } + } else { + USER_HANDLER_CACHE[eid][type].push(handler); + } + } + // 绑定dom事件 + function bindDomEvent(node, type, handler) { + if (node.addEventListener) { + node.addEventListener(type, handler, false); + } else { + node.attachEvent("on" + type, handler); + } + } + // 删除dom事件 + function deleteDomEvent(node, type, handler) { + if (node.removeEventListener) { + node.removeEventListener(type, handler, false); + } else { + node.detachEvent(type, handler); + } + } + // 触发dom事件 + function triggerDomEvent(node, type, params) { + var event = new CustomEvent(type, { + bubbles: true, + cancelable: true + }); + event._kityParam = params; + node.dispatchEvent(event); + } + // 发送消息 + function sendMessage(messageObj, type, msg) { + var event = null, handler = null; + var handlers = INNER_HANDLER_CACHE[messageObj._EVNET_UID]; + if (!handlers) return; + handler = handlers[type]; + if (!handler) { + return; + } + event = Utils.extend({ + type: type, + target: messageObj + }, msg || {}); + handler.call(messageObj, event); + } + // 对外接口 + return _p.r(11).createClass("EventHandler", { + constructor: function() { + this._EVNET_UID = ++guid; + }, + addEventListener: function(type, handler) { + return _addEvent.call(this, type, handler, false); + }, + addOnceEventListener: function(type, handler) { + return _addEvent.call(this, type, handler, true); + }, + removeEventListener: function(type, handler) { + return _removeEvent.call(this, type, handler); + }, + on: function(type, handler) { + return this.addEventListener.apply(this, arguments); + }, + once: function(type, handler) { + return this.addOnceEventListener.apply(this, arguments); + }, + off: function() { + return this.removeEventListener.apply(this, arguments); + }, + fire: function(type, params) { + return this.trigger.apply(this, arguments); + }, + trigger: function(type, params) { + sendMessage(this, type, params); + return this; + } + }); + } +}; + +//src/graphic/geometry.js +_p[34] = { + value: function(require) { + var utils = _p.r(12); + var Point = _p.r(50); + var Vector = _p.r(73); + var Matrix = _p.r(43); + var g = {}; + var pathCommand = /([achlmrqstvz])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?\s*)+)/gi, pathValues = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)\s*,?\s*/gi, paramCounts = { + a: 7, + c: 6, + h: 1, + l: 2, + m: 2, + q: 4, + s: 4, + t: 2, + v: 1, + z: 0 + }; + function pathClone(path) { + var result, i, j, segment, segmentCopy; + result = []; + for (i = 0; i < path.length; i++) { + segment = path[i]; + result.push(segmentCopy = []); + for (j = 0; j < segment.length; j++) { + segmentCopy.push(segment[j]); + } + } + if (path.isUniform) result.isUniform = true; + if (path.isAbsolute) result.isAbsolute = true; + if (path.isCurve) result.isCurve = true; + return result; + } + // 缓存函数 + // from raphael.js + function cacher(f, scope, postprocessor) { + function repush(array, item) { + for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) { + return array.push(array.splice(i, 1)[0]); + } + } + function newf() { + var arg = Array.prototype.slice.call(arguments, 0), args = arg.join("␀"), cache = newf.cache = newf.cache || {}, count = newf.count = newf.count || []; + if (cache.hasOwnProperty(args)) { + repush(count, args); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + if (count.length >= 1e3) { + delete cache[count.shift()]; + } + count.push(args); + cache[args] = f.apply(scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; + } + /** + * + * kity.g.pathToString(pathSegment) + * + * 返回表示 PathSegment 的字符串 + * + * @param {Array} pathSegment + * 要表示的 Path Segment + * + * @return {String} 表示该 Path 的字符串 + * + * @example + * + * var pathSegment = [['M', 0, 0], ['L', 10, 10]] + * var pathString = kity.g.pathToString(pathSegment); + * // 返回 'M0,0L10,10' + */ + g.pathToString = function(pathSegment) { + pathSegment = pathSegment || this; + if (typeof pathSegment == "string") return pathSegment; + if (pathSegment instanceof Array) { + pathSegment = utils.flatten(pathSegment); + return pathSegment.join(",").replace(/,?([achlmqrstvxz]),?/gi, "$1"); + } + }; + /** + * kity.g.parsePathString(pathString) + * + * 解析 Path 字符串成 PathSegment + * + * @copyright rapheal.js + * + * @example + * + * var seg = kity.g.parsePathString('M10,12l21-23-21.5,11z'); + * // 返回: [['M', 10, 12], ['l', 21, -23], ['l', -21.5, 11], ['z']] + * + * @param {String} pathString Path 字符串 + * @return {Array} + */ + g.parsePathString = cacher(function(pathString) { + var data = []; + pathString.replace(pathCommand, function(a, b, c) { + var params = [], name = b.toLowerCase(); + c.replace(pathValues, function(a, b) { + if (b) params.push(+b); + }); + if (name == "m" && params.length > 2) { + data.push([ b ].concat(params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + if (name == "r") { + data.push([ b ].concat(params)); + } else { + while (params.length >= paramCounts[name]) { + data.push([ b ].concat(params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + } + }); + data.isUniform = true; + data.toString = g.pathToString; + return data; + }); + /** + * kity.g.pathToAbsolute(path) + * + * 把路径转换为绝对路径的形式 + * + * @param {Array|String} path + * 要转换的 path 路径或者数组 + * + * @return {Array} + * 转换后的 Path Segment + * + * @example + * + * var path = 'M10,10l50,50'; + * var absPath = kity.g.pathToAbsolute(path); + * // 返回 [['M', 10, 10], ['L', 60, 60]] + */ + g.pathToAbsolute = cacher(function(path) { + var pathArray = path.isUniform ? path : g.parsePathString(g.pathToString(path)); + var res = [], x = 0, y = 0, mx = 0, my = 0, start = 0; + var r, pa, i, j, k, ii, jj, kk; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = [ "M", x, y ]; + } + for (r, pa, i = start, ii = pathArray.length; i < ii; i++) { + res.push(r = []); + pa = pathArray[i]; + if (pa[0] != pa[0].toUpperCase()) { + r[0] = pa[0].toUpperCase(); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] + x); + r[7] = +(pa[7] + y); + break; + + case "V": + r[1] = +pa[1] + y; + break; + + case "H": + r[1] = +pa[1] + x; + break; + + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + break; + + default: + for (j = 1, jj = pa.length; j < jj; j++) { + r[j] = +pa[j] + (j % 2 ? x : y); + } + } + } else { + for (k = 0, kk = pa.length; k < kk; k++) { + r[k] = pa[k]; + } + } + switch (r[0]) { + case "Z": + x = mx; + y = my; + break; + + case "H": + x = r[1]; + break; + + case "V": + y = r[1]; + break; + + case "M": + mx = r[r.length - 2]; + my = r[r.length - 1]; + break; + + default: + x = r[r.length - 2]; + y = r[r.length - 1]; + } + } + res.isUniform = true; + res.isAbsolute = true; + res.toString = g.pathToString; + return res; + }); + // 把圆弧绘制的曲线转化为对应的三次贝塞尔形式 + function a2c(x1, y1, rx, ry, angle, laf, sf, x2, y2, recursive) { + // copy from raphael.js + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var math = Math, PI = math.PI, abs = Math.abs, _120 = PI * 120 / 180, rad = PI / 180 * (+angle || 0), res = [], xy, rotate = function(x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), Y = x * math.sin(rad) + y * math.cos(rad); + return { + x: X, + y: Y + }; + }; + var cos, sin, h, x, y, rx2, ry2, k, cx, cy, f1, f2, df, f2old, x2old, y2old, c1, s1, c2, s2, t, hx, hy, m1, m2, m3, m4, newres, i, ii; + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + cos = math.cos(PI / 180 * angle); + sin = math.sin(PI / 180 * angle); + x = (x1 - x2) / 2; + y = (y1 - y2) / 2; + h = x * x / (rx * rx) + y * y / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + rx2 = rx * rx; + ry2 = ry * ry; + k = (laf == sf ? -1 : 1) * math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))); + cx = k * rx * y / ry + (x1 + x2) / 2; + cy = k * -ry * x / rx + (y1 + y2) / 2; + f1 = math.asin(((y1 - cy) / ry).toFixed(9)); + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + if (f1 < 0) f1 = PI * 2 + f1; + if (f2 < 0) f2 = PI * 2 + f2; + if (sf && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sf && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + df = f2 - f1; + if (abs(df) > _120) { + f2old = f2; + x2old = x2; + y2old = y2; + f2 = f1 + _120 * (sf && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sf, x2old, y2old, [ f2, f2old, cx, cy ]); + } + df = f2 - f1; + c1 = math.cos(f1); + s1 = math.sin(f1); + c2 = math.cos(f2); + s2 = math.sin(f2); + t = math.tan(df / 4); + hx = 4 / 3 * rx * t; + hy = 4 / 3 * ry * t; + m1 = [ x1, y1 ]; + m2 = [ x1 + hx * s1, y1 - hy * c1 ]; + m3 = [ x2 + hx * s2, y2 - hy * c2 ]; + m4 = [ x2, y2 ]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [ m2, m3, m4 ].concat(res); + } else { + res = [ m2, m3, m4 ].concat(res).join().split(","); + newres = []; + for (i = 0, ii = res.length; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + } + // 把二次贝塞尔曲线参数转化为三次贝塞尔曲线参数 + function q2c(x1, y1, ax, ay, x2, y2) { + // copy from raphael.js + var _13 = 1 / 3, _23 = 2 / 3; + return [ _13 * x1 + _23 * ax, _13 * y1 + _23 * ay, _13 * x2 + _23 * ax, _13 * y2 + _23 * ay, x2, y2 ]; + } + /** + * kity.g.pathToCurve(path) + * + * 把路径转换为贝塞尔路径 + * + * @param {Array|String} path + * 要转换的 path 路径或数组 + * + * @return {Array} + * 转换后的 PathSegment,每一段都是 'C' + */ + g.pathToCurve = cacher(function(path) { + var i, j, command, param; + var initPoint, currentPoint, endPoint, shouldClose, lastControlPoint, aussumedControlPoint; + var controlPoint1, controlPoint2; + var res = []; + // 处理的路径要求是一个绝对路径 + if (!path.isAbsolute) path = g.pathToAbsolute(path); + for (i = 0; i < path.length; i++) { + command = path[i][0]; + param = path[i].slice(1); + // 画笔移动 + if (command == "M") { + initPoint = lastControlPoint = currentPoint = param; + res.push(path[i]); + continue; + } + // 路径闭合 + if (command == "Z") { + shouldClose = true; + command = "L"; + param = initPoint; + } + // 绘制命令的目的位置 + endPoint = param.slice(param.length - 2); + // 对 'H' 命令的修正 + if (command == "H") { + endPoint = [ param[0], currentPoint[1] ]; + command = "L"; + } + // 对 'V' 命令的修正 + if (command == "V") { + endPoint = [ currentPoint[0], param[0] ]; + command = "L"; + } + // 对 'S' 命令求出隐含的控制点位置 + if (command == "S" || command == "T") { + // 隐含控制点是上一个控制点关于当前位置的镜像 + aussumedControlPoint = [ currentPoint[0] + (currentPoint[0] - lastControlPoint[0]), currentPoint[1] + (currentPoint[1] - lastControlPoint[1]) ]; + } + // 针对不同的命令求控制点 + switch (command) { + case "L": + controlPoint1 = currentPoint; + controlPoint2 = endPoint; + break; + + case "C": + controlPoint1 = param.slice(0, 2); + controlPoint2 = param.slice(2, 4); + break; + + case "S": + controlPoint1 = aussumedControlPoint.slice(); + controlPoint2 = param.slice(0, 2); + break; + + case "Q": + lastControlPoint = param.slice(0, 2); + param = q2c.apply(null, currentPoint.concat(param)); + controlPoint1 = param.slice(0, 2); + controlPoint2 = param.slice(2, 4); + break; + + case "T": + param = q2c.apply(null, currentPoint.concat(aussumedControlPoint).concat(param)); + controlPoint1 = param.slice(0, 2); + controlPoint2 = param.slice(2, 4); + break; + + case "A": + param = a2c.apply(null, currentPoint.concat(param)); + j = 0; + while (j in param) { + controlPoint1 = param.slice(j, j + 2); + controlPoint2 = param.slice(j + 2, j + 4); + endPoint = param.slice(j + 4, j + 6); + // 写入当前一段曲线 + res.push([ "C" ].concat(controlPoint1).concat(controlPoint2).concat(endPoint)); + j += 6; + } + break; + } + if (command != "A") { + // 写入当前一段曲线 + res.push([ "C" ].concat(controlPoint1).concat(controlPoint2).concat(endPoint)); + } + // 为下次循环准备当前位置 + currentPoint = endPoint; + // 二次贝塞尔曲线自己已经记录了上个控制点的位置,其它的记录控制点 2 的位置 + if (command != "Q") { + lastControlPoint = controlPoint2; + } + if (shouldClose) { + res.push([ "Z" ]); + shouldClose = false; + } + } + res.isUniform = true; + res.isAbsolute = true; + res.isCurve = true; + res.toString = g.pathToString; + return res; + }); + /** + * 将贝塞尔曲线切成两部分 + * + * @see http://stackoverflow.com/questions/18655135/divide-bezier-curve-into-two-equal-halves + */ + function cutBezier(bezierArray, t) { + function __(t) { + return function(p, q) { + return p + t * (q - p); + }; + } + var _ = __(t || .5), ba = bezierArray, ax = ba[0], ay = ba[1], bx = ba[2], by = ba[3], cx = ba[4], cy = ba[5], dx = ba[6], dy = ba[7], ex = _(ax, bx), ey = _(ay, by), fx = _(bx, cx), fy = _(by, cy), gx = _(cx, dx), gy = _(cy, dy), hx = _(ex, fx), hy = _(ey, fy), jx = _(fx, gx), jy = _(fy, gy), kx = _(hx, jx), ky = _(hy, jy); + return [ [ ax, ay, ex, ey, hx, hy, kx, ky ], [ kx, ky, jx, jy, gx, gy, dx, dy ] ]; + } + /** + * kity.g.cutBezier(bezierArray, t) + * + * 在指定位置把贝塞尔曲线切割为两部分 + * + * @param {Array} bezierArray + * 表示贝塞尔曲线的一个数组 [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y] + * p1 和 p2 是贝塞尔曲线的起点和终点,c1 和 c2 是两个控制点 + * + * @param {Number} t + * 切割的位置(0 到 1) + * + * @return {Array} + * 切割的两个贝塞尔曲线:[ + * [p1x1, p1y1, c1x1, c1y1, c2x1, c2y1, p2x1, p2y1], + * [p1x2, p1y2, c1x2, c1y2, c2x2, c2y2, p2x2, p2y2] + * ] + * + */ + g.cutBezier = cacher(cutBezier); + /** + * 求一段贝塞尔曲线的子段 + * + * @param {Array} bezierArray + * 长度为 8 的数组,表示 [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y] + * + * @param {Number} t + * 子段的结束位置(0 到 1) + * + * @param {Number} t0 + * 字段的开始位置(0 到 t),可不传,默认为 0 + * + * @return {Array} + * 长度为 8 的数组,表示给定贝塞尔曲线的子段 + */ + g.subBezier = function(bezierArray, t, t0) { + var b2t = cutBezier(bezierArray, t)[0]; + return t0 ? cutBezier(b2t, t0 / t)[1] : b2t; + }; + /** + * 求贝塞尔曲线上的一个点 + * + * @param {Array} bezierArray + * 长度为 8 的数组,表示 [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y] + * + * @param {Number} t + * 所求点的开始位置(0 到 1) + * + * @return {Point} p + * p.x: x 坐标 + * p.y: y 坐标 + * p.tan: 在 t 处的切线方向(类型为 kity.Vector,模为 1) + */ + g.pointAtBezier = function(bezierArray, t) { + var b2t = cutBezier(bezierArray, t)[0]; + var p = Point.parse(b2t.slice(6)), c = Point.parse(b2t.slice(4, 2)), v = Vector.fromPoints(c, p); + if (t === 0) { + p.tan = g.pointAtBezier(bezierArray, .01).tan; + } else { + p.tan = v.normalize(); + } + return p; + }; + /** + * 求贝塞尔曲线的长度 + * + * @param {Array} bezierArray + * 长度为 8 的数组,表示 [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y] + * + * @param {Number} tolerate + * 允许的误差,默认是 0.1 + * + * @return {Number} 贝塞尔曲线的长度 + */ + g.bezierLength = cacher(function bezierLength(bezierArray) { + // 表示(c[0]*t^4 + c[1]*t^3 + c[2]*t^2 + c[3]*t^1 + c[4])^(1/2)的函数 + function f(x) { + var m = c0 * Math.pow(x, 4) + c1 * Math.pow(x, 3) + c2 * Math.pow(x, 2) + c3 * x + c4; + if (m < 0) { + m = 0; + } + return Math.pow(m, .5); + } + // 用Newton-Cotes型求积公式 + var arr = bezierArray; + // 三次贝塞尔曲线函数求导后,求出对应的方程系数,用cx[],cy[]表示x`(t)和y`(t)的系数 + var cx0, cx1, cx2; + var cy0, cy1, cy2; + // 用c[]表示x`(t)^2 + y`(t)^2的结果的系数 + var c0, c1, c2, c3, c4; + // 求x`(t) 和 y`(t)的系数 + cx0 = -3 * arr[0] + 9 * arr[2] - 9 * arr[4] + 3 * arr[6]; + cx1 = 6 * arr[0] - 12 * arr[2] + 6 * arr[4]; + cx2 = -3 * arr[0] + 3 * arr[2]; + cy0 = -3 * arr[1] + 9 * arr[3] - 9 * arr[5] + 3 * arr[7]; + cy1 = 6 * arr[1] - 12 * arr[3] + 6 * arr[5]; + cy2 = -3 * arr[1] + 3 * arr[3]; + // 求x`(t)^2 + y`(t)^2的结果的系数 c[] + c0 = Math.pow(cx0, 2) + Math.pow(cy0, 2); + c1 = 2 * (cx0 * cx1 + cy0 * cy1); + c2 = 2 * (cx0 * cx2 + cy0 * cy2) + Math.pow(cx1, 2) + Math.pow(cy1, 2); + c3 = 2 * (cx1 * cx2 + cy1 * cy2); + c4 = Math.pow(cx2, 2) + Math.pow(cy2, 2); + // 用cotes积分公式求值 + return (f(0) + f(1) + 4 * (f(.125) + f(.375) + f(.625) + f(.875)) + 2 * (f(.25) + f(.5) + f(.75))) / 24; + }); + // 计算一个 pathSegment 中每一段的在整体中所占的长度范围,以及总长度 + // 方法要求每一段都是贝塞尔曲线 + var getBezierPathSegmentRanges = cacher(function(pathSegment) { + var i, ii, segment, position, bezierLength, segmentRanges, totalLength; + segmentRanges = []; + // 总长度 + totalLength = 0; + for (i = 0, ii = pathSegment.length; i < ii; i++) { + segment = pathSegment[i]; + if (segment[0] == "M") { + position = segment.slice(1); + segmentRanges.push(null); + continue; + } + if (segment[0] == "Z") { + segmentRanges.push(null); + continue; + } + bezierLength = g.bezierLength(position.concat(segment.slice(1))); + segmentRanges.push([ totalLength, totalLength + bezierLength ]); + totalLength += bezierLength; + // 迭代当前位置 + position = segment.slice(4); + } + segmentRanges.totalLength = totalLength; + return segmentRanges; + }); + /** + * 求一段路径的子路径 + * + * @param {Array|String} path + * 原路径 + * + * @param {Number} t1 + * 要求的子路径的结束位置(0 到 1) + * + * @param {Number} t0 + * 要求的子路径的开始位置(0 到 t1),可不传,默认为 0 + * + * @return {Array} + * 子路径的 PathSegment + */ + g.subPath = function(path, t1, t0) { + var dt; + t0 = t0 || 0; + dt = t1 - t0; + dt = dt - (dt | 0); + t0 = t0 - (t0 | 0); + t1 = t0 + dt; + if (t1 > 1) { + return g.subPath(path, 1, t0).concat(g.subPath(path, t1 - 1)); + } + if (!path.isCurve) { + path = g.pathToCurve(path); + } + // path 每一段在整体中的长度区间 + var segmentRanges = getBezierPathSegmentRanges(path); + // path 总长度 + var totalLength = segmentRanges.totalLength; + // t1 和 t0 位置命中的长度位置 + var t1Length = totalLength * t1, t0Length = totalLength * (t0 || 0); + // 产生的子路径 + var subPath = []; + // 迭代变量,a 是一段的长度区间左值,b 是右值,d 是区间长度 + var i, ii, a, b, d; + var position; + var bezier, subBezier, stared; + for (i = 0, ii = path.length; i < ii; i++) { + if (path[i][0] == "M") { + position = path[i].slice(1); + if (stared) { + subPath.push(path[i].slice()); + } + continue; + } + if (path[i][0] == "Z") { + // subpath 路径不闭合 + continue; + } + a = segmentRanges[i][0]; + b = segmentRanges[i][1]; + d = b - a; + bezier = position.concat(path[i].slice(1)); + if (t0Length > b) { + // t0 和 t1 都右溢出 + // ----------------------------------- + // t0 t1 + // |________| + // + // 需要跳过当前块 + position = bezier.slice(bezier.length - 2); + continue; + } else if (t0Length >= a) { + // 命中 t0;t1 可能命中或右溢出 + // ----------------------------------- + // t0 t1 + // |______|__| + // + // or: |_|____|__| + // + // 取当前块 t0 到 t1 的部分 + subBezier = g.subBezier(bezier, Math.min((t1Length - a) / d, 1), (t0Length - a) / d); + stared = true; + position = subBezier.slice(0, 2); + subPath.push([ "M" ].concat(subBezier.slice(0, 2))); + subPath.push([ "C" ].concat(subBezier.slice(2))); + } else if (t1Length >= b) { + // t0 左溢出;t1 右溢出,整个块是需要的 + // ----------------------------------- + // t0 t1 + // |_________| + // + // 此时取整个块 + subPath.push(path[i].slice()); + } else if (t1Length >= a) { + // t0 左溢出;t1 命中,取当前块 t1 之前的部分 + // ----------------------------------- + // t0 t1 + // |__|______| + // 取当前块 t1 之前的部分 + subBezier = g.subBezier(bezier, (t1Length - a) / d); + subPath.push([ "C" ].concat(subBezier.slice(2))); + stared = false; + } else { + // 没有可以再要的了 + break; + } + position = bezier.slice(bezier.length - 2); + } + subPath.isAbsolute = true; + subPath.isCurve = true; + subPath.isUniform = true; + subPath.toString = g.pathToString; + return subPath; + }; + /** + * 求路径上的一个点 + * + * @param {Array|String} path + * 要求点的路径 + * + * @param {Number} t + * 要求的点的位置(0 到 1) + * + * @return {Point} p + * p.x: x 坐标 + * p.y: y 坐标 + * p.tan: 在 t 处的切线方向(类型为 kity.Vector,模为 1) + */ + g.pointAtPath = function(path, t) { + if (!path.isCurve) { + path = g.pathToCurve(path); + } + var subPath = g.subPath(path, t); + var lastCurve = subPath[subPath.length - 1][0] == "Z" ? subPath[subPath.length - 2] : subPath[subPath.length - 1]; + // 跳过 'C' 命令,只留参数 + lastCurve = lastCurve.slice(1); + var p = Point.parse(lastCurve.slice(4)), c = Point.parse(lastCurve.slice(2, 4)); + p.tan = Vector.fromPoints(c, p).normalize(); + return p; + }; + /** + * 求一段路径的长度 + * + * @param {string|Array} path + * 要求的路径 + * + * @return {Number} + * 路径的长度 + */ + g.pathLength = cacher(function(path) { + if (!path.isCurve) { + path = g.pathToCurve(path); + } + // path 每一段在整体中的长度区间 + var segmentRanges = getBezierPathSegmentRanges(path); + return segmentRanges.totalLength; + }); + /** + * 求一段路径的关键点 + * + * @param {string|Array} path + * 要求的路径 + * + * @return {Array} + * 关键点的集合 + */ + g.pathKeyPoints = cacher(function(path) { + var i, ii, command, keyPoints; + if (!path.isCurve) { + path = g.pathToCurve(path); + } + keyPoints = []; + for (i = 0, ii = path.length; i < ii; i++) { + if (path[i][0] == "z") continue; + keyPoints.push(path[i].slice(path[i].length - 2)); + } + return keyPoints; + }); + // 对比两个路径的关键位置,在合适的位置切割合适的路径,使得两个路径的段数一致 + // TODO: 使用插值算法,使对应点更合理 + var alignCurve = cacher(function(path1, path2) { + if (!path1.isCurve) path1 = g.pathToCurve(path1); + if (!path2.isCurve) path2 = g.pathToCurve(path2); + var p1 = pathClone(path1); + var p2 = pathClone(path2); + p1.i = 0; + p2.i = 0; + p1.o = p2; + p2.o = p1; + function command(p, i) { + return p[i || p.i] && p[i || p.i][0]; + } + function param(p, i) { + return p[i || p.i] && p[i || p.i].slice(1); + } + function point(p, i) { + var _param = param(p, i); + return _param && _param.slice(-2); + } + function fixZ(p) { + if (command(p) == "Z") { + p.splice(p.i, 1); + return true; + } + return false; + } + function fixM(p) { + if (command(p) == "M") { + p.o.splice(p.o.i, 0, [ "M" ].concat(point(p.o, p.o.i - 1))); + p.i++; + p.o.i++; + return true; + } + return false; + } + function fill(p) { + var lastPoint; + var i = 1; + while (!lastPoint) { + lastPoint = point(p, p.length - i++); + } + p.o.i = p.i; + while (p.length < p.o.length) { + if (fixZ(p.o)) continue; + if (fixM(p.o)) continue; + p.push([ "C" ].concat(lastPoint).concat(lastPoint).concat(lastPoint)); + p.i++; + p.o.i++; + } + } + while (p1.i < p1.length && p2.i < p2.length) { + if (fixZ(p1) || fixZ(p2)) continue; + if (command(p1) == command(p2)) { + p1.i++; + p2.i++; + continue; + } + if (fixM(p1) || fixM(p2)) continue; + p1.i++; + p2.i++; + } + if (p1.i == p1.length) fill(p1); + if (p2.i == p2.length) fill(p2); + delete p1.i; + delete p1.o; + delete p2.i; + delete p2.o; + return [ p1, p2 ]; + }); + g.alignCurve = alignCurve; + /** + * 获得两个路径的补间结果 + * + * @param {string|Array} path1 + * 补间起始路径 + * + * @param {string|Array} path2 + * 补间结束路径 + * + * @param {Number} t + * 补间比例,0 返回跟 path1 等效的结果;1 返回跟 path2 等效的结果 + * + * @return {PathSegment} + * 补间的结果 + */ + g.pathTween = function(path1, path2, t) { + if (t === 0) return path1; + if (t === 1) return path2; + var aligned = alignCurve(path1, path2); + var result = [], seg, i, j; + path1 = aligned[0]; + path2 = aligned[1]; + for (i = 0; i < path1.length; i++) { + result.push(seg = []); + seg.push(path1[i][0]); + for (j = 1; j < path1[i].length; j++) { + seg.push(path1[i][j] + t * (path2[i][j] - path1[i][j])); + } + } + result.isUniform = result.isCurve = result.isAbsolute = true; + return result; + }; + /** + * 变换指定的路径 + * + * @param {String|Array} path + * 需要变换的路径 + * + * @param {kity.Matrix} matrix + * 使用的变换矩阵 + * + * @return {Array} + * 变换后的路径 + */ + g.transformPath = cacher(function(path, matrix) { + var i, ii, j, result, seg, pair; + if (!path.isCurve) { + path = g.pathToCurve(path); + } + result = []; + for (i = 0, ii = path.length; i < ii; i++) { + result.push(seg = [ path[i][0] ]); + for (j = 1; j < path[i].length; j += 2) { + pair = path[i].slice(j, j + 2); + pair = matrix.transformPoint(Point.parse(pair)); + result.push(pair); + } + } + return result; + }); + // entend + _p.r(11).extendClass(Matrix, { + transformPath: function(path) { + return g.transformPath(path, this); + } + }); + return g; + } +}; + +//src/graphic/gradient.js +_p[35] = { + value: function(require, exports, module) { + var svg = _p.r(67); + var Resource = _p.r(58); + var Color = _p.r(28); + return _p.r(11).createClass("GradientBrush", { + base: Resource, + constructor: function(gradientNodeType, paper) { + this.callBase(gradientNodeType, paper); + this.stops = []; + }, + addStop: function(offset, color, opacity) { + var gstop = svg.createNode("stop"); + if (!(color instanceof Color)) { + color = Color.parse(color); + } + if (opacity === undefined) { + opacity = color.get("a"); + } + gstop.setAttribute("offset", offset); + gstop.setAttribute("stop-color", color.toRGB()); + if (opacity < 1) { + gstop.setAttribute("stop-opacity", opacity); + } + this.node.appendChild(gstop); + return this; + } + }); + } +}; + +//src/graphic/group.js +_p[36] = { + value: function(require, exports, module) { + var ShapeContainer = _p.r(61); + return _p.r(11).createClass("Group", { + mixins: [ ShapeContainer ], + base: _p.r(60), + constructor: function Group() { + this.callBase("g"); + } + }); + } +}; + +//src/graphic/hyperlink.js +_p[37] = { + value: function(require, exports, module) { + var ShapeContainer = _p.r(61); + return _p.r(11).createClass("HyperLink", { + mixins: [ ShapeContainer ], + base: _p.r(60), + constructor: function(url) { + this.callBase("a"); + this.setHref(url); + }, + setHref: function(href) { + this.node.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", href); + return this; + }, + getHref: function() { + return this.node.getAttributeNS("xlink:href"); + }, + setTarget: function(target) { + this.node.setAttribute("target", target); + return this; + }, + getTarget: function() { + return this.node.getAttribute("target"); + } + }); + } +}; + +//src/graphic/image.js +_p[38] = { + value: function(require, exports, module) { + return _p.r(11).createClass("Image", { + base: _p.r(60), + constructor: function(url, width, height, x, y) { + this.callBase("image"); + this.url = url; + this.width = width || 0; + this.height = height || 0; + this.x = x || 0; + this.y = y || 0; + this.update(); + }, + update: function() { + this.node.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", this.url); + this.node.setAttribute("x", this.x); + this.node.setAttribute("y", this.y); + this.node.setAttribute("width", this.width); + this.node.setAttribute("height", this.height); + return this; + }, + setUrl: function(url) { + this.url = url === "" ? null : url; + return this.update(); + }, + getUrl: function() { + return this.url; + }, + setWidth: function(width) { + this.width = width; + return this.update(); + }, + getWidth: function() { + return this.width; + }, + setHeight: function(height) { + this.height = height; + return this.update(); + }, + getHeight: function() { + return this.height; + }, + setX: function(x) { + this.x = x; + return this.update(); + }, + getX: function() { + return this.x; + }, + setY: function(y) { + this.y = y; + return this.update(); + }, + getY: function() { + return this.y; + } + }); + } +}; + +//src/graphic/line.js +_p[39] = { + value: function(require, exports, module) { + return _p.r(11).createClass("Line", { + base: _p.r(46), + constructor: function(x1, y1, x2, y2) { + this.callBase(); + this.point1 = { + x: x1 || 0, + y: y1 || 0 + }; + this.point2 = { + x: x2 || 0, + y: y2 || 0 + }; + this.update(); + }, + setPoint1: function(x, y) { + this.point1.x = x; + this.point1.y = y; + return this.update(); + }, + setPoint2: function(x, y) { + this.point2.x = x; + this.point2.y = y; + return this.update(); + }, + getPoint1: function() { + return { + x: this.point1.x, + y: this.point1.y + }; + }, + getPoint2: function() { + return { + x: this.point2.x, + y: this.point2.y + }; + }, + update: function() { + var drawer = this.getDrawer(); + drawer.clear(); + drawer.moveTo(this.point1.x, this.point1.y); + drawer.lineTo(this.point2.x, this.point2.y); + return this; + } + }); + } +}; + +//src/graphic/lineargradient.js +_p[40] = { + value: function(require, exports, module) { + var svg = _p.r(67); + var Gradient = _p.r(35); + return _p.r(11).createClass("LinearGradientBrush", { + base: Gradient, + constructor: function(paper) { + this.callBase("linearGradient", paper); + this.setStartPosition(0, 0); + this.setEndPosition(1, 0); + }, + setStartPosition: function(px, py) { + this.node.setAttribute("x1", px); + this.node.setAttribute("y1", py); + return this; + }, + setEndPosition: function(px, py) { + this.node.setAttribute("x2", px); + this.node.setAttribute("y2", py); + return this; + }, + getStartPosition: function() { + return { + x: +this.node.getAttribute("x1"), + y: +this.node.getAttribute("y1") + }; + }, + getEndPosition: function() { + return { + x: +this.node.getAttribute("x2"), + y: +this.node.getAttribute("y2") + }; + } + }); + } +}; + +//src/graphic/marker.js +_p[41] = { + value: function(require, exports, module) { + var Point = _p.r(50); + var Marker = _p.r(11).createClass("Marker", { + base: _p.r(58), + mixins: [ _p.r(61), _p.r(75) ], + constructor: function() { + this.callBase("marker"); + this.setOrient("auto"); + }, + setRef: function(x, y) { + if (arguments.length === 1) { + y = x.y; + x = x.x; + } + this.node.setAttribute("refX", x); + this.node.setAttribute("refY", y); + return this; + }, + getRef: function() { + return new Point(+this.node.getAttribute("refX"), +this.node.getAttribute("refY")); + }, + setWidth: function(width) { + this.node.setAttribute("markerWidth", this.width = width); + return this; + }, + setOrient: function(orient) { + this.node.setAttribute("orient", this.orient = orient); + return this; + }, + getOrient: function() { + return this.orient; + }, + getWidth: function() { + return +this.width; + }, + setHeight: function(height) { + this.node.setAttribute("markerHeight", this.height = height); + return this; + }, + getHeight: function() { + return +this.height; + } + }); + var Path = _p.r(46); + _p.r(11).extendClass(Path, { + setMarker: function(marker, pos) { + pos = pos || "end"; + if (!marker) { + this.node.removeAttribute("marker-" + pos); + } else { + this.node.setAttribute("marker-" + pos, marker.toString()); + } + return this; + } + }); + return Marker; + } +}; + +//src/graphic/mask.js +/** + * 蒙板 + */ +_p[42] = { + value: function(require, exports, module) { + var Class = _p.r(11); + var Shape = _p.r(60); + var Mask = Class.createClass("Mask", { + base: Shape, + mixins: [ _p.r(61) ], + constructor: function() { + this.callBase("mask"); + }, + mask: function(shape) { + shape.getNode().setAttribute("mask", "url(#" + this.getId() + ")"); + return this; + } + }); + Class.extendClass(Shape, { + maskWith: function(mask) { + mask.mask(this); + return this; + } + }); + return Mask; + } +}; + +//src/graphic/matrix.js +_p[43] = { + value: function(require, exports, module) { + var utils = _p.r(12); + var Box = _p.r(25); + var mPattern = /matrix\s*\((.+)\)/i; + var Point = _p.r(50); + // 注意,合并的结果是先执行m2,再执行m1的结果 + function mergeMatrixData(m2, m1) { + return { + a: m1.a * m2.a + m1.c * m2.b, + b: m1.b * m2.a + m1.d * m2.b, + c: m1.a * m2.c + m1.c * m2.d, + d: m1.b * m2.c + m1.d * m2.d, + e: m1.a * m2.e + m1.c * m2.f + m1.e, + f: m1.b * m2.e + m1.d * m2.f + m1.f + }; + } + function d2r(deg) { + return deg * Math.PI / 180; + } + var Matrix = _p.r(11).createClass("Matrix", { + constructor: function() { + if (arguments.length) { + this.setMatrix.apply(this, arguments); + } else { + this.setMatrix(1, 0, 0, 1, 0, 0); + } + }, + translate: function(x, y) { + this.m = mergeMatrixData(this.m, { + a: 1, + c: 0, + e: x, + b: 0, + d: 1, + f: y + }); + return this; + }, + rotate: function(deg) { + var rad = d2r(deg); + var sin = Math.sin(rad), cos = Math.cos(rad); + this.m = mergeMatrixData(this.m, { + a: cos, + c: -sin, + e: 0, + b: sin, + d: cos, + f: 0 + }); + return this; + }, + scale: function(sx, sy) { + if (sy === undefined) { + sy = sx; + } + this.m = mergeMatrixData(this.m, { + a: sx, + c: 0, + e: 0, + b: 0, + d: sy, + f: 0 + }); + return this; + }, + skew: function(degX, degY) { + if (degY === undefined) { + degY = degX; + } + var tx = Math.tan(d2r(degX)), ty = Math.tan(d2r(degY)); + this.m = mergeMatrixData(this.m, { + a: 1, + c: tx, + e: 0, + b: ty, + d: 1, + f: 0 + }); + return this; + }, + /** + * 获得反转矩阵 + * + * 这是我解方程算出来的 + */ + inverse: function() { + var m = this.m, a = m.a, b = m.b, c = m.c, d = m.d, e = m.e, f = m.f, k, aa, bb, cc, dd, ee, ff; + k = a * d - b * c; + aa = d / k; + bb = -b / k; + cc = -c / k; + dd = a / k; + ee = (c * f - e * d) / k; + ff = (b * e - a * f) / k; + return new Matrix(aa, bb, cc, dd, ee, ff); + }, + setMatrix: function(a, b, c, d, e, f) { + if (arguments.length === 1) { + this.m = utils.clone(arguments[0]); + } else { + this.m = { + a: a, + b: b, + c: c, + d: d, + e: e, + f: f + }; + } + return this; + }, + getMatrix: function() { + return utils.clone(this.m); + }, + getTranslate: function() { + var m = this.m; + return { + x: m.e / m.a, + y: m.f / m.d + }; + }, + mergeMatrix: function(matrix) { + return new Matrix(mergeMatrixData(this.m, matrix.m)); + }, + merge: function(matrix) { + return this.mergeMatrix(matrix); + }, + toString: function() { + return this.valueOf().join(" "); + }, + valueOf: function() { + var m = this.m; + return [ m.a, m.b, m.c, m.d, m.e, m.f ]; + }, + equals: function(matrix) { + var m1 = this.m, m2 = matrix.m; + return m1.a == m2.a && m1.b == m2.b && m1.c == m2.c && m1.d == m2.d && m1.e == m2.e && m1.f == m2.f; + }, + transformPoint: function() { + return Matrix.transformPoint.apply(null, [].slice.call(arguments).concat([ this.m ])); + }, + transformBox: function(box) { + return Matrix.transformBox(box, this.m); + }, + clone: function() { + return new Matrix(this.m); + } + }); + Matrix.parse = function(str) { + var match; + var f = parseFloat; + if (str instanceof Array) { + return new Matrix({ + a: str[0], + b: str[1], + c: str[2], + d: str[3], + e: str[4], + f: str[5] + }); + } + if (match = mPattern.exec(str)) { + var values = match[1].split(","); + if (values.length != 6) { + values = match[1].split(" "); + } + return new Matrix({ + a: f(values[0]), + b: f(values[1]), + c: f(values[2]), + d: f(values[3]), + e: f(values[4]), + f: f(values[5]) + }); + } + return new Matrix(); + }; + Matrix.transformPoint = function(x, y, m) { + if (arguments.length === 2) { + m = y; + y = x.y; + x = x.x; + } + return new Point(m.a * x + m.c * y + m.e, m.b * x + m.d * y + m.f); + }; + Matrix.transformBox = function(box, matrix) { + var xMin = Number.MAX_VALUE, xMax = -Number.MAX_VALUE, yMin = Number.MAX_VALUE, yMax = -Number.MAX_VALUE; + var bps = [ [ box.x, box.y ], [ box.x + box.width, box.y ], [ box.x, box.y + box.height ], [ box.x + box.width, box.y + box.height ] ]; + var bp, rp, rps = []; + while (bp = bps.pop()) { + rp = Matrix.transformPoint(bp[0], bp[1], matrix); + rps.push(rp); + xMin = Math.min(xMin, rp.x); + xMax = Math.max(xMax, rp.x); + yMin = Math.min(yMin, rp.y); + yMax = Math.max(yMax, rp.y); + } + box = new Box({ + x: xMin, + y: yMin, + width: xMax - xMin, + height: yMax - yMin + }); + utils.extend(box, { + closurePoints: rps + }); + return box; + }; + // 获得从 node 到 refer 的变换矩阵 + Matrix.getCTM = function(target, refer) { + var ctm = { + a: 1, + b: 0, + c: 0, + d: 1, + e: 0, + f: 0 + }; + var node = target.shapeNode || target.node; + refer = refer || "parent"; + /** + * 由于新版chrome(dev 48.0)移除了getTransformToElement这个方法可能导致报错,这里做兼容处理 + * @Date 2015-11-12 + * @Editor Naixor + */ + function getTransformToElement(target, source) { + var matrix; + try { + matrix = source.getScreenCTM().inverse(); + } catch (e) { + throw new Error("Can not inverse source element' ctm."); + } + return matrix.multiply(target.getScreenCTM()); + } + // 根据参照坐标系选区的不一样,返回不同的结果 + switch (refer) { + case "screen": + // 以浏览器屏幕为参照坐标系 + ctm = node.getScreenCTM(); + break; + + case "doc": + case "paper": + // 以文档(Paper)为参照坐标系 + ctm = node.getCTM(); + break; + + case "view": + case "top": + // 以顶层绘图容器(视野)为参照坐标系 + if (target.getPaper()) { + ctm = node.getTransformToElement !== undefined ? node.getTransformToElement(target.getPaper().shapeNode) : getTransformToElement(node, target.getPaper().shapeNode); + } + break; + + case "parent": + // 以父容器为参照坐标系 + if (target.node.parentNode) { + ctm = node.getTransformToElement !== undefined ? node.getTransformToElement(target.node.parentNode) : getTransformToElement(node, target.node.parentNode); + } + break; + + default: + // 其他情况,指定参照物 + if (refer.node) { + ctm = node.getTransformToElement !== undefined ? node.getTransformToElement(refer.shapeNode || refer.node) : getTransformToElement(node, refer.shapeNode || refer.node); + } + } + return ctm ? new Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.e, ctm.f) : new Matrix(); + }; + return Matrix; + } +}; + +//src/graphic/palette.js +/** + * 调色板 + */ +_p[44] = { + value: function(require, exports, module) { + //标准color + var StandardColor = _p.r(64), Color = _p.r(28), Utils = _p.r(12); + var Palette = _p.r(11).createClass("Palette", { + constructor: function() { + this.color = {}; + }, + /* + * 获取颜色名称所对应的颜色值的Color对象 + * @param name 需要获取的颜色名称 + * @return 对应颜色名称的color对象, 如果未找到对应的名称, 则返回null + */ + get: function(name) { + var colorValue = this.color[name] || StandardColor.EXTEND_STANDARD[name] || StandardColor.COLOR_STANDARD[name] || ""; + if (colorValue) { + return new Color(colorValue); + } + return null; + }, + /* + * 获取给定名称的颜色的hex值表示 + * @param name 需要获取的颜色名称 + * @return 如果找到对应的名称, 则返回该名称所对应的hex格式的值, 否则, 返回一个空字符串 + */ + getColorValue: function(name) { + return this.color[name] || StandardColor.EXTEND_STANDARD[name] || StandardColor.COLOR_STANDARD[name] || ""; + }, + /* + * 向调色板实例添加自己独有的颜色名称,对已存在的颜色名称, 将会覆盖掉 + * @param name 新添加的颜色名称 + * @param value 新添加的颜色名称所对应的值, 可以是一个合法的颜色字符串或者是一个color对象 + * @return 新添加的颜色的值 + */ + add: function(name, value) { + if (typeof value === "string") { + this.color[name] = new Color(value).toRGBA(); + } else { + this.color[name] = value.toRGBA(); + } + return value; + }, + /* + * 删除调色板实例上用户自己添加的颜色, 该方法不能删除内置的颜色 + * @param name 需要删除的颜色名称 + * @return 删除是否成功的bool值 + */ + remove: function(name) { + if (this.color.hasOwnProperty(name)) { + delete this.color[name]; + return true; + } + return false; + } + }); + Utils.extend(Palette, { + getColor: function(name) { + var colorValue = StandardColor.EXTEND_STANDARD[name] || StandardColor.COLOR_STANDARD[name]; + if (colorValue) { + return new Color(colorValue); + } + return null; + }, + /* + * 通过给定的名字获取标准的颜色值表示, 返回的值以hex的方式提供 + * @param name 需要获取的标准颜色名称 + * @return 名字所对应的颜色值的hex表示, 如果未找到对应名称的值, 则返回一个空字符串 + */ + getColorValue: function(name) { + return StandardColor.EXTEND_STANDARD[name] || StandardColor.COLOR_STANDARD[name] || ""; + }, + /* + * 向调色板添加颜色名称,新添加的颜色对所有的调色板对象都可见 + * 对已存在的颜色名称, 将会覆盖掉 + * @param name 新添加的颜色名称 + * @param value 新添加的颜色名称所对于的值, 应该是一个hex格式的颜色字符串, 如: ”#ff0000“ + * @return 新添加的颜色的值 + */ + addColor: function(name, value) { + if (typeof value === "string") { + StandardColor.EXTEND_STANDARD[name] = new Color(value).toRGBA(); + } else { + StandardColor.EXTEND_STANDARD[name] = value.toRGBA(); + } + return value; + }, + /* + * 删除用户自己添加的颜色, 该方法不能删除内置的颜色, 该方法不会影响调色板实例自由的颜色 + * @param name 需要删除的颜色名称 + * @return 删除是否成功的bool值 + */ + removeColor: function(name) { + if (StandardColor.EXTEND_STANDARD.hasOwnProperty(name)) { + delete StandardColor.EXTEND_STANDARD[name]; + return true; + } + return false; + } + }); + return Palette; + } +}; + +//src/graphic/paper.js +_p[45] = { + value: function(require, exports, module) { + var Class = _p.r(11); + var utils = _p.r(12); + var svg = _p.r(67); + var Container = _p.r(29); + var ShapeContainer = _p.r(61); + var ViewBox = _p.r(75); + var EventHandler = _p.r(33); + var Styled = _p.r(66); + var Matrix = _p.r(43); + var Paper = Class.createClass("Paper", { + mixins: [ ShapeContainer, EventHandler, Styled, ViewBox ], + constructor: function(container) { + this.callBase(); + this.node = this.createSVGNode(); + this.node.paper = this; + this.node.appendChild(this.resourceNode = svg.createNode("defs")); + this.node.appendChild(this.shapeNode = svg.createNode("g")); + this.resources = new Container(); + this.setWidth("100%").setHeight("100%"); + if (container) { + this.renderTo(container); + } + this.callMixin(); + }, + renderTo: function(container) { + if (utils.isString(container)) { + container = document.getElementById(container); + } + this.container = container; + container.appendChild(this.node); + }, + createSVGNode: function() { + var node = svg.createNode("svg"); + node.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + node.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); + node.setAttribute("version", "1.1"); + return node; + }, + getNode: function() { + return this.node; + }, + getContainer: function() { + return this.container; + }, + getWidth: function() { + return this.node.clientWidth; + }, + setWidth: function(width) { + this.node.setAttribute("width", width); + return this; + }, + getHeight: function() { + return this.node.clientHeight; + }, + setHeight: function(height) { + this.node.setAttribute("height", height); + return this; + }, + setViewPort: function(cx, cy, zoom) { + var viewport, box; + if (arguments.length == 1) { + viewport = arguments[0]; + cx = viewport.center.x; + cy = viewport.center.y; + zoom = viewport.zoom; + } + zoom = zoom || 1; + box = this.getViewBox(); + var matrix = new Matrix(); + var dx = box.x + box.width / 2 - cx, dy = box.y + box.height / 2 - cy; + matrix.translate(-cx, -cy); + matrix.scale(zoom); + matrix.translate(cx, cy); + matrix.translate(dx, dy); + this.shapeNode.setAttribute("transform", "matrix(" + matrix + ")"); + this.viewport = { + center: { + x: cx, + y: cy + }, + offset: { + x: dx, + y: dy + }, + zoom: zoom + }; + return this; + }, + getViewPort: function() { + if (!this.viewport) { + var box = this.getViewBox(); + return { + zoom: 1, + center: { + x: box.x + box.width / 2, + y: box.y + box.height / 2 + }, + offset: { + x: 0, + y: 0 + } + }; + } + return this.viewport; + }, + getViewPortMatrix: function() { + return Matrix.parse(this.shapeNode.getAttribute("transform")); + }, + getViewPortTransform: function() { + var m = this.shapeNode.getCTM(); + return new Matrix(m.a, m.b, m.c, m.d, m.e, m.f); + }, + getTransform: function() { + return this.getViewPortTransform().reverse(); + }, + addResource: function(resource) { + this.resources.appendItem(resource); + if (resource.node) { + this.resourceNode.appendChild(resource.node); + } + return this; + }, + removeResource: function(resource) { + if (resource.remove) { + resource.remove(); + } + if (resource.node) { + this.resourceNode.removeChild(resource.node); + } + return this; + }, + getPaper: function() { + return this; + } + }); + var Shape = _p.r(60); + Class.extendClass(Shape, { + getPaper: function() { + var parent = this.container; + while (parent && parent instanceof Paper === false) { + parent = parent.container; + } + return parent; + }, + isAttached: function() { + return !!this.getPaper(); + }, + whenPaperReady: function(fn) { + var me = this; + function check() { + var paper = me.getPaper(); + if (paper && fn) { + fn.call(me, paper); + } + return paper; + } + if (!check()) { + this.on("add treeadd", function listen() { + if (check()) { + me.off("add", listen); + me.off("treeadd", listen); + } + }); + } + return this; + } + }); + return Paper; + } +}; + +//src/graphic/path.js +_p[46] = { + value: function(require, exports, module) { + var Utils = _p.r(12); + var createClass = _p.r(11).createClass; + var Shape = _p.r(60); + var svg = _p.r(67); + var g = _p.r(34); + var slice = Array.prototype.slice, flatten = Utils.flatten; + var PathDrawer = createClass("PathDrawer", { + constructor: function(path) { + this.segment = []; + this.path = path; + this.__clear = false; + }, + getPath: function() { + return this.path; + }, + redraw: function() { + this._transation = this._transation || []; + return this.clear(); + }, + done: function() { + var transation = this._transation; + this._transation = null; + this.push(transation); + return this; + }, + clear: function() { + if (this._transation) { + this._transation = []; + } else { + this.path.setPathData("M 0 0"); + } + this._clear = true; + return this; + }, + push: function() { + var segment = slice.call(arguments); + var originData; + if (this._transation) { + this._transation.push(segment); + return this; + } + if (this._clear) { + originData = ""; + this._clear = false; + } else { + originData = this.path.getPathData(); + } + originData = originData || ""; + this.path.setPathData(originData + g.pathToString(segment)); + return this; + }, + moveTo: function(x, y) { + return this.push("M", slice.call(arguments)); + }, + moveBy: function(dx, dy) { + return this.push("m", slice.call(arguments)); + }, + lineTo: function(x, y) { + return this.push("L", slice.call(arguments)); + }, + lineBy: function(dx, dy) { + return this.push("l", slice.call(arguments)); + }, + arcTo: function(rx, ry, xr, laf, sf, x, y) { + return this.push("A", slice.call(arguments)); + }, + arcBy: function(rx, ry, xr, laf, sf, dx, dy) { + return this.push("a", arguments); + }, + carcTo: function(r, laf, sf, x, y) { + return this.push("A", [ r, r, 0 ].concat(slice.call(arguments, 1))); + }, + carcBy: function(r, laf, sf, dx, dy) { + return this.push("a", [ r, r, 0 ].concat(slice.call(arguments, 1))); + }, + bezierTo: function(x1, y1, x2, y2, x, y) { + return this.push("C", slice.call(arguments)); + }, + bezierBy: function(dx1, dy1, dx2, dy2, dx, dy) { + return this.push("c", slice.call(arguments)); + }, + close: function() { + return this.push("z"); + } + }); + return createClass("Path", { + base: Shape, + constructor: function(data) { + this.callBase("path"); + if (data) { + this.setPathData(data); + } + this.node.setAttribute("fill", svg.defaults.fill); + this.node.setAttribute("stroke", svg.defaults.stroke); + }, + setPathData: function(data) { + data = data || "M0,0"; + this.pathdata = g.pathToString(data); + this.node.setAttribute("d", this.pathdata); + this.trigger("shapeupdate", { + type: "pathdata" + }); + return this; + }, + getPathData: function() { + return this.pathdata || ""; + }, + getDrawer: function() { + return new PathDrawer(this); + }, + isClosed: function() { + var data = this.getPathData(); + return !!~data.indexOf("z") || !!~data.indexOf("Z"); + } + }); + } +}; + +//src/graphic/pattern.js +_p[47] = { + value: function(require, exports, module) { + var Resource = _p.r(58); + var ShapeContainer = _p.r(61); + var svg = _p.r(67); + return _p.r(11).createClass("PatternBrush", { + base: Resource, + mixins: [ ShapeContainer ], + constructor: function(paper) { + this.callBase("pattern", paper); + this.node.setAttribute("patternUnits", "userSpaceOnUse"); + }, + setX: function(x) { + this.x = x; + this.node.setAttribute("x", x); + return this; + }, + setY: function(y) { + this.y = y; + this.node.setAttribute("y", y); + return this; + }, + setWidth: function(width) { + this.width = width; + this.node.setAttribute("width", width); + return this; + }, + setHeight: function(height) { + this.height = height; + this.node.setAttribute("height", height); + return this; + }, + getWidth: function() { + return this.width; + }, + getHeight: function() { + return this.height; + } + }); + } +}; + +//src/graphic/pen.js +_p[48] = { + value: function(require, exports, module) { + var Color = _p.r(28); + return _p.r(11).createClass("Pen", { + constructor: function(brush, width) { + this.brush = brush; + this.width = width || 1; + this.linecap = null; + this.linejoin = null; + this.dashArray = null; + this.opacity = 1; + }, + getBrush: function() { + return this.brush; + }, + setBrush: function(brush) { + this.brush = brush; + return this; + }, + setColor: function(color) { + return this.setBrush(color); + }, + getColor: function() { + return this.brush instanceof Color ? this.brush : null; + }, + getWidth: function() { + return this.width; + }, + setWidth: function(width) { + this.width = width; + return this; + }, + getOpacity: function() { + return this.opacity; + }, + setOpacity: function(opacity) { + this.opacity = opacity; + }, + getLineCap: function() { + return this.linecap; + }, + setLineCap: function(linecap) { + this.linecap = linecap; + return this; + }, + getLineJoin: function() { + return this.linejoin; + }, + setLineJoin: function(linejoin) { + this.linejoin = linejoin; + return this; + }, + getDashArray: function() { + return this.dashArray; + }, + setDashArray: function(dashArray) { + this.dashArray = dashArray; + return this; + }, + stroke: function(shape) { + var node = shape.node; + node.setAttribute("stroke", this.brush.toString()); + node.setAttribute("stroke-width", this.getWidth()); + if (this.getOpacity() < 1) { + node.setAttribute("stroke-opacity", this.getOpacity()); + } + if (this.getLineCap()) { + node.setAttribute("stroke-linecap", this.getLineCap()); + } + if (this.getLineJoin()) { + node.setAttribute("stroke-linejoin", this.getLineJoin()); + } + if (this.getDashArray()) { + node.setAttribute("stroke-dasharray", this.getDashArray()); + } + } + }); + } +}; + +//src/graphic/pie.js +_p[49] = { + value: function(require, exports, module) { + return _p.r(11).createClass({ + base: _p.r(68), + constructor: function(radius, angle, angleOffset) { + this.callBase([ 0, radius ], angle, angleOffset); + }, + getRadius: function() { + return this.getSectionArray()[1]; + }, + setRadius: function(radius) { + this.setSectionArray([ 0, radius ]); + } + }); + } +}; + +//src/graphic/point.js +/* + * 点对象抽象 + */ +_p[50] = { + value: function(require, exports, module) { + /** + * @class kity.Point + * @description 表示一个点 + */ + var Point = _p.r(11).createClass("Point", { + /** + * @constructor + * @for kity.Point + * @description 指定默认的 x 和 y 创建一个点 + * + * @param {Number} x 点的 x 坐标 + * @param {Number} y 点的 y 坐标 + */ + constructor: function(x, y) { + /** + * @property + * @for kity.Point + * @description 表示点的 x 坐标 + * @type {Number} + */ + this.x = x || 0; + /** + * @property + * @for kity.Point + * @description 表示点的 y 坐标 + * @type {Number} + */ + this.y = y || 0; + }, + offset: function(dx, dy) { + if (arguments.length == 1) { + dy = dx.y; + dx = dx.x; + } + return new Point(this.x + dx, this.y + dy); + }, + valueOf: function() { + return [ this.x, this.y ]; + }, + toString: function() { + return this.valueOf().join(" "); + }, + spof: function() { + return new Point((this.x | 0) + .5, (this.y | 0) + .5); + }, + round: function() { + return new Point(this.x | 0, this.y | 0); + }, + isOrigin: function() { + return this.x === 0 && this.y === 0; + } + }); + /** + * @static + * @method fromPolar() + * @for kity.Point + * @grammar kity.Point.fromPolar(radius, angle, unit) => kity.Point + * @param {Number} radius 极坐标中的半径 + * @param {Number} angle 极坐标中的角度 + * @param {String} unit 角度使用的单位,默认为 'deg' (角度),可以取值为 'rad',表示传入的是弧度值 + */ + Point.fromPolar = function(radius, angle, unit) { + if (unit != "rad") { + // deg to rad + angle = angle / 180 * Math.PI; + } + return new Point(radius * Math.cos(angle), radius * Math.sin(angle)); + }; + Point.parse = function(unknown) { + if (!unknown) return new Point(); + if (unknown instanceof Point) { + return unknown; + } + if (typeof unknown == "string") { + return Point.parse(unknown.split(/\s*[\s,]\s*/)); + } + if ("0" in unknown && "1" in unknown) { + return new Point(unknown[0], unknown[1]); + } + }; + return Point; + } +}; + +//src/graphic/pointcontainer.js +/** + * 点集合容器 + */ +_p[51] = { + value: function(require, exports, module) { + return _p.r(11).createClass("PointContainer", { + base: _p.r(29), + constructor: function() { + this.callBase(); + }, + addPoint: function(point, pos) { + return this.addItem.apply(this, arguments); + }, + prependPoint: function() { + return this.prependItem.apply(this, arguments); + }, + appendPoint: function() { + return this.appendItem.apply(this, arguments); + }, + removePoint: function(pos) { + return this.removeItem.apply(this, arguments); + }, + addPoints: function() { + return this.addItems.apply(this, arguments); + }, + setPoints: function() { + return this.setItems.apply(this, arguments); + }, + getPoint: function() { + return this.getItem.apply(this, arguments); + }, + getPoints: function() { + return this.getItems.apply(this, arguments); + }, + getFirstPoint: function() { + return this.getFirstItem.apply(this, arguments); + }, + getLastPoint: function() { + return this.getLastItem.apply(this, arguments); + } + }); + } +}; + +//src/graphic/poly.js +/* + * 通过点来决定图形的公共父类 + */ +_p[52] = { + value: function(require, exports, module) { + var Utils = _p.r(12); + return _p.r(11).createClass("Poly", { + base: _p.r(46), + mixins: [ _p.r(51) ], + constructor: function(points, closeable) { + this.callBase(); + //是否可闭合 + this.closeable = !!closeable; + this.setPoints(points || []); + this.changeable = true; + this.update(); + }, + //当点集合发生变化时采取的动作 + onContainerChanged: function() { + if (this.changeable) { + this.update(); + } + }, + update: function() { + var drawer = this.getDrawer(), points = this.getPoints(); + drawer.clear(); + if (!points.length) { + return this; + } + drawer.moveTo(points[0]); + for (var i = 1, point, len = points.length; i < len; i++) { + point = points[i]; + drawer.lineTo(point); + } + if (this.closeable && points.length > 2) { + drawer.close(); + } + return this; + } + }); + } +}; + +//src/graphic/polygon.js +_p[53] = { + value: function(require, exports, module) { + return _p.r(11).createClass("Polygon", { + base: _p.r(52), + constructor: function(points) { + this.callBase(points, true); + } + }); + } +}; + +//src/graphic/polyline.js +_p[54] = { + value: function(require, exports, module) { + return _p.r(11).createClass("Polyline", { + base: _p.r(52), + constructor: function(points) { + this.callBase(points); + } + }); + } +}; + +//src/graphic/radialgradient.js +_p[55] = { + value: function(require, exports, module) { + var Gradient = _p.r(35); + return _p.r(11).createClass("RadialGradientBrush", { + base: Gradient, + constructor: function(paper) { + this.callBase("radialGradient", paper); + this.setCenter(.5, .5); + this.setFocal(.5, .5); + this.setRadius(.5); + }, + setCenter: function(cx, cy) { + this.node.setAttribute("cx", cx); + this.node.setAttribute("cy", cy); + return this; + }, + getCenter: function() { + return { + x: +this.node.getAttribute("cx"), + y: +this.node.getAttribute("cy") + }; + }, + setFocal: function(fx, fy) { + this.node.setAttribute("fx", fx); + this.node.setAttribute("fy", fy); + return this; + }, + getFocal: function() { + return { + x: +this.node.getAttribute("fx"), + y: +this.node.getAttribute("fy") + }; + }, + setRadius: function(r) { + this.node.setAttribute("r", r); + return this; + }, + getRadius: function() { + return +this.node.getAttribute("r"); + } + }); + } +}; + +//src/graphic/rect.js +_p[56] = { + value: function(require, exports, module) { + var RectUtils = {}, Utils = _p.r(12), Point = _p.r(50), Box = _p.r(25); + Utils.extend(RectUtils, { + //根据传递进来的width、height和radius属性, + //获取最适合的radius值 + formatRadius: function(width, height, radius) { + var minValue = Math.floor(Math.min(width / 2, height / 2)); + return Math.min(minValue, radius); + } + }); + /** + * @class kity.Rect + * @description 表示一个矩形 + * @base kity.Path + */ + var Rect = _p.r(11).createClass("Rect", { + base: _p.r(46), + /** + * @constructor + * @for kity.Rect + * @grammar new kity.Rect(width, height, x, y, radius) + * @param {Number} width 矩形的初始化宽度 + * @param {Number} height 矩形的初始化高度 + * @param {Number} x 矩形的初始化 x 坐标 + * @param {Number} y 矩形的初始化 y 坐标 + * @param {Number} radius 矩形的初始化圆角大小 + */ + constructor: function(width, height, x, y, radius) { + this.callBase(); + this.x = x || 0; + this.y = y || 0; + this.width = width || 0; + this.height = height || 0; + this.radius = RectUtils.formatRadius(this.width, this.height, radius || 0); + this.update(); + }, + update: function() { + var x = this.x, y = this.y, w = this.width, h = this.height, r = this.radius; + var drawer = this.getDrawer().redraw(); + if (!r) { + // 直角 + drawer.push("M", x, y); + drawer.push("h", w); + drawer.push("v", h); + drawer.push("h", -w); + drawer.push("z"); + } else { + //圆角 + w -= 2 * r; + h -= 2 * r; + drawer.push("M", x + r, y); + drawer.push("h", w); + drawer.push("a", r, r, 0, 0, 1, r, r); + drawer.push("v", h); + drawer.push("a", r, r, 0, 0, 1, -r, r); + drawer.push("h", -w); + drawer.push("a", r, r, 0, 0, 1, -r, -r); + drawer.push("v", -h); + drawer.push("a", r, r, 0, 0, 1, r, -r); + drawer.push("z"); + } + drawer.done(); + return this; + }, + /** + * @method setWidth + * @for kity.Rect + * @grammar setWidth(width) => kity.Rect + * @description 设置矩形的宽度,设置后返回矩形实例本身 + * @param {Number} width 宽度值 + * + * @example + * ```js + * rect.setWidth(300); + * ``` + */ + setWidth: function(width) { + this.width = width; + return this.update(); + }, + /** + * @method setHeight + * @for kity.Rect + * @grammar setHeight(height) => kity.Rect + * @description 设置矩形的高度,设置后返回矩形实例本身 + * @param {Number} height 高度值 + * + * @example + * ```js + * rect.setHeight(200); + * ``` + */ + setHeight: function(height) { + this.height = height; + return this.update(); + }, + /** + * @method setSize + * @for kity.Rect + * @grammar setSize(width, height) => kity.Rect + * @description 设置矩形的尺寸,设置后返回矩形本身 + * @param {Number} width 矩形的宽度值 + * @param {Number} height 矩形的高度值 + * + * @example + * ```js + * rect.setSize(300, 200); + * ``` + */ + setSize: function(width, height) { + this.width = width; + this.height = height; + return this.update(); + }, + /** + * @method setBox + * @for kity.Rect + * @grammar setBox(box) => kity.Rect + * @description 使用一个 kity 的盒子数据, + * @param {kity.Box} box 盒子数据 + */ + setBox: function(box) { + this.x = box.x; + this.y = box.y; + this.width = box.width; + this.height = box.height; + return this.update(); + }, + getBox: function() { + return new Box(this.x, this.y, this.width, this.height); + }, + getRadius: function() { + return this.radius; + }, + setRadius: function(radius) { + this.radius = RectUtils.formatRadius(this.width, this.height, radius || 0); + return this.update(); + }, + getPosition: function() { + return new Point(this.x, this.y); + }, + setPosition: function(x, y) { + if (arguments.length == 1) { + var p = Point.parse(arguments[0]); + y = p.y; + x = p.x; + } + this.x = x; + this.y = y; + return this.update(); + }, + getWidth: function() { + return this.width; + }, + getHeight: function() { + return this.height; + }, + getPositionX: function() { + return this.x; + }, + getPositionY: function() { + return this.y; + }, + setPositionX: function(x) { + this.x = x; + return this.update(); + }, + setPositionY: function(y) { + this.y = y; + return this.update(); + } + }); + return Rect; + } +}; + +//src/graphic/regularpolygon.js +_p[57] = { + value: function(require, exports, module) { + var Point = _p.r(50); + return _p.r(11).createClass("RegularPolygon", { + base: _p.r(46), + constructor: function(side, radius, x, y) { + this.callBase(); + this.radius = radius || 0; + this.side = Math.max(side || 3, 3); + if (arguments.length > 2) { + if (arguments.length == 3) { + y = x.y; + x = x.x; + } + } + this.center = new Point(x, y); + this.draw(); + }, + getSide: function() { + return this.side; + }, + setSide: function(side) { + this.side = side; + return this.draw(); + }, + getRadius: function() { + return this.radius; + }, + setRadius: function(radius) { + this.radius = radius; + return this.draw(); + }, + draw: function() { + var radius = this.radius, side = this.side, step = Math.PI * 2 / side, drawer = this.getDrawer(), i; + drawer.clear(); + drawer.moveTo(Point.fromPolar(radius, Math.PI / 2, "rad").offset(this.center)); + for (i = 0; i <= side; i++) { + drawer.lineTo(Point.fromPolar(radius, step * i + Math.PI / 2, "rad").offset(this.center)); + } + drawer.close(); + return this; + } + }); + } +}; + +//src/graphic/resource.js +/** + * @fileOverview + * + * 资源节点基类 + * + * @author: techird + * @copyright: Baidu FEX, 2014 + */ +_p[58] = { + value: function(require, exports, module) { + var svg = _p.r(67); + return _p.r(11).createClass("Resource", { + constructor: function(nodeType, paper) { + this.callBase(); + this.node = svg.createNode(nodeType); + if (paper) { + paper.addResource(this); + } + }, + toString: function() { + return "url(#" + this.node.id + ")"; + } + }); + } +}; + +//src/graphic/ring.js +_p[59] = { + value: function(require, exports, module) { + return _p.r(11).createClass({ + base: _p.r(68), + constructor: function(innerRadius, outerRadius) { + this.callBase([ innerRadius, outerRadius ], 360, 0); + }, + getInnerRadius: function() { + return this.getSectionArray()[0]; + }, + getOuterRadius: function() { + return this.getSectionArray()[1]; + }, + setInnerRadius: function(value) { + this.setSectionArray([ value, this.getOuterRadius() ]); + }, + setOuterRadius: function(value) { + this.setSectionArray([ this.getInnerRadius(), value ]); + } + }); + } +}; + +//src/graphic/shape.js +_p[60] = { + value: function(require, exports, module) { + var svg = _p.r(67); + var utils = _p.r(12); + var EventHandler = _p.r(33); + var Styled = _p.r(66); + var Data = _p.r(31); + var Matrix = _p.r(43); + var Pen = _p.r(48); + var slice = Array.prototype.slice; + var Box = _p.r(25); + var Shape = _p.r(11).createClass("Shape", { + mixins: [ EventHandler, Styled, Data ], + constructor: function Shape(tagName) { + this.node = svg.createNode(tagName); + this.node.shape = this; + this.transform = { + translate: null, + rotate: null, + scale: null, + matrix: null + }; + this.callMixin(); + }, + getId: function() { + return this.node.id; + }, + setId: function(id) { + this.node.id = id; + return this; + }, + getNode: function() { + return this.node; + }, + getBoundaryBox: function() { + var box; + try { + box = this.node.getBBox(); + } catch (e) { + box = { + x: this.node.clientLeft, + y: this.node.clientTop, + width: this.node.clientWidth, + height: this.node.clientHeight + }; + } + return new Box(box); + }, + getRenderBox: function(refer) { + var box = this.getBoundaryBox(); + var matrix = this.getTransform(refer); + return matrix.transformBox(box); + }, + getWidth: function() { + return this.getRenderBox().width; + }, + getHeight: function() { + return this.getRenderBox().height; + }, + getSize: function() { + var box = this.getRenderBox(); + delete box.x; + delete box.y; + return box; + }, + setOpacity: function(value) { + this.node.setAttribute("opacity", value); + return this; + }, + getOpacity: function() { + var opacity = this.node.getAttribute("opacity"); + return opacity ? +opacity : 1; + }, + setVisible: function(value) { + if (value) { + this.node.removeAttribute("display"); + } else { + this.node.setAttribute("display", "none"); + } + return this; + }, + getVisible: function() { + this.node.getAttribute("display"); + }, + hasAncestor: function(node) { + var parent = this.container; + while (parent) { + if (parent === node) { + return true; + } + parent = parent.container; + } + return false; + }, + getTransform: function(refer) { + return Matrix.getCTM(this, refer); + }, + clearTransform: function() { + this.node.removeAttribute("transform"); + this.transform = { + translate: null, + rotate: null, + scale: null, + matrix: null + }; + this.trigger("shapeupdate", { + type: "transform" + }); + return this; + }, + _applyTransform: function() { + var t = this.transform, result = []; + if (t.translate) { + result.push([ "translate(", t.translate, ")" ]); + } + if (t.rotate) { + result.push([ "rotate(", t.rotate, ")" ]); + } + if (t.scale) { + result.push([ "scale(", t.scale, ")" ]); + } + if (t.matrix) { + result.push([ "matrix(", t.matrix, ")" ]); + } + this.node.setAttribute("transform", utils.flatten(result).join(" ")); + return this; + }, + setMatrix: function(m) { + this.transform.matrix = m; + return this._applyTransform(); + }, + setTranslate: function(t) { + this.transform.translate = t !== null && slice.call(arguments) || null; + return this._applyTransform(); + }, + setRotate: function(r) { + this.transform.rotate = r !== null && slice.call(arguments) || null; + return this._applyTransform(); + }, + setScale: function(s) { + this.transform.scale = s !== null && slice.call(arguments) || null; + return this._applyTransform(); + }, + translate: function(dx, dy) { + var m = this.transform.matrix || new Matrix(); + if (dy === undefined) { + dy = 0; + } + this.transform.matrix = m.translate(dx, dy); + return this._applyTransform(); + }, + rotate: function(deg) { + var m = this.transform.matrix || new Matrix(); + this.transform.matrix = m.rotate(deg); + return this._applyTransform(); + }, + scale: function(sx, sy) { + var m = this.transform.matrix || new Matrix(); + if (sy === undefined) { + sy = sx; + } + this.transform.matrix = m.scale(sx, sy); + return this._applyTransform(); + }, + skew: function(sx, sy) { + var m = this.transform.matrix || new Matrix(); + if (sy === undefined) { + sy = sx; + } + this.transform.matrix = m.skew(sx, sy); + return this._applyTransform(); + }, + stroke: function(pen, width) { + if (pen && pen.stroke) { + pen.stroke(this); + } else if (pen) { + // 字符串或重写了 toString 的对象 + this.node.setAttribute("stroke", pen.toString()); + if (width) { + this.node.setAttribute("stroke-width", width); + } + } else if (pen === null) { + this.node.removeAttribute("stroe"); + } + return this; + }, + fill: function(brush) { + // 字符串或重写了 toString 的对象 + if (brush) { + this.node.setAttribute("fill", brush.toString()); + } + if (brush === null) { + this.node.removeAttribute("fill"); + } + return this; + }, + setAttr: function(a, v) { + var me = this; + if (utils.isObject(a)) { + utils.each(a, function(val, key) { + me.setAttr(key, val); + }); + } + if (v === undefined || v === null || v === "") { + this.node.removeAttribute(a); + } else { + this.node.setAttribute(a, v); + } + return this; + }, + getAttr: function(a) { + return this.node.getAttribute(a); + } + }); + return Shape; + } +}; + +//src/graphic/shapecontainer.js +_p[61] = { + value: function(require, exports, module) { + var Container = _p.r(29); + var utils = _p.r(12); + var ShapeContainer = _p.r(11).createClass("ShapeContainer", { + base: Container, + isShapeContainer: true, + /* private */ + handleAdd: function(shape, index) { + var parent = this.getShapeNode(); + parent.insertBefore(shape.node, parent.childNodes[index] || null); + shape.trigger("add", { + container: this + }); + if (shape.notifyTreeModification) { + shape.notifyTreeModification("treeadd", this); + } + }, + /* private */ + handleRemove: function(shape, index) { + var parent = this.getShapeNode(); + parent.removeChild(shape.node); + shape.trigger("remove", { + container: this + }); + if (shape.notifyTreeModification) { + shape.notifyTreeModification("treeremove", this); + } + }, + /* private */ + notifyTreeModification: function(type, container) { + this.eachItem(function(index, shape) { + if (shape.notifyTreeModification) { + shape.notifyTreeModification(type, container); + } + shape.trigger(type, { + container: container + }); + }); + }, + /* public */ + getShape: function(index) { + return this.getItem(index); + }, + /* public */ + addShape: function(shape, index) { + return this.addItem(shape, index); + }, + put: function(shape) { + this.addShape(shape); + return shape; + }, + appendShape: function(shape) { + return this.addShape(shape); + }, + prependShape: function(shape) { + return this.addShape(shape, 0); + }, + replaceShape: function(replacer, origin) { + var index = this.indexOf(origin); + if (index === -1) { + return; + } + this.removeShape(index); + this.addShape(replacer, index); + return this; + }, + addShapeBefore: function(shape, refer) { + var index = this.indexOf(refer); + return this.addShape(shape, index); + }, + addShapeAfter: function(shape, refer) { + var index = this.indexOf(refer); + return this.addShape(shape, index === -1 ? undefined : index + 1); + }, + /* public */ + addShapes: function(shapes) { + return this.addItems(shapes); + }, + /* public */ + removeShape: function(index) { + return this.removeItem(index); + }, + getShapes: function() { + return this.getItems(); + }, + getShapesByType: function(name) { + var shapes = []; + function getShapes(shape) { + if (name.toLowerCase() == shape.getType().toLowerCase()) { + shapes.push(shape); + } + if (shape.isShapeContainer) { + utils.each(shape.getShapes(), function(n) { + getShapes(n); + }); + } + } + getShapes(this); + return shapes; + }, + /* public */ + getShapeById: function(id) { + return this.getShapeNode().getElementById(id).shape; + }, + arrangeShape: function(shape, index) { + return this.removeShape(shape).addShape(shape, index); + }, + /* protected */ + getShapeNode: function() { + return this.shapeNode || this.node; + } + }); + var Shape = _p.r(60); + _p.r(11).extendClass(Shape, { + bringTo: function(index) { + this.container.arrangeShape(this, index); + return this; + }, + bringFront: function() { + return this.bringTo(this.container.indexOf(this) + 1); + }, + bringBack: function() { + return this.bringTo(this.container.indexOf(this) - 1); + }, + bringTop: function() { + this.container.removeShape(this).addShape(this); + return this; + }, + bringRear: function() { + return this.bringTo(0); + }, + bringRefer: function(referShape, offset) { + if (referShape.container) { + if (this.remove) { + this.remove(); + } + referShape.container.addShape(this, referShape.container.indexOf(referShape) + (offset || 0)); + } + return this; + }, + bringAbove: function(referShape) { + return this.bringRefer(referShape); + }, + bringBelow: function(referShape) { + return this.bringRefer(referShape, 1); + }, + replaceBy: function(newShape) { + if (this.container) { + newShape.bringAbove(this); + this.remove(); + } + return this; + } + }); + return ShapeContainer; + } +}; + +//src/graphic/shapeevent.js +/* + * 图形事件包装类 + * */ +_p[62] = { + value: function(require, exprots, module) { + var Matrix = _p.r(43), Utils = _p.r(12), Point = _p.r(50); + return _p.r(11).createClass("ShapeEvent", { + constructor: function(event) { + var target = null; + // dom 事件封装对象 + if (!Utils.isObject(event.target)) { + this.type = event.type; + target = event.target; + // use标签有特殊属性, 需要区别对待 + if (target.correspondingUseElement) { + target = target.correspondingUseElement; + } + this.originEvent = event; + this.targetShape = target.shape || target.paper || event.currentTarget && (event.currentTarget.shape || event.currentTarget.paper); + if (event._kityParam) { + Utils.extend(this, event._kityParam); + } + } else { + Utils.extend(this, event); + } + }, + preventDefault: function() { + var evt = this.originEvent; + if (!evt) { + return true; + } + if (evt.preventDefault) { + evt.preventDefault(); + return evt.cancelable; + } else { + evt.returnValue = false; + return true; + } + }, + //当前鼠标事件在用户坐标系中点击的点的坐标位置 + getPosition: function(refer, touchIndex) { + if (!this.originEvent) { + return null; + } + var eventClient = this.originEvent.touches ? this.originEvent.touches[touchIndex || 0] : this.originEvent; + var target = this.targetShape; + var targetNode = target.shapeNode || target.node; + var pScreen = new Point(eventClient && eventClient.clientX || 0, eventClient && eventClient.clientY || 0); + var pTarget = Matrix.transformPoint(pScreen, targetNode.getScreenCTM().inverse()); + var pRefer = Matrix.getCTM(target, refer || "view").transformPoint(pTarget); + return pRefer; + }, + stopPropagation: function() { + var evt = this.originEvent; + if (!evt) { + return true; + } + if (evt.stopPropagation) { + evt.stopPropagation(); + } else { + evt.cancelBubble = false; + } + } + }); + } +}; + +//src/graphic/shapepoint.js +/* + * 图形上的点抽象 + */ +_p[63] = { + value: function(require, exports, module) { + return _p.r(11).createClass("ShapePoint", { + base: _p.r(50), + constructor: function(px, py) { + this.callBase(px, py); + }, + setX: function(x) { + return this.setPoint(x, this.y); + }, + setY: function(y) { + return this.setPoint(this.x, y); + }, + setPoint: function(x, y) { + this.x = x; + this.y = y; + this.update(); + return this; + }, + getPoint: function() { + return this; + }, + update: function() { + if (this.container && this.container.update) { + this.container.update(); + } + return this; + } + }); + } +}; + +//src/graphic/standardcolor.js +/** + * 标准颜色映射 + */ +_p[64] = { + value: { + COLOR_STANDARD: { + 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", + darkgrey: "#a9a9a9", + darkkhaki: "#bdb76b", + darkmagenta: "#8b008b", + darkolivegreen: "#556b2f", + darkorange: "#ff8c00", + darkorchid: "#9932cc", + darkred: "#8b0000", + darksalmon: "#e9967a", + darkseagreen: "#8fbc8f", + darkslateblue: "#483d8b", + darkslategray: "#2f4f4f", + darkslategrey: "#2f4f4f", + darkturquoise: "#00ced1", + darkviolet: "#9400d3", + deeppink: "#ff1493", + deepskyblue: "#00bfff", + dimgray: "#696969", + dimgrey: "#696969", + dodgerblue: "#1e90ff", + firebrick: "#b22222", + floralwhite: "#fffaf0", + forestgreen: "#228b22", + fuchsia: "#ff00ff", + gainsboro: "#dcdcdc", + ghostwhite: "#f8f8ff", + gold: "#ffd700", + goldenrod: "#daa520", + gray: "#808080", + green: "#008000", + greenyellow: "#adff2f", + grey: "#808080", + 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", + lightgray: "#d3d3d3", + lightgreen: "#90ee90", + lightgrey: "#d3d3d3", + lightpink: "#ffb6c1", + lightsalmon: "#ffa07a", + lightseagreen: "#20b2aa", + lightskyblue: "#87cefa", + lightslategray: "#778899", + lightslategrey: "#778899", + lightsteelblue: "#b0c4de", + lightyellow: "#ffffe0", + lime: "#00ff00", + limegreen: "#32cd32", + linen: "#faf0e6", + magenta: "#ff00ff", + maroon: "#800000", + mediumaquamarine: "#66cdaa", + mediumblue: "#0000cd", + mediumorchid: "#ba55d3", + mediumpurple: "#9370db", + 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: "#db7093", + 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", + slategrey: "#708090", + snow: "#fffafa", + springgreen: "#00ff7f", + steelblue: "#4682b4", + tan: "#d2b48c", + teal: "#008080", + thistle: "#d8bfd8", + tomato: "#ff6347", + turquoise: "#40e0d0", + violet: "#ee82ee", + wheat: "#f5deb3", + white: "#ffffff", + whitesmoke: "#f5f5f5", + yellow: "#ffff00" + }, + //标准扩展 + EXTEND_STANDARD: {} + } +}; + +//src/graphic/star.js +_p[65] = { + value: function(require, exports, module) { + /** + * @see http://www.jdawiseman.com/papers/easymath/surds_star_inner_radius.html + */ + var defaultRatioForStar = { + "3": .2, + // yy + "5": .38196601125, + "6": .57735026919, + "8": .541196100146, + "10": .726542528005, + "12": .707106781187 + }; + var Point = _p.r(50); + return _p.r(11).createClass("Star", { + base: _p.r(46), + constructor: function(vertex, radius, shrink, offset, angleOffset) { + this.callBase(); + this.vertex = vertex || 3; + this.radius = radius || 0; + this.shrink = shrink; + this.offset = offset || new Point(0, 0); + this.angleOffset = angleOffset || 0; + this.draw(); + }, + getVertex: function() { + return this.vertex; + }, + setVertex: function(value) { + this.vertex = value; + return this.draw(); + }, + getRadius: function() { + return this.radius; + }, + setRadius: function(value) { + this.radius = value; + return this.draw(); + }, + getShrink: function() { + return this.shrink; + }, + setShrink: function(value) { + this.shrink = value; + return this.draw(); + }, + getOffset: function() { + return this.offset; + }, + setOffset: function(value) { + this.offset = value; + return this.draw(); + }, + getAngleOffset: function() { + return this.angleOffset; + }, + setAngleOffset: function(value) { + this.angleOffset = value; + return this.draw(); + }, + draw: function() { + var innerRadius = this.radius, outerRadius = this.radius * (this.shrink || defaultRatioForStar[this.vertex] || .5), vertex = this.vertex, offset = this.offset, angleStart = 90, angleStep = 180 / vertex, angleOffset = this.angleOffset, drawer = this.getDrawer(), i, angle; + drawer.clear(); + drawer.moveTo(Point.fromPolar(outerRadius, angleStart)); + for (i = 1; i <= vertex * 2; i++) { + angle = angleStart + angleStep * i; + // 绘制内点 + if (i % 2) { + drawer.lineTo(Point.fromPolar(innerRadius, angle + angleOffset).offset(offset)); + } else { + drawer.lineTo(Point.fromPolar(outerRadius, angle)); + } + } + drawer.close(); + } + }); + } +}; + +//src/graphic/styled.js +_p[66] = { + value: function(require, exports, module) { + // polyfill for ie + var ClassList = _p.r(11).createClass("ClassList", { + constructor: function(node) { + this._node = node; + this._list = node.className.toString().split(" "); + }, + _update: function() { + this._node.className = this._list.join(" "); + }, + add: function(name) { + this._list.push(name); + this._update(); + }, + remove: function(name) { + var index = this._list.indexOf(name); + if (~index) { + this._list.splice(index, 1); + } + this._update(); + }, + contains: function(name) { + return !!~this._list.indexOf(name); + } + }); + function getClassList(node) { + if (!node.classList) { + node.classList = new ClassList(node); + } + return node.classList; + } + return _p.r(11).createClass("Styled", { + addClass: function(name) { + getClassList(this.node).add(name); + return this; + }, + removeClass: function(name) { + getClassList(this.node).remove(name); + return this; + }, + hasClass: function(name) { + return getClassList(this.node).contains(name); + }, + setStyle: function(styles) { + if (arguments.length == 2) { + this.node.style[arguments[0]] = arguments[1]; + return this; + } + for (var name in styles) { + if (styles.hasOwnProperty(name)) { + this.node.style[name] = styles[name]; + } + } + return this; + } + }); + } +}; + +//src/graphic/svg.js +_p[67] = { + value: function(require, exports, module) { + var doc = document; + var id = 0; + var svg = { + createNode: function(name) { + var node = doc.createElementNS(svg.ns, name); + node.id = "kity_" + name + "_" + id++; + return node; + }, + defaults: { + stroke: "none", + fill: "none" + }, + xlink: "http://www.w3.org/1999/xlink", + ns: "http://www.w3.org/2000/svg" + }; + return svg; + } +}; + +//src/graphic/sweep.js +_p[68] = { + value: function(require, exports, module) { + var Point = _p.r(50); + return _p.r(11).createClass("Sweep", { + base: _p.r(46), + constructor: function(sectionArray, angle, angleOffset) { + this.callBase(); + this.sectionArray = sectionArray || []; + this.angle = angle || 0; + this.angleOffset = angleOffset || 0; + this.draw(); + }, + getSectionArray: function() { + return this.sectionArray; + }, + setSectionArray: function(value) { + this.sectionArray = value; + return this.draw(); + }, + getAngle: function() { + return this.angle; + }, + setAngle: function(value) { + this.angle = value; + return this.draw(); + }, + getAngleOffset: function() { + return this.angleOffset; + }, + setAngleOffset: function(value) { + this.angleOffset = value; + return this.draw(); + }, + draw: function() { + var sectionArray = this.sectionArray, i; + for (i = 0; i < sectionArray.length; i += 2) { + this.drawSection(sectionArray[i], sectionArray[i + 1]); + } + return this; + }, + drawSection: function(from, to) { + var angleLength = this.angle && (this.angle % 360 ? this.angle % 360 : 360), angleStart = this.angleOffset, angleHalf = angleStart + angleLength / 2, angleEnd = angleStart + angleLength, sweepFlag = angleLength < 0 ? 0 : 1, drawer = this.getDrawer(); + drawer.redraw(); + if (angleLength === 0) { + drawer.done(); + return; + } + drawer.moveTo(Point.fromPolar(from, angleStart)); + drawer.lineTo(Point.fromPolar(to, angleStart)); + if (to) { + drawer.carcTo(to, 0, sweepFlag, Point.fromPolar(to, angleHalf)); + drawer.carcTo(to, 0, sweepFlag, Point.fromPolar(to, angleEnd)); + } + drawer.lineTo(Point.fromPolar(from, angleEnd)); + if (from) { + drawer.carcTo(from, 0, sweepFlag, Point.fromPolar(from, angleHalf)); + drawer.carcTo(from, 0, sweepFlag, Point.fromPolar(from, angleStart)); + } + drawer.close(); + drawer.done(); + } + }); + } +}; + +//src/graphic/text.js +_p[69] = { + value: function(require, exports, module) { + var TextContent = _p.r(70); + var ShapeContainer = _p.r(61); + var svg = _p.r(67); + var utils = _p.r(12); + var offsetHash = {}; + function getTextBoundOffset(text) { + var font = text._cachedFontHash; + if (offsetHash[font]) { + return offsetHash[font]; + } + var textContent = text.getContent(); + text.setContent("百度Fex"); + var bbox = text.getBoundaryBox(), y = text.getY(); + if (!bbox.height) return { + top: 0, + bottom: 0, + middle: 0 + }; + var topOffset = y - bbox.y + +text.node.getAttribute("dy"), bottomOffset = topOffset - bbox.height; + text.setContent(textContent); + return offsetHash[font] = { + top: topOffset, + bottom: bottomOffset, + middle: (topOffset + bottomOffset) / 2 + }; + } + return _p.r(11).createClass("Text", { + base: TextContent, + mixins: [ ShapeContainer ], + constructor: function(content) { + this.callBase("text"); + if (content !== undefined) { + this.setContent(content); + } + this._buildFontHash(); + }, + fixPosition: function() { + if (!this.__fixedPosition) { + this.setVerticalAlign(this.getVerticalAlign()); + } + }, + _buildFontHash: function() { + var style = window.getComputedStyle(this.node); + this._cachedFontHash = [ style.fontFamily, style.fontSize, style.fontStretch, style.fontStyle, style.fontVariant, style.fontWeight ].join("-"); + }, + _fontChanged: function(font) { + var last = this._lastFont; + var current = utils.extend({}, last, font); + if (!last) { + this._lastFont = font; + return true; + } + var changed = last.family != current.family || last.size != current.size || last.style != current.style || last.weight != current.weight; + this._lastFont = current; + return changed; + }, + setX: function(x) { + this.node.setAttribute("x", x); + return this; + }, + setPosition: function(x, y) { + return this.setX(x).setY(y); + }, + setY: function(y) { + this.node.setAttribute("y", y); + return this; + }, + getX: function() { + return +this.node.getAttribute("x") || 0; + }, + getY: function() { + return +this.node.getAttribute("y") || 0; + }, + setFont: function(font) { + this.callBase(font); + if (this._fontChanged(font)) { + this._buildFontHash(); + this.setVerticalAlign(this.getVerticalAlign()); + } + return this; + }, + setTextAnchor: function(anchor) { + this.node.setAttribute("text-anchor", anchor); + return this; + }, + getTextAnchor: function() { + return this.node.getAttribute("text-anchor") || "start"; + }, + // top/bottom/middle/baseline + setVerticalAlign: function(align) { + this.whenPaperReady(function() { + var dy; + switch (align) { + case "top": + dy = getTextBoundOffset(this).top; + break; + + case "bottom": + dy = getTextBoundOffset(this).bottom; + break; + + case "middle": + dy = getTextBoundOffset(this).middle; + break; + + default: + dy = 0; + } + if (dy) this.__fixedPosition = true; + this.node.setAttribute("dy", dy); + }); + this.verticalAlign = align; + return this; + }, + getVerticalAlign: function() { + return this.verticalAlign || "baseline"; + }, + setStartOffset: function(offset) { + // only for text path + if (this.shapeNode != this.node) { + this.shapeNode.setAttribute("startOffset", offset * 100 + "%"); + } + }, + addSpan: function(span) { + this.addShape(span); + return this; + }, + setPath: function(path) { + var textpath = this.shapeNode; + if (this.shapeNode == this.node) { + // 当前还不是 textpath + textpath = this.shapeNode = svg.createNode("textPath"); + while (this.node.firstChild) { + this.shapeNode.appendChild(this.node.firstChild); + } + this.node.appendChild(textpath); + } + textpath.setAttributeNS(svg.xlink, "xlink:href", "#" + path.node.id); + this.setTextAnchor(this.getTextAnchor()); + return this; + } + }); + } +}; + +//src/graphic/textcontent.js +_p[70] = { + value: function(require, exports, module) { + var Shape = _p.r(60); + return _p.r(11).createClass("TextContent", { + base: Shape, + constructor: function(nodeType) { + // call shape constructor + this.callBase(nodeType); + this.shapeNode = this.shapeNode || this.node; + this.shapeNode.setAttribute("text-rendering", "geometricPrecision"); + }, + clearContent: function() { + while (this.shapeNode.firstChild) { + this.shapeNode.removeChild(this.shapeNode.firstChild); + } + return this; + }, + setContent: function(content) { + this.shapeNode.textContent = content; + return this; + }, + getContent: function() { + return this.shapeNode.textContent; + }, + appendContent: function(content) { + this.shapeNode.textContent += content; + return this; + }, + setSize: function(value) { + return this.setFontSize(value); + }, + setFontSize: function(value) { + return this.setFont({ + size: value + }); + }, + setFontFamily: function(value) { + return this.setFont({ + family: value + }); + }, + setFontBold: function(bold) { + return this.setFont({ + weight: bold ? "bold" : "normal" + }); + }, + setFontItalic: function(italic) { + return this.setFont({ + style: italic ? "italic" : "normal" + }); + }, + setFont: function(font) { + var node = this.node; + [ "family", "size", "weight", "style" ].forEach(function(section) { + if (font[section] === null) { + node.removeAttribute("font-" + section); + } else if (font[section]) { + node.setAttribute("font-" + section, font[section]); + } + }); + return this; + }, + getExtentOfChar: function(index) { + return this.node.getExtentOfChar(index); + }, + getRotationOfChar: function(index) { + return this.node.getRotationOfChar(index); + }, + getCharNumAtPosition: function(x, y) { + return this.node.getCharNumAtPosition(this.node.viewportElement.createSVGPoint(x, y)); + } + }); + } +}; + +//src/graphic/textspan.js +_p[71] = { + value: function(require, exports, module) { + var TextContent = _p.r(70); + var Styled = _p.r(66); + return _p.r(11).createClass("TextSpan", { + base: TextContent, + mixins: [ Styled ], + constructor: function(content) { + this.callBase("tspan"); + this.setContent(content); + } + }); + } +}; + +//src/graphic/use.js +/* + * USE 功能 + */ +_p[72] = { + value: function(require, exports, module) { + var Svg = _p.r(67); + var Class = _p.r(11); + var Use = Class.createClass("Use", { + base: _p.r(60), + constructor: function(shape) { + this.callBase("use"); + this.ref(shape); + }, + ref: function(shape) { + if (!shape) { + this.node.removeAttributeNS(Svg.xlink, "xlink:href"); + return this; + } + var shapeId = shape.getId(); + if (shapeId) { + this.node.setAttributeNS(Svg.xlink, "xlink:href", "#" + shapeId); + } + // by techird + // 作为 Use 的图形,如果没有 fill 和 stroke,移除默认的 'none' 值,用于 Use 覆盖 + if (shape.node.getAttribute("fill") === "none") { + shape.node.removeAttribute("fill"); + } + if (shape.node.getAttribute("stroke") === "none") { + shape.node.removeAttribute("stroke"); + } + return this; + } + }); + var Shape = _p.r(60); + Class.extendClass(Shape, { + // fast-use + use: function() { + return new Use(this); + } + }); + return Use; + } +}; + +//src/graphic/vector.js +_p[73] = { + value: function(require, exports, module) { + var Point = _p.r(50); + var Matrix = _p.r(43); + var Vector = _p.r(11).createClass("Vector", { + base: Point, + constructor: function(x, y) { + this.callBase(x, y); + }, + square: function() { + return this.x * this.x + this.y * this.y; + }, + length: function() { + return Math.sqrt(this.square()); + }, + add: function(q) { + return new Vector(this.x + q.x, this.y + q.y); + }, + minus: function(q) { + return new Vector(this.x - q.x, this.y - q.y); + }, + dot: function(q) { + return this.x * q.x + this.y * q.y; + }, + project: function(q) { + return q.multipy(this.dot(q) / q.square()); + }, + normalize: function(length) { + if (length === undefined) { + length = 1; + } + return this.multipy(length / this.length()); + }, + multipy: function(scale) { + return new Vector(this.x * scale, this.y * scale); + }, + rotate: function(angle, unit) { + if (unit == "rad") { + angle = angle / Math.PI * 180; + } + var p = new Matrix().rotate(angle).transformPoint(this); + return new Vector(p.x, p.y); + }, + vertical: function() { + return new Vector(this.y, -this.x); + }, + reverse: function() { + return this.multipy(-1); + }, + getAngle: function() { + var length = this.length(); + if (length === 0) return 0; + var rad = Math.acos(this.x / length); + var sign = this.y > 0 ? 1 : -1; + return sign * 180 * rad / Math.PI; + } + }); + Vector.fromPoints = function(p1, p2) { + return new Vector(p2.x - p1.x, p2.y - p1.y); + }; + Vector.fromPolar = function() { + var p = Point.fromPolar.apply(Point, arguments); + return new Vector(p.x, p.y); + }; + _p.r(11).extendClass(Point, { + asVector: function() { + return new Vector(this.x, this.y); + } + }); + return Vector; + } +}; + +//src/graphic/view.js +_p[74] = { + value: function(require, exports, module) { + var ShapeContainer = _p.r(61); + var ViewBox = _p.r(75); + return _p.r(11).createClass("View", { + mixins: [ ShapeContainer, ViewBox ], + base: _p.r(74), + constructor: function() { + this.callBase("view"); + } + }); + } +}; + +//src/graphic/viewbox.js +_p[75] = { + value: function(require, exports, module) { + return _p.r(11).createClass("ViewBox", { + getViewBox: function() { + var attr = this.node.getAttribute("viewBox"); + if (attr === null) { + // firefox: + // 1. viewBox 没有设置过的时候获得的是 null + // 2. svg 标签没有指定绝对大小的时候 clientWidth 和 clientHeigt 为 0,需要在父容器上查找 + // TODO: 第 2 条取得的不准确(假如有 padding 之类的) + return { + x: 0, + y: 0, + width: this.node.clientWidth || this.node.parentNode.clientWidth, + height: this.node.clientHeight || this.node.parentNode.clientHeight + }; + } else { + attr = attr.split(" "); + return { + x: +attr[0], + y: +attr[1], + width: +attr[2], + height: +attr[3] + }; + } + }, + setViewBox: function(x, y, width, height) { + this.node.setAttribute("viewBox", [ x, y, width, height ].join(" ")); + return this; + } + }); + } +}; + +//src/kity.js +/** + * @fileOverview kity 暴露的方法或对象 + */ +_p[76] = { + value: function(require, exports, module) { + var kity = {}, utils = _p.r(12); + kity.version = "2.0.0"; + utils.extend(kity, { + // core + createClass: _p.r(11).createClass, + extendClass: _p.r(11).extendClass, + Utils: utils, + Browser: _p.r(10), + // shape + Box: _p.r(25), + Bezier: _p.r(23), + BezierPoint: _p.r(24), + Circle: _p.r(26), + Clip: _p.r(27), + Color: _p.r(28), + Container: _p.r(29), + Curve: _p.r(30), + Ellipse: _p.r(32), + Group: _p.r(36), + Gradient: _p.r(35), + HyperLink: _p.r(37), + Image: _p.r(38), + Line: _p.r(39), + LinearGradient: _p.r(40), + Mask: _p.r(42), + Matrix: _p.r(43), + Marker: _p.r(41), + Palette: _p.r(44), + Paper: _p.r(45), + Path: _p.r(46), + Pattern: _p.r(47), + Pen: _p.r(48), + Point: _p.r(50), + PointContainer: _p.r(51), + Polygon: _p.r(53), + Polyline: _p.r(54), + Pie: _p.r(49), + RadialGradient: _p.r(55), + Resource: _p.r(58), + Rect: _p.r(56), + RegularPolygon: _p.r(57), + Ring: _p.r(59), + Shape: _p.r(60), + ShapePoint: _p.r(63), + ShapeContainer: _p.r(61), + Sweep: _p.r(68), + Star: _p.r(65), + Text: _p.r(69), + TextSpan: _p.r(71), + Use: _p.r(72), + Vector: _p.r(73), + g: _p.r(34), + // animate + Animator: _p.r(0), + Easing: _p.r(1), + OpacityAnimator: _p.r(4), + RotateAnimator: _p.r(6), + ScaleAnimator: _p.r(7), + Timeline: _p.r(8), + TranslateAnimator: _p.r(9), + PathAnimator: _p.r(5), + MotionAnimator: _p.r(3), + requestFrame: _p.r(2).requestFrame, + releaseFrame: _p.r(2).releaseFrame, + // filter + Filter: _p.r(20), + GaussianblurFilter: _p.r(21), + ProjectionFilter: _p.r(22), + // effect + ColorMatrixEffect: _p.r(13), + CompositeEffect: _p.r(14), + ConvolveMatrixEffect: _p.r(15), + Effect: _p.r(16), + GaussianblurEffect: _p.r(17), + OffsetEffect: _p.r(18) + }); + return window.kity = kity; + } +}; + +var moduleMapping = { + kity: 76 +}; + +function use(name) { + _p.r([ moduleMapping[name] ]); +} +/* global use, inc: true */ + +/** + * 模块暴露 + */ +use('kity'); +})(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/loading.gif b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bb90fd6a49107a321c35b9cee4a7b810314b51f GIT binary patch literal 1787 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 WKVS!lK#me95g4F$!-{Avfd2tyqRXcM literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_CAL.woff b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_CAL.woff new file mode 100644 index 0000000000000000000000000000000000000000..f433b03af6a9396146bc669df2a4f74c58b6e61a GIT binary patch literal 5576 zcmZWtXHb(}w|xjkdQ(6k7^)z>N)1Sn4iYg)hXf)>2jP_>y-4r9cccWVA|j!egf1Xm zDJn%U6p^BooA>+f%>8lq%$hT6%|2_NJ?G5%v3(3RH4PC6LjYjH0aO4n*jNCPf7kyX z>YAFI06;Ik&YZFCL!0qTyD^yQ z)-??k@=$<_>*b}*vC0i{E@2QTjJuXn^ii#;b4Gj1Y^3O{a(&=CCwKmigI1r?la9i_ z)^hS|-_RRZV<#7_6v*E{M<~h3S=zXtFP&#NzZ1#7k`OAU6AEG4fbZ>~bV44t?Y z?NCTX^qI-NqH!2wAICC}QXbW3_n8mJnrF8wK52Vtf}{1+ z4lpt`HPzM(6IbSyl-FU&$!~Y?!Og^^sSgfPMG7#a@eO=*|9ZaiP(Lm&yTw9|P|s$4 zF;rTAV#;GyW?E)uXIg@3#CT#3FccW^*}s?=j1C5m5x`Vq95HmJ(`Fn^y=GFTQf3So zGmOvq_jub2kyXp0jKDY72|plHC#XrQ)>4l86+7>y;DHb;QYc+IZ7yuwQMSqYOBSs5ltmMa%t~#&+KC=;@?Vl2BT9KGok7F6^PbE*@s=kRDEbyovrcKgF#m6tgtVLe)+p0L030Y09zc5xDfw<2gBZfPj``x|o zD+X0mY)IxuCi>0;)4j(D@mWsX)0`OuJPS!q@iKxkdg<2=))Vf9ZJMp!p03~5{x}^l7HZU){A%VDi3*LkOfbsLV8M!@;dYU{4}k;ExN=rO*3-=j>2NU2qh)kWGF$W<^t$`Qr&cn0RvI+YbktljIX*R2 zN5w*E!~UA4uR;)&p)zihouq!RT^6uui*i4?W{cl34clAOwiF2Au$ypwQxN2KBcjLK zlxFQE&Z1VzAq0frD~Ob7>X@|GtccW%t0-@%ZYLqLXu=Z=@rwg!l%-oP{b921MEZfm z$Vi`yrAh29#&y*#!Ev%wHRU^TIL1zZSNjdt+TL0BS>l&Dp}=ui}{mULJ2ec7DU=s zvmp*+YQX0Tc|B}p_)4dI3F#hrnmr5RyF-rptc(K{6kc-qc)!#oEBNG~wUY>SI|ofv zbwuy`%c$FQa}ws*;${&qI@>cRT;B<@3KZR4$e`N^_PDQhYH+OD=Jw(>1hEJ!TP&9P z6Kd|+S{eI7I-dGyT^8F(8LSuR4iC{-bL>dRli40N`G_!V-*`q67hjv#`eXg8K-4!I z!YOMf2v&T+Oskc#89M>FUFck~Vx(YpE}W*GY0k^AA@20l$-37`GLsrCeVL{xrw!Q5 zDSz<5*1Y*jO&fMYu3V|AVOn-KJR(6zS};MgmW1XoJS~`<*2MVs+l9PwRV8VDW^Dt{ z#B0fu@-aA>rX1~|mZV--kH~5JL7Y_dGuY{*CY-HLvPX78 zYAjvL`a8ET_03h)0fNYIUWY8r9`PLW9MQCKLuxg$nXtYe_cEEjcGGtJQOu8tf6|U6 z!3a*mv3jX!dkKXMbDkA>QP0uKkI~KBOt*`sa>n)wM#>7T#q`sXzKB|a-lu_an>W~go+m#zQ#J1U$-r$hS z^3~tHBvYnhCbVjcxR|lPRE^9>3CvR;o0_vde^>`483N|miN??ED24dXLvc~Vr2$^= zsn~J7ThnLxWQ-`Rp3RTB4|Jfw;7KF??)dC%Ebl6hW1CIV-T4ys#aac&?^`OT zA~M@jBCqsKHS-;BmZ=SOYc*_12hc&iBrfVw8gZ&%wSSt(b-p*jqF?FEnOuOBJWkMB zBV~#N2!T-Md!*BGK1-Ulgcg=9eqk4=G=F84B8YvPHOCfzvunxoW0dIg;K3Md4~$hO zS3lMy4ezvVGyP9r$_y;TpMocF?zHQKSoNiOxjVyJM19S^=pQ}7YY(gHg zDgMyN@I1exa@uTPpI|_pLnVazQ_p))3#Or{czmakp&w+z6m;jp&IZN<`&)tif&a@$$>!#Q7<9(ucPTdd!O{S{ZCHqY1JqPKA zG~>sd1-M=d3?>xZlgbqy%jZu-@Dgky)2B$6c;5?D``Na`9VSncESzeDHJ8)ZLE$AG zrD=}IHq1PPkB?Iy%fDU~UH*WW+o*10Kl)oA+bRW_LYqyc3m52SM9wS-Mru|hOES(| zARm8}l>K~np>;;B@QSBcl zmKJ*_%8-8gyf;ibeNwo*IQ*g+FV}5Jf#2&c+t9ZQdo4G#S19q(HKi@0J4iRM-7C>k z>ZGH5h0yTvwdzm4jO(k9kMcXT;-tbP-uGcQzMi%F5fYyMTEr)hpdbDo)dE2SAm zR?eW_F)94^e>tSF+n!Jh8%p`I>e#PN4GqMz{ty*q3Pj&^NyymX+tab2SGONXn>$XK zyGcP;_o2wwfoj9Gd++DV!oy@*-S4QQ%Z4-(9Y??Cn&Y@s9sJ+^j3$i~9wrAB=&mG3 zm5NhZ5%pb*76Fk1Bh9y~UUHFIZHZ+QHV;!)u=yL<6?%MM}h@85NodExUz>__XuJ%K&B#W2Adn1(?}q4yZKd-6}T^n&h_ z)Dz`iRo`-8e}Bgp2K{9fS}{oT@Ii+5EkgyI^z&B{%bfLVoMhBOTMc(TBRWO3$yC@FrxJNLFW*-_b1lY~&pyp(kz(Cz z9S?VpJE@$@I%&Eu>14ox_+_nAr&f?@U=YJr$oj@9?|X1kSLR}Ye^ial75_x;7+aZn zG8wl7 z8-!_k@tPi|kYVXESNzjMz`!i%f)%Q%_<=!eu;-mR-U7t(A^cioq?iqsGjtT_KP$K{ z{K+g}!+6-a#43JQ1J?0I%0CAvZB151S2{I|_Hcj^e1aSzx`u;}lB=gLGbD;W4wFqU zE0^z9ptMn057N^`^bMD(i_~m=dSy!=9y~%ZK?66kR#xR#QD~WDiV!ta-F>l6toeEH z;d*eQ_U$`G*(!tO$(^3%6Rq@bcg0eURrDgU{m4PfWq6!BT;zyUvaNYD3d+8c_POu( z8a#j0D;qLgO#kSf(Vh4uX!|}PKw-k8hW6oOkR2l(Tvt`{Bq=XHOgFf6$RAd|*L43lTPlS4<>_dTvb zx)%JFw!2&?&>oy(#u)f^RcrCBk$Lo8hKSK}hXxA4)kBneWam75y;|5~-o@1$WHE0h zX^<#N$8a2HpgJ{Hnv|AVTQ26+HT-~eD>SjD)JRWtX?p5!bXiG(|F@`(cS^p_6QoWP zo1SEbEDt@Yyx_WxEv4H}YKL|WMU3c2p4M1~H-!i?xUxg;D|$~q`sq^HdnQ>LjdYIX zzWIG{XJ)Dmi?YLyHeS0kn8fpp;nV5G*gn|u{_#F{&-J2G|9E@Aix0ziR+qL1 zyc>J^F4qcdj2Jqs_ULU@lCpCISj5apoRMbV|G2T`ti9fNom6k-*fsA@;%R>x1iG9VymI<(ip_Egp6#lkxNG zRZzgL!AhH(i{n@Ob%yuXa+{{A_Rj(wSwwv7RQt`HbsfrSY_2O{_`< z2V~PoI)&l@9jaS3R^gjE?f>ka{p60-9Xa|gofXuP!Xbsii@L)Wyt!0k;l7@B+tYA) z-7XU8KP*^gY0ZR#Pd8+H)f<7m0oRaC9=E^mmV|CTeqQ?glv6_LNhRFJQs+~6dv2zs zkN{z{YX^co_IiLT|J#o><4Q!jQf&1Be*fu}k#5)?O>XnX@8k4r+Wl557!JjO2L z=Sfo z8TrMf341~_+dfP#q0Q%|a`oo|-j#H%1GH_dcacC`spEZ4iQEUNh}3Agiph-0NGgj1 z=0B{Xw|Df0Cj1QaV_sRqSr>(F4>yM{7+Y8lM};@qmlRe~DKR0#YjK%ZrxMtbq$p5s z{PtT0Pky1b5J3Se>gtBU#5TJ*rrkzD7*m688)_xpkkR>^_O;1U)omMCy3KdkhVb7h z4(r;r(svO{Mk`>_1$!=YNrj)M3ilhp-Tm~LT<;yKRe!3SrexD zLL;M~JD-yjDsSpi<;(PcCWzjx}vByyL#4m`-dJ7GY!_q zp|^(DFI7-Vj7tLgGs-vno67R3L8c!V@~qP^T%TtBXs~N`2|u!bG+yWMi|nYeBL!A< zpPFs;_N3Fj?cdC0eNGVRDhFg5{;6y(jemI1B=QnCE(#C30?UYL!HJ`s|4yz(l}ac6 zB@>;8q5oOCwS0Z^?T~0Ba+TDU;yRcU-``ChVWct&+K>28|2zv1}M4iRUG{QW`70rKr&yY3S~Z4 z3`E2O7M)aM|M5X0?L&~P*EO%xH;^2%^aL;ytB!#pID=-cu2iNDuCA`giUnC&7Fdw_ zha@~VrKp4;ie&t^Wa-2>xYBdkekM`varHK zr2#!W=ELtLmj`5}LaH-iTQ<-#+QNH=x8G`_s@a?*-*pHnKrInaYuoO3&8Hk>*Dm%bmx zZWhX)NRW7hk&*9q=`EWJPYyH>h{*ZAZAJR%AxID=qz0E7$wiI2<<_uK zv48!z&P=;+>j|0jZJzJR$u?gOWgJ`=J$o7dh^vSFRS-oC_{9+`Wm|%dOUf@9o>+LQ ztO2IMHZp<^JT_m}J2^`(UR?1cFUW~WW|VOu;v6jgCiT5e=JUohv$gg&%Nu-YkIb^G zFi&ERGBUBF+5d>Ml%uC}jq?ypF{m@9lV}FpFoCqYwEXcB9E^tt(L-DpHV`t{%FBRs zf;;TTAC`kt#7mZ@g`_di`yw+s+x4@HM=Nt*=(}VFvRJY`lVXE;+*{LjZ4BWC7}-AI pY8gK>?K-83x0zQb0c3tEwpssu2lhbt)flxVwJCAF`hcVj_#Z7?QSkr( literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_FRAK.woff b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_FRAK.woff new file mode 100644 index 0000000000000000000000000000000000000000..9c7e9d68e6d48f0e1d67c77d62af1d485cfbeff4 GIT binary patch literal 9956 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 HXaoEo5^4Yf literal 0 HcmV?d00001 diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_MAIN.woff b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/kityformula/resource/KF_AMS_MAIN.woff new file mode 100644 index 0000000000000000000000000000000000000000..ed93f8e84f307c523934cfea59c18569ec257e4b GIT binary patch literal 52540 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 nW;8e`EH$yetlVMM`B/g; + var path2=/data-latex="(.*?)"/g; + + if(sel.search(path)==0){ + sel.replace(path2,function($0,$1){ + var param=encodeURIComponent($1); + openDialog(param); + return $0; + }); + }; + }); + + var openDialog = function(param) { + return editor.windowManager.openUrl({ + title: '插入公式', + size: 'large', + width: 785, + height: 475, + url:param?baseURL+"?c="+param:baseURL, + buttons: [ + { + type: 'cancel', + text: 'Close' + }, + { + type: 'custom', + text: 'Save', + name: 'save', + primary: true + }, + ], + onAction: function (api, details) { + switch (details.name) { + case 'save': + api.sendMessage("save"); + break; + default: + break; + }; + } + }); + }; + + + editor.ui.registry.addButton('kityformula-editor', { + text: '公式', + tooltip: '插入公式', + onAction: function() { + openDialog(); + } + }); + editor.ui.registry.addMenuItem('kityformula-editor', { + text: '公式', + onAction: function() { + openDialog(); + } + }); + return { + getMetadata: function() { + return { + name: "公式", + url: "http://hgcserver.gitee.io", + }; + } + }; +}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/plugin.min.js new file mode 100644 index 0000000..9b74d60 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/kityformula-editor/plugin.min.js @@ -0,0 +1,72 @@ +tinymce.PluginManager.add('kityformula-editor', function(editor, url) { + + var baseURL = tinymce.baseURL+'/plugins/kityformula-editor/kityFormula.html'; + + editor.on('dblclick',function(){ + var sel=editor.selection.getContent(); + var path=/\/g; + var path2=/data-latex="(.*?)"/g; + + if(sel.search(path)==0){ + sel.replace(path2,function($0,$1){ + var param=encodeURIComponent($1); + openDialog(param); + return $0; + }); + }; + }); + + var openDialog = function(param) { + return editor.windowManager.openUrl({ + title: '插入公式', + size: 'large', + width: 785, + height: 475, + url:param?baseURL+"?c="+param:baseURL, + buttons: [ + { + type: 'cancel', + text: 'Close' + }, + { + type: 'custom', + text: 'Save', + name: 'save', + primary: true + }, + ], + onAction: function (api, details) { + switch (details.name) { + case 'save': + api.sendMessage("save"); + break; + default: + break; + }; + } + }); + }; + + + editor.ui.registry.addButton('kityformula-editor', { + text: '公式', + tooltip: '插入公式', + onAction: function() { + openDialog(); + } + }); + editor.ui.registry.addMenuItem('kityformula-editor', { + text: '公式', + onAction: function() { + openDialog(); + } + }); + return { + getMetadata: function() { + return { + name: "公式", + url: "http://hgcserver.gitee.io", + }; + } + }; +}); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/legacyoutput/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/legacyoutput/plugin.js new file mode 100644 index 0000000..d96f337 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/legacyoutput/plugin.js @@ -0,0 +1,199 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getFontSizeFormats = function (editor) { + return editor.getParam('fontsize_formats'); + }; + var setFontSizeFormats = function (editor, fontsize_formats) { + editor.settings.fontsize_formats = fontsize_formats; + }; + var getFontFormats = function (editor) { + return editor.getParam('font_formats'); + }; + var setFontFormats = function (editor, font_formats) { + editor.settings.font_formats = font_formats; + }; + var getFontSizeStyleValues = function (editor) { + return editor.getParam('font_size_style_values', 'xx-small,x-small,small,medium,large,x-large,xx-large'); + }; + var setInlineStyles = function (editor, inline_styles) { + editor.settings.inline_styles = inline_styles; + }; + + var overrideFormats = function (editor) { + var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table', fontSizes = global$1.explode(getFontSizeStyleValues(editor)), schema = editor.schema; + editor.formatter.register({ + alignleft: { + selector: alignElements, + attributes: { align: 'left' } + }, + aligncenter: { + selector: alignElements, + attributes: { align: 'center' } + }, + alignright: { + selector: alignElements, + attributes: { align: 'right' } + }, + alignjustify: { + selector: alignElements, + attributes: { align: 'justify' } + }, + bold: [ + { + inline: 'b', + remove: 'all', + preserve_attributes: [ + 'class', + 'style' + ] + }, + { + inline: 'strong', + remove: 'all', + preserve_attributes: [ + 'class', + 'style' + ] + }, + { + inline: 'span', + styles: { fontWeight: 'bold' } + } + ], + italic: [ + { + inline: 'i', + remove: 'all', + preserve_attributes: [ + 'class', + 'style' + ] + }, + { + inline: 'em', + remove: 'all', + preserve_attributes: [ + 'class', + 'style' + ] + }, + { + inline: 'span', + styles: { fontStyle: 'italic' } + } + ], + underline: [ + { + inline: 'u', + remove: 'all', + preserve_attributes: [ + 'class', + 'style' + ] + }, + { + inline: 'span', + styles: { textDecoration: 'underline' }, + exact: true + } + ], + strikethrough: [ + { + inline: 'strike', + remove: 'all', + preserve_attributes: [ + 'class', + 'style' + ] + }, + { + inline: 'span', + styles: { textDecoration: 'line-through' }, + exact: true + } + ], + fontname: { + inline: 'font', + toggle: false, + attributes: { face: '%value' } + }, + fontsize: { + inline: 'font', + toggle: false, + attributes: { + size: function (vars) { + return String(global$1.inArray(fontSizes, vars.value) + 1); + } + } + }, + forecolor: { + inline: 'font', + attributes: { color: '%value' }, + links: true, + remove_similar: true, + clear_child_styles: true + }, + hilitecolor: { + inline: 'font', + styles: { backgroundColor: '%value' }, + links: true, + remove_similar: true, + clear_child_styles: true + } + }); + global$1.each('b,i,u,strike'.split(','), function (name) { + schema.addValidElements(name + '[*]'); + }); + if (!schema.getElementRule('font')) { + schema.addValidElements('font[face|size|color|style]'); + } + global$1.each(alignElements.split(','), function (name) { + var rule = schema.getElementRule(name); + if (rule) { + if (!rule.attributes.align) { + rule.attributes.align = {}; + rule.attributesOrder.push('align'); + } + } + }); + }; + var overrideSettings = function (editor) { + var defaultFontsizeFormats = '8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7'; + var defaultFontsFormats = 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats'; + setInlineStyles(editor, false); + if (!getFontSizeFormats(editor)) { + setFontSizeFormats(editor, defaultFontsizeFormats); + } + if (!getFontFormats(editor)) { + setFontFormats(editor, defaultFontsFormats); + } + }; + var setup = function (editor) { + overrideSettings(editor); + editor.on('PreInit', function () { + return overrideFormats(editor); + }); + }; + + function Plugin () { + global.add('legacyoutput', function (editor) { + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/legacyoutput/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/legacyoutput/plugin.min.js new file mode 100644 index 0000000..c2b04c1 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/legacyoutput/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=function(s){var e,t,i,a;t=!1,(e=s).settings.inline_styles=t,e.getParam("fontsize_formats")||(i="8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7",e.settings.fontsize_formats=i),e.getParam("font_formats")||(a="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",e.settings.font_formats=a),s.on("PreInit",function(){return e=s,t="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table",i=l.explode(e.getParam("font_size_style_values","xx-small,x-small,small,medium,large,x-large,xx-large")),a=e.schema,e.formatter.register({alignleft:{selector:t,attributes:{align:"left"}},aligncenter:{selector:t,attributes:{align:"center"}},alignright:{selector:t,attributes:{align:"right"}},alignjustify:{selector:t,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all",preserve_attributes:["class","style"]},{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all",preserve_attributes:["class","style"]},{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",toggle:!1,attributes:{face:"%value"}},fontsize:{inline:"font",toggle:!1,attributes:{size:function(e){return String(l.inArray(i,e.value)+1)}}},forecolor:{inline:"font",attributes:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0}}),l.each("b,i,u,strike".split(","),function(e){a.addValidElements(e+"[*]")}),a.getElementRule("font")||a.addValidElements("font[face|size|color|style]"),void l.each(t.split(","),function(e){var t=a.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))});var e,t,i,a})};e.add("legacyoutput",function(e){t(e)})}(); \ No newline at end of file diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/link/plugin.js b/public/static/component/pear/module/tinymce/tinymce/plugins/link/plugin.js new file mode 100644 index 0000000..a5cc018 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/link/plugin.js @@ -0,0 +1,1290 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var eq = function (t) { + return function (a) { + return t === a; + }; + }; + var isString = isType('string'); + var isArray = isType('array'); + var isNull = eq(null); + var isBoolean = isSimpleType('boolean'); + var isFunction = isSimpleType('function'); + + var assumeExternalTargets = function (editor) { + var externalTargets = editor.getParam('link_assume_external_targets', false); + if (isBoolean(externalTargets) && externalTargets) { + return 1; + } else if (isString(externalTargets) && (externalTargets === 'http' || externalTargets === 'https')) { + return externalTargets; + } + return 0; + }; + var hasContextToolbar = function (editor) { + return editor.getParam('link_context_toolbar', false, 'boolean'); + }; + var getLinkList = function (editor) { + return editor.getParam('link_list'); + }; + var getDefaultLinkTarget = function (editor) { + return editor.getParam('default_link_target'); + }; + var getTargetList = function (editor) { + return editor.getParam('target_list', true); + }; + var getRelList = function (editor) { + return editor.getParam('rel_list', [], 'array'); + }; + var getLinkClassList = function (editor) { + return editor.getParam('link_class_list', [], 'array'); + }; + var shouldShowLinkTitle = function (editor) { + return editor.getParam('link_title', true, 'boolean'); + }; + var allowUnsafeLinkTarget = function (editor) { + return editor.getParam('allow_unsafe_link_target', false, 'boolean'); + }; + var useQuickLink = function (editor) { + return editor.getParam('link_quicklink', false, 'boolean'); + }; + var getDefaultLinkProtocol = function (editor) { + return editor.getParam('link_default_protocol', 'http', 'string'); + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var nativeIndexOf = Array.prototype.indexOf; + var nativePush = Array.prototype.push; + var rawIndexOf = function (ts, t) { + return nativeIndexOf.call(ts, t); + }; + var contains = function (xs, x) { + return rawIndexOf(xs, x) > -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var foldl = function (xs, f, acc) { + each(xs, function (x) { + acc = f(acc, x); + }); + return acc; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Optional.none(); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + var someIf = function (b, a) { + return b ? Optional.some(a) : Optional.none(); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var getText = function (item) { + if (isString(item.text)) { + return item.text; + } else if (isString(item.title)) { + return item.title; + } else { + return ''; + } + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$2.each(list, function (item) { + var text = getText(item); + if (item.menu !== undefined) { + var items = sanitizeList(item.menu, extractValue); + out.push({ + text: text, + items: items + }); + } else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizeWith = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + return Optional.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + }; + }; + var sanitize = function (list) { + return sanitizeWith(getValue)(list); + }; + var createUi = function (name, label) { + return function (items) { + return { + name: name, + type: 'listbox', + label: label, + items: items + }; + }; + }; + var ListOptions = { + sanitize: sanitize, + sanitizeWith: sanitizeWith, + createUi: createUi, + getValue: getValue + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var keys = Object.keys; + var hasOwnProperty = Object.hasOwnProperty; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var objAcc = function (r) { + return function (x, i) { + r[i] = x; + }; + }; + var internalFilter = function (obj, pred, onTrue, onFalse) { + var r = {}; + each$1(obj, function (x, i) { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + return r; + }; + var filter = function (obj, pred) { + var t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + var has = function (obj, key) { + return hasOwnProperty.call(obj, key); + }; + var hasNonNullableKey = function (obj, key) { + return has(obj, key) && obj[key] !== undefined && obj[key] !== null; + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var isAnchor = function (elm) { + return elm && elm.nodeName.toLowerCase() === 'a'; + }; + var isLink = function (elm) { + return isAnchor(elm) && !!getHref(elm); + }; + var collectNodesInRange = function (rng, predicate) { + if (rng.collapsed) { + return []; + } else { + var contents = rng.cloneContents(); + var walker = new global$3(contents.firstChild, contents); + var elements = []; + var current = contents.firstChild; + do { + if (predicate(current)) { + elements.push(current); + } + } while (current = walker.next()); + return elements; + } + }; + var hasProtocol = function (url) { + return /^\w+:/i.test(url); + }; + var getHref = function (elm) { + var href = elm.getAttribute('data-mce-href'); + return href ? href : elm.getAttribute('href'); + }; + var applyRelTargetRules = function (rel, isUnsafe) { + var rules = ['noopener']; + var rels = rel ? rel.split(/\s+/) : []; + var toString = function (rels) { + return global$2.trim(rels.sort().join(' ')); + }; + var addTargetRules = function (rels) { + rels = removeTargetRules(rels); + return rels.length > 0 ? rels.concat(rules) : rules; + }; + var removeTargetRules = function (rels) { + return rels.filter(function (val) { + return global$2.inArray(rules, val) === -1; + }); + }; + var newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels); + return newRels.length > 0 ? toString(newRels) : ''; + }; + var trimCaretContainers = function (text) { + return text.replace(/\uFEFF/g, ''); + }; + var getAnchorElement = function (editor, selectedElm) { + selectedElm = selectedElm || editor.selection.getNode(); + if (isImageFigure(selectedElm)) { + return editor.dom.select('a[href]', selectedElm)[0]; + } else { + return editor.dom.getParent(selectedElm, 'a[href]'); + } + }; + var getAnchorText = function (selection, anchorElm) { + var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' }); + return trimCaretContainers(text); + }; + var hasLinks = function (elements) { + return global$2.grep(elements, isLink).length > 0; + }; + var hasLinksInSelection = function (rng) { + return collectNodesInRange(rng, isLink).length > 0; + }; + var isOnlyTextSelected = function (editor) { + var inlineTextElements = editor.schema.getTextInlineElements(); + var isElement = function (elm) { + return elm.nodeType === 1 && !isAnchor(elm) && !has(inlineTextElements, elm.nodeName.toLowerCase()); + }; + var elements = collectNodesInRange(editor.selection.getRng(), isElement); + return elements.length === 0; + }; + var isImageFigure = function (elm) { + return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + }; + var getLinkAttrs = function (data) { + return foldl([ + 'title', + 'rel', + 'class', + 'target' + ], function (acc, key) { + data[key].each(function (value) { + acc[key] = value.length > 0 ? value : null; + }); + return acc; + }, { href: data.href }); + }; + var handleExternalTargets = function (href, assumeExternalTargets) { + if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) { + return assumeExternalTargets + '://' + href; + } + return href; + }; + var applyLinkOverrides = function (editor, linkAttrs) { + var newLinkAttrs = __assign({}, linkAttrs); + if (!(getRelList(editor).length > 0) && allowUnsafeLinkTarget(editor) === false) { + var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank'); + newLinkAttrs.rel = newRel ? newRel : null; + } + if (Optional.from(newLinkAttrs.target).isNone() && getTargetList(editor) === false) { + newLinkAttrs.target = getDefaultLinkTarget(editor); + } + newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, assumeExternalTargets(editor)); + return newLinkAttrs; + }; + var updateLink = function (editor, anchorElm, text, linkAttrs) { + text.each(function (text) { + if (anchorElm.hasOwnProperty('innerText')) { + anchorElm.innerText = text; + } else { + anchorElm.textContent = text; + } + }); + editor.dom.setAttribs(anchorElm, linkAttrs); + editor.selection.select(anchorElm); + }; + var createLink = function (editor, selectedElm, text, linkAttrs) { + if (isImageFigure(selectedElm)) { + linkImageFigure(editor, selectedElm, linkAttrs); + } else { + text.fold(function () { + editor.execCommand('mceInsertLink', false, linkAttrs); + }, function (text) { + editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(text))); + }); + } + }; + var linkDomMutation = function (editor, attachState, data) { + var selectedElm = editor.selection.getNode(); + var anchorElm = getAnchorElement(editor, selectedElm); + var linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data)); + editor.undoManager.transact(function () { + if (data.href === attachState.href) { + attachState.attach(); + } + if (anchorElm) { + editor.focus(); + updateLink(editor, anchorElm, data.text, linkAttrs); + } else { + createLink(editor, selectedElm, data.text, linkAttrs); + } + }); + }; + var unlinkSelection = function (editor) { + var dom = editor.dom, selection = editor.selection; + var bookmark = selection.getBookmark(); + var rng = selection.getRng().cloneRange(); + var startAnchorElm = dom.getParent(rng.startContainer, 'a[href]', editor.getBody()); + var endAnchorElm = dom.getParent(rng.endContainer, 'a[href]', editor.getBody()); + if (startAnchorElm) { + rng.setStartBefore(startAnchorElm); + } + if (endAnchorElm) { + rng.setEndAfter(endAnchorElm); + } + selection.setRng(rng); + editor.execCommand('unlink'); + selection.moveToBookmark(bookmark); + }; + var unlinkDomMutation = function (editor) { + editor.undoManager.transact(function () { + var node = editor.selection.getNode(); + if (isImageFigure(node)) { + unlinkImageFigure(editor, node); + } else { + unlinkSelection(editor); + } + editor.focus(); + }); + }; + var unwrapOptions = function (data) { + var cls = data.class, href = data.href, rel = data.rel, target = data.target, text = data.text, title = data.title; + return filter({ + class: cls.getOrNull(), + href: href, + rel: rel.getOrNull(), + target: target.getOrNull(), + text: text.getOrNull(), + title: title.getOrNull() + }, function (v, _k) { + return isNull(v) === false; + }); + }; + var link = function (editor, attachState, data) { + editor.hasPlugin('rtc', true) ? editor.execCommand('createlink', false, unwrapOptions(data)) : linkDomMutation(editor, attachState, data); + }; + var unlink = function (editor) { + editor.hasPlugin('rtc', true) ? editor.execCommand('unlink') : unlinkDomMutation(editor); + }; + var unlinkImageFigure = function (editor, fig) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.getParents(img, 'a[href]', fig)[0]; + if (a) { + a.parentNode.insertBefore(img, a); + editor.dom.remove(a); + } + } + }; + var linkImageFigure = function (editor, fig, attrs) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.create('a', attrs); + img.parentNode.insertBefore(a, img); + a.appendChild(img); + } + }; + + var isListGroup = function (item) { + return hasNonNullableKey(item, 'items'); + }; + var findTextByValue = function (value, catalog) { + return findMap(catalog, function (item) { + if (isListGroup(item)) { + return findTextByValue(value, item.items); + } else { + return someIf(item.value === value, item); + } + }); + }; + var getDelta = function (persistentText, fieldName, catalog, data) { + var value = data[fieldName]; + var hasPersistentText = persistentText.length > 0; + return value !== undefined ? findTextByValue(value, catalog).map(function (i) { + return { + url: { + value: i.value, + meta: { + text: hasPersistentText ? persistentText : i.text, + attach: noop + } + }, + text: hasPersistentText ? persistentText : i.text + }; + }) : Optional.none(); + }; + var findCatalog = function (catalogs, fieldName) { + if (fieldName === 'link') { + return catalogs.link; + } else if (fieldName === 'anchor') { + return catalogs.anchor; + } else { + return Optional.none(); + } + }; + var init = function (initialData, linkCatalog) { + var persistentData = { + text: initialData.text, + title: initialData.title + }; + var getTitleFromUrlChange = function (url) { + return someIf(persistentData.title.length <= 0, Optional.from(url.meta.title).getOr('')); + }; + var getTextFromUrlChange = function (url) { + return someIf(persistentData.text.length <= 0, Optional.from(url.meta.text).getOr(url.value)); + }; + var onUrlChange = function (data) { + var text = getTextFromUrlChange(data.url); + var title = getTitleFromUrlChange(data.url); + if (text.isSome() || title.isSome()) { + return Optional.some(__assign(__assign({}, text.map(function (text) { + return { text: text }; + }).getOr({})), title.map(function (title) { + return { title: title }; + }).getOr({}))); + } else { + return Optional.none(); + } + }; + var onCatalogChange = function (data, change) { + var catalog = findCatalog(linkCatalog, change.name).getOr([]); + return getDelta(persistentData.text, change.name, catalog, data); + }; + var onChange = function (getData, change) { + var name = change.name; + if (name === 'url') { + return onUrlChange(getData()); + } else if (contains([ + 'anchor', + 'link' + ], name)) { + return onCatalogChange(getData(), change); + } else if (name === 'text' || name === 'title') { + persistentData[name] = getData()[name]; + return Optional.none(); + } else { + return Optional.none(); + } + }; + return { onChange: onChange }; + }; + var DialogChanges = { + init: init, + getDelta: getDelta + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var delayedConfirm = function (editor, message, callback) { + var rng = editor.selection.getRng(); + global$4.setEditorTimeout(editor, function () { + editor.windowManager.confirm(message, function (state) { + editor.selection.setRng(rng); + callback(state); + }); + }); + }; + var tryEmailTransform = function (data) { + var url = data.href; + var suggestMailTo = url.indexOf('@') > 0 && url.indexOf('/') === -1 && url.indexOf('mailto:') === -1; + return suggestMailTo ? Optional.some({ + message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: 'mailto:' + url }); + } + }) : Optional.none(); + }; + var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) { + return function (data) { + var url = data.href; + var suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www(\.|\d\.)/i.test(url); + return suggestProtocol ? Optional.some({ + message: 'The URL you entered seems to be an external link. Do you want to add the required ' + defaultLinkProtocol + ':// prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: defaultLinkProtocol + '://' + url }); + } + }) : Optional.none(); + }; + }; + var preprocess = function (editor, data) { + return findMap([ + tryEmailTransform, + tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor)) + ], function (f) { + return f(data); + }).fold(function () { + return global$5.resolve(data); + }, function (transform) { + return new global$5(function (callback) { + delayedConfirm(editor, transform.message, function (state) { + callback(state ? transform.preprocess(data) : data); + }); + }); + }); + }; + var DialogConfirms = { preprocess: preprocess }; + + var getAnchors = function (editor) { + var anchorNodes = editor.dom.select('a:not([href])'); + var anchors = bind(anchorNodes, function (anchor) { + var id = anchor.name || anchor.id; + return id ? [{ + text: id, + value: '#' + id + }] : []; + }); + return anchors.length > 0 ? Optional.some([{ + text: 'None', + value: '' + }].concat(anchors)) : Optional.none(); + }; + var AnchorListOptions = { getAnchors: getAnchors }; + + var getClasses = function (editor) { + var list = getLinkClassList(editor); + if (list.length > 0) { + return ListOptions.sanitize(list); + } + return Optional.none(); + }; + var ClassListOptions = { getClasses: getClasses }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var parseJson = function (text) { + try { + return Optional.some(JSON.parse(text)); + } catch (err) { + return Optional.none(); + } + }; + var getLinks = function (editor) { + var extractor = function (item) { + return editor.convertURL(item.value || item.url, 'href'); + }; + var linkList = getLinkList(editor); + return new global$5(function (callback) { + if (isString(linkList)) { + global$6.send({ + url: linkList, + success: function (text) { + return callback(parseJson(text)); + }, + error: function (_) { + return callback(Optional.none()); + } + }); + } else if (isFunction(linkList)) { + linkList(function (output) { + return callback(Optional.some(output)); + }); + } else { + callback(Optional.from(linkList)); + } + }).then(function (optItems) { + return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) { + if (items.length > 0) { + var noneItem = [{ + text: 'None', + value: '' + }]; + return noneItem.concat(items); + } else { + return items; + } + }); + }); + }; + var LinkListOptions = { getLinks: getLinks }; + + var getRels = function (editor, initialTarget) { + var list = getRelList(editor); + if (list.length > 0) { + var isTargetBlank_1 = initialTarget.is('_blank'); + var enforceSafe = allowUnsafeLinkTarget(editor) === false; + var safeRelExtractor = function (item) { + return applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1); + }; + var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize; + return sanitizer(list); + } + return Optional.none(); + }; + var RelOptions = { getRels: getRels }; + + var fallbacks = [ + { + text: 'Current window', + value: '' + }, + { + text: 'New window', + value: '_blank' + } + ]; + var getTargets = function (editor) { + var list = getTargetList(editor); + if (isArray(list)) { + return ListOptions.sanitize(list).orThunk(function () { + return Optional.some(fallbacks); + }); + } else if (list === false) { + return Optional.none(); + } + return Optional.some(fallbacks); + }; + var TargetOptions = { getTargets: getTargets }; + + var nonEmptyAttr = function (dom, elem, name) { + var val = dom.getAttrib(elem, name); + return val !== null && val.length > 0 ? Optional.some(val) : Optional.none(); + }; + var extractFromAnchor = function (editor, anchor) { + var dom = editor.dom; + var onlyText = isOnlyTextSelected(editor); + var text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)) : Optional.none(); + var url = anchor ? Optional.some(dom.getAttrib(anchor, 'href')) : Optional.none(); + var target = anchor ? Optional.from(dom.getAttrib(anchor, 'target')) : Optional.none(); + var rel = nonEmptyAttr(dom, anchor, 'rel'); + var linkClass = nonEmptyAttr(dom, anchor, 'class'); + var title = nonEmptyAttr(dom, anchor, 'title'); + return { + url: url, + text: text, + title: title, + target: target, + rel: rel, + linkClass: linkClass + }; + }; + var collect = function (editor, linkNode) { + return LinkListOptions.getLinks(editor).then(function (links) { + var anchor = extractFromAnchor(editor, linkNode); + return { + anchor: anchor, + catalogs: { + targets: TargetOptions.getTargets(editor), + rels: RelOptions.getRels(editor, anchor.target), + classes: ClassListOptions.getClasses(editor), + anchor: AnchorListOptions.getAnchors(editor), + link: links + }, + optNode: Optional.from(linkNode), + flags: { titleEnabled: shouldShowLinkTitle(editor) } + }; + }); + }; + var DialogInfo = { collect: collect }; + + var handleSubmit = function (editor, info) { + return function (api) { + var data = api.getData(); + if (!data.url.value) { + unlink(editor); + api.close(); + return; + } + var getChangedValue = function (key) { + return Optional.from(data[key]).filter(function (value) { + return !info.anchor[key].is(value); + }); + }; + var changedData = { + href: data.url.value, + text: getChangedValue('text'), + target: getChangedValue('target'), + rel: getChangedValue('rel'), + class: getChangedValue('linkClass'), + title: getChangedValue('title') + }; + var attachState = { + href: data.url.value, + attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : function () { + } + }; + DialogConfirms.preprocess(editor, changedData).then(function (pData) { + link(editor, attachState, pData); + }); + api.close(); + }; + }; + var collectData = function (editor) { + var anchorNode = getAnchorElement(editor); + return DialogInfo.collect(editor, anchorNode); + }; + var getInitialData = function (info, defaultTarget) { + var anchor = info.anchor; + var url = anchor.url.getOr(''); + return { + url: { + value: url, + meta: { original: { value: url } } + }, + text: anchor.text.getOr(''), + title: anchor.title.getOr(''), + anchor: url, + link: url, + rel: anchor.rel.getOr(''), + target: anchor.target.or(defaultTarget).getOr(''), + linkClass: anchor.linkClass.getOr('') + }; + }; + var makeDialog = function (settings, onSubmit, editor) { + var urlInput = [{ + name: 'url', + type: 'urlinput', + filetype: 'file', + label: 'URL' + }]; + var displayText = settings.anchor.text.map(function () { + return { + name: 'text', + type: 'input', + label: 'Text to display' + }; + }).toArray(); + var titleText = settings.flags.titleEnabled ? [{ + name: 'title', + type: 'input', + label: 'Title' + }] : []; + var defaultTarget = Optional.from(getDefaultLinkTarget(editor)); + var initialData = getInitialData(settings, defaultTarget); + var catalogs = settings.catalogs; + var dialogDelta = DialogChanges.init(initialData, catalogs); + var body = { + type: 'panel', + items: flatten([ + urlInput, + displayText, + titleText, + cat([ + catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')), + catalogs.rels.map(ListOptions.createUi('rel', 'Rel')), + catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')), + catalogs.link.map(ListOptions.createUi('link', 'Link list')), + catalogs.classes.map(ListOptions.createUi('linkClass', 'Class')) + ]) + ]) + }; + return { + title: 'Insert/Edit Link', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onChange: function (api, _a) { + var name = _a.name; + dialogDelta.onChange(api.getData, { name: name }).each(function (newData) { + api.setData(newData); + }); + }, + onSubmit: onSubmit + }; + }; + var open = function (editor) { + var data = collectData(editor); + data.then(function (info) { + var onSubmit = handleSubmit(editor, info); + return makeDialog(info, onSubmit, editor); + }).then(function (spec) { + editor.windowManager.open(spec); + }); + }; + + var appendClickRemove = function (link, evt) { + document.body.appendChild(link); + link.dispatchEvent(evt); + document.body.removeChild(link); + }; + var open$1 = function (url) { + var link = document.createElement('a'); + link.target = '_blank'; + link.href = url; + link.rel = 'noreferrer noopener'; + var evt = document.createEvent('MouseEvents'); + evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + appendClickRemove(link, evt); + }; + + var getLink = function (editor, elm) { + return editor.dom.getParent(elm, 'a[href]'); + }; + var getSelectedLink = function (editor) { + return getLink(editor, editor.selection.getStart()); + }; + var hasOnlyAltModifier = function (e) { + return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false; + }; + var gotoLink = function (editor, a) { + if (a) { + var href = getHref(a); + if (/^#/.test(href)) { + var targetEl = editor.$(href); + if (targetEl.length) { + editor.selection.scrollIntoView(targetEl[0], true); + } + } else { + open$1(a.href); + } + } + }; + var openDialog = function (editor) { + return function () { + open(editor); + }; + }; + var gotoSelectedLink = function (editor) { + return function () { + gotoLink(editor, getSelectedLink(editor)); + }; + }; + var setupGotoLinks = function (editor) { + editor.on('click', function (e) { + var link = getLink(editor, e.target); + if (link && global$1.metaKeyPressed(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + editor.on('keydown', function (e) { + var link = getSelectedLink(editor); + if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + }; + var toggleState = function (editor, toggler) { + editor.on('NodeChange', toggler); + return function () { + return editor.off('NodeChange', toggler); + }; + }; + var toggleActiveState = function (editor) { + return function (api) { + return toggleState(editor, function () { + api.setActive(!editor.mode.isReadOnly() && getAnchorElement(editor, editor.selection.getNode()) !== null); + }); + }; + }; + var toggleEnabledState = function (editor) { + return function (api) { + var updateState = function () { + return api.setDisabled(getAnchorElement(editor, editor.selection.getNode()) === null); + }; + updateState(); + return toggleState(editor, updateState); + }; + }; + var toggleUnlinkState = function (editor) { + return function (api) { + var hasLinks$1 = function (parents) { + return hasLinks(parents) || hasLinksInSelection(editor.selection.getRng()); + }; + var parents = editor.dom.getParents(editor.selection.getStart()); + api.setDisabled(!hasLinks$1(parents)); + return toggleState(editor, function (e) { + return api.setDisabled(!hasLinks$1(e.parents)); + }); + }; + }; + + var register = function (editor) { + editor.addCommand('mceLink', function () { + if (useQuickLink(editor)) { + editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' }); + } else { + openDialog(editor)(); + } + }); + }; + + var setup = function (editor) { + editor.addShortcut('Meta+K', '', function () { + editor.execCommand('mceLink'); + }); + }; + + var setupButtons = function (editor) { + editor.ui.registry.addToggleButton('link', { + icon: 'link', + tooltip: 'Insert/edit link', + onAction: openDialog(editor), + onSetup: toggleActiveState(editor) + }); + editor.ui.registry.addButton('openlink', { + icon: 'new-tab', + tooltip: 'Open link', + onAction: gotoSelectedLink(editor), + onSetup: toggleEnabledState(editor) + }); + editor.ui.registry.addButton('unlink', { + icon: 'unlink', + tooltip: 'Remove link', + onAction: function () { + return unlink(editor); + }, + onSetup: toggleUnlinkState(editor) + }); + }; + var setupMenuItems = function (editor) { + editor.ui.registry.addMenuItem('openlink', { + text: 'Open link', + icon: 'new-tab', + onAction: gotoSelectedLink(editor), + onSetup: toggleEnabledState(editor) + }); + editor.ui.registry.addMenuItem('link', { + icon: 'link', + text: 'Link...', + shortcut: 'Meta+K', + onAction: openDialog(editor) + }); + editor.ui.registry.addMenuItem('unlink', { + icon: 'unlink', + text: 'Remove link', + onAction: function () { + return unlink(editor); + }, + onSetup: toggleUnlinkState(editor) + }); + }; + var setupContextMenu = function (editor) { + var inLink = 'link unlink openlink'; + var noLink = 'link'; + editor.ui.registry.addContextMenu('link', { + update: function (element) { + return hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink; + } + }); + }; + var setupContextToolbars = function (editor) { + var collapseSelectionToEnd = function (editor) { + editor.selection.collapse(false); + }; + var onSetupLink = function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setDisabled(!getAnchorElement(editor, node)); + return function () { + }; + }; + editor.ui.registry.addContextForm('quicklink', { + launch: { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + onSetup: toggleActiveState(editor) + }, + label: 'Link', + predicate: function (node) { + return !!getAnchorElement(editor, node) && hasContextToolbar(editor); + }, + initValue: function () { + var elm = getAnchorElement(editor); + return !!elm ? getHref(elm) : ''; + }, + commands: [ + { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + primary: true, + onSetup: function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setActive(!!getAnchorElement(editor, node)); + return toggleActiveState(editor)(buttonApi); + }, + onAction: function (formApi) { + var anchor = getAnchorElement(editor); + var value = formApi.getValue(); + if (!anchor) { + var attachState = { + href: value, + attach: function () { + } + }; + var onlyText = isOnlyTextSelected(editor); + var text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)).filter(function (t) { + return t.length > 0; + }).or(Optional.from(value)) : Optional.none(); + link(editor, attachState, { + href: value, + text: text, + title: Optional.none(), + rel: Optional.none(), + target: Optional.none(), + class: Optional.none() + }); + formApi.hide(); + } else { + editor.undoManager.transact(function () { + editor.dom.setAttrib(anchor, 'href', value); + collapseSelectionToEnd(editor); + formApi.hide(); + }); + } + } + }, + { + type: 'contextformbutton', + icon: 'unlink', + tooltip: 'Remove link', + onSetup: onSetupLink, + onAction: function (formApi) { + unlink(editor); + formApi.hide(); + } + }, + { + type: 'contextformbutton', + icon: 'new-tab', + tooltip: 'Open link', + onSetup: onSetupLink, + onAction: function (formApi) { + gotoSelectedLink(editor)(); + formApi.hide(); + } + } + ] + }); + }; + + function Plugin () { + global.add('link', function (editor) { + setupButtons(editor); + setupMenuItems(editor); + setupContextMenu(editor); + setupContextToolbars(editor); + setupGotoLinks(editor); + register(editor); + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/link/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/link/plugin.min.js new file mode 100644 index 0000000..bf45868 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n,t,e,r,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.util.VK"),u=function(r){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===r;var n,e}},a=function(n){return function(t){return typeof t===n}},l=u("string"),c=u("array"),f=function(t){return n===t},s=a("boolean"),m=a("function"),g=function(t){var n=t.getParam("link_assume_external_targets",!1);return s(n)&&n?1:!l(n)||"http"!==n&&"https"!==n?0:n},p=function(t){return t.getParam("default_link_target")},d=function(t){return t.getParam("target_list",!0)},h=function(t){return t.getParam("rel_list",[],"array")},v=function(t){return t.getParam("allow_unsafe_link_target",!1,"boolean")},y=function(){},k=function(t){return function(){return t}},x=k(!1),b=k(!(n=null)),O=function(){return w},w=(t=function(t){return t.isNone()},{fold:function(t,n){return t()},is:x,isSome:x,isNone:b,getOr:r=function(t){return t},getOrThunk:e=function(t){return t()},getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:k(null),getOrUndefined:k(undefined),or:r,orThunk:e,map:O,each:y,bind:O,exists:x,forall:b,filter:O,equals:t,equals_:t,toArray:function(){return[]},toString:k("none()")}),C=function(e){var t=k(e),n=function(){return o},r=function(t){return t(e)},o={fold:function(t,n){return n(e)},is:function(t){return e===t},isSome:b,isNone:x,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:n,orThunk:n,map:function(t){return C(t(e))},each:function(t){t(e)},bind:r,exists:r,forall:r,filter:function(t){return t(e)?o:w},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(t){return t.is(e)},equals_:function(t,n){return t.fold(x,function(t){return n(e,t)})}};return o},N={some:C,none:O,from:function(t){return null===t||t===undefined?w:C(t)}},A=Array.prototype.indexOf,P=Array.prototype.push,T=function(t,n){return e=t,r=n,-1= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + }; + var head = function (xs) { + return get(xs, 0); + }; + var last = function (xs) { + return get(xs, xs.length - 1); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var cached = function (f) { + var called = false; + var r; + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (!called) { + called = true; + r = f.apply(null, args); + } + return r; + }; + }; + + var DeviceType = function (os, browser, userAgent, mediaMatch) { + var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + var isiPhone = os.isiOS() && !isiPad; + var isMobile = os.isiOS() || os.isAndroid(); + var isTouch = isMobile || mediaMatch('(pointer:coarse)'); + var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); + var isPhone = isiPhone || isMobile && !isTablet; + var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + var isDesktop = !isPhone && !isTablet && !iOSwebview; + return { + isiPad: constant(isiPad), + isiPhone: constant(isiPhone), + isTablet: constant(isTablet), + isPhone: constant(isPhone), + isTouch: constant(isTouch), + isAndroid: os.isAndroid, + isiOS: os.isiOS, + isWebView: constant(iOSwebview), + isDesktop: constant(isDesktop) + }; + }; + + var firstMatch = function (regexes, s) { + for (var i = 0; i < regexes.length; i++) { + var x = regexes[i]; + if (x.test(s)) { + return x; + } + } + return undefined; + }; + var find$1 = function (regexes, agent) { + var r = firstMatch(regexes, agent); + if (!r) { + return { + major: 0, + minor: 0 + }; + } + var group = function (i) { + return Number(agent.replace(r, '$' + i)); + }; + return nu(group(1), group(2)); + }; + var detect = function (versionRegexes, agent) { + var cleanedAgent = String(agent).toLowerCase(); + if (versionRegexes.length === 0) { + return unknown(); + } + return find$1(versionRegexes, cleanedAgent); + }; + var unknown = function () { + return nu(0, 0); + }; + var nu = function (major, minor) { + return { + major: major, + minor: minor + }; + }; + var Version = { + nu: nu, + detect: detect, + unknown: unknown + }; + + var detect$1 = function (candidates, userAgent) { + var agent = String(userAgent).toLowerCase(); + return find(candidates, function (candidate) { + return candidate.search(agent); + }); + }; + var detectBrowser = function (browsers, userAgent) { + return detect$1(browsers, userAgent).map(function (browser) { + var version = Version.detect(browser.versionRegexes, userAgent); + return { + current: browser.name, + version: version + }; + }); + }; + var detectOs = function (oses, userAgent) { + return detect$1(oses, userAgent).map(function (os) { + var version = Version.detect(os.versionRegexes, userAgent); + return { + current: os.name, + version: version + }; + }); + }; + var UaString = { + detectBrowser: detectBrowser, + detectOs: detectOs + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + var checkContains = function (target) { + return function (uastring) { + return contains(uastring, target); + }; + }; + var browsers = [ + { + name: 'Edge', + versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], + search: function (uastring) { + return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); + } + }, + { + name: 'Chrome', + versionRegexes: [ + /.*?chrome\/([0-9]+)\.([0-9]+).*/, + normalVersionRegex + ], + search: function (uastring) { + return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); + } + }, + { + name: 'IE', + versionRegexes: [ + /.*?msie\ ?([0-9]+)\.([0-9]+).*/, + /.*?rv:([0-9]+)\.([0-9]+).*/ + ], + search: function (uastring) { + return contains(uastring, 'msie') || contains(uastring, 'trident'); + } + }, + { + name: 'Opera', + versionRegexes: [ + normalVersionRegex, + /.*?opera\/([0-9]+)\.([0-9]+).*/ + ], + search: checkContains('opera') + }, + { + name: 'Firefox', + versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], + search: checkContains('firefox') + }, + { + name: 'Safari', + versionRegexes: [ + normalVersionRegex, + /.*?cpu os ([0-9]+)_([0-9]+).*/ + ], + search: function (uastring) { + return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); + } + } + ]; + var oses = [ + { + name: 'Windows', + search: checkContains('win'), + versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'iOS', + search: function (uastring) { + return contains(uastring, 'iphone') || contains(uastring, 'ipad'); + }, + versionRegexes: [ + /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, + /.*cpu os ([0-9]+)_([0-9]+).*/, + /.*cpu iphone os ([0-9]+)_([0-9]+).*/ + ] + }, + { + name: 'Android', + search: checkContains('android'), + versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'OSX', + search: checkContains('mac os x'), + versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] + }, + { + name: 'Linux', + search: checkContains('linux'), + versionRegexes: [] + }, + { + name: 'Solaris', + search: checkContains('sunos'), + versionRegexes: [] + }, + { + name: 'FreeBSD', + search: checkContains('freebsd'), + versionRegexes: [] + }, + { + name: 'ChromeOS', + search: checkContains('cros'), + versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] + } + ]; + var PlatformInfo = { + browsers: constant(browsers), + oses: constant(oses) + }; + + var edge = 'Edge'; + var chrome = 'Chrome'; + var ie = 'IE'; + var opera = 'Opera'; + var firefox = 'Firefox'; + var safari = 'Safari'; + var unknown$1 = function () { + return nu$1({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$1 = function (info) { + var current = info.current; + var version = info.version; + var isBrowser = function (name) { + return function () { + return current === name; + }; + }; + return { + current: current, + version: version, + isEdge: isBrowser(edge), + isChrome: isBrowser(chrome), + isIE: isBrowser(ie), + isOpera: isBrowser(opera), + isFirefox: isBrowser(firefox), + isSafari: isBrowser(safari) + }; + }; + var Browser = { + unknown: unknown$1, + nu: nu$1, + edge: constant(edge), + chrome: constant(chrome), + ie: constant(ie), + opera: constant(opera), + firefox: constant(firefox), + safari: constant(safari) + }; + + var windows = 'Windows'; + var ios = 'iOS'; + var android = 'Android'; + var linux = 'Linux'; + var osx = 'OSX'; + var solaris = 'Solaris'; + var freebsd = 'FreeBSD'; + var chromeos = 'ChromeOS'; + var unknown$2 = function () { + return nu$2({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$2 = function (info) { + var current = info.current; + var version = info.version; + var isOS = function (name) { + return function () { + return current === name; + }; + }; + return { + current: current, + version: version, + isWindows: isOS(windows), + isiOS: isOS(ios), + isAndroid: isOS(android), + isOSX: isOS(osx), + isLinux: isOS(linux), + isSolaris: isOS(solaris), + isFreeBSD: isOS(freebsd), + isChromeOS: isOS(chromeos) + }; + }; + var OperatingSystem = { + unknown: unknown$2, + nu: nu$2, + windows: constant(windows), + ios: constant(ios), + android: constant(android), + linux: constant(linux), + osx: constant(osx), + solaris: constant(solaris), + freebsd: constant(freebsd), + chromeos: constant(chromeos) + }; + + var detect$2 = function (userAgent, mediaMatch) { + var browsers = PlatformInfo.browsers(); + var oses = PlatformInfo.oses(); + var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); + var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + var deviceType = DeviceType(os, browser, userAgent, mediaMatch); + return { + browser: browser, + os: os, + deviceType: deviceType + }; + }; + var PlatformDetection = { detect: detect$2 }; + + var mediaMatch = function (query) { + return window.matchMedia(query).matches; + }; + var platform = cached(function () { + return PlatformDetection.detect(navigator.userAgent, mediaMatch); + }); + var detect$3 = function () { + return platform(); + }; + + var compareDocumentPosition = function (a, b, match) { + return (a.compareDocumentPosition(b) & match) !== 0; + }; + var documentPositionContainedBy = function (a, b) { + return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY); + }; + + var ELEMENT = 1; + + var fromHtml = function (html, scope) { + var doc = scope || document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var is = function (element, selector) { + var dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var eq = function (e1, e2) { + return e1.dom === e2.dom; + }; + var regularContains = function (e1, e2) { + var d1 = e1.dom; + var d2 = e2.dom; + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return documentPositionContainedBy(e1.dom, e2.dom); + }; + var contains$1 = function (e1, e2) { + return detect$3().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); + }; + var is$1 = is; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var objAcc = function (r) { + return function (x, i) { + r[i] = x; + }; + }; + var internalFilter = function (obj, pred, onTrue, onFalse) { + var r = {}; + each$1(obj, function (x, i) { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + return r; + }; + var filter$1 = function (obj, pred) { + var t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var name = function (element) { + var r = element.dom.nodeName; + return r.toLowerCase(); + }; + var type = function (element) { + return element.dom.nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var setAll = function (element, attrs) { + var dom = element.dom; + each$1(attrs, function (v, k) { + rawSet(dom, k, v); + }); + }; + var clone = function (element) { + return foldl(element.dom.attributes, function (acc, attr) { + acc[attr.name] = attr.value; + return acc; + }, {}); + }; + + var parent = function (element) { + return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + }; + var children = function (element) { + return map(element.dom.childNodes, SugarElement.fromDom); + }; + var child = function (element, index) { + var cs = element.dom.childNodes; + return Optional.from(cs[index]).map(SugarElement.fromDom); + }; + var firstChild = function (element) { + return child(element, 0); + }; + var lastChild = function (element) { + return child(element, element.dom.childNodes.length - 1); + }; + + var before = function (marker, element) { + var parent$1 = parent(marker); + parent$1.each(function (v) { + v.dom.insertBefore(element.dom, marker.dom); + }); + }; + var append = function (parent, element) { + parent.dom.appendChild(element.dom); + }; + + var before$1 = function (marker, elements) { + each(elements, function (x) { + before(marker, x); + }); + }; + var append$1 = function (parent, elements) { + each(elements, function (x) { + append(parent, x); + }); + }; + + var remove = function (element) { + var dom = element.dom; + if (dom.parentNode !== null) { + dom.parentNode.removeChild(dom); + } + }; + + var clone$1 = function (original, isDeep) { + return SugarElement.fromDom(original.dom.cloneNode(isDeep)); + }; + var deep = function (original) { + return clone$1(original, true); + }; + var shallowAs = function (original, tag) { + var nu = SugarElement.fromTag(tag); + var attributes = clone(original); + setAll(nu, attributes); + return nu; + }; + var mutate = function (original, tag) { + var nu = shallowAs(original, tag); + before(original, nu); + var children$1 = children(original); + append$1(nu, children$1); + remove(original); + return nu; + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var matchNodeName = function (name) { + return function (node) { + return node && node.nodeName.toLowerCase() === name; + }; + }; + var matchNodeNames = function (regex) { + return function (node) { + return node && regex.test(node.nodeName); + }; + }; + var isTextNode = function (node) { + return node && node.nodeType === 3; + }; + var isListNode = matchNodeNames(/^(OL|UL|DL)$/); + var isOlUlNode = matchNodeNames(/^(OL|UL)$/); + var isOlNode = matchNodeName('ol'); + var isListItemNode = matchNodeNames(/^(LI|DT|DD)$/); + var isDlItemNode = matchNodeNames(/^(DT|DD)$/); + var isTableCellNode = matchNodeNames(/^(TH|TD)$/); + var isBr = matchNodeName('br'); + var isFirstChild = function (node) { + return node.parentNode.firstChild === node; + }; + var isTextBlock = function (editor, node) { + return node && !!editor.schema.getTextBlockElements()[node.nodeName]; + }; + var isBlock = function (node, blockElements) { + return node && node.nodeName in blockElements; + }; + var isBogusBr = function (dom, node) { + if (!isBr(node)) { + return false; + } + return dom.isBlock(node.nextSibling) && !isBr(node.previousSibling); + }; + var isEmpty = function (dom, elm, keepBookmarks) { + var empty = dom.isEmpty(elm); + if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) { + return false; + } + return empty; + }; + var isChildOfBody = function (dom, elm) { + return dom.isChildOf(elm, dom.getRoot()); + }; + + var shouldIndentOnTab = function (editor) { + return editor.getParam('lists_indent_on_tab', true); + }; + var getForcedRootBlock = function (editor) { + var block = editor.getParam('forced_root_block', 'p'); + if (block === false) { + return ''; + } else if (block === true) { + return 'p'; + } else { + return block; + } + }; + var getForcedRootBlockAttrs = function (editor) { + return editor.getParam('forced_root_block_attrs', {}); + }; + + var createTextBlock = function (editor, contentNode) { + var dom = editor.dom; + var blockElements = editor.schema.getBlockElements(); + var fragment = dom.createFragment(); + var blockName = getForcedRootBlock(editor); + var node, textBlock, hasContentNode; + if (blockName) { + textBlock = dom.create(blockName); + if (textBlock.tagName === blockName.toUpperCase()) { + dom.setAttribs(textBlock, getForcedRootBlockAttrs(editor)); + } + if (!isBlock(contentNode.firstChild, blockElements)) { + fragment.appendChild(textBlock); + } + } + if (contentNode) { + while (node = contentNode.firstChild) { + var nodeName = node.nodeName; + if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { + hasContentNode = true; + } + if (isBlock(node, blockElements)) { + fragment.appendChild(node); + textBlock = null; + } else { + if (blockName) { + if (!textBlock) { + textBlock = dom.create(blockName); + fragment.appendChild(textBlock); + } + textBlock.appendChild(node); + } else { + fragment.appendChild(node); + } + } + } + } + if (!blockName) { + fragment.appendChild(dom.create('br')); + } else { + if (!hasContentNode) { + textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' })); + } + } + return fragment; + }; + + var DOM = global$4.DOM; + var splitList = function (editor, ul, li) { + var removeAndKeepBookmarks = function (targetNode) { + global$5.each(bookmarks, function (node) { + targetNode.parentNode.insertBefore(node, li.parentNode); + }); + DOM.remove(targetNode); + }; + var bookmarks = DOM.select('span[data-mce-type="bookmark"]', ul); + var newBlock = createTextBlock(editor, li); + var tmpRng = DOM.createRng(); + tmpRng.setStartAfter(li); + tmpRng.setEndAfter(ul); + var fragment = tmpRng.extractContents(); + for (var node = fragment.firstChild; node; node = node.firstChild) { + if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { + DOM.remove(node); + break; + } + } + if (!editor.dom.isEmpty(fragment)) { + DOM.insertAfter(fragment, ul); + } + DOM.insertAfter(newBlock, ul); + if (isEmpty(editor.dom, li.parentNode)) { + removeAndKeepBookmarks(li.parentNode); + } + DOM.remove(li); + if (isEmpty(editor.dom, ul)) { + DOM.remove(ul); + } + }; + + var outdentDlItem = function (editor, item) { + if (is$1(item, 'dd')) { + mutate(item, 'dt'); + } else if (is$1(item, 'dt')) { + parent(item).each(function (dl) { + return splitList(editor, dl.dom, item.dom); + }); + } + }; + var indentDlItem = function (item) { + if (is$1(item, 'dt')) { + mutate(item, 'dd'); + } + }; + var dlIndentation = function (editor, indentation, dlItems) { + if (indentation === 'Indent') { + each(dlItems, indentDlItem); + } else { + each(dlItems, function (item) { + return outdentDlItem(editor, item); + }); + } + }; + + var getNormalizedPoint = function (container, offset) { + if (isTextNode(container)) { + return { + container: container, + offset: offset + }; + } + var node = global$1.getNode(container, offset); + if (isTextNode(node)) { + return { + container: node, + offset: offset >= container.childNodes.length ? node.data.length : 0 + }; + } else if (node.previousSibling && isTextNode(node.previousSibling)) { + return { + container: node.previousSibling, + offset: node.previousSibling.data.length + }; + } else if (node.nextSibling && isTextNode(node.nextSibling)) { + return { + container: node.nextSibling, + offset: 0 + }; + } + return { + container: container, + offset: offset + }; + }; + var normalizeRange = function (rng) { + var outRng = rng.cloneRange(); + var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset); + outRng.setStart(rangeStart.container, rangeStart.offset); + var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset); + outRng.setEnd(rangeEnd.container, rangeEnd.offset); + return outRng; + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); + + var getParentList = function (editor, node) { + var selectionStart = node || editor.selection.getStart(true); + return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart)); + }; + var isParentListSelected = function (parentList, selectedBlocks) { + return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList; + }; + var findSubLists = function (parentList) { + return global$5.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm) { + return isListNode(elm); + }); + }; + var getSelectedSubLists = function (editor) { + var parentList = getParentList(editor); + var selectedBlocks = editor.selection.getSelectedBlocks(); + if (isParentListSelected(parentList, selectedBlocks)) { + return findSubLists(parentList); + } else { + return global$5.grep(selectedBlocks, function (elm) { + return isListNode(elm) && parentList !== elm; + }); + } + }; + var findParentListItemsNodes = function (editor, elms) { + var listItemsElms = global$5.map(elms, function (elm) { + var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm)); + return parentLi ? parentLi : elm; + }); + return global$6.unique(listItemsElms); + }; + var getSelectedListItems = function (editor) { + var selectedBlocks = editor.selection.getSelectedBlocks(); + return global$5.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) { + return isListItemNode(block); + }); + }; + var getSelectedDlItems = function (editor) { + return filter(getSelectedListItems(editor), isDlItemNode); + }; + var getClosestListRootElm = function (editor, elm) { + var parentTableCell = editor.dom.getParents(elm, 'TD,TH'); + var root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody(); + return root; + }; + var findLastParentListNode = function (editor, elm) { + var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm)); + return last(parentLists); + }; + var getSelectedLists = function (editor) { + var firstList = findLastParentListNode(editor, editor.selection.getStart()); + var subsequentLists = filter(editor.selection.getSelectedBlocks(), isOlUlNode); + return firstList.toArray().concat(subsequentLists); + }; + var getSelectedListRoots = function (editor) { + var selectedLists = getSelectedLists(editor); + return getUniqueListRoots(editor, selectedLists); + }; + var getUniqueListRoots = function (editor, lists) { + var listRoots = map(lists, function (list) { + return findLastParentListNode(editor, list).getOr(list); + }); + return global$6.unique(listRoots); + }; + + var lift2 = function (oa, ob, f) { + return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none(); + }; + + var fromElements = function (elements, scope) { + var doc = scope || document; + var fragment = doc.createDocumentFragment(); + each(elements, function (element) { + fragment.appendChild(element.dom); + }); + return SugarElement.fromDom(fragment); + }; + + var fireListEvent = function (editor, action, element) { + return editor.fire('ListMutation', { + action: action, + element: element + }); + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var set = function (element, property, value) { + var dom = element.dom; + internalSet(dom, property, value); + }; + + var joinSegment = function (parent, child) { + append(parent.item, child.list); + }; + var joinSegments = function (segments) { + for (var i = 1; i < segments.length; i++) { + joinSegment(segments[i - 1], segments[i]); + } + }; + var appendSegments = function (head$1, tail) { + lift2(last(head$1), head(tail), joinSegment); + }; + var createSegment = function (scope, listType) { + var segment = { + list: SugarElement.fromTag(listType, scope), + item: SugarElement.fromTag('li', scope) + }; + append(segment.list, segment.item); + return segment; + }; + var createSegments = function (scope, entry, size) { + var segments = []; + for (var i = 0; i < size; i++) { + segments.push(createSegment(scope, entry.listType)); + } + return segments; + }; + var populateSegments = function (segments, entry) { + for (var i = 0; i < segments.length - 1; i++) { + set(segments[i].item, 'list-style-type', 'none'); + } + last(segments).each(function (segment) { + setAll(segment.list, entry.listAttributes); + setAll(segment.item, entry.itemAttributes); + append$1(segment.item, entry.content); + }); + }; + var normalizeSegment = function (segment, entry) { + if (name(segment.list) !== entry.listType) { + segment.list = mutate(segment.list, entry.listType); + } + setAll(segment.list, entry.listAttributes); + }; + var createItem = function (scope, attr, content) { + var item = SugarElement.fromTag('li', scope); + setAll(item, attr); + append$1(item, content); + return item; + }; + var appendItem = function (segment, item) { + append(segment.list, item); + segment.item = item; + }; + var writeShallow = function (scope, cast, entry) { + var newCast = cast.slice(0, entry.depth); + last(newCast).each(function (segment) { + var item = createItem(scope, entry.itemAttributes, entry.content); + appendItem(segment, item); + normalizeSegment(segment, entry); + }); + return newCast; + }; + var writeDeep = function (scope, cast, entry) { + var segments = createSegments(scope, entry, entry.depth - cast.length); + joinSegments(segments); + populateSegments(segments, entry); + appendSegments(cast, segments); + return cast.concat(segments); + }; + var composeList = function (scope, entries) { + var cast = foldl(entries, function (cast, entry) { + return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry); + }, []); + return head(cast).map(function (segment) { + return segment.list; + }); + }; + + var isList = function (el) { + return is$1(el, 'OL,UL'); + }; + var hasFirstChildList = function (el) { + return firstChild(el).map(isList).getOr(false); + }; + var hasLastChildList = function (el) { + return lastChild(el).map(isList).getOr(false); + }; + + var isIndented = function (entry) { + return entry.depth > 0; + }; + var isSelected = function (entry) { + return entry.isSelected; + }; + var cloneItemContent = function (li) { + var children$1 = children(li); + var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1; + return map(content, deep); + }; + var createEntry = function (li, depth, isSelected) { + return parent(li).filter(isElement).map(function (list) { + return { + depth: depth, + dirty: false, + isSelected: isSelected, + content: cloneItemContent(li), + itemAttributes: clone(li), + listAttributes: clone(list), + listType: name(list) + }; + }); + }; + + var indentEntry = function (indentation, entry) { + switch (indentation) { + case 'Indent': + entry.depth++; + break; + case 'Outdent': + entry.depth--; + break; + case 'Flatten': + entry.depth = 0; + } + entry.dirty = true; + }; + + var cloneListProperties = function (target, source) { + target.listType = source.listType; + target.listAttributes = __assign({}, source.listAttributes); + }; + var cleanListProperties = function (entry) { + entry.listAttributes = filter$1(entry.listAttributes, function (_value, key) { + return key !== 'start'; + }); + }; + var closestSiblingEntry = function (entries, start) { + var depth = entries[start].depth; + var matches = function (entry) { + return entry.depth === depth && !entry.dirty; + }; + var until = function (entry) { + return entry.depth < depth; + }; + return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(function () { + return findUntil(entries.slice(start + 1), matches, until); + }); + }; + var normalizeEntries = function (entries) { + each(entries, function (entry, i) { + closestSiblingEntry(entries, i).fold(function () { + if (entry.dirty) { + cleanListProperties(entry); + } + }, function (matchingEntry) { + return cloneListProperties(entry, matchingEntry); + }); + }); + return entries; + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var parseItem = function (depth, itemSelection, selectionState, item) { + return firstChild(item).filter(isList).fold(function () { + itemSelection.each(function (selection) { + if (eq(selection.start, item)) { + selectionState.set(true); + } + }); + var currentItemEntry = createEntry(item, depth, selectionState.get()); + itemSelection.each(function (selection) { + if (eq(selection.end, item)) { + selectionState.set(false); + } + }); + var childListEntries = lastChild(item).filter(isList).map(function (list) { + return parseList(depth, itemSelection, selectionState, list); + }).getOr([]); + return currentItemEntry.toArray().concat(childListEntries); + }, function (list) { + return parseList(depth, itemSelection, selectionState, list); + }); + }; + var parseList = function (depth, itemSelection, selectionState, list) { + return bind(children(list), function (element) { + var parser = isList(element) ? parseList : parseItem; + var newDepth = depth + 1; + return parser(newDepth, itemSelection, selectionState, element); + }); + }; + var parseLists = function (lists, itemSelection) { + var selectionState = Cell(false); + var initialDepth = 0; + return map(lists, function (list) { + return { + sourceList: list, + entries: parseList(initialDepth, itemSelection, selectionState, list) + }; + }); + }; + + var outdentedComposer = function (editor, entries) { + var normalizedEntries = normalizeEntries(entries); + return map(normalizedEntries, function (entry) { + var content = fromElements(entry.content); + return SugarElement.fromDom(createTextBlock(editor, content.dom)); + }); + }; + var indentedComposer = function (editor, entries) { + var normalizedEntries = normalizeEntries(entries); + return composeList(editor.contentDocument, normalizedEntries).toArray(); + }; + var composeEntries = function (editor, entries) { + return bind(groupBy(entries, isIndented), function (entries) { + var groupIsIndented = head(entries).map(isIndented).getOr(false); + return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); + }); + }; + var indentSelectedEntries = function (entries, indentation) { + each(filter(entries, isSelected), function (entry) { + return indentEntry(indentation, entry); + }); + }; + var getItemSelection = function (editor) { + var selectedListItems = map(getSelectedListItems(editor), SugarElement.fromDom); + return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) { + return { + start: start, + end: end + }; + }); + }; + var listIndentation = function (editor, lists, indentation) { + var entrySets = parseLists(lists, getItemSelection(editor)); + each(entrySets, function (entrySet) { + indentSelectedEntries(entrySet.entries, indentation); + var composedLists = composeEntries(editor, entrySet.entries); + each(composedLists, function (composedList) { + fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom); + }); + before$1(entrySet.sourceList, composedLists); + remove(entrySet.sourceList); + }); + }; + + var selectionIndentation = function (editor, indentation) { + var lists = map(getSelectedListRoots(editor), SugarElement.fromDom); + var dlItems = map(getSelectedDlItems(editor), SugarElement.fromDom); + var isHandled = false; + if (lists.length || dlItems.length) { + var bookmark = editor.selection.getBookmark(); + listIndentation(editor, lists, indentation); + dlIndentation(editor, indentation, dlItems); + editor.selection.moveToBookmark(bookmark); + editor.selection.setRng(normalizeRange(editor.selection.getRng())); + editor.nodeChanged(); + isHandled = true; + } + return isHandled; + }; + var indentListSelection = function (editor) { + return selectionIndentation(editor, 'Indent'); + }; + var outdentListSelection = function (editor) { + return selectionIndentation(editor, 'Outdent'); + }; + var flattenListSelection = function (editor) { + return selectionIndentation(editor, 'Flatten'); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); + + var DOM$1 = global$4.DOM; + var createBookmark = function (rng) { + var bookmark = {}; + var setupEndPoint = function (start) { + var offsetNode, container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); + if (container.hasChildNodes()) { + offset = Math.min(offset, container.childNodes.length - 1); + if (start) { + container.insertBefore(offsetNode, container.childNodes[offset]); + } else { + DOM$1.insertAfter(offsetNode, container.childNodes[offset]); + } + } else { + container.appendChild(offsetNode); + } + container = offsetNode; + offset = 0; + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + }; + setupEndPoint(true); + if (!rng.collapsed) { + setupEndPoint(); + } + return bookmark; + }; + var resolveBookmark = function (bookmark) { + function restoreEndPoint(start) { + var container, offset, node; + var nodeIndex = function (container) { + var node = container.parentNode.firstChild, idx = 0; + while (node) { + if (node === container) { + return idx; + } + if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { + idx++; + } + node = node.nextSibling; + } + return -1; + }; + container = node = bookmark[start ? 'startContainer' : 'endContainer']; + offset = bookmark[start ? 'startOffset' : 'endOffset']; + if (!container) { + return; + } + if (container.nodeType === 1) { + offset = nodeIndex(container); + container = container.parentNode; + DOM$1.remove(node); + if (!container.hasChildNodes() && DOM$1.isBlock(container)) { + container.appendChild(DOM$1.create('br')); + } + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + } + restoreEndPoint(true); + restoreEndPoint(); + var rng = DOM$1.createRng(); + rng.setStart(bookmark.startContainer, bookmark.startOffset); + if (bookmark.endContainer) { + rng.setEnd(bookmark.endContainer, bookmark.endOffset); + } + return normalizeRange(rng); + }; + + var listToggleActionFromListName = function (listName) { + switch (listName) { + case 'UL': + return 'ToggleUlList'; + case 'OL': + return 'ToggleOlList'; + case 'DL': + return 'ToggleDLList'; + } + }; + + var isCustomList = function (list) { + return /\btox\-/.test(list.className); + }; + var listState = function (editor, listName, activate) { + var nodeChangeHandler = function (e) { + var inList = findUntil(e.parents, isListNode, isTableCellNode).filter(function (list) { + return list.nodeName === listName && !isCustomList(list); + }).isSome(); + activate(inList); + }; + var parents = editor.dom.getParents(editor.selection.getNode()); + nodeChangeHandler({ parents: parents }); + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + + var updateListStyle = function (dom, el, detail) { + var type = detail['list-style-type'] ? detail['list-style-type'] : null; + dom.setStyle(el, 'list-style-type', type); + }; + var setAttribs = function (elm, attrs) { + global$5.each(attrs, function (value, key) { + elm.setAttribute(key, value); + }); + }; + var updateListAttrs = function (dom, el, detail) { + setAttribs(el, detail['list-attributes']); + global$5.each(dom.select('li', el), function (li) { + setAttribs(li, detail['list-item-attributes']); + }); + }; + var updateListWithDetails = function (dom, el, detail) { + updateListStyle(dom, el, detail); + updateListAttrs(dom, el, detail); + }; + var removeStyles = function (dom, element, styles) { + global$5.each(styles, function (style) { + var _a; + return dom.setStyle(element, (_a = {}, _a[style] = '', _a)); + }); + }; + var getEndPointNode = function (editor, rng, start, root) { + var container = rng[start ? 'startContainer' : 'endContainer']; + var offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; + } + if (!start && isBr(container.nextSibling)) { + container = container.nextSibling; + } + while (container.parentNode !== root) { + if (isTextBlock(editor, container)) { + return container; + } + if (/^(TD|TH)$/.test(container.parentNode.nodeName)) { + return container; + } + container = container.parentNode; + } + return container; + }; + var getSelectedTextBlocks = function (editor, rng, root) { + var textBlocks = [], dom = editor.dom; + var startNode = getEndPointNode(editor, rng, true, root); + var endNode = getEndPointNode(editor, rng, false, root); + var block; + var siblings = []; + for (var node = startNode; node; node = node.nextSibling) { + siblings.push(node); + if (node === endNode) { + break; + } + } + global$5.each(siblings, function (node) { + if (isTextBlock(editor, node)) { + textBlocks.push(node); + block = null; + return; + } + if (dom.isBlock(node) || isBr(node)) { + if (isBr(node)) { + dom.remove(node); + } + block = null; + return; + } + var nextSibling = node.nextSibling; + if (global$7.isBookmarkNode(node)) { + if (isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) { + block = null; + return; + } + } + if (!block) { + block = dom.create('p'); + node.parentNode.insertBefore(block, node); + textBlocks.push(block); + } + block.appendChild(node); + }); + return textBlocks; + }; + var hasCompatibleStyle = function (dom, sib, detail) { + var sibStyle = dom.getStyle(sib, 'list-style-type'); + var detailStyle = detail ? detail['list-style-type'] : ''; + detailStyle = detailStyle === null ? '' : detailStyle; + return sibStyle === detailStyle; + }; + var applyList = function (editor, listName, detail) { + if (detail === void 0) { + detail = {}; + } + var rng = editor.selection.getRng(); + var listItemName = 'LI'; + var root = getClosestListRootElm(editor, editor.selection.getStart(true)); + var dom = editor.dom; + if (dom.getContentEditable(editor.selection.getNode()) === 'false') { + return; + } + listName = listName.toUpperCase(); + if (listName === 'DL') { + listItemName = 'DT'; + } + var bookmark = createBookmark(rng); + global$5.each(getSelectedTextBlocks(editor, rng, root), function (block) { + var listBlock; + var sibling = block.previousSibling; + if (sibling && isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) { + listBlock = sibling; + block = dom.rename(block, listItemName); + sibling.appendChild(block); + } else { + listBlock = dom.create(listName); + block.parentNode.insertBefore(listBlock, block); + listBlock.appendChild(block); + block = dom.rename(block, listItemName); + } + removeStyles(dom, block, [ + 'margin', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-top', + 'padding', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'padding-top' + ]); + updateListWithDetails(dom, listBlock, detail); + mergeWithAdjacentLists(editor.dom, listBlock); + }); + editor.selection.setRng(resolveBookmark(bookmark)); + }; + var isValidLists = function (list1, list2) { + return list1 && list2 && isListNode(list1) && list1.nodeName === list2.nodeName; + }; + var hasSameListStyle = function (dom, list1, list2) { + var targetStyle = dom.getStyle(list1, 'list-style-type', true); + var style = dom.getStyle(list2, 'list-style-type', true); + return targetStyle === style; + }; + var hasSameClasses = function (elm1, elm2) { + return elm1.className === elm2.className; + }; + var shouldMerge = function (dom, list1, list2) { + return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2); + }; + var mergeWithAdjacentLists = function (dom, listBlock) { + var sibling, node; + sibling = listBlock.nextSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.firstChild) { + listBlock.appendChild(node); + } + dom.remove(sibling); + } + sibling = listBlock.previousSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.lastChild) { + listBlock.insertBefore(node, listBlock.firstChild); + } + dom.remove(sibling); + } + }; + var updateList = function (editor, list, listName, detail) { + if (list.nodeName !== listName) { + var newList = editor.dom.rename(list, listName); + updateListWithDetails(editor.dom, newList, detail); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } else { + updateListWithDetails(editor.dom, list, detail); + fireListEvent(editor, listToggleActionFromListName(listName), list); + } + }; + var toggleMultipleLists = function (editor, parentList, lists, listName, detail) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail)) { + flattenListSelection(editor); + } else { + var bookmark = createBookmark(editor.selection.getRng(true)); + global$5.each([parentList].concat(lists), function (elm) { + updateList(editor, elm, listName, detail); + }); + editor.selection.setRng(resolveBookmark(bookmark)); + } + }; + var hasListStyleDetail = function (detail) { + return 'list-style-type' in detail; + }; + var toggleSingleList = function (editor, parentList, listName, detail) { + if (parentList === editor.getBody()) { + return; + } + if (parentList) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) { + flattenListSelection(editor); + } else { + var bookmark = createBookmark(editor.selection.getRng(true)); + updateListWithDetails(editor.dom, parentList, detail); + var newList = editor.dom.rename(parentList, listName); + mergeWithAdjacentLists(editor.dom, newList); + editor.selection.setRng(resolveBookmark(bookmark)); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } + } else { + applyList(editor, listName, detail); + fireListEvent(editor, listToggleActionFromListName(listName), parentList); + } + }; + var toggleList = function (editor, listName, detail) { + var parentList = getParentList(editor); + var selectedSubLists = getSelectedSubLists(editor); + detail = detail ? detail : {}; + if (parentList && selectedSubLists.length > 0) { + toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail); + } else { + toggleSingleList(editor, parentList, listName, detail); + } + }; + + var DOM$2 = global$4.DOM; + var normalizeList = function (dom, ul) { + var sibling; + var parentNode = ul.parentNode; + if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + if (isEmpty(dom, parentNode)) { + DOM$2.remove(parentNode); + } + } else { + DOM$2.setStyle(parentNode, 'listStyleType', 'none'); + } + } + if (isListNode(parentNode)) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + } + } + }; + var normalizeLists = function (dom, element) { + global$5.each(global$5.grep(dom.select('ol,ul', element)), function (ul) { + normalizeList(dom, ul); + }); + }; + + var findNextCaretContainer = function (editor, rng, isForward, root) { + var node = rng.startContainer; + var offset = rng.startOffset; + if (isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) { + return node; + } + var nonEmptyBlocks = editor.schema.getNonEmptyElements(); + if (node.nodeType === 1) { + node = global$1.getNode(node, offset); + } + var walker = new global$2(node, root); + if (isForward) { + if (isBogusBr(editor.dom, node)) { + walker.next(); + } + } + while (node = walker[isForward ? 'next' : 'prev2']()) { + if (node.nodeName === 'LI' && !node.hasChildNodes()) { + return node; + } + if (nonEmptyBlocks[node.nodeName]) { + return node; + } + if (isTextNode(node) && node.data.length > 0) { + return node; + } + } + }; + var hasOnlyOneBlockChild = function (dom, elm) { + var childNodes = elm.childNodes; + return childNodes.length === 1 && !isListNode(childNodes[0]) && dom.isBlock(childNodes[0]); + }; + var unwrapSingleBlockChild = function (dom, elm) { + if (hasOnlyOneBlockChild(dom, elm)) { + dom.remove(elm.firstChild, true); + } + }; + var moveChildren = function (dom, fromElm, toElm) { + var node; + var targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm; + unwrapSingleBlockChild(dom, fromElm); + if (!isEmpty(dom, fromElm, true)) { + while (node = fromElm.firstChild) { + targetElm.appendChild(node); + } + } + }; + var mergeLiElements = function (dom, fromElm, toElm) { + var listNode; + var ul = fromElm.parentNode; + if (!isChildOfBody(dom, fromElm) || !isChildOfBody(dom, toElm)) { + return; + } + if (isListNode(toElm.lastChild)) { + listNode = toElm.lastChild; + } + if (ul === toElm.lastChild) { + if (isBr(ul.previousSibling)) { + dom.remove(ul.previousSibling); + } + } + var node = toElm.lastChild; + if (node && isBr(node) && fromElm.hasChildNodes()) { + dom.remove(node); + } + if (isEmpty(dom, toElm, true)) { + dom.$(toElm).empty(); + } + moveChildren(dom, fromElm, toElm); + if (listNode) { + toElm.appendChild(listNode); + } + var contains = contains$1(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm)); + var nestedLists = contains ? dom.getParents(fromElm, isListNode, toElm) : []; + dom.remove(fromElm); + each(nestedLists, function (list) { + if (isEmpty(dom, list) && list !== dom.getRoot()) { + dom.remove(list); + } + }); + }; + var mergeIntoEmptyLi = function (editor, fromLi, toLi) { + editor.dom.$(toLi).empty(); + mergeLiElements(editor.dom, fromLi, toLi); + editor.selection.setCursorLocation(toLi); + }; + var mergeForward = function (editor, rng, fromLi, toLi) { + var dom = editor.dom; + if (dom.isEmpty(toLi)) { + mergeIntoEmptyLi(editor, fromLi, toLi); + } else { + var bookmark = createBookmark(rng); + mergeLiElements(dom, fromLi, toLi); + editor.selection.setRng(resolveBookmark(bookmark)); + } + }; + var mergeBackward = function (editor, rng, fromLi, toLi) { + var bookmark = createBookmark(rng); + mergeLiElements(editor.dom, fromLi, toLi); + var resolvedBookmark = resolveBookmark(bookmark); + editor.selection.setRng(resolvedBookmark); + }; + var backspaceDeleteFromListToListCaret = function (editor, isForward) { + var dom = editor.dom, selection = editor.selection; + var selectionStartElm = selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var li = dom.getParent(selection.getStart(), 'LI', root); + if (li) { + var ul = li.parentNode; + if (ul === editor.getBody() && isEmpty(dom, ul)) { + return true; + } + var rng_1 = normalizeRange(selection.getRng()); + var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng_1, isForward, root), 'LI', root); + if (otherLi_1 && otherLi_1 !== li) { + editor.undoManager.transact(function () { + if (isForward) { + mergeForward(editor, rng_1, otherLi_1, li); + } else { + if (isFirstChild(li)) { + outdentListSelection(editor); + } else { + mergeBackward(editor, rng_1, li, otherLi_1); + } + } + }); + return true; + } else if (!otherLi_1) { + if (!isForward && rng_1.startOffset === 0 && rng_1.endOffset === 0) { + editor.undoManager.transact(function () { + flattenListSelection(editor); + }); + return true; + } + } + } + return false; + }; + var removeBlock = function (dom, block, root) { + var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root); + dom.remove(block); + if (parentBlock && dom.isEmpty(parentBlock)) { + dom.remove(parentBlock); + } + }; + var backspaceDeleteIntoListCaret = function (editor, isForward) { + var dom = editor.dom; + var selectionStartElm = editor.selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var block = dom.getParent(selectionStartElm, dom.isBlock, root); + if (block && dom.isEmpty(block)) { + var rng = normalizeRange(editor.selection.getRng()); + var otherLi_2 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); + if (otherLi_2) { + editor.undoManager.transact(function () { + removeBlock(dom, block, root); + mergeWithAdjacentLists(dom, otherLi_2.parentNode); + editor.selection.select(otherLi_2, true); + editor.selection.collapse(isForward); + }); + return true; + } + } + return false; + }; + var backspaceDeleteCaret = function (editor, isForward) { + return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward); + }; + var backspaceDeleteRange = function (editor) { + var selectionStartElm = editor.selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root); + if (startListParent || getSelectedListItems(editor).length > 0) { + editor.undoManager.transact(function () { + editor.execCommand('Delete'); + normalizeLists(editor.dom, editor.getBody()); + }); + return true; + } + return false; + }; + var backspaceDelete = function (editor, isForward) { + return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor); + }; + var setup = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode === global$3.BACKSPACE) { + if (backspaceDelete(editor, false)) { + e.preventDefault(); + } + } else if (e.keyCode === global$3.DELETE) { + if (backspaceDelete(editor, true)) { + e.preventDefault(); + } + } + }); + }; + + var get$1 = function (editor) { + return { + backspaceDelete: function (isForward) { + backspaceDelete(editor, isForward); + } + }; + }; + + var open = function (editor) { + var dom = editor.dom; + var currentList = getParentList(editor); + if (!isOlNode(currentList)) { + return; + } + editor.windowManager.open({ + title: 'List Properties', + body: { + type: 'panel', + items: [{ + type: 'input', + name: 'start', + label: 'Start list at number', + inputMode: 'numeric' + }] + }, + initialData: { start: dom.getAttrib(currentList, 'start') || '1' }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var data = api.getData(); + editor.undoManager.transact(function () { + dom.setAttrib(getParentList(editor), 'start', data.start === '1' ? '' : data.start); + }); + api.close(); + } + }); + }; + + var queryListCommandState = function (editor, listName) { + return function () { + var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL'); + return parentList && parentList.nodeName === listName; + }; + }; + var register = function (editor) { + editor.on('BeforeExecCommand', function (e) { + var cmd = e.command.toLowerCase(); + if (cmd === 'indent') { + indentListSelection(editor); + } else if (cmd === 'outdent') { + outdentListSelection(editor); + } + }); + editor.addCommand('InsertUnorderedList', function (ui, detail) { + toggleList(editor, 'UL', detail); + }); + editor.addCommand('InsertOrderedList', function (ui, detail) { + toggleList(editor, 'OL', detail); + }); + editor.addCommand('InsertDefinitionList', function (ui, detail) { + toggleList(editor, 'DL', detail); + }); + editor.addCommand('RemoveList', function () { + flattenListSelection(editor); + }); + editor.addCommand('mceListProps', function () { + open(editor); + }); + editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL')); + editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL')); + editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL')); + }; + + var setupTabKey = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode !== global$3.TAB || global$3.metaKeyPressed(e)) { + return; + } + editor.undoManager.transact(function () { + if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) { + e.preventDefault(); + } + }); + }); + }; + var setup$1 = function (editor) { + if (shouldIndentOnTab(editor)) { + setupTabKey(editor); + } + setup(editor); + }; + + var register$1 = function (editor) { + var exec = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + if (!editor.hasPlugin('advlist')) { + editor.ui.registry.addToggleButton('numlist', { + icon: 'ordered-list', + active: false, + tooltip: 'Numbered list', + onAction: exec('InsertOrderedList'), + onSetup: function (api) { + return listState(editor, 'OL', api.setActive); + } + }); + editor.ui.registry.addToggleButton('bullist', { + icon: 'unordered-list', + active: false, + tooltip: 'Bullet list', + onAction: exec('InsertUnorderedList'), + onSetup: function (api) { + return listState(editor, 'UL', api.setActive); + } + }); + } + }; + + var register$2 = function (editor) { + var listProperties = { + text: 'List properties...', + icon: 'ordered-list', + onAction: function () { + return open(editor); + }, + onSetup: function (api) { + return listState(editor, 'OL', function (active) { + return api.setDisabled(!active); + }); + } + }; + editor.ui.registry.addMenuItem('listprops', listProperties); + editor.ui.registry.addContextMenu('lists', { + update: function (node) { + var parentList = getParentList(editor, node); + return isOlNode(parentList) ? ['listprops'] : []; + } + }); + }; + + function Plugin () { + global.add('lists', function (editor) { + if (editor.hasPlugin('rtc', true) === false) { + setup$1(editor); + register(editor); + } + register$1(editor); + register$2(editor); + return get$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/lists/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/lists/plugin.min.js new file mode 100644 index 0000000..a6a7b66 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/lists/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,n,t,r,o,i,u,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(){},y=function(e){return function(){return e}},c=function(n){return function(e){return!n(e)}},f=y(!1),d=y(!0),l=function(){return m},m=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:f,isSome:f,isNone:d,getOr:t=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:y(null),getOrUndefined:y(undefined),or:t,orThunk:n,map:l,each:s,bind:l,exists:f,forall:d,filter:l,equals:e,equals_:e,toArray:function(){return[]},toString:y("none()")}),p=function(t){var e=y(t),n=function(){return o},r=function(e){return e(t)},o={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:d,isNone:f,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return p(e(t))},each:function(e){e(t)},bind:r,exists:r,forall:r,filter:function(e){return e(t)?o:m},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(f,function(e){return n(t,e)})}};return o},g={some:p,none:l,from:function(e){return null===e||e===undefined?m:p(e)}},v=function(r){return function(e){return t=typeof(n=e),(null===n?"null":"object"==t&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":t)===r;var n,t}},h=function(n){return function(e){return typeof e===n}},S=v("string"),b=v("array"),C=h("boolean"),O=h("function"),N=h("number"),L=Array.prototype.slice,T=Array.prototype.push,D=function(e,n){for(var t=e.length,r=new Array(t),o=0;o=e.childNodes.length?t.data.length:0}:t.previousSibling&&je(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&je(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}},un=function(e){var n=e.cloneRange(),t=on(e.startContainer,e.startOffset);n.setStart(t.container,t.offset);var r=on(e.endContainer,e.endOffset);return n.setEnd(r.container,r.offset),n},an=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),sn=function(e,n){var t=n||e.selection.getStart(!0);return e.dom.getParent(t,"OL,UL,DL",dn(e,t))},cn=function(e){var n,t,r,o=sn(e),i=e.selection.getSelectedBlocks();return r=i,(t=o)&&1===r.length&&r[0]===t?(n=o,Fe.grep(n.querySelectorAll("ol,ul,dl"),function(e){return qe(e)})):Fe.grep(i,function(e){return qe(e)&&o!==e})},fn=function(e){var t,n,r,o=e.selection.getSelectedBlocks();return Fe.grep((t=e,n=o,r=Fe.map(n,function(e){var n=t.dom.getParent(e,"li,dd,dt",dn(t,e));return n||e}),an.unique(r)),function(e){return We(e)})},dn=function(e,n){var t=e.dom.getParents(n,"TD,TH");return 0e.length?On:Cn)(t,e,n)},[]),R(r).map(function(e){return e.list}).toArray()},In=function(a,e,s){var n,t=En(e,(n=D(fn(a),le.fromDom),gn(E(n,c(Ln)),E(B(n),c(Ln)),function(e,n){return{start:e,end:n}})));k(t,function(e){var n,t;n=e.entries,t=s,k(w(n,Dn),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}n.dirty=!0}(t,e),0});var r,o,i,u=(r=a,o=e.entries,P(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,u=e.length;i 1) { + return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1]; + } else { + return 'https://'; + } + }; + var getUrl = function (pattern, url) { + var protocol = getProtocol(url); + var match = pattern.regex.exec(url); + var newUrl = protocol + pattern.url; + var _loop_1 = function (i) { + newUrl = newUrl.replace('$' + i, function () { + return match[i] ? match[i] : ''; + }); + }; + for (var i = 0; i < match.length; i++) { + _loop_1(i); + } + return newUrl.replace(/\?$/, ''); + }; + var matchPattern = function (url) { + var patterns = urlPatterns.filter(function (pattern) { + return pattern.regex.test(url); + }); + if (patterns.length > 0) { + return global$1.extend({}, patterns[0], { url: getUrl(patterns[0], url) }); + } else { + return null; + } + }; + + var getIframeHtml = function (data) { + var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : ''; + return ''; + }; + var getFlashHtml = function (data) { + var html = ''; + if (data.poster) { + html += ''; + } + html += ''; + return html; + }; + var getAudioHtml = function (data, audioTemplateCallback) { + if (audioTemplateCallback) { + return audioTemplateCallback(data); + } else { + return ''; + } + }; + var getVideoHtml = function (data, videoTemplateCallback) { + if (videoTemplateCallback) { + return videoTemplateCallback(data); + } else { + return ''; + } + }; + var getScriptHtml = function (data) { + return ''; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$1.extend({}, dataIn); + if (!data.source) { + global$1.extend(data, htmlToData(getScripts(editor), data.embed)); + if (!data.source) { + return ''; + } + } + if (!data.altsource) { + data.altsource = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source = editor.convertURL(data.source, 'source'); + data.altsource = editor.convertURL(data.altsource, 'source'); + data.sourcemime = guess(data.source); + data.altsourcemime = guess(data.altsource); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source); + if (pattern) { + data.source = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || String(pattern.w); + data.height = data.height || String(pattern.h); + } + if (data.embed) { + return updateHtml(data.embed, data, true); + } else { + var videoScript = getVideoScriptMatch(getScripts(editor), data.source); + if (videoScript) { + data.type = 'script'; + data.width = String(videoScript.width); + data.height = String(videoScript.height); + } + var audioTemplateCallback = getAudioTemplateCallback(editor); + var videoTemplateCallback = getVideoTemplateCallback(editor); + data.width = data.width || '300'; + data.height = data.height || '150'; + global$1.each(data, function (value, key) { + data[key] = editor.dom.encode('' + value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.sourcemime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.sourcemime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$6(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source] = response; + } + return res({ + url: data.source, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source]) { + wrappedResolve(cache[data.source]); + } else { + handler({ url: data.source }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$6(function (res) { + res({ + html: dataToHtml(data), + url: data.source + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + + var extractMeta = function (sourceInput, data) { + return get(data, sourceInput).bind(function (mainData) { + return get(mainData, 'meta'); + }); + }; + var getValue = function (data, metaData, sourceInput) { + return function (prop) { + var _a; + var getFromData = function () { + return get(data, prop); + }; + var getFromMetaData = function () { + return get(metaData, prop); + }; + var getNonEmptyValue = function (c) { + return get(c, 'value').bind(function (v) { + return v.length > 0 ? Optional.some(v) : Optional.none(); + }); + }; + var getFromValueFirst = function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { + return Optional.from(child); + }); + }); + }; + var getFromMetaFirst = function () { + return getFromMetaData().orThunk(function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child) : Optional.from(child); + }); + }); + }; + return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; + }; + }; + var getDimensions = function (data, metaData) { + var dimensions = {}; + get(data, 'dimensions').each(function (dims) { + each([ + 'width', + 'height' + ], function (prop) { + get(metaData, prop).orThunk(function () { + return get(dims, prop); + }).each(function (value) { + return dimensions[prop] = value; + }); + }); + }); + return dimensions; + }; + var unwrap = function (data, sourceInput) { + var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; + var get = getValue(data, metaData, sourceInput); + return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + }; + var wrap = function (data) { + var wrapped = __assign(__assign({}, data), { + source: { value: get(data, 'source').getOr('') }, + altsource: { value: get(data, 'altsource').getOr('') }, + poster: { value: get(data, 'poster').getOr('') } + }); + each([ + 'width', + 'height' + ], function (prop) { + get(data, prop).each(function (value) { + var dimensions = wrapped.dimensions || {}; + dimensions[prop] = value; + wrapped.dimensions = dimensions; + }); + }); + return wrapped; + }; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var snippetToData = function (editor, embedSnippet) { + return htmlToData(getScripts(editor), embedSnippet); + }; + var isMediaElement = function (element) { + return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri'); + }; + var getEditorData = function (editor) { + var element = editor.selection.getNode(); + var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + return __assign({ embed: snippet }, htmlToData(getScripts(editor), snippet)); + }; + var addEmbedHtml = function (api, editor) { + return function (response) { + if (isString(response.url) && response.url.trim().length > 0) { + var html = response.html; + var snippetData = snippetToData(editor, html); + var nuData = __assign(__assign({}, snippetData), { + source: response.url, + embed: html + }); + api.setData(wrap(nuData)); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (var i = 0; i < beforeObjects.length; i++) { + for (var y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (prevData, newData, editor) { + newData.embed = updateHtml(newData.embed, newData); + if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) { + handleInsert(editor, newData.embed); + } else { + getEmbedHtml(editor, newData).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var showDialog = function (editor) { + var editorData = getEditorData(editor); + var currentData = Cell(editorData); + var initialData = wrap(editorData); + var handleSource = function (prevData, api) { + var serviceData = unwrap(api.getData(), 'source'); + if (prevData.source !== serviceData.source) { + addEmbedHtml(win, editor)({ + url: serviceData.source, + html: '' + }); + getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + } + }; + var handleEmbed = function (api) { + var data = unwrap(api.getData()); + var dataFromEmbed = snippetToData(editor, data.embed); + api.setData(wrap(dataFromEmbed)); + }; + var handleUpdate = function (api, sourceInput) { + var data = unwrap(api.getData(), sourceInput); + var embed = dataToHtml(editor, data); + api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + }; + var mediaInput = [{ + name: 'source', + type: 'urlinput', + filetype: 'media', + label: 'Source' + }]; + var sizeInput = !hasDimensions(editor) ? [] : [{ + type: 'sizeinput', + name: 'dimensions', + label: 'Constrain proportions', + constrain: true + }]; + var generalTab = { + title: 'General', + name: 'general', + items: flatten([ + mediaInput, + sizeInput + ]) + }; + var embedTextarea = { + type: 'textarea', + name: 'embed', + label: 'Paste your embed code below:' + }; + var embedTab = { + title: 'Embed', + items: [embedTextarea] + }; + var advancedFormItems = []; + if (hasAltSource(editor)) { + advancedFormItems.push({ + name: 'altsource', + type: 'urlinput', + filetype: 'media', + label: 'Alternative source URL' + }); + } + if (hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'urlinput', + filetype: 'image', + label: 'Media poster (Image URL)' + }); + } + var advancedTab = { + title: 'Advanced', + name: 'advanced', + items: advancedFormItems + }; + var tabs = [ + generalTab, + embedTab + ]; + if (advancedFormItems.length > 0) { + tabs.push(advancedTab); + } + var body = { + type: 'tabpanel', + tabs: tabs + }; + var win = editor.windowManager.open({ + title: 'Insert/Edit Media', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var serviceData = unwrap(api.getData()); + submitForm(currentData.get(), serviceData, editor); + api.close(); + }, + onChange: function (api, detail) { + switch (detail.name) { + case 'source': + handleSource(currentData.get(), api); + break; + case 'embed': + handleEmbed(api); + break; + case 'dimensions': + case 'altsource': + case 'poster': + handleUpdate(api, detail.name); + break; + } + currentData.set(unwrap(api.getData())); + }, + initialData: initialData + }); + }; + + var get$1 = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + return { showDialog: showDialog$1 }; + }; + + var register = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog$1); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); + + var sanitize = function (editor, html) { + if (shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$5(); + var blocked; + global$3({ + validate: false, + allow_conditional_comments: false, + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript' || name === 'svg') { + return; + } + for (var i = attrs.length - 1; i >= 0; i--) { + var attrName = attrs[i].name; + if (attrName.indexOf('on') === 0) { + delete attrs.map[attrName]; + attrs.splice(i, 1); + } + if (attrName === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$4({})).parse(html); + return writer.getContent(); + }; + + var createPlaceholderNode = function (editor, node) { + var name = node.name; + var placeHolder = new global$7('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$8.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var name = node.name; + var previewWrapper = new global$7('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + var previewNode = new global$7(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + var shimNode = new global$7('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var ai; + var attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + var innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isPageEmbedWrapper = function (node) { + var nodeClass = node.attr('class'); + return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + }; + var isWithinEmbedWrapper = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = getVideoScriptMatch(getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && hasLiveEmbeds(editor) && global$8.ceFalse) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$1.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp(']*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$7(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$7('#text', 3); + innerNode.raw = true; + innerNode.value = sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('SetContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim').length === 0) { + $elm.append(''); + } + }); + }); + }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + + var setup$2 = function (editor) { + editor.on('click keyup touchend', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('ObjectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(updateHtml(html, { + width: String(e.width), + height: String(e.height) + }))); + } + } + }); + }; + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('media', { + tooltip: 'Insert/edit media', + icon: 'embed', + onAction: function () { + editor.execCommand('mceMedia'); + }, + onSetup: stateSelectorAdapter(editor, [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ]) + }); + editor.ui.registry.addMenuItem('media', { + icon: 'embed', + text: 'Media...', + onAction: function () { + editor.execCommand('mceMedia'); + } + }); + }; + + function Plugin () { + global.add('media', function (editor) { + register(editor); + register$1(editor); + setup$1(editor); + setup(editor); + setup$2(editor); + return get$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/media/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/media/plugin.min.js new file mode 100644 index 0000000..a540a82 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,t,r,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),p=function(){return(p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"):"application/x-shockwave-flash"===n.sourcemime?(l='',s.poster&&(l+=''),l+=""):-1!==n.sourcemime.indexOf("audio")?(c=n,(u=h)?u(c):'"):"script"===n.type?' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + + var open = function (editor) { + var content = getPreviewHtml(editor); + var dataApi = editor.windowManager.open({ + title: 'Preview', + size: 'large', + body: { + type: 'panel', + items: [{ + name: 'preview', + type: 'iframe', + sandboxed: true + }] + }, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: { preview: content } + }); + dataApi.focus('close'); + }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + open(editor); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('preview', { + icon: 'preview', + tooltip: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + editor.ui.registry.addMenuItem('preview', { + icon: 'preview', + text: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + }; + + function Plugin () { + global.add('preview', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/preview/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..861aacf --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.Env"),w=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(e){var t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","","string");n+='',e&&(n+='");var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";w.each(t.contentCSS,function(e){n+='"});var r,a,c,s,d,m,l,y=-1===(s=(r=t).getParam("body_id","tinymce","string")).indexOf("=")?s:(c=(a=r).getParam("body_id","","hash"))[a.id]||c,u=-1===(l=(d=t).getParam("body_class","","string")).indexOf("=")?l:(m=d).getParam("body_class","","hash")[m.id]||"",v=' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + html = '' + '' + '' + '' + contentCssEntries_1 + preventClicksOnLinksScript + '' + '' + html + '' + ''; + } + return replaceTemplateValues(html, getPreviewReplaceValues(editor)); + }; + var open = function (editor, templateList) { + var createTemplates = function () { + if (!templateList || templateList.length === 0) { + var message = editor.translate('No templates defined.'); + editor.notificationManager.open({ + text: message, + type: 'info' + }); + return Optional.none(); + } + return Optional.from(global$1.map(templateList, function (template, index) { + var isUrlTemplate = function (t) { + return t.url !== undefined; + }; + return { + selected: index === 0, + text: template.title, + value: { + url: isUrlTemplate(template) ? Optional.from(template.url) : Optional.none(), + content: !isUrlTemplate(template) ? Optional.from(template.content) : Optional.none(), + description: template.description + } + }; + })); + }; + var createSelectBoxItems = function (templates) { + return map(templates, function (t) { + return { + text: t.text, + value: t.text + }; + }); + }; + var findTemplate = function (templates, templateTitle) { + return find(templates, function (t) { + return t.text === templateTitle; + }); + }; + var loadFailedAlert = function (api) { + editor.windowManager.alert('Could not load the specified template.', function () { + return api.focus('template'); + }); + }; + var getTemplateContent = function (t) { + return new global$4(function (resolve, reject) { + t.value.url.fold(function () { + return resolve(t.value.content.getOr('')); + }, function (url) { + return global$2.send({ + url: url, + success: function (html) { + resolve(html); + }, + error: function (e) { + reject(e); + } + }); + }); + }); + }; + var onChange = function (templates, updateDialog) { + return function (api, change) { + if (change.name === 'template') { + var newTemplateTitle = api.getData().template; + findTemplate(templates, newTemplateTitle).each(function (t) { + api.block('Loading...'); + getTemplateContent(t).then(function (previewHtml) { + updateDialog(api, t, previewHtml); + }).catch(function () { + updateDialog(api, t, ''); + api.disable('save'); + loadFailedAlert(api); + }); + }); + } + }; + }; + var onSubmit = function (templates) { + return function (api) { + var data = api.getData(); + findTemplate(templates, data.template).each(function (t) { + getTemplateContent(t).then(function (previewHtml) { + insertTemplate(editor, false, previewHtml); + api.close(); + }).catch(function () { + api.disable('save'); + loadFailedAlert(api); + }); + }); + }; + }; + var openDialog = function (templates) { + var selectBoxItems = createSelectBoxItems(templates); + var buildDialogSpec = function (bodyItems, initialData) { + return { + title: 'Insert Template', + size: 'large', + body: { + type: 'panel', + items: bodyItems + }, + initialData: initialData, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: onSubmit(templates), + onChange: onChange(templates, updateDialog) + }; + }; + var updateDialog = function (dialogApi, template, previewHtml) { + var content = getPreviewContent(editor, previewHtml); + var bodyItems = [ + { + type: 'selectbox', + name: 'template', + label: 'Templates', + items: selectBoxItems + }, + { + type: 'htmlpanel', + html: '

                                  ' + htmlEscape(template.value.description) + '

                                  ' + }, + { + label: 'Preview', + type: 'iframe', + name: 'preview', + sandboxed: false + } + ]; + var initialData = { + template: template.text, + preview: content + }; + dialogApi.unblock(); + dialogApi.redial(buildDialogSpec(bodyItems, initialData)); + dialogApi.focus('template'); + }; + var dialogApi = editor.windowManager.open(buildDialogSpec([], { + template: '', + preview: '' + })); + dialogApi.block('Loading...'); + getTemplateContent(templates[0]).then(function (previewHtml) { + updateDialog(dialogApi, templates[0], previewHtml); + }).catch(function () { + updateDialog(dialogApi, templates[0], ''); + dialogApi.disable('save'); + loadFailedAlert(dialogApi); + }); + }; + var optTemplates = createTemplates(); + optTemplates.each(openDialog); + }; + + var showDialog = function (editor) { + return function (templates) { + open(editor, templates); + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addButton('template', { + icon: 'template', + tooltip: 'Insert template', + onAction: createTemplateList(editor, showDialog(editor)) + }); + editor.ui.registry.addMenuItem('template', { + icon: 'template', + text: 'Insert template...', + onAction: createTemplateList(editor, showDialog(editor)) + }); + }; + + function Plugin () { + global.add('template', function (editor) { + register$1(editor); + register(editor); + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/public/static/component/pear/module/tinymce/tinymce/plugins/template/plugin.min.js b/public/static/component/pear/module/tinymce/tinymce/plugins/template/plugin.min.js new file mode 100644 index 0000000..d6bda48 --- /dev/null +++ b/public/static/component/pear/module/tinymce/tinymce/plugins/template/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(){},o=function(e){return function(){return e}};var n,r,a,c=o(!1),u=o(!0),_=tinymce.util.Tools.resolve("tinymce.util.Tools"),s=tinymce.util.Tools.resolve("tinymce.util.XHR"),i=function(e){return e.getParam("template_mdate_classes","mdate")},l=function(e){return e.getParam("template_replace_values")},f=function(e){return e.getParam("template_mdate_format",e.translate("%Y-%m-%d"))},m=function(e,t){if((e=""+e).length":">","&":"&","'":"'"},N=function(e){return e.replace(/["'<>&]/g,function(e){return(A(t=C,n=e)?O.from(t[n]):O.none()).getOr(e);var t,n})},I=function(M,t){var e=function(e){return function(e,t){for(var n=e.length,r=new Array(n),a=0;a")&&(o="",(c=r.getParam("content_style","","string"))&&(o+='"),u=r.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"",_.each(r.contentCSS,function(e){o+='"}),i=-1===(g=(p=r).getParam("body_class","","string")).indexOf("=")?g:(d=p).getParam("body_class","","hash")[d.id]||"",l=r.dom.encode,s='